Développement Web Ruby
par Sylvain CLAUDEL

Derniers posts

rubyonrails 3 Hash.from_xml il manque des données (xml attributes)

Date d'édition 2010-10-07 à 22:55

Il est bien pratique dans rails (2 et 3) d'importer un xml sous forme de hash grâce à Hash.from_xml("blabla xml") !

Problème cette méthode saute des éléments du xml en particulier les attributs :

Hash.from_xml("<tag attr='val'>content</tag>") #=> {"tag"=>"content"}


On aurait préféré :

Hash.from_xml("<tag attr='val'>content</tag>", true)

#=> {"tag"=>{"content"=>"content", "attr"=>"val"}}

Il y avait aussi :

Hash.from_xml("<a attr='val'>du contenu<b attr='val'>bla</b></a>")

#=> {"a"=>"du contenu"}

Hash.from_xml("<a attr='val'><b attr2='val2'>bla</b></a>")

#=> {"a"=>{"b"=>"bla", "attr"=>"val"}}

Comme vous pouvez le constaté, il manque pas mal de chose. Il y a donc un patch pour rails 2 et rails 3 qui permet de corrigé ceci (voir le lien en bas).

Mais bon patcher rails3 c'est pas super super pratique ni simple.

Je vous ai donc fait un petit gem avec le patch (le mérite revient à celui qui a fait le patch : le blog du mec Peter Wagenet )

Pour l'installer : dans le Gemfile du projet :

gem "rivsc-xmlattributes" , "1.0.0"

puis 

bundle install

Ci-dessous le patch pour rails 2 et rails 3 :

https://rails.lighthouseapp.com/projects/8994/tickets/1598-preserve-xml-attributes-with-hashfrom_xml-and-activeresource

Theme_support pour rails 2 et rails3 themeing

Date d'édition 2010-10-07 à 22:36

RubyOnRails

Theme support était à l'origine un plugin qui permettait d'avoir des thèmes pour son application ruby on rails 1.X ou 2.X. Voici comment cela fonctionne.

Un répertoire themes à la racine de l'application rails, puis pour chaque theme un répertoire "images", "javascripts", "stylesheets" et enfin "view". Ce dernier permet de surcharger la vue si elle existe dans le thème sinon rails prend la vue par défaut dans app/view.

railsapp

|--themes
    |--montheme
       |--images
       |--javascripts
       |--stylecheets
       |--views

Le thème est chargé pendant l'execution de l'application et non au chargement, ce qui permet de changer de thème de manière dynamique. Les helpers permettent de choisir si on utilise des javascripts, stylesheets et images du theme ou de l'application général.

Dans la version 2.X on était obligé en développement de faire

rake themes:cache:update

pour copier les fichiers publics "themes/montheme/*" dans "public/montheme/*". J'ai porté (avec l'aide de mon chef pour le début) le plugin en un gem compatible rails3.

Vous pouvez l'installer en faisant :

sudo gem install theme_support

Pour l'utilisation de README sur github est bien fait !

Attention le gem ne fonctionne pas avec la surcharge de vue pour actionmailer !

pour rails 3.0
https://github.com/zedalaye/theme_support

pour rails 2.3
https://github.com/jystewart/theme_support
https://jystewart.net/process/

pour rails 3.2
https://github.com/lucasefe/themes_for_rails

Google Webmaster Tools - Les différences de progression en couleurs avec des flèches

Date d'édition 2010-10-07 à 21:47

Google

Si vous ne l'avez pas encore constaté allez voir c'est joli
Google webmaster tools permet de voir les progressions sur le

- nombre de clic par terme de recherche.
- progressions dans l'affichage sur chaque terme.
- progressions dans la position moyenne sur chaque terme de recherche.
- progressions dans le taux de clic (CTR).

https://www.google.com/webmasters/tools/

Partition HFS+ sur linux ubuntu avec Gparted

Date d'édition 2010-10-07 à 21:29

La freebox permet de lire les partitions HFS+, il peut être intéressant pour faire un gros disque d'enregistrement et donc HFS+ est adapté. Pour formater en HFS+ avec Gparted il faut installer hfsprogs

sudo aptitude install hfsprogs hfsplus

D'une manière générale, pour voir les formats pris en charge : menu gparted > Affichage > Prise en charge des systèmes de fichiers Ensuite il suffit de faire

sudo aptitude install X

X étant le nom du programme en dernière colonne !

Resque, redis, bluepill, background job à la queue pour rails

Date d'édition 2010-10-07 à 16:30

Resque, Redis et bluepill pour rails2.X ou 3

Resque permet de mettre des backgrounds jobs dans des queues dans rails.

https://github.com/defunkt/resque

Redis est une base de données Clé / Valeur (key/value store) très performante utilisée par Resque.

https://github.com/ezmobius/redis-rb

Bluepill permet de monitorer les processus.

https://github.com/arya/bluepill

Installation

Installation de Resque

sudo gem install resque

Installation de bluepill

sudo gem install bluepill

Installation de Redis

git clone git://github.com/defunkt/resque.git
cd resque
rake redis:install dtach:install
rake redis:start

Configuration

Créer un fichier dans config/intializer/resque.rb avec

class Authentication
def initialize(app)
@app = app
end
def call(env)
env['warden'].authenticate!(:database_authenticatable, :rememberable, :scope => :admin)
@app.call(env)
end
end
Resque::Server.use Authentication

Ensuite il faut que l'application rails charge les rake tasks de resque, il faut donc ajouter au fichier Rakefile du projet rails :

require 'resque/tasks'

Puis un fichier de config pour bluepill config/development.pill (pour qu'il sache quel processus monitorer) !

Bluepill.application("monappli") do |app|
# Redis
app.process("redis") do |process|
process.start_command = "redis-server /etc/redis.conf"
process.daemonize = true
process.pid_file = "/tmp/redis.pid"
process.start_grace_time = 3.seconds
process.stop_grace_time = 5.seconds
process.restart_grace_time = 8.seconds
process.stop_command = "echo 'SHUTDOWN' | nc localhost 6379"
end
# Workers
["maqueue1", "maqueue2"].each do |worker_type|
app.process(worker_type+"_worker") do |process|
process.group = "workers"
process.start_command = "cd /mnt/dev/rails/monappli; QUEUE="+worker_type+" rake environment resque:work RAILS_ENV=development"
process.daemonize = true
process.pid_file = "/tmp/"+worker_type+"_worker.pid"
process.start_grace_time = 3.seconds
process.stop_grace_time = 5.seconds
process.restart_grace_time = 8.seconds
process.stop_command = "resque killall"
end
end
# Resque-web | UI pour voir l'état des queues
app.process("resque-web") do |process|
process.start_command = "resque-web -p 3010"
process.daemonize = true
process.pid_file = "/tmp/resque-web.pid"
process.start_grace_time = 3.seconds
process.stop_grace_time = 5.seconds
process.restart_grace_time = 8.seconds
end
end

Comme ça bluepill sait qu'il doit démarrer les workers, redis, et resque-web (ce dernier vous permet de voir les jobs, les queues et tout et tout) Pour tout démarrer :

sudo bluepill load /mnt/dev/rails/monappli/config/development.pill

Dans votre application rails : créer un model dans le fichier maqueue_jobs.rb avec ce code de base :

class MaqueueJobs
# On peut choisir de mettre plusieurs worker par queue
# le symbole est le nom de la queue
@queue = :maqueue1
def self.perform(params1, params2, params3, ...)
#Code que va executer le worker
#C'est ici que l'on mets le code lourd et long qui doit s'effectuer en background
end
end

Dans votre application rails pour lancer en queue :

Resque.enqueue(Maqueue, params1, params2, params3, ...)
Attention params1 params2 params3 ne doivent pas être des models instanciés, passez les id des models

Vous pouvez constater sur https://localhost:3010/stats/resque l'état de vos queues, workers, et les jobs en attentes (pending) et vos jobs terminés (processed)

Pour plus d'info le readme officiel:

https://github.com/defunkt/resque

Développement ruby et geekeries - rivsc