<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0"><channel><title>Tout sur Rien</title><link>http://blog.fruitsoftware.com</link><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ToutSurRien" /><description>Un blog sur Tout sur Rien</description><language>en</language><lastBuildDate>Fri, 28 Oct 2011 19:33:57 PDT</lastBuildDate><generator>http://wordpress.org/?v=3.2.1</generator><sy:updatePeriod xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">hourly</sy:updatePeriod><sy:updateFrequency xmlns:sy="http://purl.org/rss/1.0/modules/syndication/">1</sy:updateFrequency><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/ToutSurRien" /><feedburner:info uri="toutsurrien" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item><title>Du nouveau sur geoquity</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/FGtPhbgxxWc/</link><category>Projet</category><category>Symfony</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sun, 23 Oct 2011 16:49:13 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=287</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![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&#8217;ajouter un petit &laquo;&nbsp;mashup&nbsp;&raquo; qui utilise Google Maps API, et tout un tas d&#8217;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&#8217;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&#8217;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&#8217;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&#8217;icones&#8230; C&#8217;est un peu &laquo;&nbsp;brut&nbsp;&raquo; encore&#8230;</p>
<p>Des questions, remarques, commentaires? N&#8217;hésitez pas à poster un commentaire.</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/FGtPhbgxxWc" height="1" width="1"/>]]></content:encoded><description>Je vous ai déjà parlé de mon projet personnel geoquity. Je viens d&amp;#8217;ajouter un petit &amp;#171;&amp;#160;mashup&amp;#160;&amp;#187; qui utilise Google Maps API, et tout un tas d&amp;#8217;API geolocalisé: wikipedia (via geonames.org) twitter facebook flickr google places yelp plus compliqué à appeler, mais facile une fois qu&amp;#8217;on trouve les exemples de yelp sur github youtube lastfm J&amp;#8217;ai [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/10/du-nouveau-sur-geoquity/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/10/du-nouveau-sur-geoquity/</feedburner:origLink></item><item><title>Projet: SaadTaziOEmbedBundle</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/o15ByKYsYcc/</link><category>Projet</category><category>Symfony</category><category>bundle</category><category>oembed</category><category>symfony2</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Wed, 05 Oct 2011 05:42:06 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=277</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>J&#8217;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&#8217;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&#8217;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&#8217;hésitez pas (via ce blog ou github).</p>
<p>En espérant que cela serve à quelqu&#8217;un&#8230;</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/o15ByKYsYcc" height="1" width="1"/>]]></content:encoded><description>J&amp;#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&amp;#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)&amp;#8230; Une utilisation possible: [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/10/projet-saadtazioembedbundle/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/10/projet-saadtazioembedbundle/</feedburner:origLink></item><item><title>Projet: Geoquity</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/jwmCpW44Mik/</link><category>Projet</category><category>Symfony</category><category>assetic</category><category>backbone</category><category>doctrine</category><category>lesscss</category><category>symfony2</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Mon, 03 Oct 2011 20:53:23 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=270</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![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&#8217;un autre projet que j&#8217;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&#8217;occasion d&#8217;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&#8217;ai beaucoup aimé l&#8217;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&#8217;utilisation: j&#8217;ai mis en place les filtres lesscss et yui compressors très rapidement, mais j&#8217;ai perdu un peu de temps sur le serveur de production, car j&#8217;avais oublié d&#8217;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&#8217;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&#8217;était &laquo;&nbsp;évident&nbsp;&raquo;, et que &#8216;&nbsp;&raquo;il suffisait de le savoir&nbsp;&raquo;&#8230;</p>
<p>Une note par rapport aux namespaces et à l&#8217;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&#8217;avais été plus vigilant, j&#8217;aurais sauvé une couple de minutes&#8230; J&#8217;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&#8217;utilisation, et ce framework nous force à séparer les choses. Mais je crois que je verrai la puissance si j&#8217;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&#8217;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&#8217;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&#8217;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&#8217;autres outils d&#8217;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>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/jwmCpW44Mik" height="1" width="1"/>]]></content:encoded><description>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&amp;#8217;un autre projet que j&amp;#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, [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/10/projet-geoquity/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/10/projet-geoquity/</feedburner:origLink></item><item><title>Passage à Webfaction</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/SkJDIIUuois/</link><category>Non classé</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sat, 02 Jul 2011 22:03:50 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=255</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Oui, je l&#8217;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&#8217;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&#8217;on est 2 dessus&#8230; pour l&#8217;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&#8217;avoue, c&#8217;est probablement une question qu&#8217;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&#8217;installer une version apache et php custom (&laquo;&nbsp;coûte&nbsp;&raquo; de l&#8217;<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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;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&#8217;un répertoire web/.</p>
<p><del>Seul hic: les apps &laquo;&nbsp;symbolic link&nbsp;&raquo; ne sont possible (pour l&#8217;instant, d&#8217;après le support) qu&#8217;avec php 5.2&#8230; Le trick est d&#8217;ajouter la directive suivante dans le .htaccess (j&#8217;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&#8217;est plus nécessaire: 2 mode symbolic links maintenant.</p>
<h2>Installation de node</h2>
<p>Alors là, trop facile. 15 minutes et c&#8217;était fait&#8230; Une petite recherche sur google et &#8230; J&#8217;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&#8217;ai mis les sources de node dans mon app web_apps pour la compilation</li>
<li>ce n&#8217;est qu&#8217;après que :
<ul>
<li>j&#8217;ai créée l&#8217;app custom (qui roule sur un port),</li>
<li>associer l&#8217;app à un site</li>
<li>et que je me suis loggé ssh créer le fichier app.js et pour l&#8217;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&#8217;interface d&#8217;admin my.webfaction.com, très facile: il suffit de créer les MX records&#8230;</p>
<h2>Conclusion</h2>
<p>Pour l&#8217;instant, je suis très satisfait.</p>
<p>J&#8217;espère juste qu&#8217;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&#8217;ancien forum pollue parfois google&#8230;</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/SkJDIIUuois" height="1" width="1"/>]]></content:encoded><description>Un feedback à chaud de webfaction...</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/07/passage-a-webfaction/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/07/passage-a-webfaction/</feedburner:origLink></item><item><title>GChart Bundle – un bundle Symfony pour utiliser Google Chart</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/D9FQO7VYKvI/</link><category>Projet</category><category>Symfony</category><category>bundle</category><category>chart</category><category>google</category><category>symfony</category><category>symfony2</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sun, 29 May 2011 10:52:04 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=241</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![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&#8217;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&#8217;utilisateur de redéfinir des paramètres du Bundle, passer des services aux services que l&#8217;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&#8217;ai passé un peu de temps à trouver comment faire, mais l&#8217;idée est d&#8217;utiliser la méthode initRunTime() pour garder une référence d&#8217;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&#8217;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&#8217;a gagné (je n&#8217;utilise pas les templates php de toute façon).</p>
<p>Cette partie (=le &laquo;&nbsp;rendering&nbsp;&raquo; d&#8217;un template dans l&#8217;extension Twig) pourrait être plus &laquo;&nbsp;propre aussi&#8230; Dans une version ultérieure peut-être?</p>
<p>Malheureusement, je n&#8217;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&#8217;action Demo.</p>
<p>En espérant que ça aide quelqu&#8217;un&#8230;</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/D9FQO7VYKvI" height="1" width="1"/>]]></content:encoded><description>Je viens de rendre disponible sur github.com GChartBundle, un bundle Symfony (Symfony2 donc&amp;#8230;) qui &amp;#171;&amp;#160;wrappe&amp;#160;&amp;#187; le Google Chart Tool et quelques charts (mais surtout le QrCode) de Google Image Chart API. Ce que j&amp;#8217;ai appris en faisant ce bundle: La puissance du DIC La puissance du Dependency Injection Container&amp;#8230; ou comment permettre à l&amp;#8217;utilisateur de [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/05/gchart-bundle-un-bundle-symfony-pour-utiliser-google-chart/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/05/gchart-bundle-un-bundle-symfony-pour-utiliser-google-chart/</feedburner:origLink></item><item><title>Symfony et l’AdminBundle – ça fonctionne!</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/it9b-rWVVFU/</link><category>programmation</category><category>Symfony</category><category>tips</category><category>adminBundle</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sat, 07 May 2011 19:40:01 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=229</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>&laquo;&nbsp;Ça ne marche pas, ça fonctionne&nbsp;&raquo; &#8211; <em>JF</em></p>
<p>Excellente nouvelle, l&#8217;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&#8217;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&#8217;il fallait garder. Donc voici ce que j&#8217;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&#8217;ai fait un mini système de blog, pas très original, et il existe déjà un NewsBundle&#8230; mais c&#8217;est assez simple comme objectif&#8230;)</p>
<h2>À noter</h2>
<ul>
<li>La documentation: j&#8217;ai déjà donné le lien de la documentation, mais la revoici, juste au cas où vous n&#8217;avez pas compris que c&#8217;est ce qui m&#8217;a permis d&#8217;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&#8217;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&#8217;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&#8217;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&#8217;est probablement pas super stable encore&#8230; Mais je pense que c&#8217;est une fonctionnalité essentielle pour l&#8217;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://blog.fruitsoftware.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' />  ? Bravo en tout cas en gens autours de <a href="https://github.com/sonata-project" target="_blank">sonata-project</a>.</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/it9b-rWVVFU" height="1" width="1"/>]]></content:encoded><description>&amp;#171;&amp;#160;Ça ne marche pas, ça fonctionne&amp;#160;&amp;#187; &amp;#8211; JF Excellente nouvelle, l&amp;#8217;AdminBundle a été modifié pour fonctionner avec la version beta1 de Symfony. Grâce à la documentation mise en ligne par Thomas Rabaix , j&amp;#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 [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">1</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/</feedburner:origLink></item><item><title>Symfony2 beta1 – Notes</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/-w-9wwxw_68/</link><category>programmation</category><category>Symfony</category><category>tips</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sun, 01 May 2011 20:19:09 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=218</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Maintenant que <a href="http://symfony.com/" target="_blank">Symfony 2</a> est disponible en <a href="http://symfony.com/blog/symfony2-beta1-available" target="_blank">beta 1</a>, je n&#8217;ai pas pu résister, il fallait que je fasse quelques tests.<br />
J&#8217;ai joué avec Doctrine2 ORM, les formulaires, les formats (_format json ou html), la gestions des erreurs (404, 500). J&#8217;ai aussi utilisé <a href="http://documentcloud.github.com/backbone/" target="_blank">backbone.js</a> (YESS!!! Me like!!!) et <a href="http://www.aloha-editor.org/" target="_blank">Aloha Editor</a>, peut-être que j&#8217;En parlerai un jour&#8230;</p>
<p>La seule chose qui n&#8217;a pas fonctionnée (et il m&#8217;a fallu moins d&#8217;une minute pour trouver la solutions &#8211; merci Google!): la version courte du tag Twig &laquo;&nbsp;trans&nbsp;&raquo; n&#8217;est plus supportée.<br />
Dans tous les cas, il faut garder un oeil sur la liste des updates qui brise la compatibilité: <a href="https://github.com/symfony/symfony/blob/master/UPDATE.md">https://github.com/symfony/symfony/blob/master/UPDATE.md</a><br />
Wow!</p>
<h2>Notes intéressantes</h2>
<h3>Autoload et Bundle Registration</h3>
<p>Plus de magie: il faut déclarer toutes les librairies que vous utiliser dans autoload.php. En espérant que la librairie que vous voulez utiliser utilise la convention <a href="http://groups.google.com/group/php-standards/web/psr-0-final-proposal?pli=1" target="_blank">PSR-0</a> ou PEAR (qui voudrait inclure une librairie non-PSR-0 anyway <img src='http://blog.fruitsoftware.com/wp-includes/images/smilies/icon_wink.gif' alt=';)' class='wp-smiley' /> ).</p>
<p>En fait, j&#8217;aime ça: on sait ce qui est utilisé dans le projet.</p>
<h3>AdminBundle</h3>
<p>Ça fait 2 fois que j&#8217;essaie d&#8217;installer ce Bundle (remplace l&#8217;admin-generator de symfony1), mais encore une fois sans succès&#8230; En espérant que maintenant que Symfony 2 est en beta, les développeurs vont updater ce Bundle (oui, je sais, j&#8217;aurais pu essayer de le fixer, au moins un peu&#8230; Pas le temps!)</p>
<h3>Doctrine 2</h3>
<p>Toute en douceur, même si je n&#8217;ai pas fait des choses intensives (2 tables simples simples simples&#8230;). J&#8217;ai aimé le fait que la classe du modèle soit uniquement responsable de ce qu&#8217;elle doit être responsable (au revoir active record, bonjour Data Mapper).</p>
<p>Par contre, les behaviours de Doctrine 2 étaient vraiment pratique. Même si il y a quelques plugins qui existent (pas eu le temps de les tester, comme <a href="http://www.gediminasm.org/article/timestampable-behavior-extension-for-doctrine-2" target="_blank">ça</a>), il va falloir attendre les traits (php 5.4?) pour avoir quelque chose de facile à utiliser. Ca va nous forcer à monter des solides hiérarchies de classes probablement (une bonne chose), ou à utiliser les events&#8230;</p>
<p>Ah, aussi, l&#8217;article sur les fixtures Doctrine dans le cookbook fonctionne bien. Du php pur, pas de yaml&#8230; Ok avec ça, sauf pour les gens de QA&#8230; Donc ca va être su deéveloppeur de se monter quelque chose&#8230; ou le Bundle pour les fixtures va être améliorer (mais problème de naming convention: avec les setters et getters des modèles vs les attributs  qui devraient normalement être <em>private</em> ou au moins <em>protected </em>si vous avez du &laquo;&nbsp;coeur&nbsp;&raquo;, quoique le Form Component demande de suivre des &laquo;&nbsp;naming convention&nbsp;&raquo; &#8211; lorsqu&#8217;on passe un objet à un formulaire&#8230;).</p>
<h4>Ajout par rapport à Doctrine (2011-05-07):</h4>
<p>Après quelques tests un peu plus poussés (mais pas trop&#8230;), je me suis demandé s&#8217;il y  avait un mécanisme similaire aux classes XxxxTable.class.php de Doctrine 1.2. Et oui!! Cela existe heureusement, et cela s&#8217;appelle un Repository. Merci à Richard McIntyre pour <a href="http://mackstar.com/blog/2010/10/04/using-repositories-doctrine-2" target="_blank">son article</a>. Voir aussi la <a href="http://www.doctrine-project.org/docs/orm/2.0/en/reference/working-with-objects.html#custom-repositories" target="_blank">documentation Doctrine officielle correspondante</a> (un peu caché et un peu court, non?).</p>
<h3>error template</h3>
<p>- les templates 404 et 500 supporte les templates Twig (symfony 1 offrait la possibilité d&#8217;avoir une page 500 mais elle n&#8217;était pas prise en charge par le framework (ce qui se comprend bien&#8230; ) et peuvent hériter d&#8217;un autre template. Mais attention: trop de logique et de code peut générer une autre erreur. Et là, vous n&#8217;obtiendrai qu&#8217;une page toute blanche&#8230;</p>
<p>- c&#8217;est le même template (error.html.twig pour la version html) qui est utilisé pour les 404 et 500 &#8211; c&#8217;est au développeur de mettre en place une logique &laquo;&nbsp;switch&nbsp;&raquo; sur le status_code s&#8217;il veut avoir différentes pages 404 et 500. Mais peut-être qu&#8217;il y a une autre manière de gérer la page 404 dans le routing, à la Sinatra par exemple? Histoire à suivre&#8230; Update (probablement disponible en beta2): C&#8217;est maintenant <a href="https://github.com/symfony/symfony-docs/commit/736fc4c6ecf88c7d4e7779851400b48a4c7e63c5" target="_blank">possible</a>: Il suffit d&#8217;avoir un template errorXXX.html.twig par exemple, ou XXX est le status code http (404, 500, 403&#8230;). Si ce template n&#8217;existe pas, alors error.html.twig sera utilisé.</p>
<h3>&laquo;&nbsp;app.yml is gone&nbsp;&raquo;</h3>
<p>Je n&#8217;ai pas trouvé de recommendation dans le &laquo;&nbsp;book&nbsp;&raquo; pour conserver les settings et paramètres d&#8217;une application, par environnement. J&#8217;imagine que &laquo;&nbsp;import&nbsp;&raquo; dans config.yml et le Yaml component permettent de faire ça très facilement.</p>
<p>Dans le même ordre d&#8217;idée, je n&#8217;ai pas trouvé de détails sur config.yml dans le profiler&#8230;</p>
<h3>Conclusion</h3>
<p>Bon, en un mot, j&#8217;ai bien hâte de l&#8217;utiliser sur un vrai projet! Je vous en reparlerai à ce moment-là&#8230; Histoire à suivre donc&#8230;</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/-w-9wwxw_68" height="1" width="1"/>]]></content:encoded><description>Maintenant que Symfony 2 est disponible en beta 1, je n&amp;#8217;ai pas pu résister, il fallait que je fasse quelques tests. J&amp;#8217;ai joué avec Doctrine2 ORM, les formulaires, les formats (_format json ou html), la gestions des erreurs (404, 500). J&amp;#8217;ai aussi utilisé backbone.js (YESS!!! Me like!!!) et Aloha Editor, peut-être que j&amp;#8217;En parlerai un [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/05/symfony2-beta1-notes/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/05/symfony2-beta1-notes/</feedburner:origLink></item><item><title>Symfony 2 et AsseticBundle – tips</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/WWQ8eYUl69Y/</link><category>programmation</category><category>Symfony</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sun, 24 Apr 2011 16:44:52 PDT</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=206</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Je suis vraiment impressionné par <a href="https://github.com/kriswallsmith/assetic" target="_blank">Assetic</a>, la librairie PHP écrite par Kris Wallsmith.</p>
<p>Elle permet pour tout projet PHP de gérer les &laquo;&nbsp;assets&nbsp;&raquo; javascript et css, en utilisant des techniques modernes tel que: less, sass, coffeescript&#8230;</p>
<p>La documentation étant encore un peu sommaire, notamment pour l&#8217;Intégration avec <a href="http://symfony.com" target="_blank">Symfony 2</a>, voici quelques notes afin de ne pas oublier comment faire (pour la prochaine fois hein&#8230;)</p>
<h2>Less</h2>
<p>Config.yml</p>
<pre class="brush: plain; title: ; notranslate">
# Assetic Configuration
assetic:
    debug:          %kernel.debug%
    use_controller: %kernel.debug%
    read_from:      %kernel.root_dir%/../web/bundles
    write_to:       %kernel.root_dir%/../web/assets
    filters:
        cssrewrite: ~
        less: ~
#...
parameters:
  assetic.node.bin: /usr/local/bin/node
  #ca m'a pris longtemps pour trouver la config
  #  pour loader les packages npm par exemple
  assetic.node.paths:
    - /usr/local/lib/node
</pre>
<p>Puis dans routing_dev.yml (nécessaire là où use_controller est true), j&#8217;ai ajouté la route:</p>
<pre class="brush: plain; title: ; notranslate">
_assetic:
    resource: .
    type: assetic
</pre>
<p>Puis il suffit d&#8217;inclure dans le template (Twig):</p>
<pre class="brush: plain; title: ; notranslate">
{% stylesheets
		filter='less'
		output='css/all.css'
		'@SaadTestBundle/Resources/public/less/main.less'
%}
&lt;link href=&quot;{{asset_url}}&quot; rel=&quot;stylesheet&quot;/&gt;
{% endstylesheets %}
</pre>
<p>Cela produira:</p>
<pre class="brush: plain; title: ; notranslate">
&lt;link href=&quot;/app_dev.php/css/all_main1.css&quot; rel=&quot;stylesheet&quot;/&gt;
</pre>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/WWQ8eYUl69Y" height="1" width="1"/>]]></content:encoded><description>Je suis vraiment impressionné par Assetic, la librairie PHP écrite par Kris Wallsmith. Elle permet pour tout projet PHP de gérer les &amp;#171;&amp;#160;assets&amp;#160;&amp;#187; javascript et css, en utilisant des techniques modernes tel que: less, sass, coffeescript&amp;#8230; La documentation étant encore un peu sommaire, notamment pour l&amp;#8217;Intégration avec Symfony 2, voici quelques notes afin de ne pas [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/04/symfony-2-et-asseticbundle-tips/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">6</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/04/symfony-2-et-asseticbundle-tips/</feedburner:origLink></item><item><title>Node.js, express.js et autres découvertes</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/ZVOeOewFou8/</link><category>programmation</category><category>expressjs</category><category>framework</category><category>javascript</category><category>nodejs</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Sun, 27 Feb 2011 16:26:53 PST</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=191</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>J&#8217;ai &laquo;&nbsp;commis&nbsp;&raquo; un mini-projet de test, afin de découvrir <a href="http://nodejs.org/" target="_blank">node.js</a> et plus spécifiquement <a href="http://expressjs.com/" target="_blank">express</a> (ou express.js), un mico-framework qui s&#8217;appuie sur node.js.</p>
<p>J&#8217;en ai profité pour jeter un coup d&#8217;oeil à <a href="http://mongodb.org" target="_blank">mongoDB</a>, et un ORM node.js de mongoDB qui s&#8217;appelle <a href="http://mongoosejs.com/" target="_blank">mongoose</a>.</p>
<p>Voici le <a href="https://github.com/saadtazi/test-expressjs" target="_blank">lien github</a>.</p>
<h2>J&#8217;aime</h2>
<ul>
<li>tout est évènement, rien n&#8217;est bloquant. Le language <a href="http://code.google.com/p/v8/" target="_blank">Javascript v8</a> <a href="http://shootout.alioth.debian.org/u32/which-programming-languages-are-fastest.php" target="_blank">est ultra-rapide</a>, donc si on ajoute le fait que rien n&#8217;est bloquant, alors wooooww!!</li>
<li>Un seul language client-side et server-side, et des librairies qui parfois fonctionnent des 2 côtés (le même fichier!!!).</li>
</ul>
<h2>J&#8217;aime un peu moins</h2>
<ul>
<li>un léger bémol sur la documentation de express: la doc est là, mais j&#8217;ai du googler de nombreuses chose, ou pire, aller voir le source (non, je sais il n&#8217;y a rien de grave, au contraire&#8230;)</li>
<li>C&#8217;est une technologie (encore trop?) récente: les numéros de versions (de node.js, expess, &#8230;) évoluent rapidement, et les différents packages ne sont pas forcément compatible.</li>
<li>(lié au point précédent) Il y a des milliers de packages &laquo;&nbsp;qui font la même chose&nbsp;&raquo;: impossible de compter combien de &laquo;&nbsp;template engines&nbsp;&raquo; existent, ou de client mySQL (taper &laquo;&nbsp;nodejs mysql&nbsp;&raquo; dans <a href="http://www.google.ca/search?sourceid=chrome&#038;ie=UTF-8&#038;q=nodejs+mysql" target="_blank">google</a> pour voir&#8230;)</li>
<li>Ça m&#8217;a fait réalisé que je ne maitrise pas toutes les subtilités du Javascript. Mais là, je ne peux blamer que moi-même.</li>
</ul>
<h2>J&#8217;aime pas</h2>
<p>Rien, j&#8217;aime tout.</p>
<h2>Pour conclure</h2>
<p>J&#8217;adore! J&#8217;aime! &#8230; mais j&#8217;attends un peu encore pour l&#8217;utiliser en production. Quoique, pour utiliser les webSockets et Socket.io: trop fort!</p>
<p>Il est temps de se mettre sérieusement, très sérieusement au Javscript.</p>
<p>Très prometteur&#8230;</p>
<h2>Update (2010-03-05)</h2>
<h3>mongodb</h3>
<p>Attention, dans mon code, si le serveur mongodb (c&#8217;est à dire &laquo;&nbsp;mongob&nbsp;&raquo;) n&#8217;est pas démarré avant de démarrer le serveur node, aucune requête ne sera servie (loade à l&#8217;infini)&#8230; Vous êtes prévenus maintenant&#8230;</p>
<h3>Lesscss</h3>
<p>Pour ajouter le support de lesscss, il suffit d&#8217;ajouter la ligne suivante dans app.configure():</p>
<pre class="brush: plain; title: ; notranslate">
app.configure(function(){
    //...
    //activate less compiler
    app.use(express.compiler({ src: pub, enable: ['less'] }));
    //...
});
</pre>
<p>Ensuite, il vous suffit de mettre dans public/ vos fichiers less (exemple: main.less). Dans vos templates, il faut continuer à mettre des fichiers css (exemple: main.css), express (ou node) va les compiler automatiquement et créer une version statique css dans public/.</p>
<p>Par contre, il faut 2 requêtes avant que le fichier less soit compilé en css: la première retourne un 404, la 2ème est ok. Donc attention lors du développement.</p>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/ZVOeOewFou8" height="1" width="1"/>]]></content:encoded><description>J&amp;#8217;ai &amp;#171;&amp;#160;commis&amp;#160;&amp;#187; un mini-projet de test, afin de découvrir node.js et plus spécifiquement express (ou express.js), un mico-framework qui s&amp;#8217;appuie sur node.js. J&amp;#8217;en ai profité pour jeter un coup d&amp;#8217;oeil à mongoDB, et un ORM node.js de mongoDB qui s&amp;#8217;appelle mongoose. Voici le lien github. J&amp;#8217;aime tout est évènement, rien n&amp;#8217;est bloquant. Le language Javascript [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/02/node-js-express-js-et-autres-decouvertes/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">2</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/02/node-js-express-js-et-autres-decouvertes/</feedburner:origLink></item><item><title>Notes sur les frameworks Python</title><link>http://feedproxy.google.com/~r/ToutSurRien/~3/MD39xnaW7Mk/</link><category>programmation</category><category>framework</category><category>notes</category><category>python</category><dc:creator xmlns:dc="http://purl.org/dc/elements/1.1/">Saad Tazi</dc:creator><pubDate>Thu, 03 Feb 2011 20:23:24 PST</pubDate><guid isPermaLink="false">http://blog.fruitsoftware.com/?p=185</guid><content:encoded xmlns:content="http://purl.org/rss/1.0/modules/content/"><![CDATA[<p>Il y a quelques semaines s&#8217;est tenue à Montréal un <a href="http://www.yearonelabs.com/google-hackathon/">Hackathon Google</a>, et j&#8217;ai eu envie d&#8217;explorer l&#8217;univers Python&#8230;<span id="more-185"></span></p>
<p>Voici quelques notes sur mes recherches sur Pythons et les différents frameworks Python. Étant familier avec le framework PHP symfony (bientôt la version Symfony2!!), quelques termes ne sont pas issue de l&#8217;&nbsp;&raquo;univers Python&nbsp;&raquo;, mais plutôt de symfony (ou PHP).</p>
<p>Disclaimer: Je n&#8217;ai pas encore essayé tous les frameworks ou librairies cités dans cet article, mes remarques et notes sont donc basées essentiellement sur des lectures. La prochaine étape logique va être de monter une preuve de concept avec l&#8217;un de ces frameworks (probablement <a href="http://flask.pocoo.org/">lui</a>?).</p>
<h2>Remarques générales sur l&#8217;&nbsp;&raquo;univers Python&nbsp;&raquo;</h2>
<p>La totalité de la documentation que j&#8217;ai consulté est excellente! Vraiment impressionnant! (un gros merci à <a href="http://sphinx.pocoo.org/">Sphinx</a> j&#8217;imagine&#8230; Même l&#8217;univers PHP commence à l&#8217;utiliser (<a href="http://www.doctrine-project.org/docs/orm/2.0/en/">là</a>), mais c&#8217;est une autre histoire))</p>
<p>Les tests unitaires sont de plus en plus adoptés, quelque soit le language, mais avec Python, c&#8217;est systématique&#8230;</p>
<p>Aussi, les librairies sont bien découplées (c&#8217;est le principe d&#8217;une librairie me direz vous&#8230;), et normalement facilement interchangeable: beaucoup de framework offre un choix d&#8217;ORM ou de template engines, ou de méthodes de &laquo;&nbsp;routing&nbsp;&raquo;&#8230;</p>
<p>J&#8217;ai trouvé qu&#8217;il y avait beaucoup de &laquo;&nbsp;template engines&nbsp;&raquo; de disponible en Python&#8230; Bien ou mal? Bien pour la communauté, moins bien pour l&#8217;entreprise qui veut adopter des standards.</p>
<p>Ah si, une chose négative quand même: pas d&#8217;attributs ou de méthodes privés dans les classes&#8230; Et pas de &laquo;&nbsp;new&nbsp;&raquo; pour créer une classe: il va falloir s&#8217;habituer si je veux aller plus loin&#8230;</p>
<h2><a href="http://www.djangoproject.com/">Django</a></h2>
<p>Le framework qui popularisa Python sur le web (après Zope peut-être&#8230; C&#8217;est en tout cas mon impression). Ça semble bon, avec beaucoup de fonctionnalités incluses, et &laquo;&nbsp;assez monolitique&nbsp;&raquo; (à nuancer &#8230; cf. mon commentaire plus haut).</p>
<h3>Plus</h3>
<ul>
<li>Scaffolding (admin-generator) flexible, configurable</li>
<li>Beaucoup de fonctionnalités déjà incluses</li>
<li>beaucoup de plugins</li>
<li>Très grande communauté</li>
<li>Très bonne documentation</li>
</ul>
<h3>Moins</h3>
<ul>
<li>ActiveRecord: même si on peut utiliser l&#8217;ORM de son choix, on perd tout le scaffolding (d&#8217;après mes recherches)</li>
<li>Trop de features (?) = plus lent?</li>
</ul>
<h2><a href="http://docs.pylonsproject.org/projects/pyramid/1.0/">Pyramid</a></h2>
<p>Le petit frère de repoze.bfg (et un peu de Pylons?).</p>
<h3>Plus</h3>
<ul>
<li>Plusieurs options d&#8217;ORM ou de &laquo;&nbsp;routing&nbsp;&raquo; (qu&#8217;on peut mixer)</li>
<li>Possibilité d&#8217;utiliser <a href="http://www.sqlalchemy.org/">SQLAlchemy</a> ,que j&#8217;aime beaucoup</li>
<li>Le type de routing &laquo;&nbsp;Traversal&nbsp;&raquo;: si un attribut est Iterable, alors on peut avoir des urls automatiques, du genre: /category/products/prod-1</li>
</ul>
<h3>Moins</h3>
<ul>
<li>Mmm, &#8230; Pas vraiment de points négatif, il faudrait voir à l&#8217;usage&#8230;</li>
</ul>
<h2><a href="http://flask.pocoo.org/">Flask</a></h2>
<p>J&#8217;ai beaucoup aimé l&#8217;aspect microframework, et &laquo;&nbsp;boite à outils&nbsp;&raquo; de Flask. Ah, et<a href="http://lucumr.pocoo.org/2010/4/3/april-1st-post-mortem/"> comment flask est né</a>, à partir d&#8217;un &laquo;&nbsp;april fool&nbsp;&raquo;, c&#8217;est bon&#8230;</p>
<p>L&#8217;idée de base: faire un framework léger, à partir de 2 librairies Python &laquo;&nbsp;solides&nbsp;&raquo;:</p>
<ul>
<li><a href="http://jinja.pocoo.org/">Jinja2</a>, un template engine qui semble être populaire</li>
<li><a href="http://www.pocoo.org/projects/werkzeug">werkzeug</a>, une boite à outils pour les applications <a href="http://wsgi.org/wsgi/What_is_WSGI">WSGI</a></li>
</ul>
<h3>Plus</h3>
<ul>
<li>Micro, donc (plus) rapide (que les autres)?</li>
<li>Boite à outils, des plugins bien &laquo;&nbsp;wrappés&nbsp;&raquo;</li>
</ul>
<h3>Moins</h3>
<ul>
<li>Liste de plugins limités&#8230;mais ce ne semble pas être vraiment un point négatif, c&#8217;est plutôt le principe même des microframeworks: utiliser n&#8217;importe quelle librairies.</li>
<li>Mmm, &#8230; Pas vraiment de points négatif donc, il faudrait voir à l&#8217;usage&#8230;</li>
<li>Ah si, il y a ce point: les règles de routage ne sont pas groupé, et pour de grosses applications, ça peut vite être difficile de s&#8217;y retrouver (mais peut-être que je suis dans le champ, et qu&#8217;il est super-simple de faire ça en Python&#8230;)</li>
</ul>
<h2>Conclusion</h2>
<p>La liste des frameworks Python est longue, très longue&#8230;</p>
<p>Oui, et bien, lire c&#8217;est bien, mais utiliser c&#8217;est mieux. Je vais voir si d&#8217;autres frameworks ressortent du lot (mes recherches ne sont pas fini), mais là là, j&#8217;essayerais bien Flask. Histoire à suivre donc&#8230;</p>
<h2>Liens utiles</h2>
<p>Quelques liens qui m&#8217;ont aidé lors de ma recherche:</p>
<ul>
<li>site du framework <a href="http://www.djangoproject.com/">Django</a></li>
<li><a href="http://blog.curiasolutions.com/the-great-web-framework-shootout/">The Great Web Framework Shootout</a>: des benchmarks sur plusieurs framework. On peut toujours critiquer les bencharks, mais certains chiffres ne mentent pas&#8230;</li>
<li><a href="http://wiki.python.org/moin/WebFrameworks">Listes des frameworks Python</a></li>
<li><a href="http://www.sqlalchemy.org/">SQLAlchemy</a> est un ORM qui a l&#8217;air très intéressant, et ce n&#8217;est PAS du Active Record Pattern, mais du Data Mapper, que je pense meilleur), et &#8230;</li>
<li><a href="http://code.google.com/p/formalchemy/">formAlchemy</a> a l&#8217;air bon aussi, pour permettre de faire du scaffolding rapidement avec SQLAlchemy (je trouve le scaffolding utile pour le développement itératif&#8230;)</li>
<li><a href="http://www.pocoo.org/">http://www.pocoo.org/</a> est une communauté Python qui fait de beaux projets, comme Jinja2: un template engine &laquo;&nbsp;en vogue&nbsp;&raquo; vraiment bon , Flask (voir plus haut), et d&#8217;autres bonne choses dont on peut abuser.</li>
<li>Performances des serveurs Python: <a href="http://nichol.as/benchmark-of-python-web-servers">http://nichol.as/benchmark-of-python-web-servers </a></li>
<li>Quelques remarques de la communauté <a href="http://stackoverflow.com/questions/70913/which-python-framework-is-best-for-web-development-in-google-app-engine">ici</a>, <a href="http://stackoverflow.com/questions/48681/pros-cons-of-django-vs-pylons">ici</a></li>
<li><a href="http://stackoverflow.com/questions/48681/pros-cons-of-django-vs-pylons"></a></li>
</ul>
<img src="http://feeds.feedburner.com/~r/ToutSurRien/~4/MD39xnaW7Mk" height="1" width="1"/>]]></content:encoded><description>Il y a quelques semaines s&amp;#8217;est tenue à Montréal un Hackathon Google, et j&amp;#8217;ai eu envie d&amp;#8217;explorer l&amp;#8217;univers Python&amp;#8230; Voici quelques notes sur mes recherches sur Pythons et les différents frameworks Python. Étant familier avec le framework PHP symfony (bientôt la version Symfony2!!), quelques termes ne sont pas issue de l&amp;#8217;&amp;#160;&amp;#187;univers Python&amp;#160;&amp;#187;, mais plutôt de [...]</description><wfw:commentRss xmlns:wfw="http://wellformedweb.org/CommentAPI/">http://blog.fruitsoftware.com/2011/02/notes-sur-les-frameworks-python/feed/</wfw:commentRss><slash:comments xmlns:slash="http://purl.org/rss/1.0/modules/slash/">0</slash:comments><feedburner:origLink>http://blog.fruitsoftware.com/2011/02/notes-sur-les-frameworks-python/</feedburner:origLink></item></channel></rss>

