ruby

Supprimer tous les messages d'anonyme du forum redmine

Si comme moi vous avez ouvert le forum Redmine au anonyme pour éviter qu'un utilisateur ne soit obligé de s'inscrire pour poster sur le forum, vous êtes sujet au Spam, vu que Redmine n'a encore aucun système anti-spam. Vous pouvez ainsi vous retrouver dans cette position.

screenshot de mon forum redmine spammé

Une fois que vous avez bloqué l'ajout de message par les anonymes, il faut maintenant faire le ménage. Soit, vous prenez message par message et faite le bouton supprimer. Soit vous utilisez la console comme moi. Voici donc les commandes à réaliser pour supprimer tous les messages d'anonyme du forum. Bien-sûr, cela implique que si vous avez des utilisateurs qui ont posté en tant qu'anonyme, leur poste sera détruit.

rails@shinydedi /var/rails/redmine/current $ ./script/console production                                                                                                                          
Loading production environment (Rails 2.0.2)
>> User.anonymous
=> #<AnonymousUser id: 4, login: "", hashed_password: "", firstname: "", lastname: "Anonymous", mail: "", mail_notification: false, admin: false, status: 0, last_login_on: nil, language: "", auth_source_id: nil, created_on: "2008-01-26 16:39:30", updated_on: "2008-01-26 16:39:30", type: "AnonymousUser">
>> User.anonymous.id
=> 4
>> Message.find_all_by_author_id(User.anonymous.id).size
=> 1693
>> Message.find_all_by_author_id(User.anonymous.id).each { |me| me.destroy }
=> [.........]
>>

English translation

[...]
Published on Mar 04 nov 2008 07:19
0 commentaires

Activer un compte Redmine par la console rails

Si par le plus grand malheur vous avez bloqué l'envoi de mail sur votre machine où redmine est installé. Vos utilisateurs ne peuvent plus recevoir d'email d'activation de compte. Redmine étant super pratique, vous ne pouvez pas activer le compte directement par l'interface web. Il faut donc passer par la console rails pour activer ce compte. Voici donc les commandes à réaliser pour activer le compte.

Dans cet exemple, nous allons supposer que je veux activer le compte du login 'ook'

Premièrement, il faut se connecter en console dans le mode production, où celui utilisé par votre instance web.

$ ./script/console production

Une fois dans la console, il faut chercher l'utilisateur, changé son état et ensuite supprimer le token d'activation. La suite de commande permet cela :

rails@shinydedi /var/rails/redmine/current $ ./script/console production
Loading production environment (Rails 2.0.2)
>> u = User.find_by_login 'ook'
=> #<User id: 7, login: "ook", hashed_password: "8a45629b374f3e667ea72494246b17a11309ffff", firstname: "Thomas", lastname: "XXX", mail: "thomas@xxx.com", mail_notification: false, admin: false, status: 2, last_login_on: nil, language: "fr", auth_source_id: nil, created_on: "2008-10-27 18:50:54", updated_on: "2008-10-27 18:50:54", type: nil>
>> u.status = User::STATUS_ACTIVE
=> 1
>> u.save
=> true
>> t = Token.find_by_action_and_user_id('register', u.id)
=> #<Token id: 16, user_id: 7, action: "register", value: "brVmdX8Sf0IecApDEWs0BmiD6ZN3DgsDoshpBZ2e", created_on: "2008-10-27 18:50:54">
>> t.destroy
=> #<Token id: 16, user_id: 7, action: "register", value: "brVmdX8Sf0IecApDEWs0BmiD6ZN3DgsDoshpBZ2e", created_on: "2008-10-27 18:50:54">

Ça y est votre utilisateur est activé. Il peux désormais se connecter comme si il avait réalisé l'activation par mail.

English Translation

[...]
Published on Lun 03 nov 2008 13:09
2 commentaires

Sortie de Pictrails 0.5.0

Peu de temps avant mon anniversaire qui a lieu le 11 Octobre, voici une nouvelle version de Pictrails.

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.

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.

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.

Tout retour est toujours le bienvenu ainsi que la proposition de design. Je rappele aussi qu'une version de démo est disponible. avec comme login admin/pictrails

English translation

[...]
Published on Sam 04 oct 2008 15:51
0 commentaires

Quelles nouvelles dans Rails Edge : Connection pools

Traduction de l'article de Ryan Daigle, What's new in edge rails : Connection Pools

Avec la venue prochaine de Rails thread-safe, il était nécessaire d'ajouter le pool de connection à la base de donnée. 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 database.yml avec le mot clé pool:

development:   
  adapter: mysql
  username: root    
  database: myapp_dev
  pool: 10 

Vous voilà avec un pool de connection. Facile

[...]
Published on Lun 08 sept 2008 20:46
3 commentaires

Quelles nouvelles dans Rails Edge : Les layouts pour les mails

Traduction de l'article de Ryan Daigle, What's new in edge rails : Mailer Layouts

Rails a ajouté la possibilité d'utiliser des layouts pour les mails 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:

Cass UserMailer < ActionMailer::Base
  def registration(user)
    subject    "You've registered"
    from       "system@example.com"
  end
end

vous n'aurait besoin que d'un layout à layouts/user_mailer.html.erb. Si vous spécifiez explicitement le layout vous n'avez pas besoin du suffix _mailer. Ainsi, dans l'exemple suivant, un layout à layouts/email.html.erb suffit:

class UserMailer < ActionMailer::Base
  layout 'email'
  ...
end

A partir de maintenant, vous pouvez faire de joli petit email. Vous avez désormais tous les outils.

[...]
Published on Lun 08 sept 2008 20:37
2 commentaires

Quelles nouvelles dans Rails Edge : Les Shallow routes

Traduction de l'article de Ryan Daigle, What's new in edge rails : Shallow routes

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 :

       
map.resources :users do |user|         
  user.resources :articles do |article|
    article.resourcs :comments
  end
end         

Néanmoins, si cette configuration permet de voir les articles disponibles à l'URL /users/1/articles et les commentaires à l'URL /users/1/articles/1/comments, 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 shallow route, vous le pouvez.

                          
map.resources :users, :shallow => true do |user|
  user.resources :articles do |article|
    article.resources :comments
  end
end         

Cette configuration permet de conserver les routes imbriquées et vous donne accès directement au route comme ceci:

      
articles_path #=> '/articles'                             
comments_path #=> '/comments'                             
article_comments_path(@article) #=> '/articles/1/comments'

Plus besoin de déclarer séparement les routes directes en plus des routes imbriquées. l'option :shallow fait tout les routes nécessaires automatiquement pour vous.

[...]
Published on Lun 08 sept 2008 20:11
0 commentaires

Profiler une requête rails

Pour découvrir le bug dont j'ai reporté précédement les effets, 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.

Utilisation du script Request Profiler

Depuis Rails 2.0, un nouveau script a été ajouté, script/performance/request. Ce script permet de réaliser un profile d'une ou plusieurs requête internet.

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.

get_with_redirect '/'
say "GET / => #{path}"
post_with_redirect '/sessions', :username => 'john', :password => 'doe'
say "POST /sessions => #{path}"

Une fois le script réalisé, il suffit de lancer la commande en définissant le nombre de requêtes qui seront effectuées

$ ./script/performance/request -n 10 login_session.rb

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.

Incompatibilité Rails 2.1 et ruby-prof

Alors que j'avais indiqué l'ajout d'un nouveau script dans Rails Edge qui nécessitait ruby-prof 0.6.1, je pensais que c'était le seul endroit qui nécessitait cette version de ruby-prof 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

Génération et installation de ruby-prof-0.6.1

Il faut d'abord récupérer les sources directements à partir du svn de ruby-prof

svn co http://ruby-prof.rubyforge.org/svn/

Ensuite, il faut générer le gem

$ rake package

Enfin, il suffit d'installer le gem.

# gem install pkg/ruby-prof-0.6.1.gem

Désormais, ruby-prof 0.6.1 est installé et vous pouvez utiliser pleinement le script performance/request.

English translation

[...]
Published on Mer 03 sept 2008 18:48
0 commentaires

Migration sur Typo-5.1.3 et mise à jours du script capistrano

Voilà, aussitôt sortie aussitôt installée. Alors que Typo-5.1.3 est sortie dimanche, j'ai mis à jour ce blog. Comment faire une migration si rapide ? Simple un bon script Capistrano :

require 'mongrel_cluster/recipes'

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

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

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

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

role :app, domain
role :web, domain
role :db,  domain, :primary => true

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

after "deploy:update_code", :update_config

Il ne suffit plus que d'avoir dans le dossier /shared/ le dossier /config/ comprenant les fichiers de configurations : database.yml et mongrel_cluster.yml. Après à chaque mises à jours de typo : cap deploy:migrations. Tout sera fait pour toi.

C'est pas beau la vie en Ruby ?

[...]
Published on Lun 01 sept 2008 16:20
0 commentaires

Le rubyFlow FR disponible

Après que Peter Cooper ait libéré le code original de rubyflow, Bruno Michel a pris les choses en mains pour traduire l'application. L'association RubyFrance a ensuite hébergé le tout. Nous voilà donc maintenant avec notre propre rubyflow FR. Bravo pour cette initiative.

[...]
Published on Ven 29 août 2008 06:52
0 commentaires

Gettext avec Rails, ca peux être long pour un formulaire en erreur

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.

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.

Dans Rails, durant chaque création de tag, il y a une demande de récupération de errors.on 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.

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.

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 GetText.cached = true 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.

English translation

[...]
Published on Jeu 28 août 2008 18:15
0 commentaires

RSS