<?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>AbriCoCotier.fr &#187; Wordpress</title>
	<atom:link href="http://www.abricocotier.fr/tag/wordpress/feed" rel="self" type="application/rss+xml" />
	<link>http://www.abricocotier.fr</link>
	<description>Analyses et anticipations sur le web et les nouvelles technologies de demain.</description>
	<lastBuildDate>Tue, 07 Feb 2012 21:17:20 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>WordPress : comment optimiser son fichier robots.txt pour les crawlers</title>
		<link>http://www.abricocotier.fr/17489-wordpress-comment-optimiser-fichier-robots-txt-crawlers</link>
		<comments>http://www.abricocotier.fr/17489-wordpress-comment-optimiser-fichier-robots-txt-crawlers#comments</comments>
		<pubDate>Thu, 05 Jan 2012 11:10:22 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=17489</guid>
		<description><![CDATA[Comme tout CMS, WordPress a besoin d&#8217;un certain nombre de fichiers de &#171;&#160;fonctionnement&#160;&#187;, qu&#8217;il vaut mieux cacher des crawlers afin d&#8217;éviter qu&#8217;ils se retrouvent sur les moteurs de recherches, et que via une requête bien ficelée, des potentiels hackers trouvent &#8230; <a href="http://www.abricocotier.fr/17489-wordpress-comment-optimiser-fichier-robots-txt-crawlers">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Comme tout CMS, WordPress a besoin d&#8217;un certain nombre de fichiers de &laquo;&nbsp;fonctionnement&nbsp;&raquo;, qu&#8217;il vaut mieux cacher des crawlers afin d&#8217;éviter qu&#8217;ils se retrouvent sur les moteurs de recherches, et que via une requête bien ficelée, des potentiels hackers trouvent facilement quels sites laissent ouverts certains de leurs dossiers. <span id="more-17489"></span></p>
<p><img title="wordpress" src="http://www.abricocotier.fr/wp-content/uploads/2009/05/wordpress.jpg" alt="" width="580" /></p>
<p>Bien sûr, veillez à mettre ce fichier à la racine de votre blog : www.monsite.fr/robots.txt</p>
<pre class="brush: plain; title: ; notranslate">
User-agent: *
# On empêche l'indexation des dossiers sensibles
Disallow: /cgi-bin
Disallow: /wp-admin
Disallow: /wp-includes
Disallow: /wp-content/plugins
Disallow: /wp-content/cache
Disallow: /wp-content/themes
Disallow: /trackback
Disallow: /feed
Disallow: /comments
Disallow: /category/*/*
Disallow: */trackback
Disallow: */feed
Disallow: */comments
Disallow: /*?*
Disallow: /*?
# On autorise l'indexation des images
Allow: /wp-content/uploads
User-agent: Googlebot
# On empêche l'indexation des fichiers sensibles
Disallow: /*.php$
Disallow: /*.js$
Disallow: /*.inc$
Disallow: /*.css$
Disallow: /*.gz$
Disallow: /*.swf$
Disallow: /*.wmv$
Disallow: /*.cgi$
Disallow: /*.xhtml$
# Autoriser Google Image
User-agent: Googlebot-Image
Disallow:
Allow: /*
# Autoriser Google AdSense
User-agent: Mediapartners-Google*
Disallow:
Allow: /*
# On indique au spider le lien vers notre sitemap
Sitemap: http://www.geekpress.fr/sitemap.xml
</pre>
<p><a href="http://www.geekpress.fr/wordpress/astuce/fichier-robots-txt-optimise-wordpress-503/">Source</a></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2012. |
<a href="http://www.abricocotier.fr/17489-wordpress-comment-optimiser-fichier-robots-txt-crawlers">Permalien</a> |
<a href="http://www.abricocotier.fr/17489-wordpress-comment-optimiser-fichier-robots-txt-crawlers#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/17489-wordpress-comment-optimiser-fichier-robots-txt-crawlers/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Démarrage de Madmagz : déjà plusieurs magazines vendus</title>
		<link>http://www.abricocotier.fr/16585-demarrage-de-madmagz-deja-plusieurs-magazines-vendus</link>
		<comments>http://www.abricocotier.fr/16585-demarrage-de-madmagz-deja-plusieurs-magazines-vendus#comments</comments>
		<pubDate>Wed, 23 Nov 2011 08:32:24 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Madmagz]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=16585</guid>
		<description><![CDATA[J&#8217;ai échangé quelques emails avec Youssef Rahoui, avec qui j&#8217;avais pu faire connaissance lors d&#8217;un passage chez Viadeo (ça remonte !), et qui avait lancé une offre permettant de créer, publier et monétiser son magazine en ligne, via le site &#8230; <a href="http://www.abricocotier.fr/16585-demarrage-de-madmagz-deja-plusieurs-magazines-vendus">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;ai échangé quelques emails avec Youssef Rahoui, avec qui j&#8217;avais pu faire connaissance lors d&#8217;un <a href="http://www.abricocotier.fr/4983-viadeo-remet-tout-a-neuf-petit-a-petit">passage chez Viadeo</a> (ça remonte !), et qui avait lancé une offre permettant de <a href="http://www.abricocotier.fr/9215-madmagz-un-concept-de-magazine-interessant-face-a-loffre-de-la-concurrence">créer, publier et monétiser son magazine en ligne</a>, via le site <a href="http://www.madmagz.com/">Madmagz</a>. En gros, c&#8217;était il y a moins d&#8217;un an.</p>
<p>Or il y a environ 2 mois, Youssef m&#8217;a envoyé quelques chiffres sur l&#8217;avancement de sa boite, en me demandant ce que j&#8217;en pensais. Le problème, c&#8217;est qu&#8217;en regardant le concept, j&#8217;arrivais à y voir un beau site, bien fait bien construit, mais je ne parvenais pas à croire en l&#8217;aventure. Pas à cause de lui, donc, mais à cause du secteur dans lequel il s&#8217;est lancé. Je lui ai expliqué ça par mail, ce à quoi il m&#8217;a répondu en me montrant que la situation n&#8217;était pas aussi noire que je la voyais (j&#8217;ai tendance à être assez défaitiste, sachez-le ; au passage c&#8217;est plutôt encourageant quand je me montre enthousiasmé par un projet !), et que l&#8217;aventure commençait à démarrer.    <span id="more-16585"></span></p>
<p><img src="http://www.abricocotier.fr/wp-content/uploads/2011/11/madmagz-vendez-magazine.jpg" alt="" title="madmagz-vendez-magazine" width="580" height="422" class="alignleft size-full wp-image-16587" /></p>
<p>Dans le but de l&#8217;aider, et dans l&#8217;idée de faire connaitre les chiffres qu&#8217;il m&#8217;a fournit, je lui ai proposé de publier tels quels les mails que nous nous sommes échangés. Il a accepté, les voici :</p>
<p>Premier mail de Youssef à moi :</p>
<blockquote><p>
Nous avons :</p>
<ol>
<li><a href="http://www.journaldunet.com/ebusiness/le-net/levee-de-fonds-madmagz-0211.shtml">levée</a> de 300k€
</li>
<li>redesign du site
</li>
<li>redesign du magazine web (HTML5, partageable sur réseaux sociaux…)
</li>
<li>lancement de la version anglaise avec ventes dans tous les pays
</li>
<li>et, surtout, nous avons lancé une marketplace de maquettes de magazines.</li>
</ol>
<p>Le principe est simple. Nos utilisateurs peuvent désormais acheter sur Madmagz des maquettes réalisées par des graphistes tiers. Ces graphistes sont rémunérés sur les ventes. Grâce à cela, nous passons d&#8217;application Web à plate-forme Web avec un écosystème (cf. mon <a href="http://blog.madmagz.com/madmagz-lance-une-place-de-marche-de-maquettes-de-magazines">article</a> de blog sur les enjeux).</p>
<p>Sinon, deux autres nouveautés majeures à lancer d&#8217;ici la fin d&#8217;année :</p>
<ul>
<li>Novembre : possibilité pour nos éditeurs de vendre leur magazine depuis la version online : on gère tout (paiement, fulfilment…), ils n&#8217;ont qu&#8217;à encaisser
</li>
<li>possibilité pour tous de créer un magazine pour l&#8217;iPad.
</li>
</ul>
</blockquote>
<p>A ce mail, donc je ne répondais pas (ne sachant pas quoi répondre d&#8217;autre que ma vision complètement défaitiste), et Youssef m&#8217;a donc relancé. Bien lui en a pris. Voilà son deuxième mail :</p>
<blockquote><p>
Bonjour Louis,</p>
<p>Je ne crois pas avoir reçu ta réponse. En tous cas, grande nouveauté : il est désormais possible de vendre son magazine en ligne. Les lecteurs, depuis la version Web, pourront commander le PDF ou le papier. Nous gérons tout : encaissement, impression, envoi. L&#8217;éditeur n&#8217;a qu&#8217;à fixer ses marges et il est rémunéré pour chaque vente ! Voici un exemple réel du <a href="http://madmagz.com/fr/magazine/104840">magazine d&#8217;un sommelier renommé</a>.</p>
<p>Sinon, ce qui arrive sur Madmagz :</p>
<ul>
<li>en décembre, <a href="http://vimeo.com/23445324">iPad</a>
</li>
<li>en février au plus tard : la possibilité de rendre payante la version Web en ne montrant par exemple que les premières pages
</li>
<li>en mars au plus tard : des partenariats de diffusion avec des kiosques en ligne.</li>
</ul>
</blockquote>
<p>Pour ceux qui se demanderaient à quoi ressemble le magazine du sommelier renommé, j&#8217;ai été voir, et il faut reconnaitre que c&#8217;est très propre. </p>
<p><img src="http://www.abricocotier.fr/wp-content/uploads/2011/11/magazine-sommelier-renomme-madmagz.jpg" alt="" title="magazine-sommelier-renomme-madmagz" width="580" /></p>
<p>Le contenant est là, en quelque sorte, ne reste plus qu&#8217;à avoir du contenu.</p>
<p>Ce a quoi j&#8217;avais répondu (toujours aussi noir de ma part) :</p>
<blockquote><p>
Bonjour Youssef,</p>
<p>J&#8217;avais bien reçu ton mail, il était toujours dans ma boite de reception, en attente que je te fasse une réponse construite.</p>
<p>Je n&#8217;ai actuellement que mon iPhone mais je vais essayer d&#8217;être clair pour autant.</p>
<p>Je me pose actuellement pas mal de questions sur la façon de rentabiliser la création decontenu (pour mon blog, notamment). Ma conclusion pour le moment est qu&#8217;aujourd&#8217;hui, la création de contenu est gratuite, et en fait n&#8217;est qu&#8217;un résultat d&#8217;interactions sociales. En gros, j&#8217;écris un article pour obtenir de la considération, de la confiance de la part du public visé.</p>
<p>Du coup, se lancer sur le business de la creation de contenu n&#8217;est a mon avis pas une bonne chose.</p>
<p>Pour Madmagz, on peut dire que vous vendez un moyen de publication de contenus. Après tout, d&#8217;autres le font, comme WordPress.com. Et ils gagnent bien leur vie. Mais ça nécessite une énorme base de users car la marge est extrêmement faible. C&#8217;est à mon avis le plus gros problème de Magmagz. La base de users.</p>
<p>Ensuite, si on prend le problème à l&#8217;envers, avec la consommation de contenus, je vois de moins en moins de gens aller directement et regulièrement sur les blogs. Le nouveau business semble se faire du côté des magazines automatiques tels que Flipboard et surtout Zite. Mais même eux, je ne sais pas comment ils vont finir par gagner de l&#8217;argent.</p>
<p>Bref, pas de critique/conseil réel à te donner (d&#8217;où ma non réponse jusqu&#8217;alors), mais beaucoup d&#8217;interrogation sur l&#8217;avenir de ce business.</p>
<p>Bon courage,</p>
<p>Louis
</p></blockquote>
<p>Pas découragé pour autant, Youssef m&#8217;avait corrigé :</p>
<blockquote><p>
Bonjour Louis,</p>
<p>Merci de ton avis !</p>
<p>Il y a en effet ceux qui produisent du contenu (blogueurs… : disons éditeurs) et ceux qui permettent d&#8217;en produire (WordPress, nous, etc. : disons CMS). Aujourd&#8217;hui, il est très difficile de vivre de son blog, même avec plusieurs centaines de milliers de lecteurs. Adsense rapporte des clous et les CMS ne proposent pas de solutions.</p>
<p>C&#8217;est là où je pense que l&#8217;on est innovant : on apporte le CMS mais aussi (depuis jeudi !) la solution de monétisation. Les éditeurs peuvent adosser à leur webzine un kiosque qui permet aux lecteurs d&#8217;acheter en ligne la version PDF ou papier. Dans les prochains mois, l&#8217;éditeur pourra même rendre payant la lecture de son webzine en n&#8217;en découvrant que les premières pages. Voici :</p>
<ul>
<li><a href="http://www.flickr.com/photos/29157008@N04/sets/72157628083131474/show/">comment ça marche</a>
</li>
<li>deux magazines qui le font, le dernier ayant déjà vendu (!) :
<ul>
<li><a href="http://madmagz.com/fr/magazine/104840">Au service du vin</a>
</li>
<li><a href="http://madmagz.com/magazine/109583">Breizh riding</a>.</li>
</ul>
</li>
</ul>
<p>D&#8217;après mes estimations, c&#8217;est au moins deux fois plus rémunérateur qu&#8217;Adsense.</p>
<p>Enfin, sur la question du volume, tu as raison. Mais note que ce n&#8217;est pas propre au business du contenu mais au business du Web : Paypal, eBay, Google, Facebook, etc. ne valent rien sans volume car le revenu par internaute (ARPU) est <a href="http://www.flickr.com/photos/29157008@N04/5123788204/sizes/l/in/photostream/">faible</a>.</p>
<p>Si tu veux en savoir plus sur la solution du kiosque (ça peut t&#8217;intéresser en tant que blogueur pour des dossiers ou recycler des articles de fond), à ta disposition !
</p></blockquote>
<p>Puis j&#8217;ai demandé à Youssef s&#8217;il acceptait que je publie notre conversation. Il m&#8217;a demandé si je pouvais adjoindre à celle-ci le communiqué ou la prez qu&#8217;il a fait de son site. Cela me semble la moindre des choses, <a href="https://docs.google.com/present/view?id=dg2d54pt_742dt6tcxfs">donc la voici</a>.</p>
<p>Et comme je suis une buse et que je n&#8217;arrive pas à trouver le code embed de cette prez GoogleDocs, je vous mets une vidéo d&#8217;un interview de Youssef, où il explique le principe de Madmagz.</p>
<p><iframe width="580" height="325" src="http://www.youtube.com/embed/D_SurSmbPyA" frameborder="0" allowfullscreen></iframe></p>
<p>Edit : voilà l&#8217;embed de la prez :</p>
<p><iframe src="https://docs.google.com/present/embed?id=dg2d54pt_742dt6tcxfs&#038;size=m" frameborder="0" width="555" height="451"></iframe></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/16585-demarrage-de-madmagz-deja-plusieurs-magazines-vendus">Permalien</a> |
<a href="http://www.abricocotier.fr/16585-demarrage-de-madmagz-deja-plusieurs-magazines-vendus#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/madmagz" rel="tag">Madmagz</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/16585-demarrage-de-madmagz-deja-plusieurs-magazines-vendus/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Sortie de WordPress 3.2</title>
		<link>http://www.abricocotier.fr/15088-sortie-de-wordpress-3-2</link>
		<comments>http://www.abricocotier.fr/15088-sortie-de-wordpress-3-2#comments</comments>
		<pubDate>Tue, 12 Jul 2011 11:35:19 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=15088</guid>
		<description><![CDATA[WordPress 3.2 (nom de code Gershwin) est sortie il y a bien 1 semaine maintenant (le 5 juillet dernier, si mes infos sont bonnes), je vais donc écrire un petit truc dessus. Si mes souvenirs sont bons, cette version devait &#8230; <a href="http://www.abricocotier.fr/15088-sortie-de-wordpress-3-2">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>WordPress 3.2 (nom de code Gershwin) <a href="http://fr.wordpress.org/">est sortie</a> il y a bien 1 semaine maintenant (le 5 juillet dernier, si mes infos sont bonnes), je vais donc écrire un petit truc dessus. Si mes souvenirs sont bons, cette version devait être celle de la rapidité et du passage en mode totalement objet (avec un arrêt de la rétro-compatibilité pour ceux qui sont encore dans les versions de PHP antérieures à la 5). Je n&#8217;ai pas été voir le code pour vérifier, mais ce qui est certain, c&#8217;est que cette nouvelle version bénéficie d&#8217;un nouveau design du dashboard (a mes yeux, il ne change pas grand chose, mais il apporte un petit rafraîchissement visuel), avec changement de police sur pas mal d&#8217;endroits. On note aussi, pour la zone d&#8217;édition, un mode permettant d&#8217;écrire en mode &laquo;&nbsp;Zen&nbsp;&raquo;, et enfin un nouveau thème (Twenty Eleven) en HTML5.    <span id="more-15088"></span></p>
<p><img src="http://www.abricocotier.fr/wp-content/uploads/2011/07/wordpress_3_2_gershwin.jpg" alt="" title="wordpress_3_2_gershwin" width="580" /></p>
<p>Il parait que &laquo;&nbsp;Un effort a été fait pour rendre WordPress plus rapide et plus léger&nbsp;&raquo;. Pour l&#8217;instant, ce n&#8217;est pas flagrant, mais je ne constate pas de ralentissement. Donc ça n&#8217;empire pas, ce qui est déjà bien.</p>
<p>Pour l&#8217;instant, en terme de bug, j&#8217;ai l&#8217;impression de ne plus avoir le plugin SimpleTags (en tout cas il ne semble plus fonctionner), mais sinon tout fonctionne comme avant pour moi. Au passage, je vous recommande mon billet sur la <a href="http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande">mise à jour de WordPress en ligne de commande</a>.</p>
<p>La vidéo de présentation est ci-dessous :</p>
<p><embed type="application/x-shockwave-flash" src="http://s0.videopress.com/player.swf?v=1.02" width="580" height="330" wmode="direct" seamlesstabbing="true" allowfullscreen="true" allowscriptaccess="always" overstretch="true" flashvars="guid=ac07H291"></embed></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/15088-sortie-de-wordpress-3-2">Permalien</a> |
<a href="http://www.abricocotier.fr/15088-sortie-de-wordpress-3-2#comments">3 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/15088-sortie-de-wordpress-3-2/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Changement de dossier du CDN vers WordPress + Remplacement de LinkWithin par SimilarPost puis TimThumb</title>
		<link>http://www.abricocotier.fr/14859-changement-cdn-wordpress-remplacement-linkwithin-similarpost-timthumb</link>
		<comments>http://www.abricocotier.fr/14859-changement-cdn-wordpress-remplacement-linkwithin-similarpost-timthumb#comments</comments>
		<pubDate>Sun, 26 Jun 2011 14:29:59 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=14859</guid>
		<description><![CDATA[Depuis longtemps, j&#8217;avais pas mal de photo de ce blog qui étaient stockées derrière le domaine louisvolant.com. Pourquoi ? Parce que à une époque aujourd&#8217;hui lointaine, j&#8217;avais deux hébergements, un sur lequel fonctionnait le blog, et l&#8217;autre sur lequel je &#8230; <a href="http://www.abricocotier.fr/14859-changement-cdn-wordpress-remplacement-linkwithin-similarpost-timthumb">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Depuis longtemps, j&#8217;avais pas mal de photo de ce blog qui étaient stockées derrière le domaine louisvolant.com. Pourquoi ? Parce que à une époque aujourd&#8217;hui lointaine, j&#8217;avais deux hébergements, un sur lequel fonctionnait le blog, et l&#8217;autre sur lequel je préférait stocker mes photos et autres images affichées sur le site, ce qui permettait, lors de téléchargements, de ne pas impacter le même serveur. Mais ce temps est révolu : depuis lors, j&#8217;ai un serveur non-mutualisé, donc des ressources matérielles sans commune mesure avec ce dont je disposais à l&#8217;époque. D&#8217;où l&#8217;idée de rassembler les images et le blog (et de surcroît, ça fait économiser une résolution de domaine au chargement de la page, ce qui n&#8217;est pas plus mal).</p>
<p><span id="more-14859"></span></p>
<p style="test-align:center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2011/06/linktwithin_remplacement.jpg" alt="" title="linktwithin_remplacement" width="580" /></p>
<p>J&#8217;ai commencé par copier les photos d&#8217;un domaine à un autre :</p>
<blockquote><p>cp -R ancien-ndd/dossier/* blog/wp-content/uploads/ancien-ndd</p></blockquote>
<p>Puis je suis allé dans mon MySQL, et j&#8217;ai remplacé les occurences de <em>ancien-ndd/dossier/</em> par <em>blog/wp-content/uploads/ancien-ndd</em>. En fait, ces occurrences se trouvaient exclusivement dans des URL d&#8217;images ou de documents, donc pour le lecteur, ce changement d&#8217;url devrait, s&#8217;il est bien fait, être totalement transparent <em>(Edit : maintenant ça doit bien faire deux semaines qu&#8217;il est fait, et personne ne s&#8217;est plaint, c&#8217;est donc que tout doit être correct)</em></p>
<blockquote><p>UPDATE `wp_posts` SET `post_content` = Replace(`post_content`,&#8217;ancien-ndd/dossier&#8217;,'blog/wp-content/uploads/ancien-ndd&#8217; ) WHERE `post_content` LIKE &#8216;%ancien-ndd/dossier%&#8217;
</p></blockquote>
<p>Bien sûr, le mieux c&#8217;est de faire un backup de la BDD avant de faire ce genre de manipulation, mais pour ma part, j&#8217;ai un backup qui est fait toutes les nuits, donc pas de problème à ce niveau.</p>
<p>Ensuite, j&#8217;ai besoin que toutes les photos non gérées directement par WordPress, aient une version &laquo;&nbsp;timbre&nbsp;&raquo;, ce afin de bien gérer les photos dans les <em>billets similaires</em> affichés en bas de chaque billet.<br />
Donc pour cela, il me faut un petit script, qui créé une copie des image et les convertisse directement en 150&#215;150, avec une opération de renommage du style <em>mon_image.jpg</em> qui devienne <em>mon_image-150&#215;150.jpg</em> (vous allez comprendre pourquoi dans la suite). Autant vous le dire tout de suite, pour l&#8217;instant je n&#8217;ai pas trouvé ce script. Par contre, j&#8217;ai trouvé TimThumb, qui redimmensionne (en PHP) a la volée les images. Et ça fonctionne plutôt pas mal. Je vous le recommande.</p>
<h2>Remplacement de LinkWithin par SimilarPost</h2>
<p>Comme je vous le disais plus haut, l&#8217;idée est de remplacer LinkWithin qui ne fonctionnait pas chez moi par un <em>simili</em>-LinkWithin. J&#8217;ai donc fait un tout petit peu de rétro-ingénierie (j&#8217;ai copié leur code HTML/CSS), et j&#8217;ai pu, en l&#8217;associant aux quelques fonctionnalités du plugin <a href="http://rmarsh.com/plugins/post-options/">SimilarPost</a>, créer un petit carrousel de billets similaires, avec chacun leur image (cf en bas de chaque billet de ce blog).</p>
<p>Il suffisait d&#8217;utiliser pour cela le pseudo-code que fournit le plugin SimilarPost, avec notamment les annotations comme {url} (qui donne l&#8217;url d&#8217;un billet jugé comme similaire au billet lu par le visiteur) ou {imageurl} :</p>
<p>Voilà le code. Dans les <em>Output Settings</em> du plugin SimilarPost, j&#8217;avais mis :</p>
<p><u>Case Output Template :</u></p>
<pre class="brush: xml; title: ; notranslate">
&lt;a href=&quot;{url}&quot; class=&quot;similarpostlinkblock&quot; onmouseover=&quot;this.style.backgroundColor='#dde'&quot; onmouseout=&quot;this.style.backgroundColor=''&quot;&gt;
&lt;div style=&quot;width: 156px; height: 215px; margin: 0; border: 0; padding: 0&quot;&gt;
&lt;div style=&quot;margin: 0; border: 1px solid #ddd;padding: 2px;width: auto;height: auto; &quot;&gt;
&lt;div style=&quot;background: url({imagesrc:0:post:?t}) no-repeat; width: 150px; height: 150px; margin: 0; border: 0; padding: 0&quot;&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;div class=&quot;similarpostlink&quot;&gt;
{title:59:trim}
&lt;/div&gt;
&lt;/div&gt;
&lt;/a&gt;
</pre>
<p><u>Text and codes before the list:</u></p>
<pre class="brush: xml; title: ; notranslate">
&lt;h3&gt;Vous serez peut-être intéressé :&lt;/h3&gt;&lt;div style=&quot;margin: 0; border: 0; padding: 0px 0px 160px 70px;&quot;&gt;
</pre>
<p><u>Text and codes after the list:	</u></p>
<pre class="brush: xml; title: ; notranslate">
&lt;/div&gt;
</pre>
<p>Le problème de cette solution, c&#8217;est qu&#8217;elle appelait à chaque fois les images 150&#215;150 générées par WordPress lorsque vous uploadez une image au moment de créer un billet ou une page (via le <em>{imagesrc:0:post:?t}</em>). MAIS : moi j&#8217;avais plein d&#8217;anciennes images (celles provenant de mon CDN, ainsi qu&#8217;une grosse partie encore hébergée sur Flickr), et du coup celles-ci n&#8217;avaient pas de version 150&#215;150 (et je n&#8217;avais pas trouvé de script pour les générer, comme je l&#8217;ai expliqué plus haut). D&#8217;où l&#8217;utilité du script les recréant en 150&#215;150 (ce dont j&#8217;ai parlé plus haut).</p>
<h3>La solution meilleure : TimThumb</h3>
<p>Du coup, pour créer les images en 150&#215;150, j&#8217;ai fini par trouver une script PHP qui les créée à la volée (ce qui n&#8217;est pas bien, car cela augmente le temps de chargement de la page). J&#8217;aurais préféré un script me les créant toutes d&#8217;un coup, et rajoutant <em>-150&#215;150</em> a la fin du nom du fichier, mais je ne crois pas que c&#8217;était trop possible&#8230; (ImageMagick saurait-il faire ça ? Si vous savez le faire, je suis preneur de la technique)</p>
<p>Donc revenons à <a href="http://vonlind.com/2008/06/adding-timthumb-to-your-wordpress-theme/">TimThumb</a>. Vous uploadez ce script sur votre serveur, vous créez un dossier de cache (ce qui est TRÈS bien : vous générez une fois l&#8217;image, et les fois suivantes, celle-ci est déjà créée !). Par contre, cela nécéssite d&#8217;apporter un petit changement au code d&#8217;appel de SimilarPost.</p>
<p>Ainsi, il faut remplacer </p>
<blockquote><p>{imagesrc:0:post:?t}
</p></blockquote>
<p>par</p>
<blockquote><p>wp-content/dossier_de_mon_script/timthumb.php?src={imagesrc:0:post:}&#038;h=150&#038;w=150&#038;zc=1
</p></blockquote>
<p>Et ça fonctionne ! Je ne dis pas que je n&#8217;ai pas eu d&#8217;erreur PHP à cause de droits non accordé au script PHP (ça sent très fort la faille de sécurité d&#8217;ailleurs, mais osef <img src='http://www.abricocotier.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' />  )</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/14859-changement-cdn-wordpress-remplacement-linkwithin-similarpost-timthumb">Permalien</a> |
<a href="http://www.abricocotier.fr/14859-changement-cdn-wordpress-remplacement-linkwithin-similarpost-timthumb#comments">2 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/php" rel="tag">PHP</a>, <a href="http://www.abricocotier.fr/tag/tutoriels" rel="tag">Tutoriels</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/14859-changement-cdn-wordpress-remplacement-linkwithin-similarpost-timthumb/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Mise à jour de WordPress en ligne de commande</title>
		<link>http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande</link>
		<comments>http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande#comments</comments>
		<pubDate>Tue, 01 Feb 2011 16:32:39 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Tutoriels]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=14169</guid>
		<description><![CDATA[Je viens de mettre à jour WordPress en ligne de commande, et je me disais que faire un récapitulatif des étapes pourrait s&#8217;avérer être une bonne chose. Au passage, la montée de version d&#8217;un logiciel s’appellerait de l&#8217;intégration, en tout cas c&#8217;est &#8230; <a href="http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je viens de mettre à jour WordPress en ligne de commande, et je me disais que faire un récapitulatif des étapes pourrait s&#8217;avérer être une bonne chose. Au passage, la montée de version d&#8217;un logiciel s’appellerait de l&#8217;intégration, en tout cas c&#8217;est comme ça que l&#8217;on définit ce genre d&#8217;opération dans l&#8217;entreprise où je travaille actuellement. Donc pour ceux qui veulent savoir comment on fait pour mettre à jour leur WordPress quand vous avez un serveur, un accès SSH et pas d&#8217;accès FTP, lisez la suite.    <span id="more-14169"></span></p>
<p style="text-align: center;"><img title="wordpress-3-0-4" src="http://www.abricocotier.fr/wp-content/uploads/2011/02/wordpress-3-0-4.jpg" alt="" width="498" /></p>
<p>Je rappelle avant toute chose qu&#8217;il est nécessaire de faire des backups (fichiers + BDD) AVANT ce genre d&#8217;opération, même si je n&#8217;ai de leçon à donner à personne sur ce genre de chose, n&#8217;étant pas moi-même parfait sur ce point.</p>
<p>Au passage, je rappelle également que la version &laquo;&nbsp;tout via l&#8217;interface web&nbsp;&raquo; est nettement plus rapide, et certainement plus sécurisée (dans le sens où on peut moins faire d&#8217;idiotie), mais cela nécéssite d&#8217;avoir un accès FTP d&#8217;ouvert sur sa machine, ce que je n&#8217;ai pas.</p>
<p>Pour le backup des fichiers (ci-dessous, une version gzippée) :</p>
<pre class="brush: plain; title: ; notranslate">
tar -zcvf chemin_sauvegarde/mon_blog.tar.gz chemin_vers_mon_blog/
</pre>
<p>Pour le backup de la BDD :</p>
<pre class="brush: plain; title: ; notranslate">
mysqldump -u UTILISATEUR -p MOTDEPASSE -d BASEDEDONNEES &amp;gt; fichier_de_backup.sql
</pre>
<p>Ensuite. Récupérez la dernière version de WordPress comme suit, décompressez-là, puis &laquo;&nbsp;nettoyez-la&nbsp;&raquo; :</p>
<pre class="brush: plain; title: ; notranslate">
mkdir tmp_wp

cd tmp_wp/

wget http://wordpress.org/latest.tar.gz ./

tar -xvf latest.tar.gz wordpress/

rm latest.tar.gz

cd wordpress/

rm -R wp-content/ 

rm wp-config-sample.php

cd chemin_vers_votre_site_sous_wordpress/

rm -R wp-admin/ wp-includes/

cp -R chemin_vers_votre_wordpress_tout_neuf/* chemin_vers_votre_site_sous_wordpress/
</pre>
<p>Puis rendez-vous à la page : monsiteweb.fr/update.php</p>
<p>Enfin, faites :</p>
<pre class="brush: plain; title: ; notranslate">
cd chemin_vers_votre_site_sous_wordpress/wp-admin/

rm wp-install.php

rm wp-update.php
</pre>
<p>Et voilà !</p>
<p>Notez que l&#8217;idéal serait de faire une tâche Cron qui chaque nuit récupère la dernière version de WordPress, et met à jour WP. Comme ça vous serez toujours à jour (à 24 heures près, grand maximum).</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2011. |
<a href="http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande">Permalien</a> |
<a href="http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande#comments">3 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/tutoriels" rel="tag">Tutoriels</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/14169-mise-a-jour-de-wordpress-en-ligne-de-commande/feed</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Tumblr génère aujourd&#8217;hui plus d&#8217;argent et de pages vues que WordPress</title>
		<link>http://www.abricocotier.fr/13812-tumblr-argent-pages-vues-wordpress</link>
		<comments>http://www.abricocotier.fr/13812-tumblr-argent-pages-vues-wordpress#comments</comments>
		<pubDate>Thu, 23 Dec 2010 07:55:37 +0000</pubDate>
		<dc:creator>Caroline</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Tumblr]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=13812</guid>
		<description><![CDATA[La plateforme de micro blogging originaire de New York a annoncé une nouvelle levée de fond. Tumblr n&#8217;a pas 4 ans d&#8217;existence et cette plateforme héberge bien moins de bloggers que son concurrent WordPress. Pourtant Tumblr comptabilise pas moins de &#8230; <a href="http://www.abricocotier.fr/13812-tumblr-argent-pages-vues-wordpress">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>La plateforme de micro blogging originaire de New York a <a href="http://www.techmeme.com/101217/p58#a101217p58">annoncé</a> une nouvelle levée de fond. Tumblr n&#8217;a pas 4 ans d&#8217;existence et cette plateforme héberge bien moins de bloggers que son concurrent WordPress. Pourtant Tumblr comptabilise pas moins de deux fois plus de de page vues. Des documents financiers et le blog officiel de Tumblr révèlent que la levée de fonds s&#8217;élève à 40 millions de dollars, et que la liste d&#8217;investisseurs est assez importante. Parmi eux on trouve  Spark Capital (ils ont déjà investi massivement dans Twitter, Aviary, GDGT, Next New Networks et bien d&#8217;autres), mais aussi Union Square Ventures (financeurs de Etsy, Boxee, Disqus, Foursquare, GetGlue ou encore Meetup). Dans cette levée de fonds on compte aussi un poids lourds : Sequoia Capital (investisseurs dans Google, Apple, YouTube, PayPal, Zappos, RackSpace ou encore Yahoo). Tumblr a toujours été une startup attractive, mais là avec l&#8217;argent de Sequoia Capital et son réseau, elle vient de franchir un cap.    <span id="more-13812"></span></p>
<p style="text-align: center;"><img title="tumblr_homepage" src="http://www.abricocotier.fr/wp-content/uploads/2010/12/tumblr_homepage.jpg" alt="" width="580" /></p>
<p>Comparons Tumblr et WordPress :</p>
<p>Que représente Tumblr vis-àà-vis de WordPress ? Le fondateur de WordPress, Matt Mullenweg, déclarait la semaine dernière à TechCrunch que sa plateforme faisait environ 300 millions de visiteurs uniques par mois. Le service d&#8217;analyse du trafic de Quantcast laisse penser que ce chiffre est encore en deçà de la réalité puisqu’il estime que le nombre de visiteurs uniques par mois est de 500 millions.</p>
<p>Par ailleurs Quantcast estime que Tumblr génére 48,5 millions de visiteurs uniques par mois. Ceci fait que WordPress génère donc de 6 à 10 fois plus de visiteurs uniques que Tumblr. Dans le même ordre d&#8217;idée on peut comparer le nombre de blogs hébergés chez WordPress et Tumblr. Le premier dit en avoir 30 millions alors que Tumblr n&#8217;en déclare que 11 millions.</p>
<h3>Mais qu&#8217;en est-il du nombre de pages vue ?</h3>
<p>Quantcast estime que WordPress affiche quelques 1,4 milliard de page vues par mois. Tumblr lui en affiche près de 3 milliards ! En d&#8217;autres termes, si WordPress compte plus de visiteurs uniques et plus de bloggers, les visiteurs uniques de Tumblr visitent bien plus de pages que ceux de WordPress (presque deux fois plus). D&#8217;un autre côté, les analystes de Postrank notent que WordPress et Blogger.com sont les deux plateformes dont l&#8217;engagement dans les réseaux sociaux sont les plus poussés.</p>
<p style="text-align: center;"><img title="postrank_blogging_platforms" src="http://www.abricocotier.fr/wp-content/uploads/2010/12/postrank_blogging_platforms.jpg" alt="" width="580" /></p>
<p>Tumblr vient de lever au total 40 millions de dolars, soit 10 de plus que WordPress lors de sa dernière levée, il y a 3 ans. au niveau des revenus de chacun de ces services, les estimations les donnent à peu près au même niveau, même si Tumblr reste encore plus petit.</p>
<p>Bien sûr, Tumblr connaît la concurrence (SquareSpace, Acquia et SixApart) mais aucun d&#8217;entre eux n&#8217;est aussi facile à utiliser que Tumblr.</p>
<p style="text-align: right;"><em>Via <a href="http://www.readwriteweb.com/archives/tumblr_now_has_more_money_more_pageviews_than_word.php">RWW</a></em></p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/13812-tumblr-argent-pages-vues-wordpress">Permalien</a> |
<a href="http://www.abricocotier.fr/13812-tumblr-argent-pages-vues-wordpress#comments">1 commentaire</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/tumblr" rel="tag">Tumblr</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/13812-tumblr-argent-pages-vues-wordpress/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Tuning MySQL : quelques éléments</title>
		<link>http://www.abricocotier.fr/12677-tuning-mysql-quelques-elements</link>
		<comments>http://www.abricocotier.fr/12677-tuning-mysql-quelques-elements#comments</comments>
		<pubDate>Sat, 16 Oct 2010 21:54:03 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=12677</guid>
		<description><![CDATA[Je ne sais plus comment je suis arrivé sur cette page, mais l&#8217;erreur 1040 &#8211; Too Many Connections est tellement classique pour ceux qui sont sur hébergement mutualisé, que j&#8217;ai eu envie d&#8217;y aller voir plus loin. Malheureusement ou heureusement &#8230; <a href="http://www.abricocotier.fr/12677-tuning-mysql-quelques-elements">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Je ne sais plus comment je suis arrivé sur <a href="http://www.webmaster-hub.com/topic/38547-limites-de-connections-mysql-sur-un-hebergement-mutualise/">cette page</a>, mais l&#8217;erreur 1<em>040 &#8211; Too Many Connections</em> est tellement classique pour ceux qui sont sur hébergement mutualisé, que j&#8217;ai eu envie d&#8217;y aller voir plus loin. Malheureusement ou heureusement pour moi, je n&#8217;ai que très rarement eu à me pencher sur cette erreur, notamment parce que j&#8217;aime beaucoup passer par le cache (sur ce blog, il est d&#8217;un peu plus de 24 heures, ce qui m&#8217;a bien sauvé lors que mon MySQL ne voulait plus démarrer à cause d&#8217;un problème de stockage disponible sur le serveur), et que la majorité du temps que vous viendrez ici, la page que vous verrez aura été générée depuis plusieurs heures.    <span id="more-12677"></span></p>
<p>Du coup, quand la page sera demandée, seuls Nginx et Apache seront sollicités : PHP et MySQL resteront au repos.</p>
<p style="text-align: center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/10/mysql_devconnect_member.jpg" alt="" title="mysql_devconnect_member" width="520" /></p>
<p style="text-align: center;"><em>JE ne suis pas du tout un DevConnect Member, mais j&#8217;aimais bien cette image <img src='http://www.abricocotier.fr/wp-includes/images/smilies/icon_biggrin.gif' alt=':-D' class='wp-smiley' /> </em></p>
<p>J&#8217;ai trouvé sur le web deux pages intéressantes que je souhaite partager ici à propos de la configuration MySQL :</p>
<ul>
<li>Une <a href="http://wiki.microwebagency.com/mysql/tuning">page très intéressante</a> donnant notamment deux configuration recommandées pour un MySQL, en fonction de la quantité de RAM disponible.</li>
<li>Sur le site de MySQL, <a href="http://dev.mysql.com/doc/refman/5.0/fr/table-cache.html">cette page</a> rentre davantage dans les détails de l&#8217;utilisation du cache des tables en fonction de l&#8217;utilisation qui est faite.</li>
</ul>
<p><strong>L&#8217;intérêt de Memcache</strong></p>
<p>De surcroît, il m&#8217;a semblé voir -je ne sais plus où- que les SGBD mettaient en cache les tables utilisées. Par exemple<strong>, si vous faites un SELECT de la table 1, le SGBD la mettra en cache, puis vous en retournera le résultat</strong>. Ainsi, une fois qu&#8217;elle est en cache, je doute qu&#8217;un SELECT soit trop long à sortir, car à mon avis l&#8217;opération la plus longue sera la mise en cache du contenu de la table.</p>
<p>Et du coup, je ne vois pas trop l&#8217;intérêt de <a href="http://en.wikipedia.org/wiki/Memcached">MEMCACHE</a>. J&#8217;ai regardé sur Wikipédia, et il me semble que l&#8217;exemple de code qu&#8217;ils proposent rejoint tout à fait l&#8217;utilisation que l&#8217;on peut faire de Memcache sur AppEngine. Or, sur AppEngine, Memcache n&#8217;est autre qu&#8217;une copie en RAM d&#8217;une partie de la BDD, ou plus couramment un résultat d&#8217;une interrogation de celle-ci. Ainsi, il me semble que MEMCACHE a pour effet de mettre en cache le résultat d&#8217;une commande (et pas seulement la table), ce qui donc évidemment se révèle encore plus rapide (car en cache), mais je serais intéressé par voir un comparatif de gain de performances entre une configuration sans MEMCACHE, et une configuration avec. Je pense que l&#8217;intérêt de MEMCACHE dépend évidemment des opérations faites sur les tables (dans la mesure où sauvegarder un résultat est d&#8217;autant plus intéressant lorsque l&#8217;opération prend du temps, avec des grosses tables et des jointures nombreuses), mais je ne sais pas si l&#8217;intérêt est grand lorsque les tables sont toutes déjà en RAM, et donc que les jointures et tri sur ces tables doivent aller assez vite. Encore une fois, cela dépend aussi de la taille des tables : quand elles font 5Go, et que l&#8217;index est inexistant/pas à jour, je me doute bien que les opérations vont être plus longues que pour des tables de simplement quelques Mo. Ce que je dis peut sembler idiot, mais je me souviens que sur AppEngine, le panel d&#8217;administration m&#8217;affichait de gros panneaux rouges lorsque j&#8217;utilisais directement la mémoire pour afficher le contenu de tables faiblement remplies, ce notamment pour m&#8217;inciter à utiliser Memcache à la place. Or, si la table est faiblement remplie, je reste dubitatif sur l&#8217;intérêt de la chose&#8230;</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/12677-tuning-mysql-quelques-elements">Permalien</a> |
<a href="http://www.abricocotier.fr/12677-tuning-mysql-quelques-elements#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/12677-tuning-mysql-quelques-elements/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Site encore down hier, la faute à un espace disque rempli</title>
		<link>http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli</link>
		<comments>http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli#comments</comments>
		<pubDate>Wed, 06 Oct 2010 20:58:38 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Programmation]]></category>
		<category><![CDATA[Serveur]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=13047</guid>
		<description><![CDATA[Hier encore, abricocotier était down. PLus exactement, le serveur est tombé vers 12h29 et est remonté vers 12h59 (d&#8217;après les dates données par Mon.itor.us, mais en fait il a été down un peu moins de temps). Déjà le matin, en &#8230; <a href="http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Hier <a href="http://www.abricocotier.fr/13020-hier-le-blog-etait-down-pendant-une-heure-et-demi">encore</a>, abricocotier était down. <strong>PLus exactement, le serveur est tombé vers 12h29 et est remonté vers 12h59 </strong>(d&#8217;après les dates données par <a href="http://mon.itor.us/">Mon.itor.us</a>, mais en fait il a été down un peu moins de temps). Déjà le matin, en publiant un <a href="http://www.abricocotier.fr/13022-test-de-windows-phone-7-et-de-la-creation-dune-application-via-followmyfeed">billet sur le Windows Phone 7</a>, j&#8217;avais eu la désagréable surprise de <strong>ne pas pouvoir uploader mes images</strong> correctement. Je me disais que c&#8217;était peut-être parce qu&#8217;après la tombée du serveur la veille, PHP n&#8217;avait peut-être pas été redémarré dans les même conditions que précédemment, et les fonctions de PHP permettant de recevoir les fichiers et de les redimensionner n&#8217;étaient peut-être pas utilisables. En fait, pas du tout.    <span id="more-13047"></span></p>
<p style="text-align: center;"><img src="http://www.abricocotier.fr/wp-content/uploads/2010/10/redemarrer_serveur_1and1.jpg" alt="" title="redemarrer_serveur_1and1" width="580" /></p>
<p>Il se trouve simplement que <strong>j&#8217;étais arrivé à la limite haute de la capacité de mémoire sur la partition où est stocké mon blog</strong> sur le serveur où il est, partition qui contient également les logs Nginx/Apache du serveur. Oui, je sais, c&#8217;est pas bien. Mais c&#8217;est le genre de détail qui est peu important avant qu&#8217;on ne se prenne le mur, d&#8217;autant que j&#8217;aurais parié que les logs ne prendraient pas plus de place que de raison, grâce à <a href="http://www.linuxconfig.org/Logrotate">logrotate</a> que je croyais fonctionnel (logrotate s&#8217;assure que le total des logs d&#8217;un dossier reste à un certain niveau de place en mémoire).</p>
<p>Donc<strong> j&#8217;étais arrivé à la limite de mon disque, soit&#8230; 4,7 Go</strong> (sur cette partition, hein, en fait j&#8217;en avais une à côté qui était vide et qui faisait&#8230; 80Go). En fait je ne savais pas du tout que les dossiers accessibles à la racine étaient chacun dans une partition compartimentée, donc je croyais bénéficier d&#8217;une taille de stockage totale/cumulée de 100Go, comme le prévoyais l&#8217;offre de serveur à laquelle j&#8217;ai souscrite.</p>
<p>Au passage, pour connaitre la répartition du stockage et sa charge, voilà <a href="http://www.abricocotier.fr/10807-administration-dun-serveur-quelques-commandes">la commande</a> :</p>
<blockquote><p>df -h</p></blockquote>
<p>Ce qui donne chez moi (après avoir réglé le problème) :</p>
<blockquote>
<div id="_mcePaste">$ df -h</div>
<div id="_mcePaste">Filesystem            Size  Used Avail Use% Mounted on</div>
<div id="_mcePaste">/dev/hda1             950M  343M  559M  38% /</div>
<div id="_mcePaste">varrun               1000M   72K 1000M   1% /var/run</div>
<div id="_mcePaste">varlock              1000M     0 1000M   0% /var/lock</div>
<div id="_mcePaste">udev                 1000M   36K 1000M   1% /dev</div>
<div id="_mcePaste">devshm               1000M     0 1000M   0% /dev/shm</div>
<div id="_mcePaste">/dev/hda5             4.7G  1.5G  3.2G  32% /mondossier3</div>
<div id="_mcePaste">/dev/hda6             4.7G  1.4G  3.4G  29% /mondossier2</div>
<div id="_mcePaste">/dev/hda7              81G  661M   81G   1% /mondossier1</div>
<div id="_mcePaste">none                 1000M     0 1000M   0% /tmp</div>
</blockquote>
<p>Donc, pour revenir à nos moutons, le matin, pas de possibilité d&#8217;uploader correctement mes images.</p>
<p>Et à midi, le site qui ne répond plus.</p>
<p>En confiance après le redémarrage correct de la veille, je demande un redémarrage du serveur sur l&#8217;admin de 1and1, ce qui se passe correctement, mais de ce que je constatais à ce moment là, Nginx/Apache fonctionnaient, mais sur abricocotier.Fr, il n&#8217;y avait plus de connexion MySQL. A l&#8217;inverse, il semblait que microblog.abricocotier.fr ait une connexion MySQL&#8230; Donc j&#8217;ai d&#8217;abord pensé à un hack du site (des petits malins qui auraient été s&#8217;amuser avec le install.php de WordPress), ou auraient réussi à virer le config.php&#8230;</p>
<p>Le soir, en ayant ENFIN accès à un PuTTy, j&#8217;ai pu constater qu&#8217;il n&#8217;en était rien, et que le site avait l&#8217;air d&#8217;être intact, en tout cas en ce qui concernait les fichiers. Par contre, MySQL m&#8217;affichait l&#8217;erreur suivante :</p>
<pre class="brush: plain; title: ; notranslate">
Warning: session_write_close() [function.session-write-close]: write failed: No space left on device (28) in /usr/share/phpmyadmin/libraries/common.lib.php on line 648

Warning: session_write_close() [function.session-write-close]: Failed to write session data (files). Please verify that the current setting of session.save_path is correct (/var/lib/php5) in /usr/share/phpmyadmin/libraries/common.lib.php on line 648

#0  PMA_sendHeaderLocation(http://localhost/phpmyadmin/index.php?lang=fr-utf-8&amp;amp;convcharset=iso-8859-1&amp;amp;collation_connection=utf8_unicode_ci&amp;amp;token=ec462f0246b8932e5b46ee9417dd491f) called at [/usr/share/phpmyadmin/libraries/auth/cookie.auth.lib.php:543]
#1  PMA_auth_set_user() called at [/usr/share/phpmyadmin/libraries/common.inc.php:758]
#2  require_once(/usr/share/phpmyadmin/libraries/common.inc.php) called at [/usr/share/phpmyadmin/index.php:34]

Fatal error: PMA_sendHeaderLocation called when headers are already sent! in /usr/share/phpmyadmin/libraries/common.lib.php on line 655
</pre>
<p>Après une recherche sur le <a href="http://forum.ubuntu-fr.org/viewtopic.php?pid=3770574">forum Ubuntu-fr</a>, j&#8217;ai pu constater qu&#8217;il pourrait s&#8217;agir d&#8217;un problème de taille disponible sur le disque&#8230; Ce qui m&#8217;a amené à supprimer mes logs Nginx, &laquo;&nbsp;pour voir&nbsp;&raquo;&#8230; Et quand j&#8217;ai vu que je supprimais 3Go de logs, j&#8217;ai compris qu&#8217;il y avait peut-être là quelque chose de louche.</p>
<p>Après avoir exécuté les commandes suivantes :</p>
<blockquote><p>cd /mondossierdelog/nginx</p>
<p>rm *.gz</p>
<p>rm *.1</p></blockquote>
<p><em>(rien qu&#8217;avec ces trois commandes, j&#8217;ai gagné 3Go)</em></p>
<p>MySQL ne voulait toujours pas fonctionner&#8230; Je me suis donc dis que c&#8217;était peut-être à cause du mauvais démarrage de celui-ci, et donc j&#8217;ai demandé (pour la troisième fois) un redémarrage du serveur.</p>
<p>Et là&#8230; c&#8217;état la quille ! Tout à refonctionné instantanément.</p>
<h3><strong>Bilan : </strong></h3>
<ul>
<li>Mettre les dossiers de ses sites sur la plus grosse des partition</li>
<li>Mettre ses logs sur la plus grosse des partition et/ou s&#8217;assurer que logrotate fonctionne correctement !</li>
</ul>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli">Permalien</a> |
<a href="http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli#comments">Ajoutez un commentaire !</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/programmation" rel="tag">Programmation</a>, <a href="http://www.abricocotier.fr/tag/serveur" rel="tag">Serveur</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/13047-site-encore-down-hier-la-faute-a-un-espace-disque-rempli/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>HipHop for PHP, le futur de LAMP ? C&#8217;est ce que souhaite Facebook !</title>
		<link>http://www.abricocotier.fr/12396-hiphop-for-php-le-futur-de-lamp-cest-ce-que-souhaite-facebook</link>
		<comments>http://www.abricocotier.fr/12396-hiphop-for-php-le-futur-de-lamp-cest-ce-que-souhaite-facebook#comments</comments>
		<pubDate>Sun, 15 Aug 2010 15:52:50 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[Apache]]></category>
		<category><![CDATA[Facebook]]></category>
		<category><![CDATA[PHP]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=12396</guid>
		<description><![CDATA[Apache remplacé par HipHop ? En tout cas, c&#8217;est l&#8217;idée qui vient en tête à la lecture d&#8217;un article sur GigaOM, qui explique qu&#8217;à la suite de l&#8217;ouverture du code de HipHop for PHP par Facebook, certains gros sites fonctionnant &#8230; <a href="http://www.abricocotier.fr/12396-hiphop-for-php-le-futur-de-lamp-cest-ce-que-souhaite-facebook">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Apache remplacé par HipHop ? En tout cas, c&#8217;est l&#8217;idée qui vient en tête à la lecture d&#8217;un <a href="http://gigaom.com/2010/08/13/hiphop/">article sur GigaOM</a>, qui explique qu&#8217;à la suite de l&#8217;ouverture du code de HipHop for PHP par Facebook, certains gros sites fonctionnant sur PHP se sont montrés fortement intéressés. En effet, &laquo;&nbsp;depuis lors, HipHop a été adopté par un nombre grandissant de développeurs, et Facebook aurait contacté Drupal, MediaWiki, phpBB et WordPress pour leur proposer de faire tourner leur site sur HipHop : d&#8217;après les estimations de Facebook, <strong>WordPress s&#8217;est montré</strong><a href="http://gigaom.com/2010/08/13/hiphop/"><strong> 2,7 fois plus rapide</strong></a><strong> quand il tourne sur HipHop</strong>&laquo;&nbsp;.  <span id="more-12396"></span></p>
<p style="text-align: center;"><img title="facebook_hiphop" src="http://www.abricocotier.fr/wp-content/uploads/2010/08/facebook_hiphop.jpg" alt="" width="580" height="357" /></p>
<p>De la même façon, on peut apprendre sur <a href="http://www.facebook.com/note.php?note_id=416880943919">Facebook</a> que &laquo;&nbsp;Wikipédia et Drupal.org est actuellement en train de tester des versions de leurs sites sous HipHop&nbsp;&raquo;. On peut faire confiance à Facebook pour médiatiser le premier gros passage d&#8217;un site sous HipHop <img src='http://www.abricocotier.fr/wp-includes/images/smilies/icon_smile.gif' alt=':-)' class='wp-smiley' /> </p>
<p>Rappelons que HipHop est une technologie dont le but est de compiler le code PHP en bytecode via un portage C++. Et donc, par conséquent, d&#8217;accéléré de façon conséquente la génération des pages. D&#8217;après l&#8217;article toujours, le nombre d&#8217;abonné au fil d&#8217;informations/développements autour de HipHop a constamment augmenté, et des développements annexes autour de la technologie (c&#8217;est à dire ceux produits par des développeurs a priori bénévoles) ont commencés à sortir, avec par exemple un portage de HipHop pour 32 bit et un autre pour FreeBSD.</p>
<h2><strong>HipHop en remplacement de Apache</strong></h2>
<p>La chose qui me vient à l&#8217;esprit à la lecture de cet article est que Facebook pousse très férocement à l&#8217;adoption de ce nouveau serveur. Celui qui se verrait attaqué dans ses parts de marché serait Apache, qui est actuellement celui qui (dans sa configuration LAMP) fait sans doute tourner le plus de sites internet (en quantité). Donc au final, HipHop serait candidat pour remplacer le A de LAMP par un H.</p>
<p>Chose qui par contre m&#8217;étonne : il me semblait que WordPress.com fonctionnait sur Nginx (en tout cas c&#8217;est ce qu&#8217;on pouvait <a href="http://royal.pingdom.com/2010/02/23/nginx-the-little-russian-web-server-taking-on-the-giants/">lire chez Pingdom</a>), donc je ne suis pas sûr que WordPress.com observerait un réel gain s&#8217;ils passaient de Nginx à HipHop (car je pense qu&#8217;ils ont déjà beaucoup gagné en abandonnant Apache). Pour WordPress.com, le choix serait donc déjà fait : Apache a déjà été remplacé par Nginx (ce qui me fait penser que HipHop n&#8217;est pas seul en lice et avec de gros arguments pour remplacer Apache : Nginx est déjà là).</p>
<p>Pour aller plus loin (et pour tester par vous-même), je vous renvoie vers ce billet fournissant du code perméttant de réaliser quelques benchmark de HipHop sur son propre serveur : <a href="http://www.formboss.net/blog/2010/03/hiphop-php-benchmark/">HipHop PHP Benchmark</a>.</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/12396-hiphop-for-php-le-futur-de-lamp-cest-ce-que-souhaite-facebook">Permalien</a> |
<a href="http://www.abricocotier.fr/12396-hiphop-for-php-le-futur-de-lamp-cest-ce-que-souhaite-facebook#comments">4 commentaires</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/apache" rel="tag">Apache</a>, <a href="http://www.abricocotier.fr/tag/facebook" rel="tag">Facebook</a>, <a href="http://www.abricocotier.fr/tag/php" rel="tag">PHP</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/12396-hiphop-for-php-le-futur-de-lamp-cest-ce-que-souhaite-facebook/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Système de cache sur AppEngine : quelles performances ?</title>
		<link>http://www.abricocotier.fr/12327-systeme-de-cache-sur-appengine-quelles-performances</link>
		<comments>http://www.abricocotier.fr/12327-systeme-de-cache-sur-appengine-quelles-performances#comments</comments>
		<pubDate>Mon, 09 Aug 2010 15:53:46 +0000</pubDate>
		<dc:creator>Louis</dc:creator>
				<category><![CDATA[Web]]></category>
		<category><![CDATA[AppEngine]]></category>
		<category><![CDATA[Python (et Django)]]></category>
		<category><![CDATA[Wordpress]]></category>

		<guid isPermaLink="false">http://www.abricocotier.fr/?p=12327</guid>
		<description><![CDATA[J&#8217;aime assez le système de cache de WordPress mis en place par le plugin WP-Super-Cache qui consiste à générer la page et à la mettre physiquement dans un dossier de cache, puis à dire à Apache de toujours regarder si &#8230; <a href="http://www.abricocotier.fr/12327-systeme-de-cache-sur-appengine-quelles-performances">Continue reading <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>J&#8217;aime assez le système de cache de WordPress mis en place par <strong>le plugin WP-Super-Cache qui consiste à générer la page et à la mettre physiquement dans un dossier de cache, puis à dire à Apache de toujours regarder si la page demandée par un visiteur n&#8217;existe pas déjà avant d&#8217;en demander la génération</strong>. Sur AppEngine, il y a un problème de taille : il est impossible de gérer la création/suppression de fichiers en dur. Point de cache &laquo;&nbsp;physique&nbsp;&raquo;, donc. Pour autant, on peut avoir envie de servir un grand nombre de pages, et donc d&#8217;avoir un système performant et pour autant, peu gourmand en performances. J&#8217;ai donc décidé de créer un petit script utilisant MemCached pour stocker le contenu généré, et j&#8217;ai regardé les différences de temps rapporté par les logs.    <span id="more-12327"></span></p>
<h2><strong>Explication du fonctionnement : </strong></h2>
<p>Très rapidement, voilà comment fonctionne le script que j&#8217;ai écris : a chaque URL demandée par le client (quand celle-ci est après le path /viamemcached ou /viadatastore), le script va chercher le contenu HTML de la page directement mémoire. Dans MemCached si l&#8217;URL demandée commence par /viamemcached ou dans la mémoire (pour AppEngine, il s&#8217;agit du dataStore) quand l&#8217;URL commence par /viadatastore).</p>
<p>Le principe est donc, quand l&#8217;URL demandée commence par /viadatastore, de simuler une recréation de page, à cause de la requête à la base de donnée. Et de tenter de reproduire le fonctionnement d&#8217;un cache en passant par MemCached.</p>
<h2><strong>Code :</strong></h2>
<p><strong>Fichier main.py :</strong></p>
<p>Le fichier ci-dessous répartit les requètes en 3 : la page d&#8217;admin (création de contenu), derrière /upload, la catégorie des pages nécessitant la génération de contenu via appel au datastore (via l&#8217;url /viadatatore), et enfin la catégorie des pages nécessitant juste la requête à Memcached.</p>
<pre class="brush: python; title: ; notranslate">
import cgi
import firstPage
import userpage
import wsgiref
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app

ROUTES = [
    ('/',firstPage.Home),
    ('/upload',userpage.Upload),
    ('/viadatastore/?([\w]*)/?', userpage.ContentUsage),
    ('/viamemcached/?([\w]*)/?', userpage.ContentCached),
 # other handlers here...
]

def main():
  application = webapp.WSGIApplication(ROUTES)
  wsgiref.handlers.CGIHandler().run(application)

if __name__ == &quot;__main__&quot;:
  main()
</pre>
<p><strong>Fichier firstpage.py :</strong></p>
<p>Le fichier firstpage.py est &laquo;&nbsp;juste&nbsp;&raquo; le fichier de Home, répartissant entre les trois sections (au cas où vous voudriez reproduire l&#8217;application chez vous).</p>
<pre class="brush: python; title: ; notranslate">
from google.appengine.ext import webapp

class Home(webapp.RequestHandler):
    def get(self):
        self.response.out.write(&quot;&quot;&quot;&lt;html&gt;
  &lt;head&gt;
  &lt;meta http-equiv=&quot;Content-Type&quot; content=&quot;text/html; charset=UTF-8&quot; /&gt;
    &lt;title&gt;Test&lt;/title&gt;
            &lt;/head&gt;
            &lt;body&gt;
     &lt;center&gt;
        &lt;h1&gt;TEST&lt;/h1&gt;
    &lt;/center&gt;
    &lt;br&gt;&lt;br&gt;
            &lt;center&gt;&lt;div style=&quot;text-align:left;margin:0% 30% 0% 30%;&quot;&gt;
             &lt;ul&gt;
                &lt;li&gt;
                    &lt;a href=&quot;/upload&quot;&gt;Upload&lt;/a&gt;
                &lt;/li&gt;
                &lt;li&gt;
                    &lt;a href=&quot;/viadatastore&quot;&gt;viadatastore&lt;/a&gt;
                &lt;/li&gt;
                &lt;li&gt;
                    &lt;a href=&quot;/viamemcached&quot;&gt;viamemcached&lt;/a&gt;
                &lt;/li&gt;
             &lt;/ul&gt;
             &lt;/div&gt;
         &lt;/center&gt;
     &lt;/body&gt;
 &lt;/html&gt;&quot;&quot;&quot;)              
</pre>
<p><strong>Fichier userpage.py :</strong></p>
<p>Et enfin, le fichier userpage.py comprend les trois sections. Dans la classe Upload, on voit le formulaire d&#8217;envoi et le script d&#8217;enregistrement du contenu HTML dans le datastore. Dans la classe ContentUsage, on a la génération du contenu via DataStore, et dans ContentCached, celle via Memcached.</p>
<pre class="brush: python; title: ; notranslate">

import cgi
import logging
from google.appengine.ext import webapp
from google.appengine.ext.webapp.util import run_wsgi_app
from google.appengine.ext import db
from google.appengine.api import memcache

class pageUrlContent(db.Model):
    url = db.StringProperty(multiline=False)
    content = db.TextProperty()
    date = db.DateTimeProperty(auto_now_add=True)

def add_content_in_base(url,content):
    pageUrlContent = pageUrlContent()
    pageUrlContent.url = cgi.escape(url)
    pageUrlContent.content = db.Text(content)
    pageUrlContent.put()  

def render_list_previous_queries(url):
    listurls = pageUrlContent.all().filter(&quot;url =&quot;, url)
    return listurls

def fetch_content_in_base(url):
    final_content = &quot;&quot;
    contents = render_list_previous_queries(url)
    if contents:
        for cont in contents:
            final_content = cont.content
    return final_content

def fetch_content_in_cache(url):
    thiscontent = memcache.get(url)
    if thiscontent:
        return thiscontent
    else:
        content = fetch_content_in_base(url)
        if not memcache.set(url, content):
            logging.error(&quot;Memcache *set* failed in fetch_content_in_cache(url)&gt;else&gt;ifnot.&quot;)
        return content  

class Upload(webapp.RequestHandler):
    def get(self):
        self.response.out.write(&quot;&quot;&quot;
&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;title&gt;Content Upload&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;
&lt;form action=&quot;/upload&quot; enctype=&quot;multipart/form-data&quot; method=&quot;post&quot;&gt;
  &lt;div&gt;&lt;input type=&quot;text&quot; name=&quot;url&quot;&gt;&lt;/div&gt;
  &lt;div&gt;&lt;textarea COLS=30 ROWS=30 name=&quot;content&quot;&gt;&lt;/textarea&gt;&lt;/div&gt;
  &lt;div&gt;&lt;input type=&quot;submit&quot; value=&quot;Send IT&quot;&gt;&lt;/div&gt;
&lt;/form&gt;
&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
    &quot;&quot;&quot;)
    def post(self):
        url = self.request.get(&quot;url&quot;)
        content = self.request.get(&quot;content&quot;)
        add_content_in_base(url,content)
        self.response.out.write(&quot;&quot;&quot;&lt;html xmlns=&quot;http://www.w3.org/1999/xhtml&quot;&gt;
&lt;head&gt;
&lt;title&gt;Content Upload&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;center&gt;
OK
&lt;/center&gt;
&lt;/body&gt;
&lt;/html&gt;
    &quot;&quot;&quot;)  

class ContentUsage(webapp.RequestHandler):
    # part of ImageHandler class
    def get(self,id):
        content = fetch_content_in_base(id)
        self.response.out.write(content)    

class ContentCached(webapp.RequestHandler):
    # part of ImageHandler class
    def get(self,id):
        content = fetch_content_in_cache(id)
        self.response.out.write(content)
</pre>
<h2>Performances :</h2>
<p>Les logs de AppEngine sont de ce type :</p>
<blockquote><p>08-09 06:46AM 39.408 <strong>/viamemcached/loremipsum</strong> 200 22ms 19cpu_ms 7kb Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.22 Safari/534.3,gzip(gfe)<br />
149.6.164.150 &#8211; - [09/Aug/2010:06:46:39 -0700] &laquo;&nbsp;GET /viamemcached/loremipsum HTTP/1.1&#8243; 200 7725 &#8211; &laquo;&nbsp;Mozilla/5.0 (X11; U; Linux i686; en-US) AppleWebKit/534.3 (KHTML, like Gecko) Chrome/6.0.472.22 Safari/534.3,gzip(gfe)&nbsp;&raquo; &laquo;&nbsp;abricocotierfrtests.appspot.com&nbsp;&raquo; ms=23 cpu_ms=19 api_cpu_ms=0 cpm_usd=0.001455</p></blockquote>
<p>D&#8217;après ce que j&#8217;ai compris, on peut extraire 4 valeurs : ms=23 cpu_ms=19 api_cpu_ms=0 cpm_usd=0.001455. Je n&#8217;ai pas bien compris à quoi correspondaient tous ces temps, mais ce dont je suis sûr, c&#8217;est que le api_cpu_ms correspond au temps de l&#8217;API du DataStore.</p>
<p>En effet, j&#8217;ai fait une vingtaine de tests (enfin 20 reload par catégorie), et je mes ai mis dans un tableau, puis j&#8217;en ai fait des graphiques :</p>
<p>Le tableau de données :</p>
<p style="text-align: center;"><iframe width='580' height='400' frameborder='0' src='https://spreadsheets.google.com/pub?key=0AnIym6Arf51ydGVlNW9nWXA0eTMzUFVBdjFodHdVX1E&#038;hl=fr&#038;single=true&#038;gid=0&#038;output=html&#038;widget=true'></iframe></p>
<p><strong>Millisecondes :</strong></p>
<p style="text-align: center;"><img title="datastore ms vs memcached ms" src="http://www.abricocotier.fr/wp-content/uploads/2010/08/datastore-ms-vs-memcached-ms.jpg" alt="" width="580" /></p>
<p><strong>CPU Millisecondes :</strong></p>
<p style="text-align: center;"><img title="cpu ms datastore vs memcached" src="http://www.abricocotier.fr/wp-content/uploads/2010/08/cpu-ms-datastore-vs-memcached.jpg" alt="" width="580" /></p>
<p><strong>API CPU Millisecondes :</strong></p>
<p style="text-align: center;"><img title="api cpu ms" src="http://www.abricocotier.fr/wp-content/uploads/2010/08/api-cpu-ms.jpg" alt="" width="580" /></p>
<p><strong>CPU USD :</strong></p>
<p style="text-align: center;"><img title="cpm_usd" src="http://www.abricocotier.fr/wp-content/uploads/2010/08/cpm_usd.jpg" alt="" width="580" /></p>
<h2><strong>Conclusion</strong></h2>
<p>De ce que l&#8217;on peut constater, effectivement l&#8217;API_CPU_MS est à zéro après le premier appel sur Memcached, ce qui correspond bien à la premier mise en cache (lors du premier appel), puis c&#8217;est le cache qui prend le relais, et le datastore n&#8217;est plus appelé (et on remarque que les appels au datastore font tous 22ms). Pour le reste, c&#8217;est plus compliqué. Il semble que, sur le global, MemCached soit plus rapide (légèrement), mais ce n&#8217;est pas une règle absolue, et on voit que selon les appels, les temps varient, si bien que certains appels via DataStore se révèlent plus rapides que certains via MemCached.</p>
<p>D&#8217;une manière générale, Google imposant de respecter les quotas (ce que je trouve louable), cela impose à coder relativement &laquo;&nbsp;économiquement&nbsp;&raquo;, c&#8217;est à dire avec l&#8217;idée qu&#8217;il faut utiliser Memcached aussi souvent que possible. Je rajoute que pour mon test, l&#8217;appel au DataStore était relativement simple, pas de SELECT *, ce qui peut expliquer la proximité des résultats avec MemCached. Cependant, je pense que dans un cas plus proche de la réalité, où la génération d&#8217;une page nécessite plusieurs appels au DataStore, la différence devient plus évidente. </p>
<p>Je n&#8217;ai pas non plus testé via l&#8217;utilisation de templates Django, mais je doute que celà accélère grand chose au traitement de la page, et donc encore une fois, cela devrait augmenter la différence entre une page donc l&#8217;intégralité du code se trouve en MemCached, et une autre pour laquelle il faut réaliser une certaine quantité d&#8217;opération de génération.</p>
<hr />
<p><small><a href="http://www.abricocotier.fr">AbriCoCotier.fr</a>, 2010. |
<a href="http://www.abricocotier.fr/12327-systeme-de-cache-sur-appengine-quelles-performances">Permalien</a> |
<a href="http://www.abricocotier.fr/12327-systeme-de-cache-sur-appengine-quelles-performances#comments">1 commentaire</a> | Plugin <a href="http://planetozh.com/blog/my-projects/wordpress-plugin-better-feed-rss/">Better Feed</a>, par <a href="http://planetozh.com/">Ozh</a>
<br/>
Rangé dans : <a href="http://www.abricocotier.fr/tag/appengine" rel="tag">AppEngine</a>, <a href="http://www.abricocotier.fr/tag/python" rel="tag">Python (et Django)</a>, <a href="http://www.abricocotier.fr/tag/wordpress" rel="tag">Wordpress</a><br/>
</small></p>]]></content:encoded>
			<wfw:commentRss>http://www.abricocotier.fr/12327-systeme-de-cache-sur-appengine-quelles-performances/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
	</channel>
</rss>

