<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Ziki - Cyril Mougel's last published content</title>
    <link>http://www.ziki.com/fr/shingara+8250</link>
    <pubDate>sam, 04 Oct 2008 17:51:00 +0200</pubDate>
    <ttl>120</ttl>
    <description>Mon contenu chez Ziki.com</description>
    <item>
      <title>Sortie de Pictrails 0.5.0</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/411206984/sortie-de-pictrails-0-5-0</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Peu de temps avant mon anniversaire qui a lieu le 11 Octobre, voici une nouvelle version de <a href="http://pictrails.rubyforge.org">Pictrails</a>.
</p>
<p>
  Durant cette release, la grosse nouveauté est l'ajout des commentaires. Désormais sur chaque photo, des commentaires peuvent être ajoutés. Au niveau de l'administration, il y a la possibilité de gérer ces commentaires en les éditant et les supprimant. Ce n'est bien sûr que le début de l'ajout des commentaires sur pictrails. Si vous désirez formater vos commentaires, vous pouvez le faire avec le format redcloth.
</p>
<p>
  Au niveau ergonomie, j'ai ajouter la vue des photos précédentes et suivantes dans la même galerie. Cette fonctionnalité n'était pas intégré dans Pictrails. Cette erreur est donc désormais résolu.
</p>
<p>
  Les photos sont désormais triés de la photo la plus récente à la plus ancienne dans la vue des photos pour la galerie.
</p>
<p>
  Tout retour est toujours le bienvenu ainsi que la proposition de design. Je rappele aussi qu'une <a href="http://pictrails.shingara.fr/">version de démo</a> est disponible. avec comme login admin/pictrails
</p>
<p>
  <a href="http://blog.shingara.fr/en/2008-10-04-pictrails-0-5-0-released.html">English translation</a>
</p>
</div>]]>
      </description>
      <pubDate>sam, 04 Oct 2008 17:51:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7944017</guid>
    </item>
    <item>
      <title>Quelles nouvelles dans Rails Edge : Connection pools</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/387006468/quelles-nouvelles-dans-rails-edge-connection-pools</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Traduction de l'article de Ryan Daigle, <a href="http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-connection-pools">What's new in edge rails : Connection Pools</a>
</p>
<p>
  Avec la venue prochaine de <a href="http://weblog.rubyonrails.org/2008/8/16/josh-peek-officially-joins-the-rails-core">Rails thread-safe</a>, il était nécessaire d'ajouter le <a href="http://github.com/rails/rails/commit/6f932b4790371e548c0df9033da96b2cf8f51dcc">pool de connection à la base de donnée</a>. Moins qu'une fonctionnalité, mais un détail d'implémentation caché. Vous avez la possibilité de définir la taille de ce pool. Cette configuration est dans le fichier <code>database.yml</code> avec le mot clé pool:
</p>
<div>
  <pre>
<code>development:   
  adapter: mysql
  username: root    
  database: myapp_dev
  pool: 10 </code>
</pre>
</div>
<p>
  Vous voilà avec un pool de connection. Facile
</p>
</div>]]>
      </description>
      <pubDate>lun, 08 Sep 2008 22:46:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7737615</guid>
    </item>
    <item>
      <title>Quelles nouvelles dans Rails Edge : Les layouts pour les mails</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/387006469/quelles-nouvelles-dans-rails-edge-les-layouts-pour-les-mails</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Traduction de l'article de Ryan Daigle, <a href="http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-mailer-layouts">What's new in edge rails : Mailer Layouts</a>
</p>
<p>
  Rails a ajouté la possibilité <a href="http://github.com/rails/rails/commit/e9a8e0053be3b293ab89fb584f1d660063f107aa">d'utiliser des layouts pour les mails</a> exactements comme il est actuellement possible pour leurs grand frère les vues. Il faut juste noté que pour qu'un layout de mail soit automatiquement reconnu, il doit se finir par _mailer. Donc pour un mail:
</p>
<div>
  <pre>
<code>ass UserMailer &lt; ActionMailer::Base
  def registration(user)
    subject    "You've registered"
    from       "system@example.com"
  end
end</code>
</pre>
</div>
<p>
  vous n'aurait besoin que d'un layout à <code>layouts/user_mailer.html.erb</code>. Si vous spécifiez explicitement le layout vous n'avez pas besoin du suffix _mailer. Ainsi, dans l'exemple suivant, un layout à <code>layouts/email.html.erb</code> suffit:
</p>
<div>
  <pre>
<code>class UserMailer &lt; ActionMailer::Base
  layout 'email'
  ...
end</code>
</pre>
</div>
<p>
  A partir de maintenant, vous pouvez faire de joli petit email. Vous avez désormais tous les outils.
</p>
</div>]]>
      </description>
      <pubDate>lun, 08 Sep 2008 22:37:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7737616</guid>
    </item>
    <item>
      <title>Quelles nouvelles dans Rails Edge : Les Shallow routes</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/387006471/quelles-nouvelles-dans-rails-edge-les-shallow-routes</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Traduction de l'article de <a href="http://ryandaigle.com/">Ryan Daigle</a>, <a href="http://ryandaigle.com/articles/2008/9/7/what-s-new-in-edge-rails-shallow-routes">What's new in edge rails : Shallow routes</a>
</p>
<p>
  Le système des routes avec Rails est assez malin. Dans une optique d'être le plus descriptif possible, la description des ressources est fait au niveau des URL avec une DSL spécifique pour les routes :
</p>
<div>
  <pre>
<code>       
map.resources :users do |user|         
  user.resources :articles do |article|
    article.resourcs :comments
  end
end         </code>
</pre>
</div>
<p>
  Néanmoins, si cette configuration permet de voir les articles disponibles à l'URL <code>/users/1/articles</code> et les commentaires à l'URL <code>/users/1/articles/1/comments</code>, il y a des cas où on voudrais outrepasser cette hiérarchie et accéder directement à la ressource en question. Désormais avec l'option des <a href="http://github.com/rails/rails/commit/83c6ba18899a9f797d79726ca0078bdf618ec3d4">shallow route</a>, vous le pouvez.
</p>
<div>
  <pre>
<code>                          
map.resources :users, :shallow =&gt; true do |user|
  user.resources :articles do |article|
    article.resources :comments
  end
end         </code>
</pre>
</div>
<p>
  Cette configuration permet de conserver les routes imbriquées et vous donne accès directement au route comme ceci:
</p>
<div>
  <pre>
<code>      
<span>articles_path</span> <span>#=&gt; '/articles'                             </span>
<span>comments_path</span> <span>#=&gt; '/comments'                             </span>
<span>article_comments_path</span><span>(</span><span>@article</span><span>)</span> <span>#=&gt; '/articles/1/comments'</span></code>
</pre>
</div>
<p>
  Plus besoin de déclarer séparement les routes directes en plus des routes imbriquées. l'option <code>:shallow</code> fait tout les routes nécessaires automatiquement pour vous.
</p>
</div>]]>
      </description>
      <pubDate>lun, 08 Sep 2008 22:11:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7737617</guid>
    </item>
    <item>
      <title>Profiler une requ&#234;te rails</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/382224376/profiler-une-requete-rails</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Pour découvrir le bug dont j'ai <a href="http://blog.shingara.fr/2008/08/28/gettext-avec-Rails-ca-peux-etre-long-pour-un-formulaire-en-erreur">reporté précédement les effets</a>, j'ai voulu réaliser un profile de la requête executée. Ca devait me permettre de voir ce qui prenait vraiment beaucoup de temps dans l'execution de cette page.
</p>
<h3>
  Utilisation du script Request Profiler
</h3>
<p>
  Depuis Rails 2.0, un nouveau script a été ajouté, <code>script/performance/request</code>. Ce script permet de réaliser un profile d'une ou plusieurs requête internet.
</p>
<p>
  Pour indiquer les requêtes à executer il suffit de réaliser un petit fichier de script avec le même format que les tests d'intégrations. Voici un exemple issue du changelog de rails.
</p>
<div>
  <pre>
<code><span>get_with_redirect</span> <span>'</span><span>/</span><span>'</span>
<span>say</span> <span>"</span><span>GET / =&gt; <span>#{path}</span></span><span>"</span>
<span>post_with_redirect</span> <span>'</span><span>/sessions</span><span>',</span> <span>:username</span> <span>=&gt;</span> <span>'</span><span>john</span><span>',</span> <span>:password</span> <span>=&gt;</span> <span>'</span><span>doe</span><span>'</span>
<span>say</span> <span>"</span><span>POST /sessions =&gt; <span>#{path}</span></span><span>"</span></code>
</pre>
</div>
<p>
  Une fois le script réalisé, il suffit de lancer la commande en définissant le nombre de requêtes qui seront effectuées
</p>
<pre>
$ ./script/performance/request -n 10 login_session.rb
</pre>
<p>
  Par contre, il faut faire très attention, il n'y a aucune solution (ou tout du moins à ma connaissance) pour définir les valeurs de la session. La session est vierge à chaque lancement de script. Il faut donc réaliser la connection de login au préalable pour avoir un utilisateur loggé par exemple.
</p>
<h3>
  Incompatibilité Rails 2.1 et ruby-prof
</h3>
<p>
  Alors que j'avais indiqué <a href="http://blog.shingara.fr/2008/06/27/vivre-avec-edge-ou-quoi-de-neuf-dans-rails-edge-1-changement-dapi-et-des-tests-de-performances">l'ajout d'un nouveau script dans Rails Edge qui nécessitait ruby-prof 0.6.1</a>, je pensais que c'était le seul endroit qui nécessitait cette version de <a href="http://ruby-prof.rubyforge.org/">ruby-prof</a> qui n'existe pas encore (dernière version stable : 0.6.0 en téléchargement sur rubyforge). Hélas, ce n'est pas le cas. Depuis la version 2.1 de Rails, le script performance/request nécessite aussi ruby-prof 0.6.1. Mais cette version, n'est toujours pas encore sortie officielement. Il faut donc générer et installer ce gem pour arriver à avoir cette fonctionnalité. En effet, même en modifiant la version de ruby-prof des méthodes n'existent pas dans les versions antérieurs à la version 0.6.1
</p>
<h3>
  Génération et installation de ruby-prof-0.6.1
</h3>
<p>
  Il faut d'abord récupérer les sources directements à partir du svn de ruby-prof
</p>
<pre>
svn co http://ruby-prof.rubyforge.org/svn/
</pre>
<p>
  Ensuite, il faut générer le gem
</p>
<pre>
$ rake package
</pre>
<p>
  Enfin, il suffit d'installer le gem.
</p>
<pre>
# gem install pkg/ruby-prof-0.6.1.gem
</pre>
<p>
  Désormais, ruby-prof 0.6.1 est installé et vous pouvez utiliser pleinement le script performance/request.
</p>
<p>
  <a href="http://blog.shingara.fr/en/2008-09-03-profile-a-request-in-rails.html">English translation</a>
</p>
</div>]]>
      </description>
      <pubDate>mer, 03 Sep 2008 09:49:32 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7693211</guid>
    </item>
    <item>
      <title>Et si j'&#233;crivais aussi un peu en anglais ?</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/381698344/et-si-jecrivais-aussi-un-peu-en-anglais</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Ce que j'écris en français peut par le plus grand des hasard avoir un intérêt pour des personnes anglophile. J'ai donc décidé de traduire certain de mes articles directement en anglais. Typo n'ayant pas encore de support pour le multi-blog (en prévision), j'ai donc voulu avoir un blog vraiment léger. Pour cela, rien de plus simple, j'ai décidé d'utiliser <a href="http://rassmalog.rubyforge.org/">rassmalog</a>.
</p>
<p>
  Si vous voulez donc lire ma prose anglaise <a href="http://blog.shingara.fr/en/index.html">suivez le guide</a>. Bien sûr toute correction est la bienvenue au vu de mon pauvre niveau d'anglais.
</p>
</div>]]>
      </description>
      <pubDate>mar, 02 Sep 2008 22:37:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7684561</guid>
    </item>
    <item>
      <title>Migration sur Typo-5.1.3 et mise &#224; jours du script capistrano</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/380595256/migration-sur-typo-5-1-3-et-mise-a-jours-du-script-capistrano</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Voilà, aussitôt sortie aussitôt installée. Alors que <a href="http://blog.typosphere.org/2008/08/31/typo-5-1-3-cartier-bresson-bugfix-is-out">Typo-5.1.3</a> est sortie dimanche, j'ai mis à jour ce blog. Comment faire une migration si rapide ? Simple un bon script Capistrano :
</p>
<div>
  <pre>
<code><span>require</span> <span>'</span><span>mongrel_cluster/recipes</span><span>'</span>

<span>set</span> <span>:application</span><span>,</span> <span>"</span><span>typo</span><span>"</span>
<span>set</span> <span>:repository</span><span>,</span>  <span>"</span><span>http://svn.typosphere.org/typo/trunk</span><span>"</span>
<span>set</span> <span>:domain</span><span>,</span> <span>"</span><span>shingara.fr</span><span>"</span>

<span># If you aren't deploying to /u/apps/#{application} on the target</span>
<span># servers (which is the default), you can specify the actual location</span>
<span># via the :deploy_to variable:</span>
<span>set</span> <span>:deploy_to</span><span>,</span> <span>"</span><span>/var/rails/blog-typo</span><span>"</span>

<span># If you aren't using Subversion to manage your source code, specify</span>
<span># your SCM below:</span>
<span>set</span> <span>:scm</span><span>,</span> <span>:subversion</span>

<span>set</span> <span>:runner</span><span>,</span> <span>"</span><span>rails</span><span>"</span>
<span>set</span> <span>:user</span><span>,</span> <span>"</span><span>rails</span><span>"</span>
<span>set</span> <span>:use_sudo</span><span>,</span> <span>false</span>
<span>set</span> <span>:mongrel_conf</span><span>,</span> <span>"</span><span><span>#{current_path}</span>/config/mongrel_cluster.yml</span><span>"</span>

<span>role</span> <span>:app</span><span>,</span> <span>domain</span>
<span>role</span> <span>:web</span><span>,</span> <span>domain</span>
<span>role</span> <span>:db</span><span>,</span>  <span>domain</span><span>,</span> <span>:primary</span> <span>=&gt;</span> <span>true</span>

<span>task</span> <span>:update_config</span><span>,</span> <span>:roles</span> <span>=&gt;</span> <span>[</span><span>:app</span><span>]</span> <span>do</span>
  <span>run</span> <span>"</span><span>cp -Rf <span>#{shared_path}</span>/config/* <span>#{release_path}</span>/config/</span><span>"</span>
  <span>run</span> <span>"</span><span>ln -s <span>#{shared_path}</span>/files <span>#{release_path}</span>/public/files</span><span>"</span>
<span>end</span>

<span>after</span> <span>"</span><span>deploy:update_code</span><span>",</span> <span>:update_config</span></code>
</pre>
</div>
<p>
  Il ne suffit plus que d'avoir dans le dossier /shared/ le dossier /config/ comprenant les fichiers de configurations : <code>database.yml</code> et <code>mongrel_cluster.yml</code>. Après à chaque mises à jours de typo : <code>cap deploy:migrations</code>. Tout sera fait pour toi.
</p>
<p>
  C'est pas beau la vie en Ruby ?
</p>
</div>]]>
      </description>
      <pubDate>lun, 01 Sep 2008 18:20:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7684562</guid>
    </item>
    <item>
      <title>Le rubyFlow FR disponible</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/377850121/Le-rubyFlow-FR-disponible</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Après que Peter Cooper ait libéré le code original de <a href="http://www.rubyflow.com/">rubyflow</a>, <a href="http://blog.menfin.info">Bruno Michel</a> a pris les choses en mains pour traduire l'application. <a href="http://rubyfrance.org">L'association RubyFrance</a> a ensuite hébergé le tout. Nous voilà donc maintenant avec notre propre <a href="http://flow.rubyfrance.org/">rubyflow FR</a>. Bravo pour cette initiative.
</p>
</div>]]>
      </description>
      <pubDate>ven, 29 Aou 2008 08:52:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7684563</guid>
    </item>
    <item>
      <title>Gettext avec Rails, ca peux &#234;tre long pour un formulaire en erreur</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/377506474/gettext-avec-Rails-ca-peux-etre-long-pour-un-formulaire-en-erreur</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Aujourd'hui, j'ai passé la journée à essayer de comprendre un problème que j'avais sur l'application que je réalise dans le cadre de mon nouveau travail. Ce bug est très simple. Durant la validation d'un formulaire, si celui-ci n'était pas valide, je retournais sur la même page qui m'indiquait les champs en erreur. Dans la pratique, ceci est très simple. Mais dans notre cas, la page mettait pas moins de 40 secondes à se renderer. Car la latence n'avait pas lieu dans le controlleur, mais bel est bien durant le rendering de la page.
</p>
<p>
  Pour essayer de comprendre la cause de tout ça, j'ai fini par réaliser un profile de ma requête avec le script /script/performance/request qu'il a déjà fallu faire fonctionner, mais ceci fera l'objet d'un autre billet. Une fois le profilling réalisé, j'ai constaté que ce qui me posait problème était une recherche incessante de traduction des messages d'erreurs. Après de longues recherche dans le code, j'ai fini par découvrir la vraie cause du problème.
</p>
<p>
  Dans Rails, durant chaque création de tag, il y a une demande de récupération de <code>errors.on</code> pour connaitre là où les erreurs sont et ainsi mettre en surbrillance le champs ou non. Mais là où normalement dans Rails, ce n'est qu'un appel vers un valeur figée, Gettext a décoré la méthode pour réaliser une traduction de la chaine. Bien sûr si ce n'était que ça, ça pourrait encore passer, car finalement c'est le comportement en production. Les chaines étant misent en cache, l'accès est quasiment aussi rapide que sans gettext. Mais dans le cas d'un environnement en Développement, il n'y a aucun cache des chaines de Gettext. Ainsi à chaque tentative de traduction le mo file est chargé et une itération à lieu sur tout ce fichiers pour trouver la chaine à traduire. C'est ces itérations incessantes qui entrainait un temps de traitement extrêmement long de ma requête.
</p>
<p>
  Ce phénomène n'a lieu uniquement qu'en environnement de développement, car il y a un test sur le nom de l'environnement. Dans tous les autres cas autre que développement, les mo sont mis en cache.
</p>
<p>
  Pour résoudre ce problème, soit vous changez le nom de votre environnement par défaut, par exemple dev au lieu de développement, où alors mettre le code <code>GetText.cached = true</code> dans votre environnement.rb. Cela implique par contre que si vous modifiez les fichiers mo, il faudra redémarrer le serveur pour avoir les nouvelles entrées.
</p>
<p>
  <a href="http://blog.shingara.fr/en/2008-08-01-gettext-with-rails-can-be-long-in-an-error-form.html">English translation</a>
</p>
</div>]]>
      </description>
      <pubDate>jeu, 28 Aou 2008 20:15:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7668525</guid>
    </item>
    <item>
      <title>Travailler avec rails fait trouver des bugs</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/377506475/travailler-avec-rails-fait-trouver-des-bugs</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Alors que j'ai commencé à travailler professionnelement parlant avec Rails depuis mon départ de CapGemini et mon arrivée à JTEK. En une semaine et demi, je constate 1 bug sur rails 2.1, un bug sur Edge et un comportement ajouté en Rails 2.1 qui disparaitra en Rails 2.2 (déjà disparu sur Edge)
</p>
<h1>
  <code>#has_one</code> demande la validation de sa liaison
</h1>
<p>
  Durant la migration de l'application développé au sein de Jtek de Rails 1.2 à 2.1, j'ai constaté que les éléments <code>#has_one</code> sont désormais validé durant la validation du parent. En effet, ce comportement n'était pas présent dans les versions antérieurs à Rails 2.1. Par contre, la validation du <code>#has_many</code> est quand à elle effectuée depuis plusieurs version de Rails.
</p>
<p>
  Par contre après une lecture du code de Rails edge, actuellement, ce comportement disparaitra complétement en Rails 2.2. En effet, une option <code>:validate</code> a été ajouté au méthode <code>#has_many</code>, <code>#has_and_belongs_to_many</code> et <code>#has_one</code>. J'ai parlé de ce comportement dans une <a href="http://blog.shingara.fr/2008/06/27/vivre-avec-edge-ou-quoi-de-neuf-dans-rails-edge-1-changement-dapi-et-des-tests-de-performances">news Vivre avec Rails</a>.
</p>
<p>
  Pour palier ce problème, j'ai créé un petit plugin rails qui permet de couper la validation sur le <code>#has_one</code>. Vous pouvez trouver les sources sur le <a href="http://github.com/jtek">github de JTek</a>.
</p>
<h1>
  Bug de logger dans le Runner de Rails-2.1
</h1>
<p>
  Sur ce point j'ai reporté un bug sur le lighthouse de Rails. En effet, j'ai constaté que si on utilisait le logger par défaut de Rails, et qu'on réalisait un log dans le code executé par script/runner il ne se retrouvait pas loggé dans le fichier production.log en mode production. Par contre en mode développement, tout se passait bien. En fait, le problème vient du nouveau Logger par défaut de rails qui est une surcouche au Logger de Ruby. Ainsi, il contient un buffer qui est flushé régulièrement. Mais en fait en mode production, le flush est désactivé. On peux ainsi retrouvé différent moment de flush dans le code de rails pour vider ce buffer. Mais voilà, avec script/runner, on peux se retrouver à ne pas avoir flusher tout le logger à la fin de sa tâche. Pour palier le problème, il suffit de faire un <code>RAILS_DEFAULT_LOGGER.flush</code> à la fin du fichier script/runner. Sinon vous pouvez essayer de faire bouger le <a href="http://rails.lighthouseapp.com/projects/8994/tickets/803">rapport de bug</a> que j'ai ouvert
</p>
<h1>
  Eager Loading empêchant la migration en production
</h1>
<p>
  Voulant testé un peu Pictrails avec Edge, pour reporté le bug précédent, je me suis retrouvé bettement à ne pas pouvoir réaliser la migration en mode Production de Pictrails. J'ai ainsi trouvé la cause qui est en fait le eager loading des models durant l'initialisation. Dans mon model Pictures, il se trouve que je fait une demande d'information sur un autre model. Du coup Rails tente de faire une requête SQL avant de réaliser la migration. Forcement, ca peux pas fonctionner. La seule méthode pour éviter ca est de mettre l'option config.classe_cache à false dans le fichier de configuration. J'ai bien sûr <a href="http://rails.lighthouseapp.com/projects/8994/tickets/802">reporté un bug à ce sujet</a>.
</p>
</div>]]>
      </description>
      <pubDate>mer, 13 Aou 2008 23:09:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7559942</guid>
    </item>
    <item>
      <title>Sortie de Pictrails 0.4.0</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/355679214/sortie-de-pictrails-0-4-0</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Alors que je commence un nouvelle emploi, voici la nouvelle version de <a href="http://pictrails.rubyforge.org">Pictrails</a>. Cette version 0.4.0 sort assez rapidement après la <a href="http://blog.shingara.fr/2008/06/15/publication-de-pictrails-0-3-0">version 0.3.x</a>. Elle apporte effectivement assez peu de nouvelles fonctionnalités, mais elle a l'avantage d'être maintenant compatible avec Rails 2.1 Les prochaines versions de Pictrails seront peut-être un peu moins fréquente. Mais la roadmap se charge de plus en plus et même quelques personnes commencerait à utiliser Pictrails.
</p>
<p>
  Voici la liste des nouveautés de cette version :
</p>
<ul>
  <li>Ajout du support des Tags. Ainsi chaque image peux avoir une série de Tag qui lui ai associé.
  </li>
  <li>Ajout d'un flux Atom relié au gallerie
  </li>
  <li>Ajout d'une bar de coté avec la liste des galleries disponible sur l'application. Elle est organisé sous forme d'arbre exactement comme est l'arborescence.
  </li>
  <li>Ajout d'un nuage de Tag global et gallerie par gallerie dans la bar de coté.
  </li>
</ul>
</div>]]>
      </description>
      <pubDate>lun, 04 Aou 2008 22:40:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7494002</guid>
    </item>
    <item>
      <title>Vivre avec Edge (ou quoi de neuf dans Rails Edge) #3</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/377506476/vivre-avec-edge-ou-quoi-de-neuf-dans-rails-edge-3</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  traduction de <a href="http://weblog.rubyonrails.com/2008/7/6/living-on-the-edge-3">Vivre avec Edge #3</a>
</p>
<p>
  Il n'y a pas grand chose à noter comme gros changements ou fonctionnalités dernièrement dans edge Rails, alors je vais parler des <a href="http://github.com/rails/rails/commits/master">commits rails</a> concernant quelques bugs fixes et changements mineurs que je n'ai pas indiqué précédement. Il y a eu un travail en cours avec un refactoring et multithreading de ActionPack ainsi qu'un peu d'activité sur <a href="http://github.com/rails/rails/tree/master/activemodel">ActiveModel</a>, mais rien de réelement concret encore (c'est toujours en cours de travaux).
</p>
<p>
  Comme d'habitude n'hésitez pas à laisser des critiques ou suggestions dans les commentaires.
</p>
<h4>
  Support de Thin avec script/server
</h4>
<p>
  <code>script/server</code> vérifie désormais la disponibilité de <a href="http://code.macournoyer.com/thin/">Thin</a> et l'utilise. Pratique si vous utilisez Thin comme serveur de production (et voulez lancer avec le même serveur durant le développement). Vous devez ajouter <code>config.gem 'hin'</code> en premier dans votre <code>environment.rb</code> pour que cela fonctionne.
</p>
<p>
  Ce patch est une contribution d'un des gars de <a href="http://fluxin.com/">fluxin</a>.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/a93ea88c0623b4f65af98c0eb55924c335bb3ac1">Changeset</a>
</p>
<h4>
  String#humanize peux être configurable par les régles d'inflection
</h4>
<p>
  La méthode d'extension du core <code>String#humanize</code> est utilisé pour convertir les string avec des underscores en texte lisible plus facilement (utilisé pour les noms des colonnes). Par exemple,
</p>
<div>
  <pre>
<code><span>"</span><span>actor_salary</span><span>".</span><span>humanize</span>
<span>=&gt;</span> <span>"</span><span>Actor salary</span><span>"</span>
<span>"</span><span>anime_id</span><span>".</span><span>humanize</span>
<span>=&gt;</span> <span>"</span><span>Anime</span><span>"</span></code>
</pre>
</div>
<p>
  Parfois cela ne fonctionne pas aussi bien, quand vous avez des héritages de tables ou des noms de colonnes "inhumain" comme "act_sal_money" (qui est réellement "Actor salary", mais qui sera <code>#humaize-d</code> en "Act Sal Money").
</p>
<p>
  Vous pouvez désormais spécifier une régle d'inflection (exactement comme pour les règles de mots pluriel/singulier/irrégulier/invariable).
</p>
<div>
  <pre>
<code><span>Inflector</span><span>.</span><span>inflections</span> <span>do</span> <span>|</span><span>inflect</span><span>|</span>
  <span>inflect</span><span>.</span><span>human</span> <span>/</span><span>_cnt</span><span>$/</span><span>,</span> <span>'</span><span>\1_count</span><span>'</span>
  <span>inflect</span><span>.</span><span>human</span> <span>'</span><span>act_sal_money</span><span>',</span> <span>'</span><span>Actor Salary</span><span>'</span>
<span>end</span></code>
</pre>
</div>
<p>
  Remarquez que vous pouvez aussi utiliser une expression régulière pour convertir une colonne comme "click_cnt" en "Click count".
</p>
<p>
  Merci à <a href="http://www.dcmanges.com/">Dan Manges</a> et <a href="http://rails.lighthouseapp.com/users/19954">Pascal Ehlert</a> pour ce patch.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/4f75840d72b96fff34d65b59480da7d6c7494120">Changeset</a>
</p>
<h4>
  Possibilité de spécifier des conditions sur des tables multiples en utilisant un hash.
</h4>
<p>
  Pratik a commité un petit (mais très pratique) changement d'ActiveRecord qui permet de spécifier des conditions sur les jointure dans leur propre hash. Un exemple sera plus explicite:
</p>
<div>
  <pre>
<code><span>Anime</span><span>.</span><span>all</span><span>(</span>
  <span>:joins</span> <span>=&gt;</span> <span>:character</span><span>,</span>
  <span>:conditions</span> <span>=&gt;</span> <span>{</span>
    <span>:active</span> <span>=&gt;</span> <span>true</span><span>,</span>
    <span>:characters</span> <span>=&gt;</span> <span>{</span> <span>:gender</span> <span>=&gt;</span> <span>'</span><span>female</span><span>'</span> <span>}</span>
  <span>}</span>
<span>)</span>
</code>
</pre>
</div>
<p>
  La requête ActiveRecord précédent permet de trouver tous les anime "actif" qui comme charactère une "femme".
</p>
<p>
  <a href="http://github.com/rails/rails/commit/cd994eff9a343df376bfaec59de5b24a2ab51256">Changeset</a>
</p>
<h4>
  Outro
</h4>
<p>
  C'est tout pour cette semaine dans "Living on the Edge". Faites moi savoir si vous désirez voir plus d'information sur les changement et bug fixes mineurs que j'ai mis à l'écart cette semaine.
</p>
</div>]]>
      </description>
      <pubDate>lun, 04 Aou 2008 21:39:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7494003</guid>
    </item>
    <item>
      <title>Vivre avec Edge (ou quoi de neuf dans Rails Edge) - #3</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/350374973/vivre-avec-edge-ou-quoi-de-neuf-dans-rails-edge-3</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  traduction de <a href="http://weblog.rubyonrails.com/2008/7/6/living-on-the-edge-3%C2%B2">Vivre avec Edge #3</a>
</p>
<p>
  Il n'y a pas grand chose à noter comme gros changements ou fonctionnalités dernièrement dans edge Rails, alors je vais parler des <a href="http://github.com/rails/rails/commits/master">commits rails</a> concernant quelques bugs fixes et changements mineurs que je n'ai pas indiqué précédement. Il y a eu un travail en cours avec un refactoring et multithreading de ActionPack ainsi qu'un peu d'activité sur <a href="http://github.com/rails/rails/tree/master/activemodel">ActiveModel</a>, mais rien de réelement concret encore (c'est toujours en cours de travaux).
</p>
<p>
  Come d'habitude n'hésitez pas à laisser des critiques ou suggestions dans les commentaires.
</p>
<h4>
  Support de Thin avec script/server
</h4>
<p>
  <code>script/server</code> vérifie désormais la disponibilité de <a href="http://code.macournoyer.com/thin/">Thin</a> et l'utilise. Pratique si vous utilisez Thin comme serveur de production (et voulez lancer avec le même serveur durant le développement). Vous devez ajouter <code>config.gem 'thin'</code> en premier dans votre <code>environment.rb</code> pour que cela fonctionne.
</p>
<p>
  Ce patch est une contribution d'un des gars de <a href="http://fluxin.com/">fluxin</a>.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/a93ea88c0623b4f65af98c0eb55924c335bb3ac1">Changeset</a>
</p>
<h4>
  String#humanize peux être configurable par les régles d'inflection
</h4>
<p>
  La méthode d'extension du core <code>String#humanize</code> est utilisée pour convertir les strings avec des underscores en texte lisible plus facilement (utilisé pour les noms des colonnes). Par exemple,
</p>
<div>
  <pre>
<code><span>"</span><span>actor_salary</span><span>".</span><span>humanize</span>
<span>=&gt;</span> <span>"</span><span>Actor salary</span><span>"</span>
<span>"</span><span>anime_id</span><span>".</span><span>humanize</span>
<span>=&gt;</span> <span>"</span><span>Anime</span><span>"</span></code>
</pre>
</div>
<p>
  Parfois cela ne fonctionne pas aussi bien, quand vous avez des héritages de tables ou des noms de colonnes "inhumain" comme "act_sal_money" (qui est réellement "Actor salary", mais qui sera <code>#humaize-d</code> en "Act Sal Money").
</p>
<p>
  Vous pouvez désormais spécifier une régle d'inflection (exactement comme pour les règles de mots pluriel/singulier/irrégulier/invariable).
</p>
<div>
  <pre>
<code><span>Inflector</span><span>.</span><span>inflections</span> <span>do</span> <span>|</span><span>inflect</span><span>|</span>
  <span>inflect</span><span>.</span><span>human</span> <span>/</span><span>_cnt</span><span>$/</span><span>,</span> <span>'</span><span>\1_count</span><span>'</span>
  <span>inflect</span><span>.</span><span>human</span> <span>'</span><span>act_sal_money</span><span>',</span> <span>'</span><span>Actor Salary</span><span>'</span>
<span>end</span></code>
</pre>
</div>
<p>
  Remarquez que vous pouvez aussi utiliser une expression régulière pour convertir une colonne comme "click_cnt" en "Click count".
</p>
<p>
  Merci à <a href="http://www.dcmanges.com/">Dan Manges</a> et <a href="http://rails.lighthouseapp.com/users/19954">Pascal Ehlert</a> pour ce patch.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/4f75840d72b96fff34d65b59480da7d6c7494120">Changeset</a>
</p>
<h4>
  Possibilité de spécifier des conditions sur des tables multiples en utilisant un hash.
</h4>
<p>
  Pratik a commité un petit (mais très pratique) changement d'ActiveRecord qui permet de spécifier des conditions sur les jointures dans leur propre hash. Un exemple sera plus explicite:
</p>
<div>
  <pre>
<code><span>Anime</span><span>.</span><span>all</span><span>(</span>
  <span>:joins</span> <span>=&gt;</span> <span>:character</span><span>,</span>
  <span>:conditions</span> <span>=&gt;</span> <span>{</span> 
    <span>:active</span> <span>=&gt;</span> <span>true</span><span>,</span>
    <span>:characters</span> <span>=&gt;</span> <span>{</span> <span>:gender</span> <span>=&gt;</span> <span>'</span><span>female</span><span>'</span> <span>}</span>
  <span>}</span>
<span>)</span>
</code>
</pre>
</div>
<p>
  La requête ActiveRecord précédent permet de trouver tous les anime "actif" qui comme charactère une "femme".
</p>
<p>
  <a href="http://github.com/rails/rails/commit/cd994eff9a343df376bfaec59de5b24a2ab51256">Changeset</a>
</p>
<h4>
  Outro
</h4>
<p>
  C'est tout pour cette semaine dans "Living on the Edge". Faites moi savoir si vous désirez voir plus d'information sur les changement et bug fixes mineurs que j'ai mis à l'écart cette semaine.
</p>
</div>]]>
      </description>
      <pubDate>mer, 30 Juil 2008 12:35:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7455463</guid>
    </item>
    <item>
      <title>Upgrade de typo en Typo-5.1.1</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/377522016/upgrade-de-typo-en-Typo-5-1-1</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Ce blog a été mis à jour avec succès avec la nouvelle version de <a href="http://typosphere.org/">Typo</a>. En effet, la sortie a été réalisé hier et ce blog est déjà à jour. Pour la première fois plusieurs de mes contributions sont présentes directement dans cette nouvelle mouture avec <a href="http://t37.net/sortie-de-typo-5-1-laquo-cartier-bresson-raquo#">quelques remerciement de Neuro</a>. Ca fait vraiment plaisir.
</p>
<p>
  J'ai aussi mis le thème par défaut de Typo qui est vraiment très bien. Merci à <a href="http://jeuxdemaux.com">jeuxdemaux.org</a>
</p>
</div>]]>
      </description>
      <pubDate>mar, 22 Juil 2008 18:00:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7401712</guid>
    </item>
    <item>
      <title>Vivre avec Edge (ou quoi de neuf dans Rails Edge) #2 -am&#233;lioration des performances</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/342667233/vivre-avec-edge-ou-quoi-de-neuf-dans-rails-edge-2-amelioration-des-performances</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  traduction de <a href="http://weblog.rubyonrails.com/2008/6/25/living-on-the-edge-or-what-s-new-in-edge-rails-2-performance-improvements">Vivre avec Edge #2</a>
</p>
<p>
  La <a href="http://weblog.rubyonrails.org/2008/6/20/living-on-the-edge-or-what-s-new-in-edge-rails-1-api-changes-and-performancetests">première news Vivre avec edge</a> a parlé des changement de l'<span>API</span> depuis Rails 2.1, et durant cette news, les <strong>améliorations de performances</strong> seront indiqué comme promis.
</p>
<p>
  En avant...
</p>
<h4>
  Les templates Erb plus rapide
</h4>
<p>
  Jeremy Kemper a rendu le processus d'Erb plus efficace, spécialement les méthodes d'helper <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/TextHelper.html#M001724">concat</a> et <a href="http://api.rubyonrails.org/classes/ActionView/Helpers/CaptureHelper.html#M001747">capture</a>.
</p>
<p>
  Le "spécial" Erb <code>_erbout</code> a été remplacé par une variable d'instance qui permet ceci:
</p>
<ul>
  <li>Meilleur performance (mémoire) parce que <a href="http://www.ruby-doc.org/core/classes/Binding.html">bindings</a> ne pas pas longtemps autour
  </li>
  <li>Moins de d'évaluation qui est généralement couteux.
  </li>
  <li>Il n'y a pas besoin de séparer la variable <code>_erbout</code> quand vous remplacer un nouveau buffer (de string)
  </li>
  <li>Le buffer est généralement disponible via une méthode <code>output_buffer</code> écriture et lecture (alors vous pouvez les overrider si vous le souhaitez)
  </li>
</ul>
<p>
  Changesets en relation: <a href="http://github.com/rails/rails/commit/933697a5fc5f4c56c4fd7fbbd31b8973df9c1054">933697a</a> - <a href="http://github.com/rails/rails/commit/0bdb7d353b4ac6f5470884360f9a480a16bd709c">0bdb7d3</a> - <a href="http://github.com/rails/rails/commit/4d4c8e298f5396e6b8ace0a10d7f991594aace2d">4d4c8e2</a>
</p>
<h4>
  Les helpers JavaScript et les partials sont plus rapide.
</h4>
<p>
  L'initialisation des templates partial et des helpers Javascript ont été refactoré et optimisé pour une meilleure vite et efficacité grâce à Jeremy Kemper. Quelque optimisations de Jérémy ont été commité récement. Vérfiiez avec les <a href="http://github.com/rails/rails/commits/master">commits de Rails</a> (comme pour tout projet Open Source de qualité) - Vous apprendrez plein de chose.
</p>
<p>
  Changesets en relation: <a href="http://github.com/rails/rails/commit/d7b3c3395fd7debc05923dba1cbea69d30899827">partials</a> – <a href="http://github.com/rails/rails/commit/f4ccc179530d5b9436da87d3c221dfa8fa89119a">JavaScript helpers</a>
</p>
<h4>
  Accélération de la méthode RecordIdentifier
</h4>
<p>
  Le <a href="http://api.rubyonrails.org/classes/ActionController/RecordIdentifier.html">RecordIdentifier</a> est plus rapide avec la simple utilisation de memo-ization, réduisant ainsi l'utilisation des Inflections entre autre. Le RecordIdentifier est largement utilisé dans le cache des clé, des chemins des templates de partial, et dans la plus part des endroit où vous identifiez un model ActiveRecord sans le savoir avec ton id actuel.
</p>
<p>
  Changesets en relation par Jeremy Kemper: <a href="http://github.com/rails/rails/commit/c1a98209da7422965f5dd4f475603b8a3cc887e4">c1a9820</a> – <a href="http://github.com/rails/rails/commit/566d717d783f56563cd602198be2177c972c9a81">566d717</a>
</p>
</div>]]>
      </description>
      <pubDate>dim, 29 Juin 2008 14:42:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7220001</guid>
    </item>
    <item>
      <title>Le monde du libre fait de la s&#233;lection m&#234;me pour les f&#234;tes</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/342667234/le-monde-du-libre-fait-de-la-selection-meme-pour-les-fetes</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Après avoir lu les <a href="http://t37.net/la-soiree-firefox-3-ne-passera-pas-par-moi">remarques de frédéric au sujet de la soirée Firefox 3</a>. Je ne peux m'empêcher de l'approuver et de rédiger ce billet. J'écris rarement pour critiquer quelque chose, mais j'avoue que cette pratique est vraiment anti-libriste.
</p>
<p>
  En effet, la fondation Mozilla trie sur le volet ses invités pour la grande soirée Firefox 3. Que Mozilla fasse une grande fête chez elle avec les invités qu'elle souhaite c'est tout à fait normal. Mais qu'elle annonce une grande fête et ouvre les portes de cette fête à seulement des personnes triés sur le volet en fonction de leur projet open source et de leur contribution au standard du web, je trouve ça affligeant.
</p>
<p>
  Le personne qui permette de faire ces fêtes sont justement les madame Michou. Ceux qui télécharge Firefox et qui trouve juste le produit bien. Par des personnes qui font de l'open source ou contribue à des standards. C'est peut-être même pas des utilisateurs de Firefox. En effet, Firefox n'est pas le seul navigateur à suivre les standards. Que ce soit Opera ou Safari, ces deux navigateurs sont au moins aussi respectueux des standards si ce n'est plus. Là vraiment Firefox me déçoit.
</p>
<p>
  Personnellement, j'aurais largement préféré une bonne réunion à la bonne franquette. Chacun se retrouve sur le champs de Mars avec sa bouffe. Pas de micro, pas de speech pompeux. Juste des gens réuni en un point pour être heureux.
</p>
</div>]]>
      </description>
      <pubDate>sam, 28 Juin 2008 10:27:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7213723</guid>
    </item>
    <item>
      <title>Afficher les Log SQL avec Merb et DataMapper</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/342667235/afficher-les-log-sql-avec-merb-et-datamapper</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Depuis peu, je tente d'utiliser <a href="http://merbivore.org">Merb et</a> <a href="http://datamapper.org">DataMapper</a>. Une différence notable entre Merb et Rails est le système de log. Comme Merb est ORM Agnostique, il n'affiche pas de base les logs SQL. J'ai cherché plusieurs fois comment avoir mes logs SQL de DataMapper directement dans ma console. J'ai fini par la trouvé sur le wiki de DataMapper. Je vous livre donc l'astuce :
</p>
<div>
  <pre>
<code><span>Merb</span><span>::</span><span>BootLoader</span><span>.</span><span>after_app_loads</span> <span>do</span>
  <span>DataObjects</span><span>::</span><span>SQlite3</span><span>.</span><span>logger</span> <span>=</span> <span>DataObjects</span><span>::</span><span>Logger</span><span>.</span><span>new</span><span>(</span><span>STDOUT</span><span>,</span> <span>:debug</span><span>)</span> 
<span>end</span></code>
</pre>
</div>
<p>
  Vous pouvez bien-sûr modifier le SQlite3 par Postgres ou MySQL. Cette comment fait une sortie en mode debug sur STDOUT. On aurait aussi pu mettre un fichier ('log/dm.log').
</p>
<p>
  Pour connaitre la liste des niveaux de logs, la voici :
</p>
<ul>
  <li>fatal
  </li>
  <li>error
  </li>
  <li>warn
  </li>
  <li>info
  </li>
  <li>debug
  </li>
</ul>
</div>]]>
      </description>
      <pubDate>ven, 27 Juin 2008 13:43:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7205769</guid>
    </item>
    <item>
      <title>Vivre avec Edge (ou quoi de neuf dans Rails Edge) #1 - changement d'API et des tests de performances</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/342667236/vivre-avec-edge-ou-quoi-de-neuf-dans-rails-edge-1-changement-dapi-et-des-tests-de-performances</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Voici la nouvelle traduction de Vivre avec Edge. Par contre, cette fois ci, comme annoncé dans cette news, cette news est issu du <a href="http://weblog.rubyonrails.com">blog officiel de rubyonrails</a> et non plus du blog de <a href="http://blog.codefront.net/">Chu Yeow</a>
</p>
<p>
  Comme Gregg Pollack <a href="http://weblog.rubyonrails.org/2008/6/10/two-new-weekly-columns">l'indique il y a une semaine</a>, Je conserve une note hebdomadaire au sujet des changements de edge Rails. C'est la première fois que Living on the Edge(of Rails) est apparu officiellement sur le blog officiel de Ruby on Rails.
</p>
<p>
  <a href="http://blog.codefront.net/category/edge-rails/">Living on the Edge</a> est une note hebdomadaire que je mettais sur mon <a href="http://blog.codefront.net/">propre blog</a> après plusieurs récupération par Gregg Pollack of <a href="http://railsenvy.com/">Rails Envy</a> depuis décembre 2007. J'avais l'habitude d'être une contributeur actif de rails et non pas trop une personne qui réfléchis. Gregg et Jason ont été génial de m'ajouter à leur <a href="http://railsenvy.com/podcast">podcast</a> hebdomadaire.
</p>
<p>
  Et maintenant je suis ici, alors je vais essayer de faire de mon mieux et n'hésitez pas à être très critique pour que ça soit utile pour vous. Quand je blogguais cela dans mon petit blog personnel, ce n'était pas vital d'avoir une audience large et <em>significative</em> (NdT: Au moins sur ce blog ça reste toujours le cas). Laissez vos suggestions et critique dans les commentaires. Ils seront grandement appréciés.
</p>
<p>
  De toutes façon il y a eu énormément de nouveauté durant les deux semaines après la release de Rails 2.1, changement de l'<span>API</span> et amélioration des performances. Donc au lieu de faire une très gros post, j'ai décidé de le séparé en 2 posts pour les nouveautés et changement d'API et les améliorations de performances. Dans ce post, je parlerais des nouveautés et changement de l'<span>API</span>
</p>
<h4>
  Changements mineurs de l'<span>API</span>
</h4>
<p>
  Commençons avec les changements mineurs de l'<span>API</span>.
</p>
<h5>
  link_to peux désormais prendre un block
</h5>
<p>
  Le helper <code>link_to</code> peux désormais prendre en argument un block. Utile dans les cas où vous avez long texte d'hyperlien avec des variables.:
</p>
<div>
  <pre>
<code><span>&lt;%</span> <span>link_to</span><span>(</span><span>@profile</span><span>)</span> <span>do</span> <span>%&gt;</span><span>

  &lt;strong</span><span>&gt;&lt;%=</span><span> @profile.name %&gt;&lt;/strong&gt; -
  &lt;span&gt;Status: &lt;%</span><span>=</span> <span>@profile</span><span>.</span><span>status</span> <span>%&gt;</span><span>&lt;/span</span><span>&gt;</span>
<span>&lt;%</span> <span>end</span> <span>%&gt;</span></code>
</pre>
</div>
<p>
  Certaine personne trouve cela plus propre que:
</p>
<div>
  <pre>
<code><span>&lt;%=</span><span> link_to "&lt;strong&gt;<span>#{@profile.name}</span>&lt;/strong&gt; -- &lt;span&gt;Status: <span>#{@profile.status}</span>&lt;/span&gt;", @profile %&gt;</span></code>
</pre>
</div>
<p>
  Ce changement a été apporté par Sam Stephenson (du fameux Prototype) et <span>DHH</span>.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/8190bce8bc7249b7b9f3680195336eb3ca9508ee">Changeset details</a>
</p>
<h5>
  ActiveRecord::Base#merge_conditions fait maintenant partie de l'<span>API</span> public
</h5>
<p>
  Jeremy Kemper a rendu public la méthode <code>ActiveRecord::Base#merge_conditions</code>.
</p>
<p>
  C'est vraiment très pratique si vous avez des conditions issues de multiples sources ou qui se combine pour différentes raisons.
</p>
<div>
  <pre>
<code><span>Post</span><span>.</span><span>merge_conditions</span><span>(</span>
  <span>{</span><span>:title</span> <span>=&gt;</span> <span>'</span><span>Lucky ☆ Star</span><span>'},</span>
  <span>['</span><span>rating IN (?)</span><span>',</span> <span>1</span><span>..</span><span>5</span><span>]</span>
<span>)</span>
<span>=&gt;</span> <span>"</span><span>(`posts`.`title` = 'Lucky ☆ Star') AND (rating IN (1,2,3,4,5))</span><span>"</span></code>
</pre>
</div>
<p>
  Notez bien que cela merge uniquement avec un boolean <span>SQL</span> <code>AND</code> (pas <code>OR</code>s).
</p>
<p>
  <a href="http://github.com/rails/rails/commit/e328bdaab6c1cf920af3cabc0a27e32798a9fcb6">Changeset details</a>
</p>
<h5>
  Les associations peuvent prendre une option :validate
</h5>
<p>
  les associations peuvent désormais accepter une option c:validate comme ceci:
</p>
<div>
  <pre>
<code><span>class </span><span>Anime</span> <span>&lt;</span> <span>ActiveRecord</span><span>::</span><span>Base</span>
  <span>has_many</span> <span>:characters</span><span>,</span> <span>:validate</span> <span>=&gt;</span> <span>true</span>
<span>end</span></code>
</pre>
</div>
<p>
  Cela indique à ActiveRecord de valider l'association <code>characters</code> quand vous enregistrer le model <code>Anime</code> - exactement comment fonctionnait <code>:validates_associated</code>. La valeur par défaut est <code>false</code>, qui est le comportement actuel dans Rails 2.1 et plus récent, donc pas d'agitation à avoir. Cela fonctionne pour toutes les autre associations comme (<code>has_one</code>, <code>belongs_to</code>, <code>has_and_belongs_to_many</code>).
</p>
<p>
  Merci à Jan De Poorter et Pratik Naik pour cela, qui permette aussi de résoudre un <a href="http://rails.lighthouseapp.com/projects/8994/tickets/301">mauvais bug</a>.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/7f140bbddaf70abc61570f6cfdcbfba5771ffc78">Changeset details</a> – <a href="http://rails.lighthouseapp.com/projects/8994/tickets/301">Ticket</a>
</p>
<h5>
  ActiveSupport::StringInquirer et avantage de la méthode Rails.env.development?
</h5>
<p>
  David Heinemeier Hansson (généralement abbrégé par <span>DHH</span> – désolé!) a récemment ajouté un sous-classe à String, <code>ActiveSupport::StringInquirer</code> qui permet de faire ceci:
</p>
<div>
  <pre>
<code><span>s</span> <span>=</span> <span>ActiveSupport</span><span>::</span><span>StringInquirer</span><span>.</span><span>new</span><span>('</span><span>awesome</span><span>')</span>
<span>=&gt;</span> <span>"</span><span>awesome</span><span>"</span> 
<span>s</span><span>.</span><span>awesome?</span>
<span>=&gt;</span> <span>true</span>
<span>s</span><span>.</span><span>sucks?</span>
<span>=&gt;;</span> <span>false</span></code>
</pre>
</div>
<p>
  Une utilisation immédiate de cette classe est quand vous voulez vérifier l'environnement de votre application en fonctionnement : <code>Rails.env</code> est enrobé en StringInquirer alors vous pouvez utiliser des méthodes comme <code>Rails.env.development?</code> et <code>Rails.env.production?</code>.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/8afa725f4b98a6e0ceee4792e8ebaebb6189e5f6">Changeset details</a>
</p>
<h5>
  Core extensions: Object#present? et Enumerable#many?
</h5>
<p>
  <span>DHH</span> a aussi ajouté une extensions au core. C'est quelque peu trivial, mais peu rendre le code plus lisible. Le première est <code>Object#present?</code>, qui est essentiellement <code>!Object#blank?</code>
</p>
<div>
  <pre>
<code><span>[].</span><span>present?</span>
<span>=&gt;</span> <span>false</span>
<span>[</span><span>1</span><span>,</span> <span>2</span><span>].</span><span>present?</span>
<span>=&gt;</span> <span>true</span>
<span>"</span><span>".</span><span>present?</span>
<span>=&gt;</span> <span>false</span>
<span>"</span><span>i'm here</span><span>".</span><span>present?</span>
<span>=&gt;</span> <span>true</span></code>
</pre>
</div>
<p>
  Une extension <code>Enumerable#many?</code> a aussi été ajouté qui réalise simplement un test conditionnel sur <code>enumerable.size &gt; 1</code>:
</p>
<div>
  <pre>
<code><span>[].</span><span>many?</span>
<span>=&gt;</span> <span>false</span>
<span>[</span><span>:just_me</span><span>].</span><span>many?</span>
<span>=&gt;</span> <span>false</span>
<span>[</span><span>:just_me</span><span>,</span> <span>'</span><span>my_friend</span><span>'].</span><span>many?</span>
<span>=&gt;</span> <span>true</span></code>
</pre>
</div>
<p>
  <a href="http://github.com/rails/rails/commit/a3caf28da3a22c1326d3d98dcf71483a8edaa55a">Object#present? changeset</a> – <a href="http://github.com/rails/rails/commit/556204abaf95f7c995576cb1358f13de406682ab">Enumerable#many? changeset</a>
</p>
<h4>
  Syntaxe de block déclaratif pour l'écriture de tests
</h4>
<p>
  <span>DHH</span> s'est inspiré de <a href="http://blog.jayfields.com/">Jay Fields</a> quand il commita cette nouvelle syntaxe. Vous pouvez maintenant écrire vos tests <code>(Test::Unit)</code> avec un style de block déclaratif comme :
</p>
<div>
  <pre>
<code><span>test</span> <span>"</span><span>an anime should be invalid if any of its characters are invalid</span><span>"</span> <span>do</span>
  <span># Your usual test code here.</span>
<span>end</span></code>
</pre>
</div>
<p>
  J'utilise rarement Test::Unit (sauf pour soumettre des patchs à Rails) et préfère RSpec – Ce style déclaratif pour écrire des tests est vraiment plus lisible.
</p>
<p>
  Tous les tests générés par Rails utilisent désormais cette syntaxe.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/f74ba37f4e4175d5a1b31da59d161b0020b58e94">Changeset details</a>
</p>
<h4>
  Performance tests
</h4>
<p>
  Jeremy Kemper a fait un travail en profondeur pour optimiser et améliorer les performances de Rails, alors c'est sans surprise que cela a été introduit comme nouveau type de test d'intégration. Les tests de performances.
</p>
<p>
  Vous pouvez utiliser le générateur de test de performance (ajouté par Pratik dans <a href="http://github.com/rails/rails/commit/2e232af91f7e276904e02cbb1ea42ea24c19255b">23232a</a>) pour générer des tests de performances.
</p>
<div>
  <pre>
<code>script/generate performance_test LoginStories</code>
</pre>
</div>
<p>
  Le lancement du test de performance nécessite ruby-prof &gt;= 0.6.1, qui n'est pas encore sortie. Mais vous pouvez récupérer sa version en développement à partir des sources et en installant vous même le gem (Je vous conseille de récupérer le <a href="http://github.com/jeremy/ruby-prof/">ruby-prof que Jeremy a forké</a>). Il est intéressant de remarquer qu'avec la sortie de ruby-prof 0.6.1, ruby-prof supportera le profiling des tests écrits avec Test::Unit
</p>
<p>
  Attention - Si vous faites un petit code de test (requêtes sur plusieurs actions, quelque soit le cas d'utilisateur que vous voulez testez en performance) et lancez le test. Vous aurez la sortie suivante (si vous avez dirigé la sortie habituel de ruby-prof vers le répertoire test/tmp/performance de votre application Rails):
</p>
<div>
  <pre>
<code>&gt; ruby performance/login_stories_test.rb 
Loaded suite performance/login_stories_test
Started
LoginStoriesTest#test_homepage (32 ms warmup)
        process_time: 11 ms
              memory: unsupported
             objects: unsupported
.
Finished in 0.870842 seconds.</code>
</pre>
</div>
<p>
  Les résultats <code>memory</code> et <code>objects</code> ne sont pas supporté, parce que je n'avais pas patché mon interpréteur Ruby au support du proflling de mémoire. Vous aurez besoin de patcher certain interpréteur ruby pour activer le profiling de la mémoire et de GC. Je souhaiterais vous en dire plus à ce sujet, mais je suis en terrain inconnu. Il y a <a href="http://blog.pluron.com/2008/02/memory-profilin.html">plus de détail ici (en)</a> sur la méthode à suivre pour patcher Ruby pour le profilling de la mémoire. Je laisse les personnes plus qualifiée sur ce sujet expliquer tout ça.
</p>
<p>
  <a href="http://github.com/rails/rails/commit/eab71208db1afead6803501c8d51d77625e5ad6e">Changeset details</a>
</p>
<h4>
  Outro
</h4>
<p>
  C'est tout pour le moment concernant les nouvelles fonctionnalités et changement dans Rails depuis Rails 2.1 - Les améliorations de performances arriveront dans un prochain post et j'ai laissé aussi intentionnellement de coté le <a href="http://github.com/ezmobius/rails/">support de Rack</a> qui n'est que partiellement mergé dans Edge.
</p>
<p>
  Si il y a des erreurs ou que vous avez des suggestions sur comment faire un meilleur post, s'il vous plait indiquez le en commentaire. Toute information sur le patch de l'interpréteur Ruby pour supporter le profiling de la mémoire et aussi le bienvenue. Si j'ai laissé de coté des éléments qui ne vous semblez pas le nécessiter, laisser moi un commentaire.
</p>
</div>]]>
      </description>
      <pubDate>ven, 27 Juin 2008 07:20:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7205770</guid>
    </item>
    <item>
      <title>Le piege des routes &#224; &#233;viter</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/342667237/le-piege-des-routes-a-eviter</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Alors, que je testais <a href="http://pictrails.rubyforge.org/">Pictrails</a> pour la <a href="http://blog.shingara.fr/articles/2008/06/15/publication-de-pictrails-0-3-0">release en version 0.3</a>, j'ai par hasard créé une galerie s'appelant "new". Ayant implémenté un système de PrettyURL pour pictrails, j'ai changé les routes REST pour non pas afficher l'id de la galerie dans l'url mais son nom. Ainsi, comme ma galerie s'appele "new", je devais allez sur l'URL : /galleries/new.
</p>
<p>
  Mais voilà comme galerie était une ressource REST, la route /galleries/new est déjà réservé et je me suis donc retrouvé sur l'url de création d'une Gallerie et non sur l'url de visualisation de la galerie new. C'est ainsi que je suis tombé dans le piège des routes à éviter.
</p>
<p>
  Maintenant, que j'ai trouvé le bug il a fallu trouvé la solution et plus que de trouver la solution, il fallait trouver une solution propre. En effet, basiquement, on peux créer un validateur qui vérifie que le nom n'est pas "new", mais cette technique ne me semblait pas idéal surtout pour l'avenir et le maintient à terme de cette solution. J'ai donc commencé à en discuter avec les personnes présentent sur le chan #rubyonrails.fr. C'est ainsi que <a href="http://lifeisdead.net">webs</a> m'a proposé une solution tout à fait élégante en me donnant un code de <a href="http://sunfox.org/">sunny</a>. La vérification directe de l'existence ou non de la route. Voici le bout de code qui permet cette vérification :
</p>
<div>
  <pre>
<code><span>permalinks</span> <span>=</span> <span>ActionController</span><span>::</span><span>Routing</span><span>::</span><span>Routes</span><span>.</span><span>routes</span><span>.</span><span>collect</span> <span>{|</span><span>r</span><span>|</span>
   <span>r</span><span>.</span><span>generation_structure</span><span>.</span><span>match</span><span>(/</span><span>"<span>\/</span>galleries<span>\/</span>([<span>\w</span>]+)</span><span>/)[</span><span>1</span><span>]</span> <span>rescue</span> <span>nil</span>
<span>}.</span><span>uniq</span><span>.</span><span>compact</span></code>
</pre>
</div>
<p>
  On récupère ainsi tous les mots utilisés dans nos routes et commençant par galleries. Sur Pictrails, nous obtenons ainsi "pages" et "new". Il suffit ensuite d'empêcher la création de galerie avec ces noms.
</p>
</div>]]>
      </description>
      <pubDate>mar, 17 Juin 2008 12:29:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7122848</guid>
    </item>
    <item>
      <title>Publication de pictrails 0.3.0</title>
      <link>http://feeds.feedburner.com/%7Er/ProgDreamShiny/%7E3/342667238/publication-de-pictrails-0-3-0</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Presque 3 mois jours pour jours après la dernière release de <a href="http://blog.shingara.fr/articles/2008/03/18/pictrails-0-2-2-released">Pictrails 0.2.3</a>, voici la release de la version 0.3.0
</p>
<p style="text-align: center;">
  <img src="http://blog.shingara.fr/files/public_part_pictrails.png" alt="partie public de pictrails" />
</p>
<p>
  Cette nouvelle version apporte son lot de fonctionnalités. La plus importante étant l'ajout du support des sous-galerie En effet, désormais, on peux créer des galeries photos dépendant d'une autre galerie. Cette galerie sera donc visible avec la liste des photos de sa galerie parente. Pour que la navigation soit ainsi plus fluide, j'ai ajouté un fil d'ariane ou breadcrumb pour les anglophiles. On sait ainsi désormais dans quel galerie nous nous trouvons et si celle-ci a des parents.
</p>
<p style="text-align: center;">
  <img src="http://blog.shingara.fr/files/breadcrumb_pictrails.png" alt="breadcrumb de pictrails" />
</p>
<p>
  La deuxième fonctionnalité est surtout la refonte compléte du mass_upload. En effet, le mass_upload ne fonctionnait pas trop si on avait énormément de photo a ajouter. Les threads mongrel ou FastCGI s'arrêtait avec un time out et plus aucune solution de continuer la tâche. Pour ce faire, la première requête liste toutes les images à importer et dans quel galerie. Ensuite à chaque nouvelle requête dans la partie d'administration une série de 5 photos est ajoutés. Pour rendre le système plus conviviale, une progress bar a été ajoutée. Celle-ci évolue progressivement si le Javascript est activé sur votre navigateur. Ce système de mass_upload a bien évidement suivit l'évolution de Pictrails en supportant lui aussi les sous-galeries. Ainsi, il liste de façon récursive les répertoires et créé les galeries avec leurs parents associés.
</p>
<p style="text-align: center;">
  <img src="http://blog.shingara.fr/files/mass_upload_pictrails.png" alt="mass_upload de pictrails" />
</p>
<p>
  J'espère que cette nouvelle version vous satisfera. Bien-sûr la <a href="http://dev.shingara.fr/projects/roadmap/pictrails">liste des fonctionnalités</a> a ajouter n'est pas fini pour arriver à la version 1.0. Si vous avez envie de contribuer n'hésitez pas. Pour plus de détails sur cette version, le <a href="http://pictrails.rubyforge.org">site de pictrails</a> a été mis à jour
</p>
</div>]]>
      </description>
      <pubDate>dim, 15 Juin 2008 10:31:00 +0200</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/7108888</guid>
    </item>
    <item>
      <title>Codage vid&#233;o</title>
      <link>http://temet79.free.fr/index.php?post/2008/01/06/Codage-video</link>
      <description>
        <![CDATA[<div class="post_content wiki_text">Bon, c'est plus en pense bête pour moi. Si ça peut en aider certains, tant mieux.<br />
Ça faisait pas mal de temps que je voulais m'essayer à l'encodage vidéo en ligne de commande, histoire d'approfondir un peu le sujet. Manque de bol, ça fait des années que j'ai pas converti un DVD en divx-like.<br />
Jeudi, un collègue m'a filé les DVD de "Pitch black" et "Les chroniques de Riddick". Je me suis donc servi de "Pitch black" comme cobaye.<br />
<br />
<br />
<span style="font-weight: bold;"><span style="text-decoration: underline;">1 - ripper le film sur le disque</span></span><br />
<br />
Pour ça, choper le bon titre sur le DVD avec mplayer :<br />
<br />
<code>mplayer dvd://1 -dvd-device /dev/sr1</code><br />
<br />
C'est le "1" de "dvd://1" qui indique le titre. Si le film se lance, c'est le bon titre. Si c'est une bande annonce ou un bonus, bah c'est pas le bon.<br />
Une fois le bon trouvé, soit le "1" chez moi, on va dumper tout ça.<br />
<br />
<code>mplayer dvd://1 -dvd-device /dev/sr1 -dumpstream -dumpfile pitchblack.vob</code><br />
<br />
Contrairement aux bons vieux programmes que j'utilisais sous Windows il y a de nombreuses années, il n'y a qu'un VOB, vu que sur mon OS civilisé il n'y a pas de limitation à la taille d'un fichier.<br />
<br />
Bon, mplayer nous sort ça:<br />
<br />
<code>MPlayer SVN-r24130 (C) 2000-2007 MPlayer Team<br />
CPU: Genuine Intel(R) CPU&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;&nbsp;T2400 @ 1.83GHz (Family: 6, Model: 14, Stepping: 8)<br />
CPUflags: MMX: 1 MMX2: 1 3DNow: 0 3DNow2: 0 SSE: 1 SSE2: 1<br />
Compilé pour CPU x86 avec les extensions: MMX MMX2 SSE SSE2<br />
Lecture de dvd://1<br />
Il y a 38 titres sur ce DVD.<br />
Il y a 19 chapitres sur ce titre DVD.<br />
Il y a 1 angles sur ce titre DVD.<br />
Flux audio : 0 format : ac3 (5.1) langue : en aide : 128.<br />
Flux audio : 1 format : ac3 (5.1) langue : fr aide : 129.<br />
Flux audio : 2 format : ac3 (stereo) langue : en aide : 130.<br />
Flux audio : 3 format : ac3 (stereo) langue : en aide : 131.<br />
Nombre du canaux audio sur le disque : 4.<br />
Sous-titre ( sid ) : 0 langue : en<br />
Sous-titre ( sid ) : 1 langue : fr<br />
Sous-titre ( sid ) : 2 langue : nl<br />
Sous-titre ( sid ) : 3 langue : ar<br />
Sous-titre ( sid ) : 4 langue : en<br />
Sous-titre ( sid ) : 5 langue : fr<br />
Sous-titre ( sid ) : 6 langue : nl<br />
Sous-titre ( sid ) : 7 langue : en<br />
Sous-titre ( sid ) : 8 langue : fr<br />
Sous-titre ( sid ) : 9 langue : nl<br />
Sous-titre ( sid ) : 10 langue : fr<br />
Nombre de sous-titres sur le disque : 11<br />
Vidage de la mémoire du noyeau (core dump) effectué ;)<br />
<br />
Sortie... (Fin du fichier)</code><br />
<br />
<br />
<span style="font-weight: bold;"><span style="text-decoration: underline;">2 - traitement du son</span></span><br />
<br />
Extraction des pistes en anglais et en français. Pour le paramètre "aid", c'est marqué dans l'output de mplayer dans la première partie.<br />
<br />
<code>mplayer pitchblack.vob -ao pcm:file=en.wav -vc dummy -aid 128 -vo null<br />
mplayer pitchblack.vob -ao pcm:file=fr.wav -vc dummy -aid 129 -vo null</code><br />
<br />
Normalisation du son :<br />
<br />
<code>normalize en.wav<br />
normalize fr.wav</code><br />
<br />
Codage en ogg vorbis. Ne conserve pas le 5.1... autant dumper directement l'ac3 pour le conserver.<br />
<br />
<code>oggenc -q5 en.wav<br />
oggenc -q5 fr.wav</code><br />
<br />
<br />
<span style="font-weight: bold;"><span style="text-decoration: underline;">3 - traitement des sous-titres</span></span><br />
<br />
<code>mencoder pitchblack.vob -nosound -ovc frameno -o /dev/null -sid 1 -vobsubout fr</code><br />
<br />
Utiliser avidemux pour convertir en srt (c'est plus joli que les st des dvd).<br />
<br />
<br />
<span style="font-weight: bold;"><span style="text-decoration: underline;">4 - traitement de la vidéo</span></span><br />
<br />
Détection des bandes noires :<br />
<br />
<code>mplayer title.vob -vf cropdetect</code><br />
<br />
Ce qui m'a donné : "-vf crop=720:432:0:76".<br />
<br />
Note : pour savoir si une vidéo est entrelacée, pour le moment je n'ai trouvé que cette astuce avec transcode mais faut que je trouve autre chose, le but étant justement de me débarrasser de transcode...<br />
<br />
<code>transcode -i pitchblack.vob -J 32detect=verbose -c 1000-1001 2&gt;&amp;1</code><br />
<br />
Codage de la vidéo :<br />
<br />
<code># First pass<br />
mencoder\<br />
&nbsp;&nbsp;&nbsp;&nbsp;pitchblack.vob\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-vf crop=720:432:0:76,harddup\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-ovc x264 -x264encopts subq=4:bframes=3:b_pyramid:weight_b:turbo=1:pass=1:psnr:bitrate=1500:threads=2\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-oac copy\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-of rawvideo\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-o pitchblack.264<br />
<br />
# Second pass<br />
mencoder\<br />
&nbsp;&nbsp;&nbsp;&nbsp;pitchblack.vob\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-vf crop=720:432:0:76,harddup\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-ovc x264 -x264encopts subq=6:partitions=all:8x8dct:me=umh:frameref=5:bframes=3:b_pyramid:weight_b:pass=2:psnr:bitrate=1500:threads=2\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-oac copy\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-of rawvideo\<br />
&nbsp;&nbsp;&nbsp;&nbsp;-o pitchblack.264</code><br />
<br />
<br />
<span style="font-weight: bold;"><span style="text-decoration: underline;">5 - multiplexage du tout</span></span><br />
<br />
Coller la vidéo dans un mp4 (installer gpac) :<br />
<br />
<code>MP4Box -fps 25 -add pitchblack.264 pitchblack.mp4</code><br />
<br />
Multiplexer le mp4, les pistes audio et les sous-titres avec mkvtoolnix :<br />
<br />
<code>mmg</code><br />
<br />
J'ai choisi le mkv car les conteneurs acceptant le une vidéo codée en h.264 ne sont pas légion et que le conteneur mp4 merdait vraiment trop.<br />
<br />
</div>]]>
      </description>
      <pubDate>dim, 06 Jan 2008 19:37:00 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/6017024</guid>
    </item>
    <item>
      <title>Thin: A Ruby HTTP Daemon That's Faster Than Mongrel</title>
      <link>http://feeds.feedburner.com/%7Er/RubyInside/%7E3/211450065/thin-a-ruby-http-daemon-thats-faster-than-mongrel-688.html</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  <img src="http://www.rubyinside.com/wp-content/uploads/2008/01/thin.png" height="150" width="350" />
</p>
<p>
  Thin is a new Web server / daemon written in Ruby by Marc-André Cournoyer that uses the <a href="http://rubyeventmachine.com/">EventMachine</a>, <a href="http://rack.rubyforge.org/">Rack</a>, and <a href="http://mongrel.rubyforge.org/">Mongrel</a> libraries. EventMachine makes it super fast at processing network I/O, Rack makes it easy to integrate with existing Ruby Web app frameworks, and Mongrel helps it parse HTTP. So, yes, the title is <span style="font-style: italic;">slightly</span> misleading. Thin actually relies on Mongrel, but is ultimately faster than it, even against Mongrel's EventMachine-enhanced guise.
</p>
<p>
  You can get started with Thin with a simple <span style="font-style: italic;">sudo gem install thin</span> and then you can use it with any Rack supporting Web app / framework. With a Rails app, for example, a simple <span style="font-style: italic;">thin start</span> in the base directory will get things moving.
</p>
<p>
  <a href="http://feeds.feedburner.com/%7Ea/RubyInside?a=0MvWHW"><img src="http://feeds.feedburner.com/%7Ea/RubyInside?i=0MvWHW" /></a>
</p>
<div>
  <a href="http://feeds.feedburner.com/%7Ef/RubyInside?a=AJNpmdD"><img src="http://feeds.feedburner.com/%7Ef/RubyInside?i=AJNpmdD" /></a> <a href="http://feeds.feedburner.com/%7Ef/RubyInside?a=Fj1sQid"><img src="http://feeds.feedburner.com/%7Ef/RubyInside?i=Fj1sQid" /></a> <a href="http://feeds.feedburner.com/%7Ef/RubyInside?a=qlOyaRd"><img src="http://feeds.feedburner.com/%7Ef/RubyInside?i=qlOyaRd" /></a>
</div><img src="http://feeds.feedburner.com/%7Er/RubyInside/%7E4/211450065" height="1" width="1" />
</div>]]>
      </description>
      <pubDate>sam, 05 Jan 2008 05:01:42 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/5989183</guid>
    </item>
    <item>
      <title>Autotesting JavaScript in Rails</title>
      <link>http://feeds.feedburner.com/%7Er/ajaxian/%7E3/211095933/autotesting-javascript-in-rails</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Dr Nic has written a <a href="http://drnicwilliams.com/2008/01/04/autotesting-javascript-in-rails/">tutorial on testing JavaScript in Rails</a> using a new <code>javascript_test</code> plugin.
</p>
<p>
  Once you <code>ruby script/plugin install javascript_test</code> you can <code>ruby script/generate javascript_test maths</code>. Then you can write a test a la:
</p>
<div>
  <a href="#">PLAIN TEXT</a>
</div>
<div>
  <span style="color: #000000; font-weight: bold;">JAVASCRIPT:</span><br />
  <div>
    <div>
      <ol>
        <li style="color: black; font-weight: normal; font-style: normal; color: #3A6A8B;">
          <div style="color: #000000; font-weight: normal;">
            &nbsp;
          </div>
        </li>
        <li style="font-weight: bold; color: #26536A;">
          <div style="color: #000000; font-weight: normal;">
            testTruth: <span style="color: #003366; font-weight: bold;">function</span><span style="color: #006600; font-weight: bold;">(</span><span style="color: #006600; font-weight: bold;">)</span> <span style="color: #006600; font-weight: bold;">{</span> <span style="color: #000066; font-weight: bold;">with</span><span style="color: #006600; font-weight: bold;">(</span><span style="color: #000066; font-weight: bold;">this</span><span style="color: #006600; font-weight: bold;">)</span> <span style="color: #006600; font-weight: bold;">{</span>
          </div>
        </li>
        <li style="color: black; font-weight: normal; font-style: normal; color: #3A6A8B;">
          <div style="color: #000000; font-weight: normal;">
            &nbsp; assert<span style="color: #006600; font-weight: bold;">(</span><span style="color: #003366; font-weight: bold;">true</span><span style="color: #006600; font-weight: bold;">)</span>;
          </div>
        </li>
        <li style="font-weight: bold; color: #26536A;">
          <div style="color: #000000; font-weight: normal;">
            <span style="color: #006600; font-weight: bold;">}</span><span style="color: #006600; font-weight: bold;">}</span>
          </div>
        </li>
        <li style="color: black; font-weight: normal; font-style: normal; color: #3A6A8B;">
          <div style="color: #000000; font-weight: normal;">
            &nbsp;
          </div>
        </li>
      </ol>
    </div>
  </div>
</div>
<p>
  You can go further though with the autotest watching over files, and Nic shows some TDD in action.
</p>
<p>
  <a href="http://drnicwilliams.com/2008/01/04/autotesting-javascript-in-rails/"><img src="http://drnicwilliams.com/wp-content/uploads/2008/01/javascript-testing-intro.jpg" /></a>
</p>
<div>
  <a href="http://feeds.feedburner.com/%7Ef/ajaxian?a=bzR1yZD"><img src="http://feeds.feedburner.com/%7Ef/ajaxian?i=bzR1yZD" /></a> <a href="http://feeds.feedburner.com/%7Ef/ajaxian?a=xgFwY9D"><img src="http://feeds.feedburner.com/%7Ef/ajaxian?i=xgFwY9D" /></a> <a href="http://feeds.feedburner.com/%7Ef/ajaxian?a=zxCyrAd"><img src="http://feeds.feedburner.com/%7Ef/ajaxian?i=zxCyrAd" /></a>
</div>
</div>]]>
      </description>
      <pubDate>ven, 04 Jan 2008 13:56:58 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2008:/article/5969398</guid>
    </item>
    <item>
      <title>Dave Thomas: Pipelines Using Fibers in Ruby 1.9</title>
      <link>http://pragdave.blogs.pragprog.com/pragdave/2007/12/pipelines-using.html</link>
      <description>
        <![CDATA[<div class="post_content wiki_text"><p>
  Users of the command line are familiar with the idea of building pipelines: a chain of simple commands strung together to the output of one becomes the input of the next. Using pipelines and a basic set of primitives, shell users can accomplish some sophisticated tasks. Here's a basic Unix shell pipeline that reports the ten longest .tip files in the current directory, based on the number of lines in each file:
</p>
<pre>
<code> wc -l *.tip | grep \.tip | sort -n | tail -10
</code>
</pre>
<p>
  Let's see how to add something similar to Ruby. By the end of this set of two articles, we'll be able to write things like
</p>
<pre>
<code>puts (even_numbers | tripler | incrementer | multiple_of_five ).resume
</code>
</pre>
<p>
  and a palindrome finder using blocks:
</p>
<pre>
<code>words            = Pump.new %w{Madam, the civic radar rotator is not level.}
is_palindrome = Filter.new {|word| word == word.reverse}

pipeline = words .| {|word| word.downcase.tr("^a-z", '') } .| is_palindrome

while word = pipeline.resume
  puts word
end
</code>
</pre>
<p>
  Great code? Nope. But getting there is fun. And, who knows? The techniques might well be useful in your next project.
</p>
<h1>
  A Daily Dose of Fiber
</h1>
<p>
  Ruby 1.9 adds support for Fibers. At their most basic, let you create simple generators (much as you could do previously with blocks. Here's a trivial example: a fiber that generates successive Fibonacci numbers:
</p>
<pre>
<code>      fib = Fiber.new do
        f1 = f2 = 1
        loop do
          Fiber.yield f1
          f1, f2 = f2, f1 + f2
        end
      end

      10.times { puts fib.resume }
</code>
</pre>
<p>
  A fiber is somewhat like a thread, except you have control over when it gets scheduled. Initially, a fiber is suspended. When you resume it, it runs the block until the block finishes, or it hits a <code>Fiber.yield</code>. This is similar to a regular block yield: it suspends the fiber and passes control back to the <code>resume</code>. Any value passed to <code>Fiber.yield</code> becomes the value returned by <code>resume</code>.
</p>
<p>
  By default, a fiber can only yield back to the code that resumed it. However, if you require the <code>"fiber"</code> library, Fibers get extended with a <code>transfer</code> method that allows one fiber to transfer control to another. Fibers then become fully fledged coroutines. However, we won't be needing all that power today.
</p>
<p>
  Instead, let's get back to the idea of creating pipelines of functionality in code, much as you can create pipelines in the shell.
</p>
<p>
  As a starting point, let's write two fibers. One's a generator—it creates a list of even numbers. The second is a consumer. All it does it accept values from the generator and print them. We'll make the consumer stop after printing 10 numbers.
</p>
<pre>
<code>    evens = Fiber.new do
      value = 0
      loop do
        Fiber.yield value
        value += 2
      end
    end

    consumer = Fiber.new do
      10.times do
        next_value = evens.resume
        puts next_value
      end
    end

    consumer.resume
</code>
</pre>
<p>
  Note how we had to use <code>resume</code> to kick off the consumer. Technically, the consumer doesn't have to be a Fiber, but, as we'll see in a minute, making it one gives us some flexibility.
</p>
<p>
  As a next step, notice how we've created some coupling in this code. Our <code>consumer</code> fiber has the name of the evens generator coded into it. Let's wrap both fibers in a method, and pass the name of the generator into the <code>consumer</code> method.
</p>
<pre>
<code>    def evens
      Fiber.new do
        value = 0
        loop do
          Fiber.yield value
          value += 2
        end
      end
    end

    def consumer(source)
      Fiber.new do
        10.times do
          next_value = source.resume
          puts next_value
        end
      end
    end

    consumer(evens).resume
</code>
</pre>
<p>
  OK. Let's add one more fiber to the weave. We'll create a filter that only passes on numbers that are multiples of three. Again, we'll wrap it in a method.
</p>
<pre>
<code>    def evens
      Fiber.new do
        value = 0
        loop do
          Fiber.yield value
          value += 2
        end
      end
    end

    def multiples_of_three(source)
      Fiber.new do
        loop do
          next_value = source.resume
          Fiber.yield next_value if next_value % 3 == 0
        end
      end
    end

    def consumer(source)
      Fiber.new do
        10.times do
          next_value = source.resume
          puts next_value
        end
      end
    end

    consumer(multiples_of_three(evens)).resume
</code>
</pre>
<p>
  Running this, we get the output
</p>
<pre>
<code>0
6
12
18
. . .
</code>
</pre>
<p>
  This is getting cool. We write little chunks of code, and then combine them to get work done. Just like a pipeline. Except...
</p>
<p>
  We can do better. First, the composition looks backwards. Because we're passing methods to methods, we write
</p>
<pre>
<code>    consumer(multiples_of_three(evens))
</code>
</pre>
<p>
  Instead, we'd like to write
</p>
<pre>
<code>    evens | multiples_of_three | consumer
</code>
</pre>
<p>
  Also, there's a fair amount of duplication in this code. Each of our little pipeline methods has the same overall structure, and each is coupled to the implementation of fibers. Let's see if we can fix this.
</p>
<h1>
  Wrapping Fibers
</h1>
<p>
  As is usual when we're refactoring towards a solution, we're about to get really messy. Don't worry, though. It will all wash off, and we'll end up with something a lot neater.
</p>
<p>
  First, let's create a class that represents something that can appear in our pipeline. At it's heart is the <code>process</code> method. This reads something from the input side of the pipe, then "handles" that value. The default handling is to write that value to the output side of the pipeline, passing it on to the next element in the chain.
</p>
<pre>
<code>    class PipelineElement

      attr_accessor :source

      def initialize
        @fiber_delegate = Fiber.new do
          process
        end
      end

      def resume
        @fiber_delegate.resume
      end

      def process
        while value = input
          handle_value(value)
        end
      end

      def handle_value(value)
        output(value)
      end

      def input
        source.resume
      end

      def output(value)
        Fiber.yield(value)
      end
    end
</code>
</pre>
<p>
  When I first wrote this, I was tempted to make <code>PipelineElement</code> a subclass of <code>Fiber</code>, but that leads to coupling. In the end, the pipeline elements delegate to a separate <code>Fiber</code> object.
</p>
<p>
  The first element of the pipeline doesn't receive any input from prior elements (because there are no prior elements), so we need to override its <code>process</code> method.
</p>
<pre>
<code>    class Evens &lt; PipelineElement
       def process
         value = 0
         loop do
           output(value)
           value += 2
         end
       end
    end

    evens = Evens.new
</code>
</pre>
<p>
  Just to make things more interesting, we'll create a generic <code>MultiplesOf filter, so we can filter based on any number, and not just 3:</code>
</p>
<pre>
<code>    class MultiplesOf &lt; PipelineElement
      def initialize(factor)
        @factor = factor
        super()
      end
      def handle_value(value)
        output(value) if value % @factor == 0
      end
    end

    multiples_of_three = MultiplesOf.new(3)
    multiples_of_seven = MultiplesOf.new(7)
</code>
</pre>
<p>
  Then we just knit it all together into a pipeline:
</p>
<pre>
<code>    multiples_of_three.source = evens
    multiples_of_seven.source = multiples_of_three

    10.times do
      puts multiples_of_seven.resume
    end
</code>
</pre>
<p>
  We get 0, 42, 84, 126, 168, and so on as output. (Any output stream that contains 42 must be correct, so no need for any unit tests here.)
</p>
<p>
  But we're still a little way from our ideal of being able to pipe these puppies together. It's a good thing that Ruby let's us override the "|" operator. Up in class <code>PipelineElement</code>, define a new method:
</p>
<pre>
<code>    def |(other)
      other.source = self
      other
    end
</code>
</pre>
<p>
  This allows us to write:
</p>
<pre>
<code>    10.times do
      puts (evens | multiples_of_three | multiples_of_seven).resume
    end
</code>
</pre>
<p>
  or even:
</p>
<pre>
<code>    pipeline = evens | multiples_of_three | multiples_of_seven

    10.times do
      puts pipeline.resume
    end
</code>
</pre>
<p>
  Cool, or what?
</p>
<h2>
  In The Next Thrilling Installment
</h2>
<p>
  The next post will take these basic ideas and tart them up a bit, allowing us to use blocks directly in pipelines. We'll also reveal why our <code>PipelineElement</code> class I just wrote is somewhat more complicated than might seem necessary. In the meantime, here's the full source of the code so far.
</p>
<pre>
<code>    class PipelineElement

      attr_accessor :source

      def initialize
        @fiber_delegate = Fiber.new do
          process
        end
      end

      def |(other)
        other.source = self
        other
      end

      def resume
        @fiber_delegate.resume
      end

      def process
        while value = input
          handle_value(value)
        end
      end

      def handle_value(value)
        output(value)
      end

      def input
        source.resume
      end

      def output(value)
        Fiber.yield(value)
      end
    end

    ##
    # The classes below are the elements in our pipeline
    #
     class Evens &lt; PipelineElement
       def process
         value = 0
         loop do
           output(value)
           value += 2
         end
       end
     end

    class MultiplesOf &lt; PipelineElement
      def initialize(factor)
        @factor = factor
        super()
      end
      def handle_value(value)
        output(value) if value % @factor == 0
      end
    end

    evens = Evens.new
    multiples_of_three = MultiplesOf.new(3)
    multiples_of_seven = MultiplesOf.new(7)

    pipeline = evens | multiples_of_three | multiples_of_seven

    10.times do
      puts pipeline.resume
    end
</code>
</pre>
</div>]]>
      </description>
      <pubDate>lun, 31 Dec 2007 17:45:38 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2007:/article/5989184</guid>
    </item>
    <item>
      <title>Pat Eyler: Real World Performance Profiling</title>
      <link>http://on-ruby.blogspot.com/2007/12/real-world-performance-profiling.html</link>
      <description>
        <![CDATA[<div class="post_content wiki_text">It looks like my post on Ruby 1.9.0 performance is drawing some criticism over on on reddit.

I already updated the original post to deal with a comment by ‘gravity’.  In a later comment, ‘Ganryu’ wrote “I don’t get it… isn’t this mainly IO dependent?”  Since he doesn’t have access to the code for LogWatchR he can’t do the profiling to find this out, but it’s the same kind of assumption that a</div>]]>
      </description>
      <pubDate>mer, 26 Dec 2007 12:41:06 +0100</pubDate>
      <guid isPermaLink="false">tag:ziki.com,2007:/article/5861858</guid>
    </item>
  </channel>
</rss>
