<?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>Mikael Randy</title>
	<atom:link href="http://www.mikaelrandy.fr/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.mikaelrandy.fr</link>
	<description>Encore un blog ...</description>
	<lastBuildDate>Fri, 30 Dec 2011 22:06:05 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>De l&#8217;intérêt de la micro-optimisation</title>
		<link>http://www.mikaelrandy.fr/2011/12/30/de-linteret-de-la-micro-optimisation/</link>
		<comments>http://www.mikaelrandy.fr/2011/12/30/de-linteret-de-la-micro-optimisation/#comments</comments>
		<pubDate>Fri, 30 Dec 2011 22:06:05 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[chargement]]></category>
		<category><![CDATA[execution]]></category>
		<category><![CDATA[optimisation]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=140</guid>
		<description><![CDATA[Il y a quelques jours, sur Nexen, je tombais sur un article portant sur la micro-optimisation, et peu de temps...]]></description>
			<content:encoded><![CDATA[<p>Il y a quelques jours, sur <a href="http://www.nexen.net" title="Nexen" target="_blank">Nexen</a>, je tombais sur un <a href="http://www.nexen.net/actualites/php/20498-conseils_doptimisations_php.php" title="Nexen - conseil d'optimisation PHP" target="_blank">article portant sur la micro-optimisation</a>, et peu de temps après, sur une &laquo;&nbsp;<a href="http://zenprog.com//index.php?cle=La-micro-optimisation" title="Zenprog - La micro-optimisation" target="_blank">réponse</a>&nbsp;&raquo; de <a href="http://zenprog.com" title="Zenprog" target="_blank">Zenprog</a>.</p>
<p>Comme je trouve le sujet intéressant et que j&#8217;ai un avis complémentaire, bien que différent, je me permet dont d&#8217;écrire cet article pour l&#8217;exposer.</p>
<h2>Différence entre temps d&#8217;exécution et temps de rendu</h2>
<p>Pour ma part, je trouve la micro-optimisation assez peu intéressante dans le sens où elle est micro. Cette optimisation se base en tout et pour tout sur le temps d&#8217;exécution brut d&#8217;un script PHP, en se demandant si je peux gagner 10% en remplaçant tout mes echo par des print, ou alors en utilisant des &nbsp;&raquo; au lieu de &#8216;.</p>
<p>Sauf que, dans la vie d&#8217;une application web, ce temps n&#8217;est rien. Pour enfoncer une porte ouverte, le fonctionnement du web se décompose en plusieurs phases :</p>
<ol>
<li>Envoi d&#8217;une requête : interroger les serveurs DNS, trouver le serveur et ouvrir une connexion avec lui.</li>
<li>Génération de la réponse : le temps d&#8217;exécution</li>
<li>Téléchargement du résultat : le temps que le HTML généré par le PHP reviennent sur le client</li>
<li>Interprétation du résultat : le temps que le navigateur interprète le HTML, découvre les ressources nécessaire au rendu</li>
<li>Chargement des ressources annexes (assets) : pour chaque ressource, on repart du début (requête, réponse, téléchargement et interprétation)</li>
</ol>
<p>Le temps de rendu est l&#8217;ensemble des temps nécessaires pour réaliser toutes ces phases.</p>
<p>Prenons l&#8217;exemple, au hasard, d&#8217;un moteur de recherche bien connu, et analysons le chargement de la page d&#8217;accueil :<br />
<div id="attachment_147" class="wp-caption alignnone" style="width: 810px"><a href="http://www.mikaelrandy.fr/wp-content/uploads/2011/12/google-homepage.png"><img src="http://www.mikaelrandy.fr/wp-content/uploads/2011/12/google-homepage.png" alt="" title="Google - Analyse chargement homepage" width="800" height="481" class="size-full wp-image-147" /></a><p class="wp-caption-text">Analyse du chargement de la homepage</p></div></p>
<p>Voici ce que l&#8217;on peut apprendre de cette analyse :</p>
<ul>
<li>le temps complet de chargement de la page est de 964ms</li>
<li>la requête initiale (requête, génération, téléchargement du résultat) prend 110ms (95ms de génération du résultat)</li>
</ul>
<p>Il est donc clair que le temps de rendu (le temps nécessaire pour que l&#8217;utilisateur puisse utiliser la page) est 9 fois plus important que le temps d&#8217;exécution du script sur le serveur. Du coup, gagner 10% sur le temps d&#8217;exécution ne fait gagner que 1% sur le temps de rendu.<br />
Et je parle ici de la page d&#8217;accueil de Google, qui optimise beaucoup ses chargements, mais pour d&#8217;autres sites, moins optimisé, c&#8217;est encore pire dès que le nombre de CSS, de JS ou d&#8217;images croît.</p>
<h2>Optimisez vos chargements</h2>
<p>Pour agir de façon drastiquement efficace sur votre temps de rendu, tant que le temps d&#8217;exécution est inférieur à 75% du temps de rendu, c&#8217;est du côté du chargement qu&#8217;il faut chercher.</p>
<p>Pour agir sur le chargement, j&#8217;utilise 2 outils : <a href="http://code.google.com/intl/fr-FR/speed/page-speed/" title="Google Page Speed" target="_blank">Page Speed</a> et <a href="http://developer.yahoo.com/yslow/" title="Yslow" target="_blank">Yslow</a>. Ces outils se basent sur une liste d&#8217;optimisations de chargement de pages web.<br />
Je vous conseille de ne pas chercher à atteindre la perfection sur tout les points, mais c&#8217;est une bonne base de travail. Je vous conseille également de travailler avec les 2 outils en parallèle, car ils ne sont pas toujours d&#8217;accord, et cela permet de pondérer les conseils de chacun.</p>
<h2>Micro-optimisation vs. macro-optimisation</h2>
<p>Sur ce point, je suis totalement d&#8217;accord avec ZenProg : commencer par ce qui apporte réellement un gain de performance à vos sites !</p>
<p>Par expérience, je sais que lorsqu&#8217;un script PHP est lent, il faut commencer par traquer les causes suivantes :</p>
<ol>
<li>Requêtes non optimisées</li>
<li>Schéma de base de données non optimisé</li>
<li>Requêtes dans des boucles</li>
<li>Boucles non optimisées</li>
</ol>
<h3>Requêtes non optimisées</h3>
<p>Faire un <a href="http://dev.mysql.com/doc/refman/5.0/fr/explain.html" title="Syntax EXPLAIN pour MySQL" target="_blank">EXPLAIN PLAN</a> est un minimum vital pour des requêtes un minimum complexe. Dans de (trop) nombreux cas, 80% du temps d&#8217;exécution du script est l&#8217;oeuvre d&#8217;une requête non optimisée qui bloque le PHP</p>
<h3>Schéma de base de données non optimisé</h3>
<p>Comme le dit ZenProg, un index bien pensé (un index sur le(s) champ(s) sur lequel/lesquels se base les requêtes les plus fréquentes) permet de gagner <strong>beaucoup</strong> de temps, pour la même raison que pour le point précédent. </p>
<h3>Requêtes dans une boucle</h3>
<p>L&#8217;une des plus grosses fautes de développement, selon moi, c&#8217;est de ne pas contrôler les requêtes générées par son code source. Il est très facile de se retrouver dans un cas de figure où une requête est exécutée dans une boucle, surtout avec les frameworks MVC.<br />
Contrôler le nombre de requêtes générées, et travailler sur des données de test réalistes (des dizaines d&#8217;enregistrement minimum) permettent donc de se rendre compte quand le nombre de requêtes d&#8217;une page semble trop important pour le travail réalisé, et donc se rendre compte qu&#8217;on a des requêtes inutiles.</p>
<h3>Boucles non optimisées</h3>
<p>Je vois trop souvent des algos qui, suite à plusieurs évolutions, se retrouvent avec plusieurs parcours d&#8217;un même tableau.<br />
Au final, c&#8217;est du temps perdu lors des milliers/millions d&#8217;exécution de l&#8217;algo, juste parce le développeur n&#8217;a pas voulu &laquo;&nbsp;perdre&nbsp;&raquo; quelques minutes à prendre du recul sur son algo.</p>
<h2>La lisibilité du code</h2>
<p>Je sais que je sors un peu du sujet, mais je trouve qu&#8217;on y perd plus lorsque la micro-optimisation d&#8217;un code source rend sa lecture difficile</p>
<h2>L&#8217;optimisation hors script</h2>
<p>Je ne pouvais pas finir cet article portant sur l&#8217;optimisation sans parler de l&#8217;optimisation que j&#8217;appelle &laquo;&nbsp;hors site&nbsp;&raquo;.<br />
J&#8217;entends par là qu&#8217;il y a des optimisations qui sont applicables sans se pencher sur un script, mais qui améliorent drastiquement son temps d&#8217;exécution :</p>
<ul>
<li>Mettre en place un cache d&#8217;Opcode (APC, &#8230;)</li>
<li>Mettre en place un cache de rendu</li>
</ul>
<h2>Conclusion</h2>
<p>Pour moi, bencher si print est plus efficace que echo, c&#8217;est de la masturbation intellectuelle pour la plupart des développeurs web que nous sommes.<br />
Après la démonstration que je viens de vous faire, je pense que le jour où vous en serez réduis à remplacer vos print par des echo dans votre code source pour l&#8217;optimiser, c&#8217;est que vous aurez des besoins en performance très particulier, et que vous aurez déjà éculé les optimisations que je vous ai listées.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/12/30/de-linteret-de-la-micro-optimisation/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Mettre à jour MacPorts après une mise à jour de MacOS X</title>
		<link>http://www.mikaelrandy.fr/2011/11/04/mettre-a-jour-macport-apres-une-mise-a-jour-de-macos-x/</link>
		<comments>http://www.mikaelrandy.fr/2011/11/04/mettre-a-jour-macport-apres-une-mise-a-jour-de-macos-x/#comments</comments>
		<pubDate>Fri, 04 Nov 2011 17:50:09 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Mac]]></category>
		<category><![CDATA[lion]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[macports]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=130</guid>
		<description><![CDATA[Puisque, à la suite de la mise à jour de mon MacBook Pro vers OS X Lion, j&#8217;ai eu un...]]></description>
			<content:encoded><![CDATA[<p>Puisque, à la suite de la mise à jour de mon MacBook Pro vers OS X Lion, j&#8217;ai eu un problème de fonctionnement de <a href="http://www.macports.org/" title="MacPorts" target="_blank">MacPorts</a> qui m&#8217;a posé beaucoup de soucis, je partage avec vous la solution.</p>
<p>J&#8217;ai détecté le soucis en essayant de mettre à jour les ports<br />
<code>sudo port selfupdate<br />
sudo port upgrade outdated<br />
</code></p>
<p>Je suis tombé rapidement sur l&#8217;erreur suivante (dans mon cas, c&#8217;était sur gettext) :<br />
<code>Error: Target org.macports.build returned: shell command failed (see log for details)<br />
Log for gettext is at: /opt/local/var/macports/logs/_opt_local_var_macports_sources_rsync.macports.org_release_ports_devel_gettext/gettext/main.log<br />
Error: Status 1 encountered during processing.<br />
To report a bug, see <http://guide.macports.org/#project.tickets><br />
</code></p>
<p>Le soucis viens en fait de MacPorts, qui n&#8217;est plus adapté au nouvel OS, mais qui ne sais pas se mettre à jour.<br />
Pour résoudre ce soucis, il existe heureusement une <a href="https://trac.macports.org/wiki/Migration" title="Migration MacPort" target="_blank">explication fournie par MacPort</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/11/04/mettre-a-jour-macport-apres-une-mise-a-jour-de-macos-x/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Apple quitte MySQL pour PostGreSQL</title>
		<link>http://www.mikaelrandy.fr/2011/08/03/apple-quitte-mysql-pour-postgresql/</link>
		<comments>http://www.mikaelrandy.fr/2011/08/03/apple-quitte-mysql-pour-postgresql/#comments</comments>
		<pubDate>Wed, 03 Aug 2011 17:10:58 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[apple]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[PostGreSQL]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=125</guid>
		<description><![CDATA[Ce jour, en lisant mes flux RSS, je suis tombé sur un article indiquant que Mac OS X Lion abandonnait...]]></description>
			<content:encoded><![CDATA[<p>Ce jour, en lisant mes flux RSS, je suis tombé sur un article indiquant que <a href="http://www.macgeneration.com/news/voir/211032/pourquoi-mysql-a-disparu-de-lion-server" title="Mac OS X Lion abandonne MySQL pour PostGreSQL" target="_blank">Mac OS X Lion abandonnait MySQL pour PostGreSQL</a>.</p>
<p>Pour information, je n&#8217;ai toujours pas migré de Snow Leopard vers Lion, car j&#8217;attends les 1er retours avant de me jeter sur la mise à jour.</p>
<p>Mais revenons au sujet : le remplacement de MySQL par PostGreSQL.<br />
Pour ma part, cela fait longtemps que MySQL n&#8217;est plus mon SGBD préféré, et je dirais même que j&#8217;ai pas mal de choses à lui reprocher, dont la source est toujours la même : sous couvert de simplicité d&#8217;utilisation, il ne respecte pas la norme <a href="http://www.contrib.andrew.cmu.edu/~shadow/sql/sql1992.txt" title="Norme SQL ANSI-92" target="_blank">SQL ANSI-92</a>.</p>
<ul>
<li>Possibilité d&#8217;utiliser des mots-clés réservés pour les tables, colonnes, &#8230; en utilisant le &laquo;&nbsp;`&nbsp;&raquo;</li>
<li>Création automatique d&#8217;index</li>
<li>Intégration des dates plus que limitée (tout est converti en timestamp à votre insu)</li>
<li>tant encore</li>
</ul>
<p>Je sais bien que vous pourrez me répondre &laquo;&nbsp;mais si c&#8217;est plus simple à utiliser, où est le mal ?&nbsp;&raquo;. Et j&#8217;aurais du mal à vous contredire sur ce point.<br />
Mais le soucis est ailleurs, au niveau de la maîtrise.<br />
Non seulement, les milliers (millions ?) de développeurs ayant découvert le SQL avec MySQL apprennent de très mauvaises habitudes, mais les défendent alors même qu&#8217;elles sont contraires aux standards.</p>
<p>Le plus marrant, selon moi, est que ce sont ces mêmes personnes qui défendent Mozilla parce que &laquo;&nbsp;c&#8217;est libre, respectueux des standards, alors que Internet Explorer, non&nbsp;&raquo; qui utilisent MySQL (preuve selon moi de l&#8217;immense majorité de personnes qui ont adoptés Firefox pour être &laquo;&nbsp;hype&nbsp;&raquo; et pas par conviction).</p>
<p>Bref, pour en revenir à nouveau au sujet de base, j&#8217;utilise PostGreSQL depuis plusieurs années, et j&#8217;en pense le plus grand bien : non seulement il est ouvert, en pleine force de l&#8217;âge, équipé pour supporter les très gros volumes, permettant l&#8217;utilisation de techniques SQL avancées, mais également utilisable rapidement pour des sites à petits volumes, avec des bases de données simples.</p>
<p>Donc, en conclusion, je trouve que cette migration est une très bonne nouvelle pour PostGreSQL, pour augmenter sa visibilité au développeurs amateurs, qui apprennent sur les outils démocratiques.<br />
Et, qui sais, un jour nous aurons une majorité de LAPP (Linux-Apache-PostGreSQL-PHP) au détriment du traditionnel LAMP (Linux-Apache-MySQL-PHP)</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/08/03/apple-quitte-mysql-pour-postgresql/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Création de l&#8217;antenne Lyonnaise de l&#8217;AFUP</title>
		<link>http://www.mikaelrandy.fr/2011/07/22/creation-de-lantenne-lyonnaise-de-lafup/</link>
		<comments>http://www.mikaelrandy.fr/2011/07/22/creation-de-lantenne-lyonnaise-de-lafup/#comments</comments>
		<pubDate>Fri, 22 Jul 2011 21:39:08 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[AFUP]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[afup]]></category>
		<category><![CDATA[Lyon]]></category>
		<category><![CDATA[PHP Tour]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=122</guid>
		<description><![CDATA[Comme vous en avez certainement déjà entendu parlé, l&#8217;AFUP crée sa première antenne locale, sur Lyon. Sous l&#8217;impulsion de Geoffrey...]]></description>
			<content:encoded><![CDATA[<p>Comme vous en avez <a href="http://www.afup.org/pages/site/?route=actualites/462/lafup-sa-premiere-antenne-locale-a-lyon" title="L'AFUP crée sa première antenne locale" target="_blank">certainement déjà entendu parlé</a>, l&#8217;AFUP crée sa première antenne locale, sur Lyon.</p>
<p>Sous l&#8217;impulsion de <a href="http://twitter.com/#!/ubermuda" target="_blank">Geoffrey Bachelet</a>, il y a une équipe de motivé, dont je fais parti, qui est composé d&#8217;une dizaine de personnes.</p>
<p>Nous sommes en phase de création, on se cherche un peu, mais nous avons déjà de bonnes idées, et des mises en pratique vont suivre dès la rentrée.<br />
Au programme, nous avons :</p>
<ul>
<li><a href="http://dictionnaire.phpmyvisites.net/definition-Coding-party-9218.htm" title="Coding Party" target="_blank">Coding party</a> pour recoder le site aperophp.net</li>
<li>Organisation d&#8217;une conférence technique à la rentrée</li>
<li>Déposer une candidature pour le <a href="http://www.afup.org/pages/site/?route=actualites/445/lafup-lance-son-tour-de-france-php-%20un-evenement-itinerant-le-php-Tour" title="PHP Tour" target="_blank">PHP Tour</a> 2012</li>
</ul>
<p>Un leitmotiv que nous allons tenter de suivre va être l&#8217;ouverture aux autres technologies. Et dans cette voie, nous avons participé il y a quelques temps au Barcamp Lyon 2011, avec des devs Java, JS, Ruby, Microsoft, &#8230;<br />
De cet évènement sont ressortis quelques contacts intéressants qui annoncent des collaborations intéressantes. Affaire à suivre <img src='http://www.mikaelrandy.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
<p>Je suis très content qu&#8217;une communauté de développeurs PHP se mette enfin en place sur Lyon je suis très motivé par cette association, et je compte donc m&#8217;investir autant que possible dans son activité.</p>
<p>Je suis très heureux que ça bouge enfin</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/07/22/creation-de-lantenne-lyonnaise-de-lafup/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Game Dev Party à Lyon</title>
		<link>http://www.mikaelrandy.fr/2011/06/13/game-dev-party-a-lyon/</link>
		<comments>http://www.mikaelrandy.fr/2011/06/13/game-dev-party-a-lyon/#comments</comments>
		<pubDate>Mon, 13 Jun 2011 16:40:00 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=117</guid>
		<description><![CDATA[Bonjour à tous, Je sais que je m&#8217;y prend un peu tard, puisque l&#8217;évènement aura lieu dans moins de 15...]]></description>
			<content:encoded><![CDATA[<p>Bonjour à tous,</p>
<p>Je sais que je m&#8217;y prend un peu tard, puisque l&#8217;évènement aura lieu dans moins de 15 jours maintenant, mais le week-end des 25 et 26 juin 2011 se tiendra à Lyon la première <a href="http://gamedevparty.posterous.com/">Game Dev Party Lyonnaise</a>.</p>
<p>Le principe est simple :<br />
Vous êtes développeur et vous ne savez pas comment utiliser vos compétences ?<br />
Vous avez une super idée de jeu, mais vous n&#8217;avez pas le temps/les compétences/la motivation pour la mettre en pratique ?<br />
Rejoignez-vous pour 48h, et pour aller le plus loin possible dans la réalisation de cette idée.</p>
<p>Le lieu est également sympa puisque ça sera <a href="http://gamedevparty.posterous.com/le-lieu-latelier-des-medias">l&#8217;atelier des médias</a></p>
<p>Je m&#8217;étais inscrit parce que le challenge m&#8217;intéressais beaucoup, mais des obligations familiales font que je serais dans le sud ce week-end là.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/06/13/game-dev-party-a-lyon/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Gérer facilement ses versions de node.js</title>
		<link>http://www.mikaelrandy.fr/2011/06/03/gerer-facilement-ses-versions-de-node-js/</link>
		<comments>http://www.mikaelrandy.fr/2011/06/03/gerer-facilement-ses-versions-de-node-js/#comments</comments>
		<pubDate>Fri, 03 Jun 2011 20:53:31 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Node.js]]></category>
		<category><![CDATA[n]]></category>
		<category><![CDATA[node.js]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=106</guid>
		<description><![CDATA[Pour ceux qui ne le savent pas encore, Node.js est un interpreteur de JS en ligne de commande permettant de...]]></description>
			<content:encoded><![CDATA[<p>Pour ceux qui ne le savent pas encore, <a href="http://nodejs.org/">Node.js</a> est un interpreteur de JS en ligne de commande permettant de réaliser des serveurs, dont l&#8217;énorme avantage est l&#8217;aspect asynchrone de la programmation (voir <a href="http://naholyr.fr/2011/02/node-js-lavenement-de-la-programmation-asynchrone/">cet article de naholyr</a>, qui en parle très bien.<br />
Rappelez-vous, je vous avais déjà décrit <a href="http://www.mikaelrandy.fr/2011/01/07/installer-node-js-et-zombie-js-sur-macos-x/">l&#8217;installation de node.js</a> et de npm, son <em>package manager</em></p>
<p>Ce projet, en plus d&#8217;être très prometteur, est dans une phase de développement très forte, et toujours en version beta, ce qui implique que de nouvelles versions sortent très régulièrement (15 versions depuis le début de l&#8217;année 2011, dont une version majeure).<br />
La principale conséquence est qu&#8217;il est à la fois difficile d&#8217;être toujours à jour, mais également qu&#8217;un code peut ne plus fonctionner du jour au lendemain.<br />
Heureusement, dans ce genre de technos très dans le vent, il existe toujours une solution.</p>
<p>L&#8217;astuce du jour s&#8217;appelle <a href="https://github.com/visionmedia/n">n</a>. C&#8217;est un package qui permet d&#8217;installer/activer/supprimer rapidement et facilement n&#8217;importe quelle version de node.js, en permettant à plusieurs versions de cohabiter.</p>
<h2>Installation</h2>
<p>n s&#8217;installe très facilement grâce à npm :<br />
<code>sudo npm install -g n</code></p>
<p>C&#8217;est tout. Il y a pire me direz vous.</p>
<p>EDIT : comme me le fait remarquer Naholyr dans les commentaires, la version actuelle de npm demande l&#8217;option &laquo;&nbsp;-g&nbsp;&raquo; pour une installation globale</p>
<h2>Utilisation</h2>
<p>n permet de consulter les versions de node installer, d&#8217;en ajouter, de changer la version utilisée, de supprimer des versions inutiles, ou d&#8217;installer rapidement la dernière version disponible :</p>
<h3>Voir les versions installées</h3>
<p>Cette commande affiche la liste des versions de node installées<br />
<code>mrandy:~$ n<br />
    0.4.6<br />
  ο 0.4.7<br />
</code></p>
<h3>Activer/installer une version de node.js</h3>
<p>Imaginons que vous avez besoin d&#8217;installer node.js v0.3.8 (dernière version 0.3) pour exécuter un de vos codes<br />
<code>mrandy:~$ sudo n 0.4.6<br />
mrandy:~$ n<br />
  ο 0.4.6<br />
    0.4.7<br />
</code><br />
Cette commande va modifier la version active de node (celle appelée par défaut).<br />
Dans le cas où la version demandée n&#8217;était pas installée, cette commande va télécharger les sources, les compiler, installer la version et l&#8217;activer :<br />
<code>mrandy:~$ sudo n 0.4.0<br />
[...]<br />
mrandy:~$ n<br />
  ο 0.4.0<br />
    0.4.6<br />
    0.4.7<br />
</code></p>
<h3>Installer la version la plus récente</h3>
<p>Seulement voilà, sur un projet aussi dynamique, on ne sait jamais si on a la dernière version ou pas.<br />
Heureusement, n gère ce cas puisque la commande &laquo;&nbsp;n latest&nbsp;&raquo; est un alias pour la dernière version disponible.<br />
<code>mrandy:~$ sudo n latest<br />
[...]<br />
mrandy:~$ n<br />
    0.4.0<br />
    0.4.6<br />
    0.4.7<br />
  ο 0.4.8<br />
</code></p>
<h3>Supprimer une version de node</h3>
<p>C&#8217;est bien joli tout ça, mais au bout d&#8217;un moment, on se retrouve avec plus d&#8217;une dizaine de versions installée, et c&#8217;est un peu le boxon pour un psychorigide comme moi.<br />
Mais rassurez-vous, là aussi, n a tout prévu :</p>
<p><code>mrandy:~$ sudo n rm 0.4.0<br />
[...]<br />
mrandy:~$ n<br />
    0.4.6<br />
    0.4.7<br />
  ο 0.4.8<br />
</code></p>
<h3>Et tout le reste</h3>
<p><code><br />
n help // affiche la liste des commandes de n<br />
n use 0.4.7 // Execute node avec la version donnée (activation one shot)<br />
n bin 0.4.7 // Affiche le chemin vers l'exécutable de la version donnée<br />
n ls // Affiche la liste des versions de node.js disponible, en indiquant lesquelles sont installée<br />
</code></p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/06/03/gerer-facilement-ses-versions-de-node-js/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Qui veux mes beaux tee-shirts ?</title>
		<link>http://www.mikaelrandy.fr/2011/04/18/qui-veux-mes-beaux-tee-shirts/</link>
		<comments>http://www.mikaelrandy.fr/2011/04/18/qui-veux-mes-beaux-tee-shirts/#comments</comments>
		<pubDate>Mon, 18 Apr 2011 21:24:02 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Tout le reste]]></category>
		<category><![CDATA[pilotee]]></category>
		<category><![CDATA[tee-shirts]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=99</guid>
		<description><![CDATA[Comme je l&#8217;avais dit à l&#8217;époque, j&#8217;ai participé au forum PHP 2010 en novembre dernier. Lors de cet évènement, un...]]></description>
			<content:encoded><![CDATA[<p>Comme <a href="http://www.mikaelrandy.fr/2010/11/11/forum-php-2010/">je l&#8217;avais dit à l&#8217;époque</a>, j&#8217;ai participé au forum PHP 2010 en novembre dernier.<br />
Lors de cet évènement, un <a href="http://www.pilo-tee.com/blog.php?2010/11/10/866-pilo-tee-au-forum-php-paris-2010">petit délire</a> à eu lieu dont le point commun était les tee-shirt (je vous assure que rien n&#8217;était préparé, c&#8217;est juste un gros concours de circonstance)</p>
<p>Comme vous l&#8217;aurez compris, je suis un fan de tee-shirt marrant, comme tout geek qui se respecte, et les tee-shirts en question viennent d&#8217;un site que j&#8217;aime beaucoup :  <a href="http://pilo-tee.com/">Pilo-Tee</a>.<br />
Non seulement leurs produits sont intéressants, mais la base (souvent American Apparel) est d&#8217;excellente facture, les couleurs ne délavent pas et leurs impressions sont d&#8217;une superbe qualité (même après plusieurs lavage, aucune dégradation)</p>
<p>Aujourd&#8217;hui, pour fêter leur 3 ans, le site organise un <a href="http://www.pilo-tee.com/blog.php?2011/04/18/895-et-1-et-2-et-3-annees">jeu concours</a>, et comme je trouve que ce site mérite d&#8217;être connu pour la qualité de ses produits, et que je renierais pas de gagner 10 tee-shirts, eh bien je participe <img src='http://www.mikaelrandy.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /><br />
En résumé, je poste un article pour faire connaitre le site, et, en contrepartie, je dispose d&#8217;un code promo rien que pour vous, heureux lecteurs, vous permettant de ne pas payer de frais de ports  : <strong>mrandy</strong></p>
<p>Bien entendu, le jeu concours est ouvert à tous et rien ne vous empêche de participer vous même pour faire connaitre encore un plus cet excellent site.</p>
<p>PS : Liens direct vers les tee-shirt que j&#8217;ai acheté : &laquo;&nbsp;<a href="http://pilo-tee.com/index.php?menu=boutique&#038;id_stock=109">Fork me i&#8217;m famous</a>&nbsp;&raquo; et &laquo;&nbsp;<a href="http://pilo-tee.com/index.php?menu=boutique&#038;id_stock=129">Error 404 : brain not found</a>&nbsp;&raquo;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/04/18/qui-veux-mes-beaux-tee-shirts/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>La bulle des années 2010</title>
		<link>http://www.mikaelrandy.fr/2011/04/16/la-bulle-des-annees-2010/</link>
		<comments>http://www.mikaelrandy.fr/2011/04/16/la-bulle-des-annees-2010/#comments</comments>
		<pubDate>Sat, 16 Apr 2011 08:46:41 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Prestaconcept]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=93</guid>
		<description><![CDATA[Pour une fois, je ne vais pas parler de technologie, de langages, mais de contexte économique. Plus particulièrement de l&#8217;état...]]></description>
			<content:encoded><![CDATA[<p>Pour une fois, je ne vais pas parler de technologie, de langages, mais de contexte économique. Plus particulièrement de l&#8217;état du marché dans lequel je navigue tout les jours, à savoir le développement d&#8217;applications web.</p>
<p>Pour rappel, je suis responsable technique dans une SSII lyonnaise, Prestaconcept, qui se place sur le segment des applications web, c&#8217;est à dire du développement web, mais pour plus qu&#8217;un site web vitrine.<br />
Cela parce que nous voulons vendre du développement maintenable, évolutif, avec une vrai utilité, un vrai coeur de métier, et donc accompagner nos clients sur le long terme.<br />
Ce sont d&#8217;ailleurs ces idéaux qui me font me sentir bien dans mon entreprise : on ne cherche pas à vendre à tout prix, on essaye surtout de s&#8217;inscrire dans la durée avec nos partenaires, et donner les moyens à nos développeurs de produire de la qualité.</p>
<p>Seulement, dans ce superbe tableau, il y a un problème : les clients.<br />
Je sais, ça commence comme une mauvaise blague (trop) souvent répétée, mais ne quitter pas tout de suite la lecture de ce billet.<br />
Ce qui me pousse à écrire ce billet aujourd&#8217;hui, ce sont les profils des clients qui viennent nous voir.<br />
Il y a quelques années (juste 3 petites années, avant la fameuse crise), les gens avaient des budgets, des idées. Les personnes qui demandaient des applications web étaient des investisseurs habitués au monde du web, qui connaissaient sa réalité, à savoir que ce n&#8217;est pas un eldorado où il suffit de lancer un site pour rentrer un maximum de liquide sans trop d&#8217;effort. Bref, en un mot, des gens qui savent ce qu&#8217;a été la bulle internet.</p>
<p>Toutefois, depuis le passage de la crise financière (je passerais sous silence mon analyse de cette crise …), j&#8217;ai remarqué une progressive mutation du profil client type qui vient nous voir. Nous avons de plus en plus de clients qui décident de changer de vie (travail pas assez payé, licenciement, …) et qui pensent que monter un projet web est une superbe idée, qui plus est facilité par le statut d&#8217;auto-entrepreneur.<br />
Du coup, nous voyons de plus en plus de clients qui tombent des nues lorsque nous avançons un budget à 5 chiffres pour une application e-commerce complète, ou qui s&#8217;étonnent que les maquettes et le cahier des charges n&#8217;est pas offert avant signature.</p>
<p>Maintenant, il me reste à insérer le dernier soucis pour en arriver à ma conclusion : les concurrents qui pourrissent le marché.<br />
Je vous préviens dès le début que je pense manquer de recul sur l&#8217;analyse de ces concurrents, et que mon avis n&#8217;est donc surement pas totalement éclairé.<br />
Mais je trouve que ces professionnels, souvent des free-lances, des auto-entrepreneurs ou encore des TPE qui, à l&#8217;abois, cassent complètement les prix pour survivre.</p>
<p>Mais, dites moi, des clients qui pensent faire fortune juste en étant sur le net, des prestataires qui ne tiennent pas la qualité … ce ne sont pas les ingrédients de la bulle internet ?<br />
Est-ce que le monde capitaliste est aussi cruel qu&#8217;il suffit de 10ans pour que les erreurs se répètent ?<br />
De plus, des clients qui cherchent du pas cher, et des prestataires qui sont prêts à se prostituer pour ne pas mourir. Au final, tout cela donne l&#8217;image d&#8217;un web pas cher, de mauvaise qualité (eh oui, pour 8 000€, on ne recode pas Magento) et qui ne fonctionne pas.</p>
<p>J&#8217;avoue que je souri toujours quand un client nous demande de reprendre une application que notre concurrent moins cher lui a vendu, et de me rendre compte qu&#8217;elle fait la moitié de ce qu&#8217;on avait promis, pour 3/4 du prix qu&#8217;on avait proposé (pas besoin d&#8217;avoir fait math sup&#8217; pour comprendre le soucis).<br />
Je me doute bien que, humainement, c&#8217;est compliqué &laquo;&nbsp;d&#8217;enterrer&nbsp;&raquo; un client qui viens aux abois pour qu&#8217;on lui sauve la vie. Mais c&#8217;est pas parce qu&#8217;ils ont fait confiance à quelqu&#8217;un qui n&#8217;a pas réussi à tenir ses engagements qu&#8217;on doit, nous, lui faire des cadeaux.</p>
<p>Pour finer sur use nouvelle violation de copyright : &laquo;&nbsp;I have a dream about a better web world&nbsp;&raquo;</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/04/16/la-bulle-des-annees-2010/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Appelez moi &#171;&#160;Expert certifié Zend PHP 5.3&#8243;</title>
		<link>http://www.mikaelrandy.fr/2011/03/20/appelez-moi-expert-certifie-zend-php-5-3/</link>
		<comments>http://www.mikaelrandy.fr/2011/03/20/appelez-moi-expert-certifie-zend-php-5-3/#comments</comments>
		<pubDate>Sun, 20 Mar 2011 18:56:09 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Prestaconcept]]></category>
		<category><![CDATA[certification]]></category>
		<category><![CDATA[Christophe Dolivet]]></category>
		<category><![CDATA[PHP 5.3]]></category>
		<category><![CDATA[zend]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=86</guid>
		<description><![CDATA[Eh oui, depuis mercredi 16 mars 2011, je suis officiellement un expert certifié Zend PHP 5.3. Ma société, Prestaconcept, m&#8217;a...]]></description>
			<content:encoded><![CDATA[<p>Eh oui, depuis mercredi 16 mars 2011, je suis officiellement un expert certifié Zend PHP 5.3.</p>
<p>Ma société, <a href="http://www.prestaconcept.net">Prestaconcept</a>, m&#8217;a donné l&#8217;occasion de passer la <a href="http://www.zend.com/fr/services/certification/php-5-certification/">certification Zend PHP 5.3</a> cette année, principalement pour des raisons commerciales, mais j&#8217;ai accepté avec plaisir.<br />
Nous étions 2 de ma société, puisque j&#8217;ai passé l&#8217;examen avec mon collègue <a href="http://www.cdolivet.com/">Christophe Dolivet</a>.</p>
<p>Ne sachant pas le niveau attendu, et comme je ne m&#8217;estime pas non plus le 1er venu en PHP, nous avons décidé de la passer en candidat libre, juste en révisant à l&#8217;aide de la <a href="http://static.zend.com/topics/PHP-5-3-Study-Guide-v1.pdf">documentation Zend</a> et du manuel PHP.</p>
<p>Et bien, malgré mes doutes, <a href="http://www.zend.com/fr/store/education/certification/authenticate.php/ClientCandidateID/ZEND016254/RegistrationID/240074943">JE L&#8217;AI EU</a></p>
<p>Bon, côté des points noirs, maintenant que je l&#8217;ai passé, je suis moins ébloui par cette certification, puisqu&#8217;il vaut mieux connaitre le manuel sur le bout des doigts que de savoir organiser un code, ou savoir mettre en pratique une factory ou un visiteur.<br />
Mais bon, comme cette nouvelle ligne sur mon CV semble être reconnue, je ne vais pas m&#8217;en plaindre <img src='http://www.mikaelrandy.fr/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> </p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/03/20/appelez-moi-expert-certifie-zend-php-5-3/feed/</wfw:commentRss>
		<slash:comments>7</slash:comments>
		</item>
		<item>
		<title>Installer node.js et zombie.js sur MacOS X</title>
		<link>http://www.mikaelrandy.fr/2011/01/07/installer-node-js-et-zombie-js-sur-macos-x/</link>
		<comments>http://www.mikaelrandy.fr/2011/01/07/installer-node-js-et-zombie-js-sur-macos-x/#comments</comments>
		<pubDate>Fri, 07 Jan 2011 21:54:51 +0000</pubDate>
		<dc:creator>Mikael Randy</dc:creator>
				<category><![CDATA[Développement]]></category>
		<category><![CDATA[Mac]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[MacOSX]]></category>
		<category><![CDATA[node.js]]></category>
		<category><![CDATA[npm]]></category>
		<category><![CDATA[zombie.js]]></category>

		<guid isPermaLink="false">http://www.mikaelrandy.fr/?p=70</guid>
		<description><![CDATA[Ce soir, alors que je lisais l&#8217;article de Romain Pouclet (alias @Palleas) sur le blog de Clever Age : Mise...]]></description>
			<content:encoded><![CDATA[<p>Ce soir, alors que je lisais l&#8217;article de <a href="http://www.palleas.com">Romain Pouclet</a> (alias <a href="http://twitter.com/#!/palleas">@Palleas</a>) sur le blog de Clever Age : <a href="http://www.clever-age.com/veille/blog/mise-en-place-de-tests-fonctionnels-avec-zombie-js.html">Mise en place de tests fonctionnels avec zombie.js</a>, je me suis dit qu&#8217;il était temps que j&#8217;essaye enfin node.js, dont je n&#8217;entends que du bien.</p>
<p>Comme j&#8217;ai eu quelques problèmes, notamment lors de l&#8217;installation de zombie.js, je vous partage mes découvertes</p>
<h3>Installation de node.js</h3>
<p>Pour rappel, <a href="http://nodejs.org/">node.js</a> est un framework JS se basant sur le moteur javascript V8, le moteur utilisé par Chrome.<br />
Il permet de créer des applications serveur codées en javascript.</p>
<p>Pour cette première étape, la procédure donnée par Romain fonctionne sans soucis</p>
<p><code>git clone https://github.com/ry/node.git<br />
cd node<br />
./configure &#038;&#038; make &#038;&#038; sudo make install</code></p>
<p>Pour les débutants de git, la 1ère ligne va downloader le code source de node.js, il est donc nécessaire de se placer dans un répertoire spécifique. Pour ma part, je dispose d&#8217;un répertoire &laquo;&nbsp;~/vendor&nbsp;&raquo; qui me sert à ça.</p>
<h3>Installation de zombie.js</h3>
<p><a href="http://zombie.labnotes.org/">Zombie.js</a>, quand a lui est une extension node.js permettant d&#8217;exécuter du code javascript distant.<br />
Romain l&#8217;utilise pour réaliser des tests fonctionnels d&#8217;écran utilisant javascript.</p>
<h4>Installation de npm</h4>
<p>La méthode la plus simple est effectivement d&#8217;utiliser <a href="http://npmjs.org/">npm</a>, un package manager for node. En gros, il s&#8217;agit d&#8217;un macport dédié pour node.js</p>
<p>Pour cela, il suffit de taper la ligne suivante :<br />
<code>curl http://npmjs.org/install.sh | sudo sh</code></p>
<h4>Installation de zombie.js</h4>
<p>Maintenant, attaquons la dernière étape, celle qui m&#8217;a posé le plus de soucis : l&#8217;installation de zombie.js</p>
<p>Normalement, il suffit de lancer la ligne de commande suivante :<br />
<code>sudo npm install zombie</code></p>
<p>Sauf que, dans mon cas, l&#8217;installation échouais sur une erreur de ce type :<br />
<code>npm ERR! Error: base64@1.0.1 install: `node-waf configure build`<br />
npm ERR! `sh` failed with 1<br />
npm ERR!     at ChildProcess.<anonymous> (/usr/local/lib/node/.npm/npm/0.2.14-1/package/lib/utils/exec.js:25:18)<br />
npm ERR!     at ChildProcess.emit (events.js:34:17)<br />
npm ERR!     at ChildProcess.onexit (child_process.js:164:12)<br />
npm ERR!<br />
npm ERR! Failed at the base64@1.0.1 install script.<br />
npm ERR! This is most likely a problem with the base64 package,<br />
npm ERR! not with npm itself.<br />
npm ERR! Tell the author that this fails on your system:<br />
npm ERR!     node-waf configure build<br />
npm ERR! You can get their info via:<br />
npm ERR!     npm owner ls base64<br />
npm ERR! There may be additional logging output above.<br />
</code></p>
<p>En remontant un peu, l&#8217;erreur exacte était la suivante :<br />
<code><br />
Waf: Entering directory `/usr/local/lib/node/.npm/base64/1.0.1/package/build'<br />
[1/2] cxx: base64.cc -> build/default/base64_1.o<br />
../base64.cc: In function ‘v8::Handle<v8::Value> base64_encode_binding(const v8::Arguments&#038;)’:<br />
../base64.cc:132: error: ‘class node::Buffer’ has no member named ‘data’<br />
../base64.cc:132: error: ‘class node::Buffer’ has no member named ‘length’<br />
../base64.cc: In function ‘v8::Handle<v8::Value> base64_decode_binding(const v8::Arguments&#038;)’:<br />
../base64.cc:150: error: ‘class node::Buffer’ has no member named ‘data’<br />
../base64.cc:150: error: ‘class node::Buffer’ has no member named ‘length’<br />
Waf: Leaving directory `/usr/local/lib/node/.npm/base64/1.0.1/package/build'<br />
Build failed:  -> task failed (err #1):<br />
	{task: cxx base64.cc -> base64_1.o}<br />
npm info base64@1.0.1 Failed to exec install script<br />
npm ERR! install failed Error: base64@1.0.1 install: `node-waf configure build`<br />
npm ERR! install failed `sh` failed with 1<br />
npm ERR! install failed     at ChildProcess.<anonymous> (/usr/local/lib/node/.npm/npm/0.2.14-1/package/lib/utils/exec.js:25:18)<br />
npm ERR! install failed     at ChildProcess.emit (events.js:34:17)<br />
npm ERR! install failed     at ChildProcess.onexit (child_process.js:164:12)<br />
</code></p>
<p>Heureusement, après une petite recherche Google, je suis tombé sur la solution au fond d&#8217;un <a href="https://gist.github.com/765894">gist</a> : npm utilise une version personnelle de la librairie base64, qui n&#8217;est pas la meilleure.<br />
Il vaut mieux commencer par installer la bonne librairie :<br />
<code><br />
git clone git://github.com/substack/node-base64.git<br />
cd node-base64<br />
sudo npm install .<br />
</code></p>
<p>Une fois cette étape réalisée, il suffit de relancer l&#8217;installation de zombie pour que ça fonctionne</p>
<p><code>sudo npm install zombie</code></p>
<p>Le problème dont parle Romain dans son article était un soucis de &laquo;&nbsp;missing dependencies&nbsp;&raquo; qui était simplement dû au fait que son npm n&#8217;était pas à jour, et il a fallu le mettre à jour, donc en gros de reprendre la procédure d&#8217;installation.</p>
]]></content:encoded>
			<wfw:commentRss>http://www.mikaelrandy.fr/2011/01/07/installer-node-js-et-zombie-js-sur-macos-x/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

