<?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>Tout sur Rien</title>
	<atom:link href="http://blog.fruitsoftware.com/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fruitsoftware.com</link>
	<description>Un blog sur Tout sur Rien</description>
	<lastBuildDate>Thu, 10 Mar 2016 12:11:31 +0000</lastBuildDate>
	<language>fr-FR</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>https://wordpress.org/?v=4.3.24</generator>
	<item>
		<title>Est-ce capital(es)?</title>
		<link>http://blog.fruitsoftware.com/2015/01/est-ce-capitales/</link>
		<comments>http://blog.fruitsoftware.com/2015/01/est-ce-capitales/#comments</comments>
		<pubDate>Wed, 07 Jan 2015 04:35:53 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[freebase]]></category>
		<category><![CDATA[leafletjs]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=335</guid>
		<description><![CDATA[Je viens de &#171;&#160;commettre&#160;&#187; un nouveau projet personnel, histoire de me familiariser avec certaines technologies et de tester comment leaflet peut s&#8217;intégrer avec backbone (pas trop mal&#8230;): http://capitales.saadtazi.com. Il y aurait encore &#171;&#160;de l&#8217;amour à donner&#160;&#187; au projet (côté visuel notamment). essayez-le et n&#8217;hésitez pas à me faire part de vos questions/remarques. Le projet est [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je viens de &laquo;&nbsp;commettre&nbsp;&raquo; un nouveau projet personnel, histoire de me familiariser avec certaines technologies et de tester comment <a href="http://leafletjs.com" target="_blank">leaflet</a> peut s&rsquo;intégrer avec backbone (pas trop mal&#8230;): http://capitales.saadtazi.com.</p>
<p>Il y aurait encore &laquo;&nbsp;de l&rsquo;amour à donner&nbsp;&raquo; au projet (côté visuel notamment). essayez-le et n&rsquo;hésitez pas à me faire part de vos questions/remarques.</p>
<p>Le projet est dans un repo privé bitbucket, encore une autre affaire que je voulais essayer, repo privé&#8230; Github, je t&rsquo;aime&#8230; Mais bitbucket est acceptable et &laquo;&nbsp;fait la job&nbsp;&raquo;. Je peux rendre le code public si vous êtes intéressé.</p>
<p>Les données (pays, capitales, positions géographiques) proviennent de <a href="http://freebase.com" title="Freebase" target="_blank">freebase</a>.</p>
<p>voir la page <a href="http://capitales.saadtazi.com/about" target="_blank">&laquo;&nbsp;à propos&nbsp;&raquo;</a> pour connaitre plus en détail les technologies utilisées.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2015/01/est-ce-capitales/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Heu&#8230; Y a quelqu&#8217;un?</title>
		<link>http://blog.fruitsoftware.com/2014/10/heu-y-a-quelquun/</link>
		<comments>http://blog.fruitsoftware.com/2014/10/heu-y-a-quelquun/#comments</comments>
		<pubDate>Tue, 07 Oct 2014 00:30:14 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[programmation]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=331</guid>
		<description><![CDATA[Ce petit billet rapide afin de vous donner quelques nouvelles de ma nouvelle vie&#8230; de développeur bien sûr. J&#8217;ai quitté le monde du PHP il y a maintenant 3 ans. Je voulais me confronter à de nouveaux &#171;&#160;stacks&#160;&#187;. J&#8217;ai travaillé pendant plus de 6 mois sur un projet purement Javascript (frontend), sur un &#171;&#160;one page [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ce petit billet rapide afin de vous donner quelques nouvelles de ma nouvelle vie&#8230; de développeur bien sûr.</p>
<p>J&rsquo;ai quitté le monde du PHP il y a maintenant 3 ans. Je voulais me confronter à de nouveaux &laquo;&nbsp;stacks&nbsp;&raquo;.</p>
<p>J&rsquo;ai travaillé pendant plus de 6 mois sur un projet purement Javascript (frontend), sur un &laquo;&nbsp;one page app&nbsp;&raquo;. J&rsquo;ai approfondi les joies et les peines des callbacks, et j&rsquo;ai été épargné sur ce projet par les problèmes de compatibilité de navigateurs. L&rsquo;utilisation d&rsquo;un framework du coté du browser (en l&rsquo;occurrence JMVC&#8230;) a été une révélation.</p>
<p>Puis je suis passé sur un projet Python (avec le framework <a href="http://flask.pocoo.org/" target="_blank">flask</a> et canjs du coté frontend, experience bien appréciée! Là encore, j&rsquo;ai principalement travaillé sur le frontend.</p>
<p>Puis depuis plus d&rsquo;une année, javascript &laquo;&nbsp;all the way&nbsp;&raquo; pour une plateforme comprenant:</p>
<p>* une extension de navigateur (&laquo;&nbsp;browser extension&nbsp;&raquo;) pour Chrome, Firefox et IE (aïe, j&rsquo;ai mal&#8230;),<br />
* un site et des api en node.js (express)<br />
* des tests d&rsquo;integration en node.js avec selenium et wd.js</p>
<p>Il y a aussi un gros backend HBase/Spark/Flume, mais je ne touche pas trop à ce composant là&#8230;</p>
<p>Afin de m&rsquo;aider dans le choix de package npm, j&rsquo;ai monté une  <a href="http://packrep.saadtazi.com" target="_blank">petite application</a> bien simple. C&rsquo;est fonctionnel, mais je vais probablement ajouté quelques fonctionnalités&#8230; N&rsquo;hésitez pas à partager vos commentaires! Le code source est disponible sur <a href="https://gituhub.com/saadtazi/npm-rep" target="_blank">github</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2014/10/heu-y-a-quelquun/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>gRaphael, axes et graduations &#8211; tips</title>
		<link>http://blog.fruitsoftware.com/2012/03/graphael-axes-et-graduations-tips/</link>
		<comments>http://blog.fruitsoftware.com/2012/03/graphael-axes-et-graduations-tips/#comments</comments>
		<pubDate>Sun, 11 Mar 2012 05:52:14 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=320</guid>
		<description><![CDATA[Je cherchais à personnaliser les textes de l&#8217;axe des x d&#8217;un graphique de type &#171;&#160;linechart&#160;&#187; fait en gRaphael. En effet, il n&#8217;est pas possible de personnaliser les textes affichées sur les différents axes. Or je voulais pouvoir avoir un graphique pour lequel j&#8217;avais des données journalières, mais pouvoir afficher des graduation toutes les semaines. N&#8217;ayant [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je cherchais à personnaliser les textes de l&rsquo;axe des x d&rsquo;un graphique de type &laquo;&nbsp;linechart&nbsp;&raquo; fait en <a href="http://g.raphaeljs.com/" target="_blank">gRaphael</a>.</p>
<p>En effet, il n&rsquo;est pas possible de personnaliser les textes affichées sur les différents axes. Or je voulais pouvoir avoir un graphique pour lequel j&rsquo;avais des données journalières, mais pouvoir afficher des graduation toutes les semaines.</p>
<p>N&rsquo;ayant rien trouvé sur les tubes, j&rsquo;ai donc décidé de creuser un peu dans le code, et voici ce que j&rsquo;ai trouvé. Ceci est donc plus une note personnelle&#8230; En espérant que cela pourra aussi servir à quelqu&rsquo;un.</p>
<p>Bon, je commence par la fin: <a href="http://jsfiddle.net/saadtazi/vpGyL/" target="_blank">voici un jsFiddle</a> illustrant le résultat. Vous voyez comment les graduations de l&rsquo;axe des y est pas beau? Les nombres affichés ne sont pas très &laquo;&nbsp;ronds&nbsp;&raquo;&#8230; J&rsquo;ai ici corriger le tir pour l&rsquo;axe des x.</p>
<p><iframe style="width: 100%; height: 300px;" src="http://jsfiddle.net/saadtazi/vpGyL/embedded/result/" frameborder="0" width="320" height="240"></iframe></p>
<p>J&rsquo;ai utilisé une fonction utilitaire de graphael, Raphael.g.axis. J&rsquo;ai noté que il y avait un paramètre label! Et en utilisant le debugger, la version non-minifiée de graphael, et en regardant comment g.line.js utilise cette foncction , j&rsquo;ai pu comprendre son fonctionnement et voici ce qu&rsquo;il faut faire pour avoir un axe des x avec des textes sous forme de texte:</p>
<pre class="brush: jscript; title: ; notranslate">
var r = Raphael('testGraph', 320, 220);

// Creates a simple line chart at 10, 10
// width 300, height 200
var x = 10
,    y = 10
,    xlen = 300
,    ylen = 200
,    gutter = 20
, xdata = [0,2,4,6,8,10]
;
var chrt = r.linechart(x,y,xlen,ylen,xdata,[30,10,20,15,35,30], { gutter: gutter, nostroke: false, axis: &quot;0 0 0 1&quot;, symbol: &quot;circle&quot;, smooth: true });
// default gutter: 10
              //x, y, length, from, to, steps, orientation, labels, type, dashsize, paper
Raphael.g.axis(
    x + gutter, // 10 + gutter
    y + ylen - gutter, //y pos
    xlen - 2*gutter,
    null, null, // used to pass the initial value and last value (number) if no labels are provided
    xdata.length - 1, // number of steps
    0,
    ['0', '-2-', '-4-', '-6-', '-8-', '-10-'], // the labels
    r // you need to provide the Raphael object
);
</pre>
<p>Donc vous pouvez facilement controler le nombre de graduations et les textes affichés sur les axes. Pas pire, non?</p>
<p>Bon, si vous voulez aller plus loin (changer la police de caractères par exemple), il va falloir que vous fassiez votre propre fonction axis&#8230;</p>
<h2>Bonus</h2>
<h3>documentation graphael</h3>
<p>Si vous cherchez un peu de documentation sur graphael, voici quelques liens:</p>
<ul>
<li>Documentation pas encore ajoutée au repo officiel: <a href="https://github.com/kennyshen/g.raphael/tree/master/docs" target="_blank">https://github.com/kennyshen/g.raphael/tree/master/docs</a></li>
<li><a href="http://jburrows.wordpress.com/2011/02/21/documentation-for-graphael-g-line-js/" target="_blank">http://jburrows.wordpress.com/2011/02/21/documentation-for-graphael-g-line-js/</a></li>
<li>Une autre librairie raphael pour faire des graphiques: <a href="http://alexyoung.github.com/ico/" target="_blank">http://alexyoung.github.com/ico/</a></li>
</ul>
<h3>Documentation (manque de)</h3>
<p>(en date du 11 mars 2012) Le code d&rsquo;exemple sur la page d&rsquo;accueil n&rsquo;est pas bon:</p>
<pre class="brush: jscript; title: ; notranslate">
// il y a ça:
// r.g.piechart(320, 240, 100, [55, 20, 13, 32, 5, 1, 2]);
// mais ça devrait être ça
r.piechart(320, 240, 100, [55, 20, 13, 32, 5, 1, 2]);
</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2012/03/graphael-axes-et-graduations-tips/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Node, functions asynchones et async</title>
		<link>http://blog.fruitsoftware.com/2012/02/node-functions-asynchones-et-async/</link>
		<comments>http://blog.fruitsoftware.com/2012/02/node-functions-asynchones-et-async/#comments</comments>
		<pubDate>Sat, 11 Feb 2012 03:58:03 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[async]]></category>
		<category><![CDATA[javascript]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=294</guid>
		<description><![CDATA[Ces derniers temps, je fais beaucoup de javascript&#8230; vraiment beaucoup&#8230;. et j&#8217;aime ça! Il y a un &#171;&#160;shift&#160;&#187; de mentalité à faire lorsqu&#8217;on n&#8217;est pas habitué à utiliser des callbacks tous les jours&#8230; Mais en en faisant plus, on se rend compte de la puissance de la chose. Et j&#8217;aime ça! Mes vieux réflexes sont [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Ces derniers temps, je fais beaucoup de javascript&#8230; vraiment beaucoup&#8230;. et j&rsquo;aime ça!</p>
<p>Il y a un &laquo;&nbsp;shift&nbsp;&raquo; de mentalité à faire lorsqu&rsquo;on n&rsquo;est pas habitué à utiliser des callbacks tous les jours&#8230; Mais en en faisant plus, on se rend compte de la puissance de la chose. Et j&rsquo;aime ça! Mes vieux réflexes sont parfois encore là mais &laquo;&nbsp;je me soigne&nbsp;&raquo;, et ça va de mieux en mieux.</p>
<p>J&rsquo;ai eu un problème dernièrement, où il fallait que plusieurs callbacks de fonctions soient executés avant de passer à la suite. </p>
<p>Veuillez noter dans les exemples qui suivent, je vais utiliser la fonction setTimeout pour illustrer le code, mais vous pouvez remplacer setTimeout par toute autre function qui accepte un callback comme paramètre. En utilisant setTimeout, on ne se rend pas bien compte qu&rsquo;on recherche à recevoir un résultat (en paramètre du callback), mais bon&#8230;</p>
<p>Une première approche, qui fonctionne, est la suivante:</p>
<pre class="brush: jscript; title: ; notranslate">
setTimeout(function(
    // with &quot;real functions with callbacks, 
    // the &quot;result&quot; is passed as params of the callback function
    ) {
    console.log('in function 1 callback');
    // ok, now run function2
        setTimeout(function() {
        console.log('in function 2 callback');
        // ok, I'm done
        // now, do what you have to do...
        // ...
    }, 100);
}, 200);

console.log('the end!');
</pre>
<p>Le résultat:</p>
<pre class="brush: plain; title: ; notranslate">
the end!
in function 1 callback
in function 2 callback
</pre>
<p>Cela fonctionne, mais on voit vite le problème: si on a une 3ème fonction à exécuter, on rajoute un autre niveau&#8230; De plus en plus difficile à lire, pas super élégant (à mon goût)&#8230; Donc plus d&rsquo;erreurs en cas de modification future.<br />
En plus, une telle approche exécute les differentes fonctions en série, les unes après les autres.</p>
<p>Donc, après une rapide recherche, j&rsquo;ai découvert la librairie <a href="https://github.com/caolan/async" target="_blank">async</a> de <a title="site web de caolan" href="http://caolanmcmahon.com" target="_blank">caolan</a> (que je ne connaissais pas, mais qui est probablement connu de tout développeur nodejs (?)), initialement développé pour nodejs mais également disponible dans le browser. Cette librairie semble très populaire. Elle est notamment dans le top 6 des packages npm dont dépendent le plus d&rsquo;autres <a href="http://search.npmjs.org/" target="_blank">packages npm</a>.</p>
<p>async contient de nombreuses fonctions qui permettent de resoudre le genre de problèmes décrits plus haut.<br />
Voici un exemple d&rsquo;utilisation de aync.parallel:</p>
<pre class="brush: jscript; title: ; notranslate">
// this example uses nodejs module loading system
var async = require('async');

async.parallel([
    function(callback){
    	// any function with callback
        setTimeout(function(){
        	console.log('in function 1 callback');
        	// when you have what you want, call &quot;callback&quot;
        	// to notify async that the function 1 is done
        	// note: we are in the setTimeout callback function,
        	// that is the beauty!!
            callback(null, 'function 1 result');
        }, 200);
    },
    function(callback){
        setTimeout(function(){
            console.log('in function 2 callback');
            callback(null, 'function 2 result');
        }, 100);
    },
],
// optional callback
function(err, results){
	// we are here only if function 1 and 2 called callback
	// or if one callback param 1 (err) is not null
    console.log('test 1 - in final callback - err:', err, ' - results: ', results);
});

console.log('the end!');
</pre>
<p>Le résultat (exécuté en ligne de commande &laquo;&nbsp;node test-async.js&nbsp;&raquo;):</p>
<pre class="brush: plain; title: ; notranslate">
the end!
in function 2 callback
in function 1 callback
test 1 - in final callback - err: undefined  - results:  [ 'function 1 result', 'function 2 result' ]
</pre>
<p>C&rsquo;est certain que le code est plus long (mais j&rsquo;ai aussi mis plus de commentaires&#8230;), mais on a des avantages:</p>
<ul>
<li>les functions sont exécutées en parallèle. Veuillez noter qu&rsquo;il y a de nombreuses autres stratégies de &laquo;&nbsp;flow&nbsp;&raquo; (en série, waterfall, &#8230;) disponible avec async. Une de plus avancée je trouve (mais je n&rsquo;ai pas encore trouvé une utilité) est auto</li>
<li>on a aussi accès à des fonctions permettant d&rsquo;appliquer la même fonction à des collections (comme async.forEach(), async.map() &#8230;)</li>
</ul>
<p>Le README du projet sur github est complet et décrit très bien toutes les fonctions offertes par la librarie.</p>
<p>Voici un 2ème exemple de callback qui illustre une génération d&rsquo;erreur:</p>
<pre class="brush: jscript; title: ; notranslate">
// test #2 - error
var async = require('async');

async.parallel({
    func3: function(callback){
    	// any function with callback
        setTimeout(function(){
            console.log('in function 3 callback');
            callback('error returned by function 3');
        }, 200);
    },
    func3: function(callback){
        setTimeout(function(){
            console.log('in function 4 callback');
            callback(null, 'function 4 result');
        }, 100);
    },
},
// optional callback
function(err, results){
	// we are here only if func3 and 4 called callback
	// or if one callback first param (err) is not null
	// not that results may contain some values (if some functions have ended)
        // only only one error, 0 to functionCount results
        // note: because we used the parallel map notation, result is a map
    console.log('test 2 - in final callback - err:', err, ' - results: ', results);
});

console.log('the end!');
</pre>
<p>Le résultat:</p>
<pre class="brush: plain; title: ; notranslate">
the end!
in function 4 callback
in function 3 callback
test 2 - in final callback - err: error returned by function 3  - results:  { func2: 'function 4 result', func1: undefined }
</pre>
<p>Voilà, j&rsquo;apprends, doucement&#8230; Et, au cas où vous ne l&rsquo;auriez pas compris&#8230; j&rsquo;aime ça!!</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2012/02/node-functions-asynchones-et-async/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Du nouveau sur geoquity</title>
		<link>http://blog.fruitsoftware.com/2011/10/du-nouveau-sur-geoquity/</link>
		<comments>http://blog.fruitsoftware.com/2011/10/du-nouveau-sur-geoquity/#comments</comments>
		<pubDate>Sun, 23 Oct 2011 23:49:13 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[Projet]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=287</guid>
		<description><![CDATA[Je vous ai déjà parlé de mon projet personnel geoquity. Je viens d&#8217;ajouter un petit &#171;&#160;mashup&#160;&#187; qui utilise Google Maps API, et tout un tas d&#8217;API geolocalisé: wikipedia (via geonames.org) twitter facebook flickr google places yelp plus compliqué à appeler, mais facile une fois qu&#8217;on trouve les exemples de yelp sur github youtube lastfm J&#8217;ai [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je vous ai déjà parlé de mon projet personnel <a title="projet: geoquity" href="http://blog.fruitsoftware.com/2011/10/projet-geoquity/">geoquity</a>. Je viens d&rsquo;ajouter un petit &laquo;&nbsp;mashup&nbsp;&raquo; qui utilise Google Maps API, et tout un tas d&rsquo;API geolocalisé:</p>
<ul>
<li>wikipedia (via <a title="geonames.org" href="http://www.geonames.org/export/ws-overview.html" target="_blank">geonames.org</a>)</li>
<li><a title="twitter api" href="https://dev.twitter.com/docs" target="_blank">twitter</a></li>
<li><a title="facebook graph api" href="https://developers.facebook.com/docs/reference/api/" target="_blank">facebook</a></li>
<li><a title="flickr api" href="http://www.flickr.com/services/api/" target="_blank">flickr</a></li>
<li><a title="google places api" href="http://code.google.com/apis/maps/documentation/places/" target="_blank">google places</a></li>
<li><a title="yelp api" href="http://www.yelp.com/developers/documentation/v2/overview" target="_blank">yelp</a></li>
<ul>
<li>plus compliqué à appeler, mais facile une fois qu&rsquo;on trouve les <a href="https://github.com/Yelp/yelp-api/tree/master/v2/php" target="_blank">exemples de yelp sur github</a></li>
</ul>
<li><a href="http://code.google.com/apis/youtube/overview.html" target="_blank">youtube</a></li>
<li><a title="lastfm api" href="http://www.last.fm/api" target="_blank">lastfm</a></li>
</ul>
<p>J&rsquo;ai aussi utilisé pour récupérer certaines statistiques sur Google Analytics la librairie <a href="http://code.google.com/p/gapi-google-analytics-php-interface/" target="_blank">ga:pi</a>, que j&rsquo;affiche sur <a title="geo stat page" href="http://demo.saadtazi.com/fr/geo/stats" target="_blank">cette page</a> en utilisant le bundle <a href="https://github.com/saadtazi/SaadTaziGChartBundle" target="_blank">SaadTaziGChartBundle</a>.</p>
<p>Toujours du <a href="http://symfony.com">Symfony2</a> (parfait), du <a href="http://documentcloud.github.com/backbone/" target="_blank">backbone</a> (parfait aussi).</p>
<p>Je sais, la carte est trop chargée, trop d&rsquo;icones&#8230; C&rsquo;est un peu &laquo;&nbsp;brut&nbsp;&raquo; encore&#8230;</p>
<p>Des questions, remarques, commentaires? N&rsquo;hésitez pas à poster un commentaire.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/10/du-nouveau-sur-geoquity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projet: SaadTaziOEmbedBundle</title>
		<link>http://blog.fruitsoftware.com/2011/10/projet-saadtazioembedbundle/</link>
		<comments>http://blog.fruitsoftware.com/2011/10/projet-saadtazioembedbundle/#comments</comments>
		<pubDate>Wed, 05 Oct 2011 12:42:06 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[Projet]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[oembed]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=277</guid>
		<description><![CDATA[J&#8217;ai rendu disponible sur github le bundle SaadTaziOEmbedBundle pour Symfony2 qui permet de récupérer des données oembed, pour aller chercher des informations sur des images, vidéos&#8230; lorsque celles-ci sont diffusées par un fournisseur (provider) qui met à disposition les données oembed, comme youtube.com, vimeo.com, flickr.com (la longue liste des fournisseurs est disponible ici)&#8230; Une utilisation possible: [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>J&rsquo;ai rendu disponible sur github le bundle <a href="https://github.com/saadtazi/SaadTaziOEmbedBundle" target="_blank">SaadTaziOEmbedBundle</a> pour <a href="http://symfony.com">Symfony2</a> qui permet de récupérer des données <a href="http://oembed.com">oembed</a>, pour aller chercher des informations sur des images, vidéos&#8230; lorsque celles-ci sont diffusées par un fournisseur (provider) qui met à disposition les données oembed, comme youtube.com, vimeo.com, flickr.com (la longue liste des fournisseurs est disponible <a href="http://oembed.com/#section7" target="_blank">ici</a>)&#8230;</p>
<p>Une utilisation possible: aller chercher le thumbnail de vidéos youtube ou vimeo (sans avoir à utiliser les différentes apis des différents fournisseurs&#8230;)</p>
<p>Pour en savoir plus sur oembed, lisez la spécification <a href="http://oembed.com/">ici</a>.</p>
<p>J&rsquo;ai en fait créé une librairie <a href="https://github.com/saadtazi/simple-oembed" target="_blank">simple-oembed</a> qui est indépendante de Symfony2 (php 5.3+ et curl nécessaires). Le bundle ne fait qu&rsquo;exposer le service oembed grâce au DIC de Symfony2. Vous pouvez bien entendu utiliser cette librairie sans utiliser le bundle.</p>
<p>La documentation est dans le README github. Si vous avez des questions/bugs/commentaires, n&rsquo;hésitez pas (via ce blog ou github).</p>
<p>En espérant que cela serve à quelqu&rsquo;un&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/10/projet-saadtazioembedbundle/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Projet: Geoquity</title>
		<link>http://blog.fruitsoftware.com/2011/10/projet-geoquity/</link>
		<comments>http://blog.fruitsoftware.com/2011/10/projet-geoquity/#comments</comments>
		<pubDate>Tue, 04 Oct 2011 03:53:23 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[Projet]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[assetic]]></category>
		<category><![CDATA[backbone]]></category>
		<category><![CDATA[doctrine]]></category>
		<category><![CDATA[lesscss]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=270</guid>
		<description><![CDATA[Je viens de lancer un nouveau projet personnel, geoquity, qui utilise différentes méthodes de géolocalisation, et les compare (bientôt). Ce projet est dans la lignée d&#8217;un autre projet que j&#8217;avais lancé il y a 2 ans et demi http://geo.fruitsoftware.com/. Mais chaque utilisateur est invité à soumettre les données récupérées par les différentes méthodes de géolocalisations, [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je viens de lancer <a href="http://demo.saadtazi.com/fr/geo" target="_blank">un nouveau projet personnel, geoquity,</a> qui utilise différentes méthodes de géolocalisation, et les compare (bientôt).<br />
Ce projet est dans la lignée d&rsquo;un autre projet que j&rsquo;avais <a href="http://blog.fruitsoftware.com/2010/04/geolocalisation/" target="_blank">lancé il y a 2 ans et demi</a> http://geo.fruitsoftware.com/. Mais chaque utilisateur est invité à soumettre les données récupérées par les différentes méthodes de géolocalisations, afin de pouvoir comparer les résultats (js geolocation api est super performant pour moi, et pour vous?&#8230;).<br />
Toutes les statistiques collectées restent anonymes bien sûr!</p>
<p>Ça a été pour moi l&rsquo;occasion d&rsquo;essayer <a href="http://symfony.com/" target="_blank">Symfony 2</a> et de tester plus en détail <a href="http://documentcloud.github.com/backbone/" target="_blank">backbone</a>. Voici un résumé de mon expérience:</p>
<h2>Symfony</h2>
<p>J&rsquo;ai beaucoup aimé l&rsquo;expérience. Le framework nous force à être organisé, et de plus facilement faire des bundles réutilisables.</p>
<p>Assetic a été très facile d&rsquo;utilisation: j&rsquo;ai mis en place les filtres lesscss et yui compressors très rapidement, mais j&rsquo;ai perdu un peu de temps sur le serveur de production, car j&rsquo;avais oublié d&rsquo;exécuter:</p>
<pre class="brush: plain; title: ; notranslate">php  app/console assetic:dump --env=prod</pre>
<p>Au niveau de Doctrine (ORM), là aussi, assez simple et facile à mettre en place.</p>
<p>Par contre, du côté des formulaires, j&rsquo;ai eu un peu plus de difficulté pour sauvegarder des entités avec une relation one-to-many&#8230; Mais une fois fini, on se rend compte que c&rsquo;était &laquo;&nbsp;évident&nbsp;&raquo;, et que &lsquo;&nbsp;&raquo;il suffisait de le savoir&nbsp;&raquo;&#8230;</p>
<p>Une note par rapport aux namespaces et à l&rsquo;autoloading: Attention au nom des fichiers et des classes PHP: ils doivent être identiques, et la casse doit être la même. Disons que si j&rsquo;avais été plus vigilant, j&rsquo;aurais sauvé une couple de minutes&#8230; J&rsquo;aime mon Mac Book Pro, mais disons que si le filesystem était &laquo;&nbsp;case-sensitive&nbsp;&raquo;, la vie serait plus simple&#8230;</p>
<h2>Backbone</h2>
<p>Là encore, assez simple d&rsquo;utilisation, et ce framework nous force à séparer les choses. Mais je crois que je verrai la puissance si j&rsquo;utilisais un api RESTful et les collections.</p>
<p>Aussi, je trouve que la séparation Model et View est moins évidente en Javscript (pour moi en tout cas). Je suis pas mal certain que je ferai les choses différemment maintenant que j&rsquo;en sais un peu plus sur backbone&#8230;</p>
<h2>Autres affaires</h2>
<h3>html5 boilerplate</h3>
<p>(vraiment rien à dire, dans le bon sens du terme&#8230;)</p>
<h3>the semantic grid</h3>
<p><a href="http://semantic.gs/" target="_blank">The semantic grid</a> est un beau projet, qui permet d&rsquo;utiliser la puissance de lesscss pour réaliser des grids très flexibles sans avoir à utiliser des classes css obscures. Ça rend le html très propre.</p>
<h2>Ce qu&rsquo;il me reste à faire (un jour&#8230;)</h2>
<ul>
<li><del>Ajouter les statistiques et les rendre publiques</del></li>
<li>Configurer <a href="http://jenkins-ci.org/" target="_blank">Jenkins</a> (je débute en configuration de jenkins&#8230;) pour rouler <a href="http://jenkins-php.org/" target="_blank">les tests et d&rsquo;autres outils d&rsquo;asurance qualité</a>, et faire le deploiement sur mon serveur <a href="http://webfaction.com" target="_blank">webfaction</a>.</li>
<li><del>Ajouter un mashup qui collecte des données de différentes API géolocalisées (foursquare, facebook&#8230;)</del></li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/10/projet-geoquity/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Passage à Webfaction</title>
		<link>http://blog.fruitsoftware.com/2011/07/passage-a-webfaction/</link>
		<comments>http://blog.fruitsoftware.com/2011/07/passage-a-webfaction/#comments</comments>
		<pubDate>Sun, 03 Jul 2011 05:03:50 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[Non classé]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=255</guid>
		<description><![CDATA[Un feedback à chaud de webfaction...]]></description>
				<content:encoded><![CDATA[<p>Oui, je l&rsquo;avoue, je suis encore sur du shared hosting&#8230; Mais je viens de passer à du shared hosting amélioré&#8230;</p>
<p>Cela faisait quelques temps que je voulais migrer vers un nouveau &laquo;&nbsp;hosting&nbsp;&raquo;, pour pouvoir facilement expérimenter des nouvelles technologies, sans devoir me poser la question: &laquo;&nbsp;est-ce que mon hosting supporte ça?&nbsp;&raquo;</p>
<p>Mon soucis: je ne voulais pas faire le saut à un VPS:</p>
<ul>
<li>plus cher généralement,</li>
<li>plus de soucis à installer,</li>
<li>il faut constamment mettre à jour, mais pas forcément tout&#8230;</li>
</ul>
<p>Je me suis donc pris du hosting chez <a href="http://webfaction.com">webfaction.com</a>, et voici mon retour sur l&rsquo;expérience &laquo;&nbsp;à date&nbsp;&raquo;.</p>
<h2>Création du compte</h2>
<p>Cela leur a pris 50 minutes pour me donner accès à mon serveur (je pense qu&rsquo;on est 2 dessus&#8230; pour l&rsquo;instant&#8230;). Pas pire&#8230;</p>
<h2>Tickets</h2>
<p>Cela leur a pris 11 minutes pour répondre et donner une solution qui fonctionnent. Bon, je l&rsquo;avoue, c&rsquo;est probablement une question qu&rsquo;ils doivent se faire poser souvent: version php 5.3 pour une symlink app&#8230;</p>
<h2>Version php</h2>
<p>Bon, ils supportent mieux php 5.2 que php 5.3, mais ils supportent les 2.</p>
<p>En créant une app php (qui créée un répertoire dans webapps), on peut choisir quelle version de php 5.2(.11) ou php 5.3(.5). Mais les choses se corsent avec les app &laquo;&nbsp;symbolic links&nbsp;&raquo; (voir plus bas).</p>
<p><strong>Update: </strong></p>
<ol>
<li>Les symbolic links peuvent être soient 5.2 soient 5.3, donc pas besoin modification du .htaccess.</li>
<li>Mmm, pas de apc ou autre accélérateurs php, à moins d&rsquo;installer une version apache et php custom (&laquo;&nbsp;coûte&nbsp;&raquo; de l&rsquo;<a href="http://www.webfaction.com/services/hosting" target="_blank">application memory</a>)</li>
</ol>
<h2>Structures</h2>
<p>Comment ça fonctionne: dans une interface d&rsquo;admin web, on créée un domaine ou sous-domaine, une application (php, ruby, python&#8230;) et on créée finalement un site web qui lie un sous-domaine à une ou plusieurs apps (donc &laquo;&nbsp;http://monsite.com/&nbsp;&raquo; peut rouler du php, &laquo;&nbsp;htpp://monsite.com/testnode&nbsp;&raquo; peut rouler nodejs&#8230;). Rien de neuf sous le soleil, mais facile et intuitif.</p>
<p>Mais comme il faut bien quelques irritants&#8230; Il faut créer une webapp dans leur panneau de contrôle pour pouvoir faire quelque chose. Donc comme la majorité des apps que j&rsquo;ai sont en <a href="http://symfony.com" target="_blank">Symfony</a> 1 ou 2 (mais le problème se poserait aussi pour cakePHP et Zend framework je pense), il ne faut qu&rsquo;exposer un répertoire web/ (qui contient le front controller), et tout le reste du code se trouve au même niveau que web/ (app(s)/ ou lib/ ou src/&#8230;</p>
<p>En cherchant un peu, je trouve qu&rsquo;il est possible de faire de &laquo;&nbsp;symbolic link&nbsp;&raquo; app: parfait! &#8230; mais il faut créer quand même une app (que j&rsquo;ai appelé web_apps) pour déposer tout le code,  que je ne vais jamais linker à un site web pour pouvoir déposer mes apps qui ont besoin d&rsquo;un répertoire web/.</p>
<p><del>Seul hic: les apps &laquo;&nbsp;symbolic link&nbsp;&raquo; ne sont possible (pour l&rsquo;instant, d&rsquo;après le support) qu&rsquo;avec php 5.2&#8230; Le trick est d&rsquo;ajouter la directive suivante dans le .htaccess (j&rsquo;aime pas trop mais ça fonctionne&#8230;):</del></p>
<p><del></p>
<blockquote><p>AddHandler php53-cgi .php</p></blockquote>
<p></del></p>
<p><del>Pas top mais ça ne semble pas ralentir le site.</del></p>
<p>Ceci n&rsquo;est plus nécessaire: 2 mode symbolic links maintenant.</p>
<h2>Installation de node</h2>
<p>Alors là, trop facile. 15 minutes et c&rsquo;était fait&#8230; Une petite recherche sur google et &#8230; J&rsquo;ai utilisé une méthode très similaire à celle décrite par <a href="http://www.ravelrumba.com/blog/how-to-install-node-js-on-webfaction/" target="_blank">Rob Flaherty</a> sur son blog, sauf que:</p>
<ul>
<li>j&rsquo;ai mis les sources de node dans mon app web_apps pour la compilation</li>
<li>ce n&rsquo;est qu&rsquo;après que :
<ul>
<li>j&rsquo;ai créée l&rsquo;app custom (qui roule sur un port),</li>
<li>associer l&rsquo;app à un site</li>
<li>et que je me suis loggé ssh créer le fichier app.js et pour l&rsquo;exécuter</li>
</ul>
</li>
</ul>
<p>Avantage: les sources node ne pollue pas mon app node&#8230;</p>
<h2>Configuration Google email (google apps)</h2>
<p>Depuis l&rsquo;interface d&rsquo;admin my.webfaction.com, très facile: il suffit de créer les MX records&#8230;</p>
<h2>Conclusion</h2>
<p>Pour l&rsquo;instant, je suis très satisfait.</p>
<p>J&rsquo;espère juste qu&rsquo;ils vont améliorer le support de php 5.3, notamment pour les &laquo;&nbsp;symbolic link apps&nbsp;&raquo;.</p>
<p>Autre point positif: beaucoup de documentation, même si l&rsquo;ancien forum pollue parfois google&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/07/passage-a-webfaction/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>GChart Bundle &#8211; un bundle Symfony pour utiliser Google Chart</title>
		<link>http://blog.fruitsoftware.com/2011/05/gchart-bundle-un-bundle-symfony-pour-utiliser-google-chart/</link>
		<comments>http://blog.fruitsoftware.com/2011/05/gchart-bundle-un-bundle-symfony-pour-utiliser-google-chart/#comments</comments>
		<pubDate>Sun, 29 May 2011 17:52:04 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[Projet]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[bundle]]></category>
		<category><![CDATA[chart]]></category>
		<category><![CDATA[google]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=241</guid>
		<description><![CDATA[Je viens de rendre disponible sur github.com GChartBundle, un bundle Symfony (Symfony2 donc&#8230;) qui &#171;&#160;wrappe&#160;&#187; le Google Chart Tool et quelques charts (mais surtout le QrCode) de Google Image Chart API. Ce que j&#8217;ai appris en faisant ce bundle: La puissance du DIC La puissance du Dependency Injection Container&#8230; ou comment permettre à l&#8217;utilisateur de [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>Je viens de <a title="GChartBundle sur github.com" href="https://github.com/saadtazi/SaadTaziGChartBundle" target="_blank">rendre disponible sur github.com</a> GChartBundle, un bundle Symfony (Symfony2 donc&#8230;) qui &laquo;&nbsp;wrappe&nbsp;&raquo; le <a title="Google Chart Tool" href="http://code.google.com/apis/chart/interactive/docs/index.html" target="_blank">Google Chart Tool</a> et quelques charts (mais surtout le QrCode) de <a title="Google Image Chart API" href="http://code.google.com/apis/chart/image/" target="_blank">Google Image Chart API</a>.</p>
<p>Ce que j&rsquo;ai appris en faisant ce bundle:</p>
<h2>La puissance du DIC</h2>
<p>La puissance du Dependency Injection Container&#8230; ou comment permettre à l&rsquo;utilisateur de redéfinir des paramètres du Bundle, passer des services aux services que l&rsquo;on créée&#8230;</p>
<h2>La puissance des Twig Extensions</h2>
<p>&#8230; ou comment définir ses propres fonctions Twig, qui elles-même peuvent appeler &laquo;&nbsp;render&nbsp;&raquo; sur un template.</p>
<p>J&rsquo;ai passé un peu de temps à trouver comment faire, mais l&rsquo;idée est d&rsquo;utiliser la méthode initRunTime() pour garder une référence d&rsquo;un Twig_Environment:</p>
<pre class="brush: plain; title: ; notranslate">
    //in Twig/TwigExtension.php
    public function initRuntime(\Twig_Environment $environment)
    {
        $this-&gt;environment = $environment;
    }
</pre>
<p>J&rsquo;aurais pu aussi de la même manière utiliser un template php (en passant 2 resources dans le DIC par exemple&#8230;), mais un manque de motivation m&rsquo;a gagné (je n&rsquo;utilise pas les templates php de toute façon).</p>
<p>Cette partie (=le &laquo;&nbsp;rendering&nbsp;&raquo; d&rsquo;un template dans l&rsquo;extension Twig) pourrait être plus &laquo;&nbsp;propre aussi&#8230; Dans une version ultérieure peut-être?</p>
<p>Malheureusement, je n&rsquo;ai pas de démo live. Mais voici tout de même un <a href="http://blog.fruitsoftware.com/demo-gchartbundle/" target="_blank">démo</a> statique (copier coller du code html généré localement) de ce que génère l&rsquo;action Demo.</p>
<p>En espérant que ça aide quelqu&rsquo;un&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/05/gchart-bundle-un-bundle-symfony-pour-utiliser-google-chart/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Symfony et l&#8217;AdminBundle &#8211; ça fonctionne!</title>
		<link>http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/</link>
		<comments>http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/#comments</comments>
		<pubDate>Sun, 08 May 2011 02:40:01 +0000</pubDate>
		<dc:creator><![CDATA[Saad Tazi]]></dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[adminBundle]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=229</guid>
		<description><![CDATA[&#171;&#160;Ça ne marche pas, ça fonctionne&#160;&#187; &#8211; JF Excellente nouvelle, l&#8217;AdminBundle a été modifié pour fonctionner avec la version beta1 de Symfony. Grâce à la documentation mise en ligne par Thomas Rabaix , j&#8217;ai assez facilement réussi à obtenir ça: (oui, les datas ne sont pas très réaliste, car loadées rapidement avec DoctrineFixturesBundle) Mon seul [&#8230;]]]></description>
				<content:encoded><![CDATA[<p>&laquo;&nbsp;Ça ne marche pas, ça fonctionne&nbsp;&raquo; &#8211; <em>JF</em></p>
<p>Excellente nouvelle, l&rsquo;AdminBundle a été modifié pour fonctionner avec la version beta1 de Symfony.</p>
<p>Grâce à <a href="http://rabaix.net/AdminBundle/html/index.html" target="_blank">la documentation</a> mise en ligne par <a href="http://twitter.com/#!/th0masr" target="_blank">Thomas Rabaix</a> , j&rsquo;ai assez facilement réussi à obtenir ça:</p>
<p><a href="http://blog.fruitsoftware.com/wp-content/uploads/2011/05/adminBundle.png"><img class="alignnone size-full wp-image-230" title="adminBundle" src="http://blog.fruitsoftware.com/wp-content/uploads/2011/05/adminBundle.png" alt="" width="800" /></a></p>
<p>(oui, les datas ne sont pas très réaliste, car loadées rapidement avec <a href="https://github.com/symfony/DoctrineFixturesBundle">DoctrineFixturesBundle</a>)</p>
<p>Mon seul &laquo;&nbsp;soucis&nbsp;&raquo; a été de comprendre la configuration à insérer dans config.yml, ne sachant pas trop les préfixes &laquo;&nbsp;sonata&nbsp;&raquo; qu&rsquo;il fallait garder. Donc voici ce que j&rsquo;ai mis dans mon fichier:</p>
<pre class="brush: plain; title: ; notranslate">
services:
  sonata.blog.admin.post:
    class: SaadTazi\BlogBundle\Admin\PostAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, group: saadtazi_blog, label: post }
    arguments: [null, SaadTazi\BlogBundle\Entity\Post, BlogBundle:PostAdmin]
  sonata.blog.admin.author:
    class: SaadTazi\BlogBundle\Admin\AuthorAdmin
    tags:
      - { name: sonata.admin, manager_type: orm, group: saadtazi_blog, label: author }
    arguments: [null, SaadTazi\BlogBundle\Entity\Author, BlogBundle:AuthorAdmin]

</pre>
<p>(oui, je sais, j&rsquo;ai fait un mini système de blog, pas très original, et il existe déjà un NewsBundle&#8230; mais c&rsquo;est assez simple comme objectif&#8230;)</p>
<h2>À noter</h2>
<ul>
<li>La documentation: j&rsquo;ai déjà donné le lien de la documentation, mais la revoici, juste au cas où vous n&rsquo;avez pas compris que c&rsquo;est ce qui m&rsquo;a permis d&rsquo;y arriver&#8230; <a href="http://rabaix.net/AdminBundle/html/index.html" target="_blank">http://rabaix.net/AdminBundle/html/index.html</a></li>
<li>La possibilité d&rsquo;ajouter un enregistrement relié par une foreign key directement depuis (depuis une modal jQuery). Un exemple:</li>
</ul>
<p style="text-align: center;"><img class="aligncenter size-large wp-image-231" title="adminBundleAssoc" src="http://blog.fruitsoftware.com/wp-content/uploads/2011/05/adminBundleAssoc-1024x451.png" alt="" width="573" height="253" /></p>
<ul>
<li>Par rapport à l&rsquo;admin generator de symfony 1 (une ligne de commande et on avait un module), là il y a un plus de chose à faire pour le développeur: une classe Controller (super simple), une classe Admin, de la configuration dans config.yml (ou xml ou &#8230;)</li>
<li>Reste à trouver comment customiser les menus (xliff i18n?)&#8230;</li>
<li>Il m&rsquo;a fallu appliquer <a href="https://github.com/deoxxa/AdminBundle/commit/eb44b7652ffa2ae6ef59b467e96ab086e50e3bc2" target="_blank">ce patch</a> afin de supprimer un problème de &laquo;&nbsp;invalid CSRF token&nbsp;&raquo; à chaque fois que je voulais sauvegarder quelque chose (pas encore accepté&#8230;). Donc ce n&rsquo;est probablement pas super stable encore&#8230; Mais je pense que c&rsquo;est une fonctionnalité essentielle pour l&rsquo;adoption de Symfony par la communauté&#8230;</li>
</ul>
<h2>Merci, Merci, Merci, Merci!!!</h2>
<p>Ça ressemble étrangement à django, vous ne trouvez pas <img src="http://s.w.org/images/core/emoji/72x72/1f609.png" alt="😉" class="wp-smiley" style="height: 1em; max-height: 1em;" /> ? Bravo en tout cas en gens autours de <a href="https://github.com/sonata-project" target="_blank">sonata-project</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>
