<?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>e-Maxime &#187; Programmation</title>
	<atom:link href="http://www.maximegarcia.fr/blog/category/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>http://www.maximegarcia.fr/blog</link>
	<description>Un autre entrepreneur du Web</description>
	<lastBuildDate>Sat, 26 Mar 2011 18:16:45 +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>Pi Day : calculer Pi en PHP avec rand()</title>
		<link>http://www.maximegarcia.fr/blog/2010/03/pi-day-calculer-pi-avec-rand/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/03/pi-day-calculer-pi-avec-rand/#comments</comments>
		<pubDate>Sun, 14 Mar 2010 14:42:39 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=186</guid>
		<description><![CDATA[Aujourd&#8217;hui, c&#8217;est le 14 mars. Noté à l&#8217;anglaise, on est le 3/14 et, tenez-vous bien, ça fait le nombre Pi à deux décimales. Vous allez me dire &#171;&#160;il est un peu siphonné lui !&#160;&#187;, mais pour ma défense, quand on &#8230; <a href="http://www.maximegarcia.fr/blog/2010/03/pi-day-calculer-pi-avec-rand/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Aujourd&#8217;hui, c&#8217;est le 14 mars. Noté à l&#8217;anglaise, on est le 3/14 et, tenez-vous bien, ça fait le nombre Pi à deux décimales. Vous allez me dire &laquo;&nbsp;il est un peu siphonné lui !&nbsp;&raquo;, mais pour ma défense, quand on a fait des mathématiques et de la physique à un niveau un peu poussé, on aime Pi ! Je l&#8217;ai jamais fêté pourtant.</p>
<p>Donc pour cette occasion un peu spéciale, je vais vous présenter une méthode un peu inattendue pour calculer Pi. On va utiliser la fonction rand().</p>
<p><span id="more-186"></span></p>
<p>On va utiliser le hasard et les probabilités. Fuyez pas, vous allez voir, c&#8217;est sympa. C&#8217;est la méthode de Monte-Carlo (vous savez, ses casinos, ses jeux de hasard&#8230;).</p>
<p>Regardons cette figure présentant un quart de disque de rayon 1 :</p>
<p style="text-align: center;"><img class="aligncenter size-full" title="pi-montecarlo" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/03/pi-montecarlo.png" alt="Détermination de Pi par la méthode de Monte Carlo" width="300" height="300" /></p>
<p>L&#8217;aire de ce quart de disque est de Pi / 4 et l&#8217;aire totale du carré est de 1.</p>
<p>Le principe est simple : on va tirer des points au hasard. La probabilité (notons la P) que chaque point soit dans ce quart de cercle est donc de P=Pi/4. Et cette probabilité, on va la calculer en faisant un tirage de N points. Il y en aura disons X qui tomberont dans le quart de cercle. On divise X par N et on a notre probabilité P.</p>
<p>Finalement, on a P=Pi/4 et P=X/N donc Pi/4=X/N d&#8217;où <strong>Pi=4*X/N</strong>.</p>
<p>On tire alors un point au hasard. On va utiliser la fonction <em>rand</em> (ou <em>mt_rand</em>, plus rapide et meilleure au niveau distribution aléatoire) pour déterminer ses coordonnées X et Y. Et s&#8217;il vérifie X²+Y² &lt; 1 alors il est dans le quart de cercle. On répète ça un paquet de fois et le tour est joué.</p>
<p>Voyons comment on code ça en PHP. J&#8217;ai optimisé un peu la chose en ne ramenant pas les coordonnées dans [0,1]² ce qui évite des divisions. Le code :</p>
<pre>&lt;?php
$totalDotNumber = 100001;

$inCircleDotNumber = 0;
$maxRand = mt_getrandmax();
$maxRand_pow2 = pow($maxRand, 2);

for ($i=0; $i&lt;$totalDotNumber; $i++) {
&nbsp;&nbsp;&nbsp;&nbsp;if ( (pow(mt_rand(), 2)+pow(mt_rand(), 2) ) &lt; $maxRand_pow2) {
&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;$inCircleDotNumber++;
&nbsp;&nbsp;&nbsp;&nbsp;}
}

$frequency = $inCircleDotNumber / $totalDotNumber;
$pi = $frequency*4;

echo 'Points tirés : '.$totalDotNumber."\n";
echo 'dont dans le cercle : '.$inCircleDotNumber."\n";
echo 'Fréquence : '.$frequency.' (=Pi/4)'."\n";
echo 'd\'où : Pi = '.$pi."\n";
?&gt;</pre>
<p>On tire 500&nbsp;000&nbsp;points, ça prend 5 secondes et on obtient par exemple Pi=3,14436971126. Bon la précision n&#8217;est pas fameuse, mais on a bien (heu souvent&#8230;) 3,14 et des poussières.</p>
<p>On va s&#8217;arrêter là avec Pi, on va pas chercher à améliorer la chose, c&#8217;était juste pour le principe. La <a title="Méthode de Monte-Carlo" href="http://fr.wikipedia.org/wiki/M%C3%A9thode_de_Monte-Carlo" target="_blank">méthode de Monte-Carlo</a> permet de calculer des intégrales de dimensions supérieure à 1 (avec 2 on a des aires, 3 des volumes, 4 c&#8217;est pour Albert Einstein dont c&#8217;est l&#8217;anniversaire aujourd&#8217;hui&#8230;).</p>
<p>Moi, ça m&#8217;épate. Pas vous ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/03/pi-day-calculer-pi-avec-rand/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>HipHop, compilateur PHP et bottleneck PHP</title>
		<link>http://www.maximegarcia.fr/blog/2010/02/hiphop-compilateur-php-et-bottleneck-php/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/02/hiphop-compilateur-php-et-bottleneck-php/#comments</comments>
		<pubDate>Wed, 03 Feb 2010 11:43:49 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Je réagis]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Compilateur]]></category>
		<category><![CDATA[Framework]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=168</guid>
		<description><![CDATA[Les développeurs de Facebook ont mis au point HipHop for PHP. Pas si loin du compilateur PHP tel que Roadsand ou phc, HipHop réalise une traduction du code source PHP en C++ et se charge de le compiler en embarquant &#8230; <a href="http://www.maximegarcia.fr/blog/2010/02/hiphop-compilateur-php-et-bottleneck-php/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-277" title="Des éléPHPants" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/02/elephpant-groupe.head_.jpg" alt="" width="640" height="200" /></p>
<p>Les développeurs de Facebook ont mis au point <strong>HipHop for PHP</strong>. Pas si loin du compilateur PHP tel que <a href="http://www.roadsend.com/home/index.php?pageID=compiler" target="_blank">Roadsand</a> ou <a href="http://www.phpcompiler.org/" target="_blank">phc</a>, <a href="http://developers.facebook.com/hiphop-php/" target="_blank">HipHop</a> réalise une traduction du code source PHP en C++ et se charge de le compiler en embarquant un serveur HTTP léger.</p>
<p>Alors on entend tout et rien à son sujet, alors mettons quelques éléments de compréhension sur la table.</p>
<p><span id="more-168"></span></p>
<p>Optimiser son application / son site est un domaine en soi. On peut mettre en cache les résultats des appels aux bases de données (via la base elle-même ou un autre moyen), mettre en cache des parties ou des pages entières générées&#8230; <a href="http://memcached.org/" target="_blank">Memcached</a> sera votre ami dans bien des cas. Je ne parle même pas d&#8217;une utilisation optimale de plusieurs serveurs HTTP (un pour les données statiques, un autre pour les scripts).</p>
<p>Enfin bref, on arrive vite à une limite, un appel où tout est en cache. Et quand on veut améliorer les performances, il faut se tourner du côté de PHP.</p>
<p>Il est déjà important de savoir comment fonctionne PHP. Quand on appelle un script, il est parsé, puis traduit en opcode lequel opcode est ensuite lancé dans une machine virtuelle qui fera le reste du boulot (traduction en instructions CPU et exécution). Ceci à chaque fois.</p>
<p>On peut évidemment optimiser un peu ça. Il y a principalement les <a href="http://en.wikipedia.org/wiki/List_of_PHP_accelerators" target="_blank">caches d&#8217;opcode</a> (APC, eAccelerator&#8230;). Mais on arrive vite à une autre limite, la machine virtuelle prendra bien un opcode caché, mais elle refera éternellement le même boulot.</p>
<p>L&#8217;idée est alors de compiler le PHP. Passons sur phc qui semble inactif.</p>
<p>On a d&#8217;un côté Roadsand, qui proposent une autre implémentation de PHP et qui vont effectivement traduire votre script en instructions binaires pour le CPU (bref compiler). Et de l&#8217;autre on a HipHop qui va traduire votre script PHP en C++, puis le compiler. Pourquoi j&#8217;ai séparé les deux ? Ils arrivent au même résultat. Mais par des moyens différents. On a un binaire. Selon les possibilités, il intègre son serveur HTTP, ou bien il dialogue via <a href="http://www.fastcgi.com" target="_blank">FastCGI</a> avec un serveur HTTP.</p>
<p>Roadsend permet du runtime eval (eval, include), HipHop non et le sacrifie fièrement. On va pas rentrer dans les détails inutiles ici.</p>
<p>Je passe aussi l&#8217;optimisation au sens propre du code : profilage, blablabla et tout et tout. Ça se fait très bien et permet de voir des défauts d&#8217;architecture.</p>
<p>Bref, voyons ce qui nous a amené ici : l&#8217;optimisation, compiler PHP et les diverses conneries entendues. Ne retenons qu&#8217;une seule chose entendue, qui n&#8217;est pas foncièrement une connerie et qui mérite nuance et explication. Les conneries, elles, elles resteront.</p>
<p>Lu chez <a href="http://maxime.sh/2010/02/hiphop-lhistoire-dun-mal-necessaire/" target="_blank">Maxime Valette</a> :</p>
<blockquote><p>Avant d’en arriver au stade d’avoir besoin de compiler du PHP transformé en C++, il faudrait déjà penser à s’affranchir de son framework qui ne peut que ralentir l’exécution de son site.</p></blockquote>
<p>Bon, un framework, pourquoi ? Si Yahoo a choisi <a href="http://www.symfony-project.org/" target="_blank">Symfony</a>, c&#8217;est pour une bonne raison : le développement. Ils savaient très bien que c&#8217;est une surcharge de PHP. Mais un développement en équipe, agile, reposant sur des briques découplables, testable est plus qu&#8217;un confort. C&#8217;est générique. mais c&#8217;est un gain d&#8217;argent. Un développeur coûte cher. Les serveurs, c&#8217;est pas cher. Seule la bande passante est chère. (comparativement)</p>
<p>Il y a des cas où le service est relativement simple, avec une évolution limitée des fonctionnalités. Dans ce cas, oui, faites sans framework. Il ne sert à rien de sortir le marteau pilon pour écraser la mouche. Vous pouvez, mais ne râlez pas à propos de performance sur la lourdeur du framework. Vous avez fait un choix, celui de penser aux capacités de développement avant tout. Si vous voulez, vous pouvez créer votre propre framework, adapté à votre utilisation, pour combiner le meilleur des deux. Mais quand vous aurez tout optimisé, système de cache et tout et tout, alors PHP sera votre facteur limitant, du fait de votre framework. The bottleneck.</p>
<p>Bon, c&#8217;est assez tranché, mais tout ça pour vous dire que le PHP peut devenir le facteur limitant. Parce que déjà, si quelque chose est en cache, il faut bien à un moment ou à un autre l&#8217;y mettre. Et puis quand tout sort de cache, il y a quand même du code qui s&#8217;exécute.</p>
<p>Pas convaincu ? Essayez de générer un fichier PDF à l&#8217;aide de FPDF. Pas le truc de Mickey, un gros PDF, pleins de pages. Par exemple, 5000 bons de commandes en un seul PDF. Vous allez le sentir le bottleneck, vous allez sentir du PHP pur qui tourne. Récupérer les infos de la base de donnée c&#8217;est du gâteau à côté (c&#8217;est peut-être même déjà en cache ?). Les appels d&#8217;appels de re-appels de fonctions, de méthodes, d&#8217;objets&#8230; c&#8217;est élégant, mais ça a un coût.</p>
<p>Donc, compiler PHP peut-être une porte à ouvrir, si on veut gagner en terme de performance. Facebook en était là. Et c&#8217;est tant mieux, ça complète la voie.</p>
<p><em>Crédit photo : <a href="http://www.flickr.com/photos/dragonbe/3411273755/" target="_blank">DragonBe</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/02/hiphop-compilateur-php-et-bottleneck-php/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Et BOM ! Dans ta face.</title>
		<link>http://www.maximegarcia.fr/blog/2010/01/et-bom-dans-ta-face/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/01/et-bom-dans-ta-face/#comments</comments>
		<pubDate>Mon, 11 Jan 2010 17:36:23 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=141</guid>
		<description><![CDATA[Alors que j&#8217;aidais un peu Robix à refondre le site de locations à Tignes de sa belle maman (réécriture d&#8217;URL, i18n&#8230;), on est tombé sur un os. Un vrai, un dur. Un put&#8230;n d&#8217;espace apparaissait dans nos navigateurs (firefox windows &#8230; <a href="http://www.maximegarcia.fr/blog/2010/01/et-bom-dans-ta-face/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Alors que j&#8217;aidais un peu <a href="http://www.robix-elayce-australia.com/" target="_self">Robix</a> à refondre le site de <a title="Location Tignes" href="http://www.location-vente-tignes.fr" target="_blank">locations à Tignes</a> de sa belle maman (réécriture d&#8217;URL, i18n&#8230;), on est tombé sur un os. Un vrai, un dur. Un put&#8230;n d&#8217;espace apparaissait dans nos navigateurs (firefox windows et linux, ie8&#8230;). Ce n&#8217;était ni un margin, ni un padding&#8230; Et pile à des endroits où il y avait des inclusions en PHP, mais c&#8217;était pas systématique. Comment perdre deux heures de notre vie, qu&#8217;on ne rattrapera jamais plus !<span id="more-141"></span></p>
<p>Cela venait d&#8217;un caractère UTF8 appelé le <strong>BOM</strong> (<strong>Byte Order Mark</strong> &#8211; <strong>U+FEFF</strong>) qui est censé donné l&#8217;ordre de lecture des données. Sauf qu&#8217;en UTF8, il n&#8217;y a qu&#8217;un sens, donc ce BOM ne sert à rien. Du coup, je sais même pas pourquoi il existe. Ils se trouvent au tout début de fichier.</p>
<p>Si ce n&#8217;était que cela, ça irait. Mais voilà, PHP les envoie et les navigateurs les affichent ces cons de BOM. Cela pose donc deux problèmes : un possible envoi de header prématuré avec PHP (génant) et ce fameux espace à la noix dont on a mis 2h à trouver d&#8217;où il sortait.</p>
<p>Les symptômes :</p>
<ul>
<li>Erreur PHP &laquo;&nbsp;headers already sent&nbsp;&raquo; alors que vous avez apparemment rien envoyé au navigateur ;</li>
<li>Vous avez l&#8217;encodage UTF8 de détecté : l&#8217;espace blanc à la c..n (si votre fond est blanc, sinon ça peut être un espace bleu&#8230;);</li>
<li>Vous forcez l&#8217;encodage du navigateur en ISO-8859-1 : <strong>ï»¿</strong> apparait à la place de l&#8217;espace blanc ;</li>
</ul>
<p>Pour résoudre ça, si vous avez l&#8217;option (idiote soit dit en passant) de pouvoir enregistrer en UTF8 avec ou sans BOM dans votre éditeur favori, vous choisirez la version sans BOM.</p>
<p>Sinon, vous sortez votre éditeur héxadécimal et la séquence à éradiquer est <strong>EFBBBF</strong>. En général il se trouve au tout début du fichier. Mais attention, ce caractère de 3 octets est vil et mesquin, avec des copiés-collés, il peut se multiplier et se retrouver pas qu&#8217;au début. (Sous VIM il apparait en tant que <strong>&lt;FEFF&gt;</strong> mais uniquement s&#8217;il n&#8217;est pas au début, s&#8217;il l&#8217;est, on le voit pas).</p>
<p>Il aura fallu que je rapatrie des fichiers PHP UTF8 de Windows pour voir arriver ce genre de merdouille. Robix, Linux, c&#8217;est pour quand ?</p>
]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/01/et-bom-dans-ta-face/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>PHP : Accès aux variables non déclarées</title>
		<link>http://www.maximegarcia.fr/blog/2009/10/php-acces-aux-variables-non-declarees/</link>
		<comments>http://www.maximegarcia.fr/blog/2009/10/php-acces-aux-variables-non-declarees/#comments</comments>
		<pubDate>Sun, 25 Oct 2009 13:00:48 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Performance]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=127</guid>
		<description><![CDATA[Quand on accède à des variables non déclarées, cela a un coût en terme de performance. En effet, PHP tente de la trouver, constate qu&#8217;il n&#8217;y arrive pas et lève une erreur de type E_WARNING, et ce même si vous &#8230; <a href="http://www.maximegarcia.fr/blog/2009/10/php-acces-aux-variables-non-declarees/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-277" title="Des éléPHPants" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/02/elephpant-groupe.head_.jpg" alt="" width="640" height="200" /></p>
<p>Quand on accède à des variables non déclarées, cela a un coût en terme de performance. En effet, PHP tente de la trouver, constate qu&#8217;il n&#8217;y arrive pas et lève une erreur de type E_WARNING, et ce même si vous ne les affichez pas. Démonstration.</p>
<p><span id="more-127"></span></p>
<p>Exécutons 100 000 fois le code de référence, la variable $variable n&#8217;étant pas déclarée :</p>
<pre>if ($variable=='test')
  { }</pre>
<p>Cela prend en moyenne 180ms.</p>
<p>Voyons le code, amélioré :</p>
<pre>if (isset($variable) &amp;&amp; $variable=='test')
  { }</pre>
<p>100 000 exécutions prennent alors en moyenne 42ms, soit une amélioration de 75% en terme de rapidité d&#8217;exécution.</p>
<p>Ce test donne les même résultats que ce soit une variable ($test), un élément de tableau ($test['test']) ou autre.</p>
<p>PHP est souple au niveau des variables (déclaration, typage), l&#8217;avantage en terme de programmation a un coût en terme de performances.</p>
<p>Si vous voulez améliorer celles de votre app, laissez s&#8217;afficher les erreurs E_WARNING : en effet ce n&#8217;est pas parce qu&#8217;elles ne sont pas affichées par votre configuration de PHP qu&#8217;elles ne sont pas présentes. PHP lèvent ces erreurs quoiqu&#8217;il arrive, donc mieux vaut les voir et les éradiquer.</p>
<p>Déclarez explicitement vos variables, ou testez en premier leur existance via isset() avant d&#8217;y accéder.</p>
<p><em>Crédit photo : <a href="http://www.flickr.com/photos/dragonbe/3411273755/" target="_blank">DragonBe</a>.</em></p>
]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2009/10/php-acces-aux-variables-non-declarees/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

