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.
Posted in planet on May 6th, 2008 | Comments Off
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).
Posted in planet on May 5th, 2008 | Comments Off
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.
Posted in planet on May 5th, 2008 | Comments Off
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.
Posted in planet on May 5th, 2008 | Comments Off
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
Posted in planet on May 5th, 2008 | Comments Off
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 :)
Posted in planet on May 5th, 2008 | Comments Off
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.
Posted in planet on May 5th, 2008 | Comments Off
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.
Posted in planet on May 4th, 2008 | Comments Off
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 ;)
Posted in planet on May 4th, 2008 | Comments Off
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 !
Posted in planet on May 4th, 2008 | Comments Off