<?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</title>
	<atom:link href="http://www.maximegarcia.fr/blog/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.2</generator>
		<item>
		<title>Récupérer des photos sur une SD Card</title>
		<link>http://www.maximegarcia.fr/blog/2010/12/recuperer-des-photos-sur-une-sd-card/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/12/recuperer-des-photos-sur-une-sd-card/#comments</comments>
		<pubDate>Sat, 25 Dec 2010 13:53:01 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[Système]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=236</guid>
		<description><![CDATA[Rien à voir avec d&#8217;habitude, on va tourner aujourd&#8217;hui autour des cartes SD des appareils photos numériques. On va voir comment récupérer des photos perdues et aussi comment éviter que quelqu&#8217;un ne récupère vos photos supprimées. On est sous Ubuntu. &#8230; <a href="http://www.maximegarcia.fr/blog/2010/12/recuperer-des-photos-sur-une-sd-card/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-275" title="SD Card" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/12/sd-card.head_.jpg" alt="" width="640" height="200" /></p>
<p>Rien à voir avec d&#8217;habitude, on va tourner aujourd&#8217;hui autour des cartes SD des appareils photos numériques.</p>
<p>On va voir comment récupérer des photos perdues et aussi comment éviter que quelqu&#8217;un ne récupère vos photos supprimées.</p>
<p><span id="more-236"></span></p>
<p>On est sous Ubuntu. Si vous êtes sous Windows, <a href="http://www.ubuntu.com/desktop/get-ubuntu/download" target="_blank">télécharger un live-cd Ubuntu</a> et démarrez dessus. Autant utiliser un logiciel libre qui a fait ses preuves plutôt que payer un soft bidon à 80€ car vous êtes désespérés (ils le savent, d&#8217;où le prix).</p>
<p>Tout ceci est applicable à n&#8217;importe quel support, une clé USB ou une partition de disque dur par exemple. Et bien entendu, pour n&#8217;importe quel type de fichier (le rapport de 15 pages que vous venez de connement supprimer).</p>
<p>En préalable, je rappelle juste qu&#8217;il  faut travailler à partir d&#8217;un autre support (une autre partition&#8230;)  afin de ne pas réduire vos chances à zéro.</p>
<h2>Récupérer des photos perdues</h2>
<p>Il est plus efficace d&#8217;insérer la carte SD dans un lecteur de carte que d&#8217;y accéder depuis l&#8217;APN connecté en USB. Les ordinateurs portables ont tous un lecteur de carte multiformat.</p>
<p>Première étape, il faut connaître le périphérique. Faites <kbd>ls /dev/mmc*</kbd> ou si la carte est montée la commande <kbd>df</kbd> vous donnera ces infos :</p>
<pre>Sys. de fich.            Taille  Uti. Disp. Uti% Monté sur
/dev/sda2              19G  5,9G   12G  33% /
/dev/sda5             106G   96G  4,5G  96% /home
/dev/sda3              19G  2,2G   16G  13% /var
/dev/sr0              4,2G  4,2G     0 100% /media/cdrom0
/dev/mmcblk0p1        3,8G  111M  3,7G   3% /media/FC30-8E5A</pre>
<p>On voit que <kbd>/dev/mmcblk0p1</kbd> est notre carte SD.</p>
<p>On va faire une image de la carte sur le disque dur. On va créer un dossier pour l&#8217;occasion et utiliser la commande <kbd>dd</kbd> pour faire cette image :</p>
<pre>mkdir sd-recovery &amp;&amp; cd sd-recovery
dd if=/dev/mmcblk0p1 of=./carte-sd.img</pre>
<p>C&#8217;est assez lent, <kbd>dd</kbd> copie l&#8217;intégralité des blocs. Pour une carte de 4 Go, même s&#8217;il est annoncé qu&#8217;elle contient que 2 Go d&#8217;espace occupé, il faut donc compter donc que <kbd>dd</kbd> copie 4 Go (à environ 7 Mo/s).</p>
<p>On va travailler sur l&#8217;image de la carte avec un outil nommé <kbd>foremost</kbd>. Si ce n&#8217;est déjà fait, installez-le :</p>
<pre>sudo aptitude install foremost</pre>
<p>Et on lance la bête :</p>
<pre>sudo foremost -v -i carte-sd.img</pre>
<p>Maintenant il faut être patient. <kbd>foremost</kbd> va parcourir tous les blocs de l&#8217;image de la carte SD à la recherche de fichiers. Tous ce qui est trouvé est placé dans le dossier output, trié par type. Les noms des fichiers trouvés ne sont pas les noms originaux mais reflètent à quel endroit ils ont été trouvés.</p>
<p>Dernière petite étape, on va mettre les droits comme il faut (ça a été exécuté en tant que root avec sudo) :</p>
<pre>sudo chown -R $USER output</pre>
<p>Et voilà. C&#8217;est pas infaillible, mais ça en trouve beaucoup. En fait, tant que les blocs n&#8217;ont pas été réécrits, les données sont toujours présentes. Donc moins vous avez utilisé la carte depuis la perte des photos, plus vous avez de chance de tout récupérer.</p>
<h2>Empêcher la récupération</h2>
<p>On vient de voir qu&#8217;il faut éviter de réécrire sur les blocs pour espérer en récupérer le plus. Tout naturellement, pour empêcher ça, l&#8217;idée est donc de réécrire sur les blocs. On va créer un fichier rempli de données aléatoires qui va occuper toute la place restante.</p>
<p>Le point de montage de la carte (visible avec <kbd>df</kbd>) étant <kbd>/media/FC30-8E5A/</kbd>, on utilise la commande <kbd>dd</kbd> :</p>
<pre>dd if=/dev/urandom of=/media/FC30-8E5A/gros-fichier.aaa</pre>
<p>C&#8217;est assez long (comptez environ 5 Mo/s, soit 1/4h pour 4 Go). La commande <kbd>dd</kbd> s&#8217;arrête quand il n&#8217;y a plus de place. Il ne reste qu&#8217;à supprimer ce fichier :</p>
<pre>rm -fr /media/FC30-8E5A/gros-fichier.aaa</pre>
<p>Les plus paranoïaques répéteront l&#8217;opération 2 ou 3 fois.</p>
<p>Voilou. Maintenant vous pouvez jouer les espions, ou sauver un Noël.</p>
<div id="tweetbutton236" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F12%2Frecuperer-des-photos-sur-une-sd-card%2F&amp;via=maximegarcia&amp;text=R%C3%A9cup%C3%A9rer%20des%20photos%20sur%20une%20SD%20Card&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F12%2Frecuperer-des-photos-sur-une-sd-card%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/12/recuperer-des-photos-sur-une-sd-card/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Optimiser ses CSS côté serveur automatiquement</title>
		<link>http://www.maximegarcia.fr/blog/2010/08/optimiser-ses-css-cote-serveur-automatiquement/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/08/optimiser-ses-css-cote-serveur-automatiquement/#comments</comments>
		<pubDate>Wed, 11 Aug 2010 21:54:58 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Webmastering]]></category>
		<category><![CDATA[CSS]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[PHP]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=218</guid>
		<description><![CDATA[Optimiser la vitesse de chargement de ses pages Web, ça en devient presque à la mode, surtout depuis le pavé dans la marre jeté par Google. Voici de quoi remuer tout ça, et augmenter nos scores Yslow ou Page Speed &#8230; <a href="http://www.maximegarcia.fr/blog/2010/08/optimiser-ses-css-cote-serveur-automatiquement/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Optimiser la vitesse de chargement de ses pages Web, ça en devient <a href="http://autourduncafe.fr/2010/08/10/les-sites-high-tech-sont-ils-optimises/" target="_blank">presque à la mode</a>, surtout depuis le <a href="http://www.keeg.fr/2010/04/15/google-tient-compte-de-la-vitesse-pour-le-referencement/" target="_blank">pavé dans la marre jeté par Google</a>.</p>
<p>Voici de quoi remuer tout ça, et augmenter nos scores Yslow ou Page Speed (et nous aimons ça). On va chasser les octets superflus, on va s&#8217;attaquer aux CSS.</p>
<p><span id="more-218"></span></p>
<p>Et l&#8217;occasion qui fait le larron, c&#8217;est la sortie de <a href="http://libre.maxbusiness.fr/cssmin/" target="_blank">MAX CssMin</a>, un optimiseur CSS écrit en PHP que je viens de releaser en GNU GPL. Une sortie du placard car cela fait un petit moment que je l&#8217;utilise pour différents projets. Il ne touche pas à la sémantique, que de <a href="http://libre.maxbusiness.fr/cssmin/fonctionnement.html" target="_blank">l&#8217;amélioration de syntaxe</a>. Pour l&#8217;instant, c&#8217;est le meilleur que j&#8217;ai pu essayé. Bon, à la fin, c&#8217;est la guerre des octets, que des micros optimisations, mais j&#8217;en ai encore quelques unes en réserves. La version 0.2 verra une option pour tout mettre sur une seule ligne. Pour l&#8217;instant ça le fait pas encore (vous pouvez en éditant le fichier cssmin et en décommentant la ligne en dessous du commentaire &laquo;&nbsp;Efface les retours à la ligne (à désactiver par défaut)&nbsp;&raquo;).</p>
<p>On va se faire un petit script à placer sur le serveur, lancé par cron chaque nuit qui va optimiser vos fichiers CSS, tout seul.</p>
<p><img class="aligncenter size-full wp-image-234" title="Compte tour" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/08/587661_compteur.jpg" alt="" width="400" height="300" /></p>
<p>Aller, on se ssh à son serveur.</p>
<p>Les prérequis (rien de bien extraordinaire, adaptez la commande à votre système de paquet) :</p>
<pre>aptitude install php5-cli unzip</pre>
<p>On commence par installer le MAX CssMin en version script (CLI). Copiez-collez ceci (après avoir lu et compris) dans votre terminal :</p>
<pre>wget http://libre.maxbusiness.fr/files/cssmin/cssmin-0.1.zip
wget http://libre.maxbusiness.fr/files/cssmin/cssmin-0.1.zip.md5
md5sum -c cssmin-0.1.zip.md5
unzip cssmin-0.1.zip
chmod +x cssmin
mv cssmin /usr/local/bin
cssmin --help</pre>
<p>Bonus, ça vérifie même la somme md5 de l&#8217;archive. C&#8217;est installé. Tapez <kbd>cssmin --help</kbd> pour les options courantes.</p>
<p>On va créer un script shell, nommons le css.sh qui va contenir les commandes de minification. C&#8217;est lui qui sera appelé par la tâche cron toutes les nuits. Créons le. Voici son contenu :</p>
<pre>#!/bin/sh
cssmin -rbq /var/www/monsite/css/style.css
cssmin -rbq /var/www/monsite2/css/style2.css</pre>
<p>Explications : -q vous passe en mode quiet (pas de blabla sauf si erreurs), -r c&#8217;est le mode replace (on écrase le fichier CSS par sa version minifiée) et -b c&#8217;est le mode better (on ne fait les changements que si le résultat est meilleur). En l&#8217;occurrence, le mode better vous permettra de ne pas avoir la date de modification du fichier mise à jour chaque nuit (apache s&#8217;en sert pour les instructions de cache aux navigateurs).</p>
<p>Vous placer une ligne comme ça par fichier à optimiser. Je vous conseille d&#8217;essayer en console avant (sans l&#8217;option -q).</p>
<p>On rend ce script exécutable :</p>
<pre>chmod +x css.sh</pre>
<p>Maintenant, on enregistre une tâche cron, réglée pour être lancée pour tous les jours à 03:05. Tapez <kbd>crontab -e</kbd> et ajoutez dont une ligne :</p>
<pre>5 3 * * * /home/mon/chemin/vers/mon/script/css.sh</pre>
<p>Et voilà. Vos fichiers CSS se ré-optimiseront tout seuls, même après vos uploads de nouvelles versions, non optimisées.</p>
<p><a href="http://libre.maxbusiness.fr/cssmin/" target="_blank">MAX CssMin</a> n&#8217;en est qu&#8217;à ses débuts publics, mais on peut déjà faire des choses intéressantes avec. Un bonus pour la fin :</p>
<pre>cat style-1.css style-2.css style-3.css | cssmin &gt; all-min.css</pre>
<div id="tweetbutton218" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F08%2Foptimiser-ses-css-cote-serveur-automatiquement%2F&amp;via=maximegarcia&amp;text=Optimiser%20ses%20CSS%20c%C3%B4t%C3%A9%20serveur%20automatiquement&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F08%2Foptimiser-ses-css-cote-serveur-automatiquement%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/08/optimiser-ses-css-cote-serveur-automatiquement/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Google sait exactement où j&#8217;habite !</title>
		<link>http://www.maximegarcia.fr/blog/2010/05/google-sait-exactement-ou-jhabite/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/05/google-sait-exactement-ou-jhabite/#comments</comments>
		<pubDate>Fri, 14 May 2010 12:21:39 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Divers]]></category>
		<category><![CDATA[e-Commerce]]></category>
		<category><![CDATA[Google]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=203</guid>
		<description><![CDATA[Il y a quelque temps, j&#8217;ai eu la surprise de constater que Google Analytics était arrivé à me localiser très précisément, dans mon petit village. Comment a-t&#8217;il fait ? Essayons de comprendre. Google arrive à en savoir beaucoup. Et par &#8230; <a href="http://www.maximegarcia.fr/blog/2010/05/google-sait-exactement-ou-jhabite/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/05/google-map.head_.jpg" alt="" title="Google Map" width="640" height="200" class="size-full wp-image-263" /></p>
<p>Il y a quelque temps, j&#8217;ai eu la surprise de constater que Google Analytics était arrivé à me localiser très précisément, dans mon petit village. Comment a-t&#8217;il fait ? Essayons de comprendre.</p>
<p><span id="more-203"></span></p>
<p>Google arrive à en savoir beaucoup. Et par beaucoup, on peux déjà commencer par dire : vous situer géographiquement. Moi, c&#8217;est à Bernin, petite commune de la vallée du Grésivaudan. Et Google le sait, voyez donc :</p>
<p><img class="aligncenter size-full wp-image-202" title="google-bernin" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/05/google-bernin.png" alt="Google connait Bernin" width="400" height="200" /></p>
<p>Comment Google est arrivé à le savoir ?</p>
<p>Déjà, il existe des bases de données qui font la correspondance entre des adresses IP et leur localisation (GeoIP). La précision est relative, elle se situe à l&#8217;échelle du NRA (répartiteur téléphonique sur lequel votre ligne est branché). On peut regarder le <a href="http://www.mon-ip.com/" target="_blank">reverse DNS de son ip</a> pour comprendre. Par exemple, chez moi ça donne : cro38-1-xxx-xxx-xxx-xxx.fbx.proxad.net. Il lui suffit d&#8217;avoir la liste des NRA de Free et il sait que j&#8217;habite à Crolles (bien connu des savoyards avec le rond-point pour payer moins cher au péage&#8230;) ou autour.</p>
<p>À Crolles ou autour, ok. Mais ça nous dit pas Bernin. Et sachant qu&#8217;avant, il me situait à Crolles, vous comprenez que ça m&#8217;a un peu intrigué.</p>
<p>Autre élément, j&#8217;ai une ligne ADSL chez Free (ça vous l&#8217;avez compris), mais en dégroupage total. Ce qui signifie que j&#8217;ai involontairement une IP fixe. Et Google aime ça. Au bout d&#8217;un moment, il s&#8217;est rendu compte que l&#8217;IP était toujours la même. Cette IP ne se balade pas à Crolles ou autour, mais y est logée à un endroit précis et de manière fixe. Chez Orange par exemple, vous changez d&#8217;IP à chaque reconnexion de la box, donc là c&#8217;est plus chaud pour Google.</p>
<p>Ok, mais ça nous dit toujours pas Bernin. En parlant de dire Bernin, à quel moment je lui ai dit, volontairement ou non, à Google, que j&#8217;habitais à Bernin ?</p>
<p>La réponse : en passant des commandes sur des boutiques en ligne ! Qui, de plus, utilisait Google Analytics et qui <a href="http://www.google.com/support/googleanalytics/bin/answer.py?hl=fr&amp;answer=55528" target="_blank">ont paramétré le e-Commerce</a>. Oui oui, GA collecte à la demande des boutiques le montant du panier, les frais de port, le détail (de manière codifié) des articles, et&#8230; suspense&#8230; la ville de livraison.</p>
<p>Au fil du temps (et des commandes donc), Google a vu que la ville de livraison était quasi<sup><a href="http://www.maximegarcia.fr/blog/2010/05/google-sait-exactement-ou-jhabite/#footnote_0_203" id="identifier_0_203" class="footnote-link footnote-identifier-link" title="Ceux qui veulent briller en soir&eacute;e mondaine pourront prononcer &amp;laquo;&amp;nbsp;couazi&amp;nbsp;&amp;raquo;">1</a></sup> systématiquement Bernin, que Bernin c&#8217;était juste à côté de Crolles et donc Google a donc compris que mon IP, qui est fixe, est logée à Bernin. Il s&#8217;est donc mis l&#8217;info de côté. C&#8217;est pourquoi, j&#8217;apparais comme visiteur venant de Bernin dans tous les rapports GA des sites que je visite.</p>
<p>Je ne vois pas d&#8217;autres façons.</p>
<p>Il y en a qui savent croiser le fer. Google sait croiser les informations. Quel coquin !</p>
<ol class="footnotes"><li id="footnote_0_203" class="footnote">Ceux qui veulent briller en soirée mondaine pourront prononcer &laquo;&nbsp;couazi&nbsp;&raquo;</li></ol><div id="tweetbutton203" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F05%2Fgoogle-sait-exactement-ou-jhabite%2F&amp;via=maximegarcia&amp;text=Google%20sait%20exactement%20o%C3%B9%20j%26%238217%3Bhabite%20%21&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F05%2Fgoogle-sait-exactement-ou-jhabite%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/05/google-sait-exactement-ou-jhabite/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<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>
<div id="tweetbutton186" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F03%2Fpi-day-calculer-pi-avec-rand%2F&amp;via=maximegarcia&amp;text=Pi%20Day%20%3A%20calculer%20Pi%20en%20PHP%20avec%20rand%28%29&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F03%2Fpi-day-calculer-pi-avec-rand%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></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>Bloquer une ip</title>
		<link>http://www.maximegarcia.fr/blog/2010/03/bloquer-une-ip/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/03/bloquer-une-ip/#comments</comments>
		<pubDate>Tue, 02 Mar 2010 08:40:53 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=175</guid>
		<description><![CDATA[Cela arrive parfois, un petit malin s&#8217;amuse à flooder un des services de votre serveur. Le dernier en date pour moi c&#8217;était hier soir, 15000 connexions avec erreur de syntaxe en quelques minutes sur le serveur de mail. Et si &#8230; <a href="http://www.maximegarcia.fr/blog/2010/03/bloquer-une-ip/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p><img class="alignnone size-full wp-image-273" title="Mur de brique rouge" src="http://www.maximegarcia.fr/blog/wp-content/uploads/2010/03/mur-brique.head_.jpg" alt="" width="640" height="200" /></p>
<p>Cela arrive parfois, un petit malin s&#8217;amuse à flooder un des services de votre serveur. Le dernier en date pour moi c&#8217;était hier soir, 15000 connexions avec erreur de syntaxe en quelques minutes sur le serveur de mail.</p>
<p>Et si on le bloquait via son ip ? Voyons comment y remédier.</p>
<p><span id="more-175"></span></p>
<p>Sous Linux, Iptables est là pour ça (entre autres). Il suffit de lancer cette commande pour ajouter une règle qui va bien :</p>
<pre>iptables -A INPUT -s &lt;ip_embêtante&gt; -j DROP</pre>
<p>Attention à ne pas mettre votre ip, vous seriez dans l&#8217;impossibilité de vous connecter au serveur (effet immédiat). Les règles sont perdues au redémarrage donc si vous voulez les conserver de manière permanente, il va falloir faire un script lancé au démarrage. Dans ce cas, bloquer cette ip jusqu&#8217;au redémarrage me va bien.</p>
<p>Et pour lister vos règles en cours :</p>
<pre>iptables -L</pre>
<p>C&#8217;est toujours utile à avoir sous la main, ne serait-ce que pour le petit malin occasionnel.</p>
<p><em>Crédit photo : <a href="http://www.lunerouge.org/spip/article.php3?id_article=913" target="_blank">Lionel Allorge</a>.</em></p>
<div id="tweetbutton175" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F03%2Fbloquer-une-ip%2F&amp;via=maximegarcia&amp;text=Bloquer%20une%20ip&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F03%2Fbloquer-une-ip%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/03/bloquer-une-ip/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>
<div id="tweetbutton168" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F02%2Fhiphop-compilateur-php-et-bottleneck-php%2F&amp;via=maximegarcia&amp;text=HipHop%2C%20compilateur%20PHP%20et%20bottleneck%20PHP&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F02%2Fhiphop-compilateur-php-et-bottleneck-php%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></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>iPad, iTampon ou iAgain ?</title>
		<link>http://www.maximegarcia.fr/blog/2010/01/ipad-itampon-ou-iagain/</link>
		<comments>http://www.maximegarcia.fr/blog/2010/01/ipad-itampon-ou-iagain/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 10:11:11 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Je réagis]]></category>
		<category><![CDATA[Apple]]></category>
		<category><![CDATA[iPad]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=155</guid>
		<description><![CDATA[C&#8217;est le buzz du moment, Apple a annoncé en grande pompe sa tablette tactile l&#8217;iPad. Steve Jobs a mis le paquet &#171;&#160;The most important thing I&#8217;ve ever done&#160;&#187; ; pourtant le nom a déjà bien fait rire les américains puisque &#8230; <a href="http://www.maximegarcia.fr/blog/2010/01/ipad-itampon-ou-iagain/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>C&#8217;est le buzz du moment, Apple a annoncé en grande pompe sa tablette tactile l&#8217;iPad. Steve Jobs a mis le paquet &laquo;&nbsp;<em>The most important thing I&#8217;ve ever done</em>&nbsp;&raquo; ; pourtant le nom a déjà bien fait rire les américains puisque &laquo;&nbsp;pad&nbsp;&raquo; signifie serviette hygiénique.</p>
<p>Tout le monde y va de son commentaire, alors moi aussi : Apple nous la refait à l&#8217;envers. Explications.</p>
<p><span id="more-155"></span>Disons déjà que c&#8217;est joli, ça promet une interface léchée et une expérience utilisateur sympathique. Un iPhone version 10&#8243;.</p>
<p>Et c&#8217;est là que le bat blesse. Ce sera bel et bien un iPhone en plus grand, avec tout ce qui va avec.</p>
<p>On va avoir un iPhone OS adapté. Et pas de OS X adapté. Cela traduit la volonté d&#8217;enfermement des applications dans la lignée de l&#8217;AppStore, avec le business model qui va si bien (à Apple). On ne pourra pas y loger ce qu&#8217;on veut, mais uniquement télécharger des applications (gratuites ou payantes) approuvées par Apple. Les développeurs devront payer un droit d&#8217;enregistrement et subir la terrible décision d&#8217;Apple qui peut refuser ce qu&#8217;il veut sans avoir à se justifier. Quand on sait que le modèle économique pour les développeurs <a href="http://www.applicationiphone.com/2009/12/ipilule-chronique-application-iphone-developpement-promotion-ventes-appstore/" target="_blank">n&#8217;est pas si facile que ça</a>, ça laisse sur sa faim.</p>
<p>Bien sûr cela promet une interface commune comme sur l&#8217;iPhone grâce au SDK, mais c&#8217;est au prix d&#8217;une absence totale de bidouillabilité. Impossible de se faire sa propre appli qui va bien (je pense aux fans de la domotique&#8230;).</p>
<p>Et qui dit iPhone OS amélioré dit aussi :</p>
<ul>
<li>Toujours pas de possibilité d&#8217;avoir plusieurs applications qui tournent en même temps ;</li>
<li>Safari uniquement : Apple refuse tout autre navigateur ;</li>
<li>Pas de Flash : J&#8217;aime pas le flash, certes. Mais là ça veut dire qu&#8217;on se prive de plein de sites fonctionnant avec flash (Allociné pour les bandes annonces&#8230;).</li>
</ul>
<p>Niveau matériel maintenant. Apple nous refait-il le coup de l&#8217;iPhone ? D&#8217;abord un iPhone EDGE uniquement, sans GPS à l&#8217;époque des téléphones 3G et incluant le GPS. Puis vint plus tard l&#8217;iPhone 3G avec le GPS. Tour de passe-passe suprême, ou comment faire acheter deux iPhones aux Mac Addicts. Cette fois non, le tour est presque différent. Il y a déjà une version 3G (plus chère de $130). Mais la caméra ? Pas de caméra. Pourtant, <a href="http://www.macplus.net/magplus/depeche-51552-ipad-en-europe-apn" target="_blank">on sent que c&#8217;est prévu</a>&#8230; Et le GPS ?</p>
<p>Le gros du tour est dans les accessoires, l&#8217;autre manne d&#8217;Apple. Seule, l&#8217;iPad ne permet pas grand chose. Il n&#8217;y a même pas de port USB. Pour brancher votre appareil photo, il vous faut le petit accessoire qui va bien (un connecteur USB ou le lecteur de carte SD). Oui vous avez bien entendu, pas de lecteur SD inclus, pour un engin pareil, c&#8217;est un gros fail.</p>
<p>Donc en résumé, c&#8217;est un iPhone plus grand, avec moins de choses. Donc c&#8217;est bien, c&#8217;est beau. Mais c&#8217;est limité.</p>
<p>Je me prenais à rêver d&#8217;une tablette tactile pour mes applications en semi ou pleine mobilité : faire l&#8217;inventaire ou préparer une commande avec l&#8217;iPad, ça aurait pu le faire&#8230;</p>
<div id="tweetbutton155" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F01%2Fipad-itampon-ou-iagain%2F&amp;via=maximegarcia&amp;text=iPad%2C%20iTampon%20ou%20iAgain%20%3F&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F01%2Fipad-itampon-ou-iagain%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2010/01/ipad-itampon-ou-iagain/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>
<div id="tweetbutton141" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F01%2Fet-bom-dans-ta-face%2F&amp;via=maximegarcia&amp;text=Et%20BOM%20%21%20Dans%20ta%20face.&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2010%2F01%2Fet-bom-dans-ta-face%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></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>SSH sans mot de passe</title>
		<link>http://www.maximegarcia.fr/blog/2009/12/ssh-sans-mot-de-passe/</link>
		<comments>http://www.maximegarcia.fr/blog/2009/12/ssh-sans-mot-de-passe/#comments</comments>
		<pubDate>Fri, 11 Dec 2009 15:06:51 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Sécurité]]></category>
		<category><![CDATA[SSH]]></category>
		<category><![CDATA[Ubuntu]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=136</guid>
		<description><![CDATA[Quand on commence à se servir de SSH de manière un peu intensive, il peut devenir très intéressant de se servir du mécanisme de clé partagée pour s&#8217;authentifier. Surtout quand on se sert de système de gestion de version avec &#8230; <a href="http://www.maximegarcia.fr/blog/2009/12/ssh-sans-mot-de-passe/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Quand on commence à se servir de SSH de manière un peu intensive, il peut devenir très intéressant de se servir du mécanisme de clé partagée pour s&#8217;authentifier. Surtout quand on se sert de système de gestion de version avec des dépôts distants.</p>
<p><span id="more-136"></span></p>
<p>Le principe : sur votre ordinateur perso, vous avez une clé privée, et vous enregistrez votre clé public sur le(s) serveur(s). Quand vous vous connectez, seule la passphrase de votre clé sera à taper. Ce qui fait un seul mot de passe à taper pour tous vos serveurs, ou aucun mot de passe à taper si vous n&#8217;en spécifiez pas (dans ce cas, éviter de faire ça sur des serveurs avec login root possible, sudo est votre ami).</p>
<p>Sur votre machine, vous générez vos clés :</p>
<pre>ssh-keygen -t dsa -b 1024</pre>
<p>Il devrez vous demander où les stocker. Par défaut c&#8217;est très bien (/home/maxime/.ssh/id_dsa). Après vous choisissez (ou pas) une passphrase.</p>
<p>Ensuite, il faut les installer sur vos serveurs. Retenez la commande que vous utilisez pour vous connecter en ssh. Si c&#8217;est :</p>
<pre>ssh maxime@mon-serveur</pre>
<p>Alors, toujours sur votre machine locale, vous faites :</p>
<pre>ssh-copy-id -i ~/.ssh/id_dsa.pub maxime@mon-serveur</pre>
<p>Et le tour est joué. Connectez vous en ssh avec la commande habituelle, et plus de mot de passe (ou bien une seule passphrase pour tous vos serveurs).</p>
<div id="tweetbutton136" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2009%2F12%2Fssh-sans-mot-de-passe%2F&amp;via=maximegarcia&amp;text=SSH%20sans%20mot%20de%20passe&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2009%2F12%2Fssh-sans-mot-de-passe%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2009/12/ssh-sans-mot-de-passe/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Éteindre par le bouton Power sous Ubuntu Server</title>
		<link>http://www.maximegarcia.fr/blog/2009/12/eteindre-par-le-bouton-power-sous-ubuntu-server/</link>
		<comments>http://www.maximegarcia.fr/blog/2009/12/eteindre-par-le-bouton-power-sous-ubuntu-server/#comments</comments>
		<pubDate>Thu, 10 Dec 2009 11:51:48 +0000</pubDate>
		<dc:creator>Maxime Garcia</dc:creator>
				<category><![CDATA[Système]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[Ubuntu]]></category>
		<category><![CDATA[VirtualBox]]></category>

		<guid isPermaLink="false">http://www.maximegarcia.fr/blog/?p=133</guid>
		<description><![CDATA[J&#8217;ai quelques machines virtuelles pour gérer différentes versions de CouchDB. J&#8217;ai pris l&#8217;habitude de les éteindre via la croix de la fenêtre en leur envoyant un signal ACPI, comme si j&#8217;appuyais sur le bouton Power du boitier (qu&#8217;elles n&#8217;ont pas, &#8230; <a href="http://www.maximegarcia.fr/blog/2009/12/eteindre-par-le-bouton-power-sous-ubuntu-server/">Continuer la lecture <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai quelques machines virtuelles pour <a title="Installer plusieurs versions de CouchDB grâce à VirtualBox" href="http://www.couchdb-fr.net/commencer/virtualbox" target="_blank">gérer différentes versions de CouchDB</a>. J&#8217;ai pris l&#8217;habitude de les éteindre via la croix de la fenêtre en leur envoyant un signal ACPI, comme si j&#8217;appuyais sur le bouton Power du boitier (qu&#8217;elles n&#8217;ont pas, elles sont virtuelles !).</p>
<p>Celles sous Debian marchaient bien, mais celles sous Ubuntu Karmic Koala Server, impossible ! Pour éteindre proprement, il fallait me logguer et faire sudo halt. Peut-être un bug avec VirtualBox ?</p>
<p><span id="more-133"></span></p>
<p>Et bien pareil sur mon vrai serveur de développement : sous Debian, quand j&#8217;appuie sur le bouton Power, il lance son extinction comme il faut, et sous Ubuntu Server que dalle ! Tout juste ça rallume l&#8217;écran et pouet : &laquo;&nbsp;Si tu veux m&#8217;éteindre, il va falloir te logguer !&nbsp;&raquo;. Et quand il y a pas d&#8217;écran ni de clavier avec, faut rallumer un PC pour s&#8217;y connecter en SSH ! Bravo le veau.</p>
<p>Et j&#8217;ai trouvé, Ubuntu Server est pas packagée de la même manière. Il y a des choses en plus (rien ne me vient à l&#8217;idée là), des choses en moins (la préemption dans le noyau) et des choses en remplacement (l&#8217;ordonnanceur n&#8217;est pas le même) par rapport à la version Desktop. Et parmi les choses en moins, acpid.</p>
<pre>sudo aptitude install acpid</pre>
<p>Même pas besoin de redémarrer pour que ça marche&#8230; Une action (virtuelle ou pas) sur le bouton Power lance bien l&#8217;arrêt propre du PC.</p>
<div id="tweetbutton133" class="tw_button" style="float:right;margin-left:10px;"><a href="http://twitter.com/share?url=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2009%2F12%2Feteindre-par-le-bouton-power-sous-ubuntu-server%2F&amp;via=maximegarcia&amp;text=%C3%89teindre%20par%20le%20bouton%20Power%20sous%20Ubuntu%20Server&amp;related=&amp;lang=fr&amp;count=horizontal&amp;counturl=http%3A%2F%2Fwww.maximegarcia.fr%2Fblog%2F2009%2F12%2Feteindre-par-le-bouton-power-sous-ubuntu-server%2F" class="twitter-share-button"  style="width:55px;height:22px;background:transparent url('http://www.maximegarcia.fr/blog/wp-content/plugins/wp-tweet-button/tweetn.png') no-repeat  0 0;text-align:left;text-indent:-9999px;display:block;"></a></div>]]></content:encoded>
			<wfw:commentRss>http://www.maximegarcia.fr/blog/2009/12/eteindre-par-le-bouton-power-sous-ubuntu-server/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

