EventMachine + Jabber

Article sur la programmation distribuée avec Jabber et EventMachine. C’est plutôt enfantin et ça rox bien. Tellement que je me suis remis à faire un bot pour mes paris en ligne que je pourrais gérer directement depuis mon Adium.

beanstalkd première approche

beanstalkd est un serveur de file d’attente en C développé pour une application Facebook. Il existe un client Ruby mais la documentation est très succincte. Il existe bien un exemple d’usage mais ne répond pas vraiment aux questions, telles que comment obtenir un équivalent des namespaces de manière à ce que plusieurs clients puissent se connecter au serveur tout en écoutant chacun sur leur(s) file(s) et comment savoir que tel message vient de telle file. La documentation du protocole m’a permis d’y répondre.

beanstalk = Beanstalk::Pool.new(['localhost:11300'])
loop do
  job = beanstalk.reserve
  puts job.body # prints "hello" 
  job.delete
end

Le protocole de Beanstalkd parle de tube. Ces tubes correspondent à des files d’attentes. Dans cet exemple de base le client écoute par défaut sur le tube “default”. Si l’on souhaite spécifier le tube à écouter ou bien ajouter un tube il suffit de le préciser :

beanstalk.watch('montube')

Ainsi le client écoutera sur les tubes “default” et “montube”.

beanstalk.ignore('default')

Supprime l’écoute sur le tube “default”. Attention un client doit au moins écouter un tube. L’ignore doit donc être effectué après le watch.

Si l’on souhaite qu’un client puisse écouter sur plusieurs tubes, il y a de fortes chances d’avoir besoin de savoir de quel tube provient un message afin d’effectuer les bons traitements :

job.stats['tube']

Indique de quel tube provient le message reçu. Un exemple complet :

require 'rubygems'
require 'beanstalk-client'
beanstalk = Beanstalk::Pool.new(['127.0.0.1:11300'])
beanstalk.watch('foo')
beanstalk.watch('bar')
beanstalk.ignore('default')
loop do
  job = beanstalk.reserve
  job_hash = job.ybody
  case job.stats['tube']
  when "foo" 
    puts "from foo's tube : #{job_hash[:data]}" 
  when "bar" 
    puts "from bar's tube : #{job_hash[:data]}" 
  end
  job.delete 
end

Depuis un client qui souhaite empiler un message il suffit de préciser quel tube l’on vise, sinon cela sera “default” :

beanstalk.use('foo')

Exemple :

require 'rubygems'
require 'beanstalk-client'
beanstalk = Beanstalk::Pool.new(['127.0.0.1:11300'])
beanstalk.use('foo')
beanstalk.yput(:data => "good")
beanstalk.use('bar')
beanstalk.yput(:data => "bye")

Résultats :

from foo's tube : good
from bar's tube : bye

On a ainsi un usage plus intéressant que les exemples n’utilisant qu’un seul client sur un seul tube. Beanstalkd possède un grand nombre de commandes mais il est dommage qu’il ne fournisse pas pour l’instant d’option de persistance sur le disque. Pour cela sparrow peut faire l’affaire et même s’il est en Ruby, l’usage d’eventmachine peut sans doute lui faire tenir une charge raisonnable. Cependant Beanstalkd possède une communauté très active et des bibliothèques vers 4 langages (pas PHP :P mais cela ne saurait tarder).

Ruby to Python

Petit projet intéressant qui permet de transformer le bytecode généré par la VM de Ruby 1.9 en Python. Le créateur, Why (qui a aussi fait Shoes et Camping), donne l’exemple d’une application web pour Google App Engine avec Ruby qui transformera tout ça en Python. Proof of concept à suivre.

Quelques helpers pour Wordpress

J’aime bien les helpers de Rails, alors j’ai décidé d’en faire quelques uns pour mes templates Wordpress. On les stocke dans le fichier functions.php de son thème et c’est parti. Pour l’instant c’est juste de l’inclusion de tags dans le header, mais ça facilite vraiment la vie.

Vivre avec Rails Edge #19

Traduction de la news #19

Le rapport de cette semaine couvre les changements du 29 Avril 2008 au 4 Mai 2008 (jour correspondant à l'enregistrement de Rails Envy podcast).

change_table pour les migrations d'ActiveRecord

Merci à Jeff Dean, qui a aussi blogué au sujet de la nouvelle fonctionnalité change_table des migrations d'ActiveRecord. Vous pouvez donc maintenant changer une table avec un block comme ceci :

change_table :videos do |t|
  t.add_timestamps
  t.add_belongs_to :goat
  t.add_string :name, :email, :limit => 20
  t.remove_column :name, :email # prend de multiples arguments
  t.rename :new_name
  t.string :new_string_column # execute avec le changement de nom de la table
end

Parmis les principaux points à noter :

  • add_XXX permettant d'ajouter une nouvelle colonne, exemple : add_string qui ajoutera un nouveau champs string.
  • Bien-sûr, add_timestamps permet d'ajouter les champs datetime magics created_at et updated_at
  • remove_column peux dorénavant prendre plusieurs arguments.
  • rename qui renommera la table.

Très belle amélioration DRY proposée par Jeff Dean une fois encore.

Révision concernant cette fonctionnalité : http://github.com/rails/rails/commit/96980bd561d79824b6cb6efbcbecdcbf8785d452

ActiveRecord::Base.create prend un block comme ActiveRecord::Base.new

Youpie, maintenant vous pouvez aussi créer (ActiveRecord::Base.create) un objet ActiveRecord avec un block en argument exactement comme vous pouviez le faire avec ActiveRecord::Base.new:

@person = Person.create(params[:person]) do |p|
  p.name = 'Konata Izumi'
  p.age = 17
end

Merci a Adam Meehan pour ce patch.

Révision concernant cette fonctionnalité : http://github.com/rails/rails/commit/dd120ede53eaf71dee76894998a81626b7a689fc

Bugfix: change_column doit permettre d'utiliser :null => true sur les champs qui ne l'étaient pas précédement.

Vous pouvez désormais utiliser change_column dans vos migrations pour modifier une colonne en nullable si elle était précédement NOT NULL.

Ce bugfix est gentiment offert par Nate Wiger.

Révision concernant cette fonctionnalité : http://github.com/rails/rails/commit/10ef65a3b054270ed3d458ec8eb7c2b9a3e638f7

Comme toujours, vous pouvez laissez toutes suggestions pour améliorer cette série de Vive avec Rails.

Enfin merci à Chu Yeow de m'encourager dans la traduction de ses magnifiques news

GitHub Badge

Dr. Nic a encore fait un truc super. On peut désormais avoir un widget sur son blog qui affiche les différents dépôts publics que l’on a sur GitHub. J’ai mis le mien juste en dessous des sidenotes, pas beaucoup de dépôts encore mais c’est en train de grossir :)

Photos du Wordcamp

J’étais au Wordcamp à Paris hier où j’ai pu rencontré pas mal de monde et vu que je commence à beaucoup travailler avec Wordpress, je suis bien obligé de rester à jour. Il y a plein de photos surtout de Rod et de Thanh.

Flux Atom Ok

J’ai ajouté le flux de ma section Sidenotes, vous pouvez maintenant profiter des mini articles de la sidebar dans le flux Atom. Comme par exemple celui sur Action Presenter.

Nouveau thème, nouveau Boldr

Ca faisait longtemps que je le préparais et que je l’avais déjà mis sur les pages du site, mais par manque de temps je ne l’ai pas fait sur le blog. Mais l’ancien thème commençait vraiment à m’énerver alors j’ai accélérer les choses.

J’ai enlevé le nuage de tags et ajouter des mini articles dans la sidebar qui devraient être disponibles dans le feed dans peu de temps (mais il faut que j’agrège 2 feeds d’abord). Ca va me permettre de faire du microblogging mais un peu plus long et depuis l’admin de Mephisto. Il y aura comme ça plus de contenu même s’il sera plus court.

Enfin voilà, je n’ai pas trop de choses à dire dessus à part que je l’aime beaucoup et que je encore des petites retouches à faire dessus. Regardez-le et si vous avez des commentaires à faire dessus, faites-le ;)

Action Presenter Reloaded

Je suis en train de préparer quelques éléments de présentation pour le RailsCamp et j’en avais un peu marre de mon Action Presenter, je l’ai donc recodé et amélioré. Maintenant les presenters contiennent le contrôleur courant, ce qui est très réjouissant !