<?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 &#187; programmation</title>
	<atom:link href="http://blog.fruitsoftware.com/category/programmation/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.fruitsoftware.com</link>
	<description>Un blog sur Tout sur Rien</description>
	<lastBuildDate>Sat, 29 Oct 2011 02:33:57 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3</generator>
		<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>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: &#8230; <a href="http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/05/symfony-et-ladminbundle-ca-fonctionne/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Symfony2 beta1 &#8211; Notes</title>
		<link>http://blog.fruitsoftware.com/2011/05/symfony2-beta1-notes/</link>
		<comments>http://blog.fruitsoftware.com/2011/05/symfony2-beta1-notes/#comments</comments>
		<pubDate>Mon, 02 May 2011 03:19:09 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=218</guid>
		<description><![CDATA[Maintenant que Symfony 2 est disponible en beta 1, je n&#8217;ai pas pu résister, il fallait que je fasse quelques tests. J&#8217;ai joué avec Doctrine2 ORM, les formulaires, les formats (_format json ou html), la gestions des erreurs (404, 500). &#8230; <a href="http://blog.fruitsoftware.com/2011/05/symfony2-beta1-notes/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/05/symfony2-beta1-notes/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Symfony 2 et AsseticBundle &#8211; tips</title>
		<link>http://blog.fruitsoftware.com/2011/04/symfony-2-et-asseticbundle-tips/</link>
		<comments>http://blog.fruitsoftware.com/2011/04/symfony-2-et-asseticbundle-tips/#comments</comments>
		<pubDate>Sun, 24 Apr 2011 23:44:52 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[Symfony]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=206</guid>
		<description><![CDATA[Je suis vraiment impressionné par Assetic, la librairie PHP écrite par Kris Wallsmith. Elle permet pour tout projet PHP de gérer les &#171;&#160;assets&#160;&#187; javascript et css, en utilisant des techniques modernes tel que: less, sass, coffeescript&#8230; La documentation étant encore un &#8230; <a href="http://blog.fruitsoftware.com/2011/04/symfony-2-et-asseticbundle-tips/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/04/symfony-2-et-asseticbundle-tips/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Node.js, express.js et autres découvertes</title>
		<link>http://blog.fruitsoftware.com/2011/02/node-js-express-js-et-autres-decouvertes/</link>
		<comments>http://blog.fruitsoftware.com/2011/02/node-js-express-js-et-autres-decouvertes/#comments</comments>
		<pubDate>Mon, 28 Feb 2011 00:26:53 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[expressjs]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[javascript]]></category>
		<category><![CDATA[nodejs]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=191</guid>
		<description><![CDATA[J&#8217;ai &#171;&#160;commis&#160;&#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&#8217;appuie sur node.js. J&#8217;en ai profité pour jeter un coup d&#8217;oeil à mongoDB, et un ORM node.js de mongoDB qui s&#8217;appelle &#8230; <a href="http://blog.fruitsoftware.com/2011/02/node-js-express-js-et-autres-decouvertes/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/02/node-js-express-js-et-autres-decouvertes/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Notes sur les frameworks Python</title>
		<link>http://blog.fruitsoftware.com/2011/02/notes-sur-les-frameworks-python/</link>
		<comments>http://blog.fruitsoftware.com/2011/02/notes-sur-les-frameworks-python/#comments</comments>
		<pubDate>Fri, 04 Feb 2011 04:23:24 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[notes]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=185</guid>
		<description><![CDATA[Il y a quelques semaines s&#8217;est tenue à Montréal un Hackathon Google, et j&#8217;ai eu envie d&#8217;explorer l&#8217;univers Python&#8230; Voici quelques notes sur mes recherches sur Pythons et les différents frameworks Python. Étant familier avec le framework PHP symfony (bientôt &#8230; <a href="http://blog.fruitsoftware.com/2011/02/notes-sur-les-frameworks-python/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![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>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/02/notes-sur-les-frameworks-python/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Capitales &#8211; mini-projet</title>
		<link>http://blog.fruitsoftware.com/2011/01/capitales-mini-projet/</link>
		<comments>http://blog.fruitsoftware.com/2011/01/capitales-mini-projet/#comments</comments>
		<pubDate>Mon, 10 Jan 2011 03:02:29 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[jquerymobile]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=173</guid>
		<description><![CDATA[Toujours afin de tester de nouvelles technologies et de m&#8217;exercer avec le framework Symfony2 et les librairies javascript pour mobile, j&#8217;ai décidé de faire un mini-projet qui liste les pays du monde et leurs capitales. Le résultat final se trouve &#8230; <a href="http://blog.fruitsoftware.com/2011/01/capitales-mini-projet/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Toujours afin de tester de nouvelles technologies et de m&#8217;exercer avec le framework Symfony2 et les librairies javascript pour mobile, j&#8217;ai décidé de faire un mini-projet qui liste les pays du monde et leurs capitales. Le résultat final se trouve <a href="http://departements.fruitsoftware.com/capitales/extract" target="_blank">ici</a>.</p>
<p>Après avoir chercher une base de données qui comprend les pays et leurs capitales, j&#8217;ai finalement décider d&#8217;utiliser Wikipedia et parser le html. Je voulais pouvoir refaire l&#8217;import si nécessaire. Donc il me fallait le faire programmatiquement, en utilisant PHP.</p>
<p>Notes</p>
<ul>
<li>Même si la table HTML de Wikipedia semble uniforme, il m&#8217;a fallu traiter les différences de DOM</li>
<li>Utilisation de SplFileObject au lieu de fread: Utiliser les classes de la Standard PHP Librairy, c&#8217;est louable. Mais comment lire le fichier d&#8217;&nbsp;&raquo;une shot&nbsp;&raquo;, l&#8217;équivalent de:
<pre class="brush: plain; title: ; notranslate">contents = fread($handle, filesize($filename));</pre>
</li>
<li>J&#8217;ai essayé d&#8217;utiliser la classe Crawler de Symfony2, normelement utilisée pour les tests fonctionnelles: cette classes n&#8217;est pas fait pour parser du XML, même si j&#8217;ai bien aimé la classe qui convertit un selecteur css en selecteur XPath.</li>
<li>En utilisant DOMDocument: mmm, trop &laquo;&nbsp;verbose&nbsp;&raquo;, pas facile de parcourir le document je trouve, les attributs nodeValue et textContent retourne le contenu &laquo;&nbsp;strippé&nbsp;&raquo;, donc il faut utiliser la méthode saveXML() uniquement utilisable depuis DOMDocument, donc si on a un DOMNode, il faut faire un
<pre class="brush: plain; title: ; notranslate">$myDOMNode-&gt;ownerDocumnent-&gt;saveXML($myDOMNode);</pre>
<p>Pas très élégant, non?</li>
<li>Donc retour à SimpleXML, mais la méthode XPath de SimpleXML semble très limité (peut-être à cause des namespace ou du fait que ce soit du html?). Donc l&#8217;essentiel est en SimpleXML, mais j&#8217;ai du utilisé la méthode DocDocument::getElementById() et convertir en SimpleXMLElement en utilisant la fonction simplexml_import_dom.</li>
<li>Plus d&#8217;info sur les limitations que j&#8217;ai rencontré avec la méthode SimpleXMLElement::xpath() (mais c&#8217;est peut-être juste moi):
<ul>
<li>incapable de loader le html&#8230; Peut-être est-ce à cause des namespaces?</li>
<li>incapable d&#8217;utiliser les selector XPath de type attribut:
<pre class="brush: plain; title: ; notranslate">root/node[@id='my-id']</pre>
</li>
</ul>
</li>
<li>Quelques problème d&#8217;encoding avec DomDocument: il a fallu qu&#8217;en loadant le string XML, j&#8217;ajoute le &laquo;&nbsp;tag&nbsp;&raquo; xml  
<pre class="brush: plain; title: ; notranslate">$domDoc-&gt;loadHTML('&lt;?xml encoding=&quot;UTF-8&quot;&gt;' . $content);</pre>
</li>
</ul>
<p>Aussi, j&#8217;ai toujours une des problèmes de performance avec jQuery, lorsque le DOM est trop important&#8230;</p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/01/capitales-mini-projet/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>jQuery mobile, Symfony2, Doctrine 2 et autres tests&#8230;</title>
		<link>http://blog.fruitsoftware.com/2011/01/jquery-mobile-doctrine-2-et-autres-tests/</link>
		<comments>http://blog.fruitsoftware.com/2011/01/jquery-mobile-doctrine-2-et-autres-tests/#comments</comments>
		<pubDate>Sat, 01 Jan 2011 22:41:27 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[Symfony]]></category>
		<category><![CDATA[jquery]]></category>
		<category><![CDATA[mobile]]></category>
		<category><![CDATA[symfony]]></category>
		<category><![CDATA[symfony2]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=145</guid>
		<description><![CDATA[Bonne année!! Et oui, après de longs mois de silence, les bonnes résolutions de 2011: comme je suis curieux, j&#8217;ai voulu faire quelques tests avec Symfony2 et jQuery mobile. Et comme ma blonde a une &#171;&#160;passion&#160;&#187; pour les départements français &#8230; <a href="http://blog.fruitsoftware.com/2011/01/jquery-mobile-doctrine-2-et-autres-tests/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Bonne année!!</p>
<p>Et oui, après de longs mois de silence, les bonnes résolutions de 2011: comme je suis curieux, j&#8217;ai voulu faire quelques tests avec <a title="Symfony2" href="http://symfony-reloaded.org" target="_blank">Symfony2</a> et <a href="http://jquerymobile.com" target="_blank">jQuery mobile</a>.</p>
<p>Et comme ma blonde a une &laquo;&nbsp;passion&nbsp;&raquo; pour les départements français (donner un numéro de département, et deviner le nom du département &#8211; difficile à comprendre quand on n&#8217;est pas de France j&#8217;imagine), j&#8217;ai fait un <a href="http://departements.fruitsoftware.com/">mini-site</a> qui liste les départements français (liste de tous les départements ou par région).</p>
<p><a href="http://departements.fruitsoftware.com" target="_blank">Testez-le ici.</a></p>
<h2>Mise à jour (2011-01-09)</h2>
<p>J&#8217;ai aussi réaliser quelque chose de similaire pour les capitales des pays. <a title="Capitales du monde" href="http://departements.fruitsoftware.com/capitales/extract#ctry-22" target="_blank">Voir ici</a>. Cela m&#8217;a permis de jouer avec les classes php SimpleXMLElement, DOMDocument et la famille PHP DOM, mais aucune ne m&#8217;a complètement convaincue. Voir <a href="/2011/01/capitales-mini-projet/">ici</a> pour des commentaires additionnels.</p>
<h2>J&#8217;ai utilisé&#8230;</h2>
<ul>
<li>le framework Symfony2 PR4: j&#8217;ai utilisé le fichier tarball pour être rapidement &laquo;&nbsp;efficace&nbsp;&raquo;. Simple à installer, mais je pense qu&#8217;il manque quelques commandes Symfony pour générer des Bundles par exemple (j&#8217;ai pas trop chercher, peut-être que ça existe)</li>
<li>jQuery mobile 1.0 ALPHA 2:
<ul>
<li>les listView: encore quelques améliorations sont nécessaire (notamment pour les count bubbles des nested list), mais ça promet,</li>
<li>les liens (remplacés en call ajax) et le back automatique: cool, mais parfois pas très fluide et très lent, et je pense que c&#8217;est encore lent si le lien est dans une liste de 100+ items (DOM trop complexe)</li>
<li>parfois lorsque la page se loade sur le iphone, le css ne semble pas appliqué. Le problème se résout lorsqu&#8217;on raffraichit la page: problème de latence réseau, problème de webKit, problème de DOM trop long, ou de performance iPhone? Je ne sais pas, mais problème il y a&#8230; Pour répliquer à tout coup le problème, allez sur votre iphone à <a href="http://departements.fruitsoftware.com/index2.html">http://departements.fruitsoftware.com/index2.html</a>. Dans la dernière version (<a href="http://departements.fruitsoftware.com">http://departements.fruitsoftware.com</a>), j&#8217;ai séparé les listes imbriquées en 2 pages: chaque nested list est dans une page séparée.</li>
<li>d&#8217;une manière générale, il reste encore (un peu (?), beaucoup (?)) de travail à faire. Mais très prometteur et utilisable si on accepte les limitations actuels.</li>
</ul>
</li>
<li>une base de donnée mySQL et l&#8217;ORM Doctrine 2 avec les docBlock annotations (Doctrine 2: excellent!!). Sauf que je n&#8217;ai pas trouvé de façon d&#8217;initialiser la connexion à UTF8 via la configuration de Symfony2. Pour m&#8217;en sortir, j&#8217;ai créé une petite méthode dans l&#8217;unique controleur de l&#8217;application (probablement une meilleure manière de faire, notamment via les <a href="http://www.doctrine-project.org/docs/dbal/2.0/en/reference/events.html" target="_blank">postConnect events</a> de la DBAL de Doctine):
<pre class="brush: plain; title: ; notranslate">
    public function fixUtf8() {
        $conn = $this-&gt;get('database_connection');
        $statement = $conn-&gt;prepare('SET NAMES \'utf8\';');
        $statement-&gt;execute();
    }
</pre>
</li>
<li><a href="http://www.twig-project.org/" target="_blank">Twig</a> pour les views de Symfony2: je n&#8217;ai pas trouvé de limitations pour l&#8217;instant, il faut s&#8217;habituer je pense à la syntaxe (et à l&#8217;IDE qui ne &laquo;&nbsp;highlight&nbsp;&raquo; pas et ne formate pas correctement &#8211; tabs&#8230;)</li>
</ul>
<h2>Reste à tester&#8230;</h2>
<ul>
<li>le HTTP cache de Symfony2: je trouve le principe excellent, je me garde juste ça pour plus tard&#8230;</li>
<li>comment jQuery mobile se comporte avec Google Analytics, notamment avec le remplacement automatique des liens par des calls Ajax [EDIT] J&#8217;ai trouvé ce lien qui semble répondre à cette question: <a href="http://www.jongales.com/blog/2011/01/10/google-analytics-and-jquery-mobile/">http://www.jongales.com/blog/2011/01/10/google-analytics-and-jquery-mobile/</a></li>
<li>les formulaire jQuery mobile et leur intégration avec Symfony2</li>
<li>les formulaires Symfony2 en général</li>
<li><a href="http://www.phonegap.com/" target="_blank">PhoneGap</a> (lire cet <a href="http://insideria.com/2010/12/code-files-for-using-jquery-mo.html" target="_blank">article</a>)</li>
</ul>
<h2>Quelques remarques</h2>
<ul>
<li>s&#8217;il vous plait, pas de commentaires sur les régions qui ne sont pas des régions, &#8230;. J&#8217;ai pris mes données de <a href="http://fr.wikipedia.org/wiki/D%C3%A9partements_fran%C3%A7ais_avec_leur_carte_de_localisation" target="_blank">wikipédia</a>, alors, bon, hein&#8230;</li>
<li>Le framework Symfony2 semble avoir gagner en robustesse par rapport à la version 1, mais aussi plus exigeant: code plus long à taper. Rien de bien grave là, surtout si on gagne en clarté, performance, fonctionalité, beauté (oui oui, Symfony2, c&#8217;est beau!!), règles de l&#8217;art&#8230;</li>
<li>Pour tester: Chrome et firefox l&#8217;affaire (en redimensionnant la fenêtre), mais j&#8217;ai aussi utilisé le iPhone Simulator qui vient avec xcode (sur Mac uniquement)</li>
<li>j&#8217;ai utilisé Apache et mySQL installé via <a href="http://www.macports.org/">macPorts</a>: fini pour moi MAMP, j&#8217;ai plus de contrôle avec MacPorts, notamment pour installer des extensions php.</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2011/01/jquery-mobile-doctrine-2-et-autres-tests/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>eZ Publish, Cache and Performance</title>
		<link>http://blog.fruitsoftware.com/2010/09/ez-publish-cache-and-performance/</link>
		<comments>http://blog.fruitsoftware.com/2010/09/ez-publish-cache-and-performance/#comments</comments>
		<pubDate>Sun, 05 Sep 2010 16:04:38 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[caching]]></category>
		<category><![CDATA[ezpublish]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=136</guid>
		<description><![CDATA[eZ Publish is not the fastest CMS I&#8217;ve seen. It is flexible (you can define your own classes (type of content), and the fields that define your class. But it seems like &#171;&#160;more flexible != fast&#160;&#187;. Just take a look &#8230; <a href="http://blog.fruitsoftware.com/2010/09/ez-publish-cache-and-performance/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>eZ Publish is not the fastest CMS I&#8217;ve seen. It is flexible (you can define your own classes (type of content), and the fields that define your class. But it seems like &laquo;&nbsp;more flexible != fast&nbsp;&raquo;. Just take a look at the number of queries on a page that has object relations fields, and you will understand why: it can reach more than 100 queries on a page!</p>
<p>If your eZ Publish is slow (actually even if it&#8217;s not slow!!), you should activate eZ Publish caching mechanism. I was looking for some info about eZ Publish, and here is what I found.</p>
<h2>Links and notes about Ez Publish caching</h2>
<ol>
<li><a href="http://share.ez.no/articles/ez-publish/ez-publish-performance-optimization-part-3-of-3-practical-cache-and-template-solutions/%28page%29/2" target="_blank">http://share.ez.no/articles/ez-publish/ez-publish-performance-optimization-part-3-of-3-practical-cache-and-template-solutions/%28page%29/2</a>
<ul>
<li>This article explains the different cache mechanism (template cache, view cache, preview cache), and the {cache-block} template function</li>
</ul>
</li>
<li><a href="http://ez.no/doc/ez_publish/technical_manual/4_x/features/view_caching/configuring_the_view_cache" target="_blank">http://ez.no/doc/ez_publish/technical_manual/4_x/features/view_caching/configuring_the_view_cache</a>
<ul>
<li>It explains how to deactivate the view cache on specific pages, by adding the following code at the beginning of the related template:
<pre class="brush: plain; title: ; notranslate">{set-block scope=global variable=cache_ttl}0{/set-block}</pre>
</li>
<li>This tip is really useful when you have user session related pages, like a profile page, a cart page&#8230;</li>
</ul>
</li>
</ol>
<h2>deactivate eZ Publish cache on ou development environment</h2>
<p>These are the settings I usually add to the frontend siteaccesses to deactivate the cache mechanism. Remember to remov them on your staging/test and live environments.</p>
<pre class="brush: plain; title: ; notranslate">
[ContentSettings]
#...(other settings in that section)
#dev only
ViewCaching=disabled
#dev only
PreViewCache=disabled

[TemplateSettings]
#... (other settings in that section)
#dev only
TemplateCache=enabled

[OverrideSettings]
#... (other settings in that section)
#dev only
Cache=disabled
</pre>
<p>Oh, and also deactivate template caching (in TemplateSettings), your integrators will hate you if you don&#8217;t: they would have to clear eZ Publish cache everytime they change a template &#8211; using the following command:</p>
<pre class="brush: plain; title: ; notranslate">php bin/php/ezcache --clear-all --purge</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2010/09/ez-publish-cache-and-performance/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Notes: Apache,  MAMP</title>
		<link>http://blog.fruitsoftware.com/2010/08/notes-apache-mamp/</link>
		<comments>http://blog.fruitsoftware.com/2010/08/notes-apache-mamp/#comments</comments>
		<pubDate>Sun, 29 Aug 2010 18:55:12 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[tips]]></category>
		<category><![CDATA[apache]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=127</guid>
		<description><![CDATA[Because I don&#8217;t want to loose time with those things the next time I setup MAMP, I decided to write it down. I hope it will help you too! mod_rewrite doesn&#8217;t work? Make sure mod_rewrite is enabled: Check you httpd.conf &#8230; <a href="http://blog.fruitsoftware.com/2010/08/notes-apache-mamp/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Because I don&#8217;t want to loose time with those things the next time I setup MAMP, I decided to write it down. I hope it will help you too!</p>
<h2>mod_rewrite doesn&#8217;t work?</h2>
<p>Make sure mod_rewrite is enabled:</p>
<pre class="brush: plain; title: ; notranslate">LoadModule rewrite_module modules/mod_rewrite.so</pre>
<p>Check you httpd.conf (or apache.conf) settings, specially the following setting: <a href="http://httpd.apache.org/docs/2.0/mod/core.html#allowoverride">AllowOverride</a></p>
<pre class="brush: plain; title: ; notranslate">AllowOverride All</pre>
<p>You can put inside a Directory block, in a virtual host for example:</p>
<pre class="brush: plain; title: ; notranslate">
&lt;VirtualHost *:8888&gt;
ServerName local.mysite.com
DocumentRoot /path/to/web/root
&lt;Directory &quot;/path/to/web/root&quot;&gt;
AllowOverride All
&lt;/Directory&gt;
#...
</pre>
<p>This is valid for any Apache bundle (MAMP, WAMP, XAMP, or Apache itself)</p>
<h2>MAMP mySQL &#8211; connection problem?</h2>
<p>If you&#8217;re having trouble connecting to MySQL (using PDO for example), try the following tip:</p>
<p>edit startMySQL.sh in /Applications/MAMP/bin and add the following line at the end:</p>
<pre class="brush: plain; title: ; notranslate">ln -s /Applications/MAMP/tmp/mysql/mysql.sock /tmp/mysql.sock &amp;</pre>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2010/08/notes-apache-mamp/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>quelques notes sur le développement d&#8217;applications iPhone</title>
		<link>http://blog.fruitsoftware.com/2010/05/quelques-notes-sur-le-developpement-dapplications-iphone/</link>
		<comments>http://blog.fruitsoftware.com/2010/05/quelques-notes-sur-le-developpement-dapplications-iphone/#comments</comments>
		<pubDate>Sat, 08 May 2010 15:33:15 +0000</pubDate>
		<dc:creator>Saad Tazi</dc:creator>
				<category><![CDATA[programmation]]></category>
		<category><![CDATA[iphone]]></category>
		<category><![CDATA[tips]]></category>

		<guid isPermaLink="false">http://blog.fruitsoftware.com/?p=113</guid>
		<description><![CDATA[Voici quelques notes prises lors de mon auto-apprentissage sur le développement d&#8217;applications iphone. En effet, étant du genre &#171;&#160;c&#8217;est quoi déjà?&#160;&#187;, j&#8217;ai regroupé quelques informations dans cet article afin de pouvoir centraliser certaines informations que j&#8217;ai trouvées pertinentes&#8230; En espérant &#8230; <a href="http://blog.fruitsoftware.com/2010/05/quelques-notes-sur-le-developpement-dapplications-iphone/">Lire la suite <span class="meta-nav">&#8594;</span></a>]]></description>
			<content:encoded><![CDATA[<p>Voici quelques notes prises lors de mon auto-apprentissage sur le développement d&#8217;applications iphone.</p>
<p>En effet, étant du genre &laquo;&nbsp;c&#8217;est quoi déjà?&nbsp;&raquo;, j&#8217;ai regroupé quelques informations dans cet article afin de pouvoir centraliser certaines informations que j&#8217;ai trouvées pertinentes&#8230; En espérant que cela puisse vous aider aussi.</p>
<p>L&#8217;essentiel des informations étant en anglais, j&#8217;ai donc laissé l&#8217;information dans la langue originale.</p>
<h2>Some Objective-C stuff</h2>
<ul>
<li>When declaring a method, <strong>&laquo;&nbsp;-&nbsp;&raquo;</strong> is fr instance methods, <strong>&laquo;&nbsp;+&nbsp;&raquo;</strong> is for Class methods.</li>
<li>If <strong>you message nil, it returns zero</strong>.</li>
<li>with NSString inValue returns 0 if it&#8217;s not an integer. If it starts  with an integer but followed by &laquo;&nbsp;crap&nbsp;&raquo; (9873ikdi) it will return the  integer (9873). Same thing with floatValue, doubleValue&#8230;</li>
<li>If you overwite the -(id) init method, always return the result of  [super init].</li>
<li>when release method is called, the retain count is decreased, if  it&#8217;s zero then the dealloc s called</li>
<li><strong>never call -(void)dealloc</strong> directly, except if you overwite  the -(void)dealloc method, you should call [super dealloc].</li>
<li>if your method returns an object that you created in the method:
<ul>
<li>use the [newObject autorelease] or</li>
<li>prefix your method name with &laquo;&nbsp;alloc&nbsp;&raquo;, &laquo;&nbsp;copy&nbsp;&raquo; or &laquo;&nbsp;new&nbsp;&raquo; to inform the  developer that he will have to release it</li>
</ul>
</li>
<li>balance the number of retain and release</li>
<li>If you use <strong>autorelease</strong>, the object will be put in the  autorelease pull. At the end of the event handling cycle,  the  autorelease pull will call the release method on the objects in the  pull, and if the <strong>retain count hits 0</strong>, the object is <strong>deallocated</strong>)</li>
<li>&laquo;&nbsp;attribute.property = value&nbsp;&raquo; will call the setter, but &laquo;&nbsp;property =  value&nbsp;&raquo; will access the property directly</li>
<li>you can overwite -(void) <strong>awakeFromNib</strong> method in your  AppDelegate to initialize values</li>
</ul>
<h2>From &laquo;&nbsp;<a title="iPhone Aplication Programming Guide" href="http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationEnvironment/ApplicationEnvironment.html#//apple_ref/doc/uid/TP40007072-CH7-SW1" target="_blank">iPhone Application Programming Guide</a>&laquo;&nbsp;</h2>
<ul>
<li>When <strong>your application quits, you should save out information</strong> about your  application’s current state in addition to any unsaved data. At launch  time, you should look for this state information and use it to restore  your application to the state it was in when it was last used.</li>
</ul>
<table style="height: 107px;" border="0" cellspacing="0" cellpadding="5" width="722">
<tbody>
<tr>
<td scope="row"><code><a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/applicationDidFinishLaunching:" target="_top">applicationDidFinishLaunching:</a></code></td>
<td>Use   this method to restore the application to the state it was in during   the previous session. You can also use this method to perform any custom   initialization to your application data structures and user interface.</td>
</tr>
<tr>
<td scope="row"><code><a href="http://developer.apple.com/iphone/library/documentation/UIKit/Reference/UIApplicationDelegate_Protocol/Reference/Reference.html#//apple_ref/occ/intfm/UIApplicationDelegate/applicationWillTerminate:" target="_top">applicationWillTerminate:</a></code></td>
<td>Use   this method to save any unsaved data or key application state to disk.   You can also use this method to perform additional cleanup operations,   such as deleting temporary files.</td>
</tr>
</tbody>
</table>
<ul>
<li>All applications should respond to this notification and do their part  to help relieve the <strong>memory pressure</strong>. For information on how to handle  such notifications in your application, see <a href="http://developer.apple.com/iphone/library/documentation/iPhone/Conceptual/iPhoneOSProgrammingGuide/ApplicationEnvironment/ApplicationEnvironment.html#//apple_ref/doc/uid/TP40007072-CH7-SW49">“Observing  Low-Memory Warnings.”</a></li>
<li>Icon.png is mandatory</li>
<li>an application can be interrupted by an incoming phone call, an SMS  message, a calendar alert, or by the user pressing the Sleep button on a  device.(&#8230;) If the user decides to take a call or reply to an SMS message, however,  the system does proceed to <strong>terminate your application</strong>.</li>
<li>A <strong>keychain</strong> is a secure, encrypted container for passwords and other  secrets. The keychain data for an application is stored outside of the  application sandbox.</li>
<li>Avoid writing cache files to disk. The only exception to this rule is  when your application quits and you need to write state information that  can be used to put your application back into the same state when it is  next launched.</li>
<li>Unlike most desktop applications, where the user manually chooses when  to save files to disk, your application should <strong>save changes  automatically </strong>at key points in your workflow. Exactly when you save data  is up to you, but there are two potential options. Either you can save  each change immediately as the user makes it, or you can batch changes  on the same page together and save them when the page is dismissed, a  new page is displayed, or the application quits. Under no circumstances  should you let the user navigate to a new page of content without saving  the data on the previous page.</li>
<li>If your application accesses the network using the<strong> Wi-Fi </strong>radios, you  must notify the system of that fact by including the <code>UIRequiresPersistentWiFi</code> key in the application’s <code>Info.plist</code> file. The inclusion of  this key lets the system know that it should display the network  selection panel if it detects any active Wi-Fi hot spots. It also lets  the system know that it should not attempt to shut down the Wi-Fi  hardware while your application is running.</li>
<li>UIView:</li>
</ul>
<p><img src="http://developer.apple.com/iphone/library/documentation/WindowsViews/Conceptual/ViewPG_iPhoneOS/Art/uiview_classes.jpg" alt="View class hierarchy" /></p>
<p>NSFetchedResultsController: A &laquo;&nbsp;helper&nbsp;&raquo; controller between TableViewController and Core Data.</p>
<ul>
<li>Load data lazily</li>
<li>multiple NIBs so you don&#8217;t load everything at the same time</li>
<li>Every controllers can receive didReceiveMemoryWarning&#8230; By default, it will unload all the views that are not on screen&#8230; So ViewDidLoad can be called more than once (at te beginning and after a memory Warning when the view needs to be reloaded)</li>
</ul>
<p>More to come from the &laquo;&nbsp;<a title="iPhone Human Interface Guide" href="http://developer.apple.com/iphone/library/documentation/UserExperience/Conceptual/MobileHIG/Introduction/Introduction.html" target="_blank">iPhone Human Interface Guide</a>&laquo;&nbsp;&#8230;</p>
<h3>Sources:</h3>
<p><a href="http://developer.apple.com/iphone/index.action">http://developer.apple.com/iphone/index.action</a></p>
<p><a href="#mce_temp_url#">http://deimos3.apple.com/WebObjects/Core.woa/Browse/itunes.stanford.edu.3124430053.03124430055</a></p>
]]></content:encoded>
			<wfw:commentRss>http://blog.fruitsoftware.com/2010/05/quelques-notes-sur-le-developpement-dapplications-iphone/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

