mai 15, 2012
Ruby 1.9.3-p194 and Bundler

If you update your version of Ruby to Ruby 1.9.3 patch 194 you might to see Rails don’t work anymore :(

The problem is the naming of the file Wrapper Bundler.

~/.rvm/gems/ruby-1.9.2-p290@global/bin/bundler_wrapper
~/.rvm/gems/ruby-1.9.3-p194@global/bin/ruby_bundler_wrapper

Env :

bundler-1.1.3
rvm 1.13.4
Rails 3.2.3

9:24am  |   URL: http://tmblr.co/ZhYFhxLWWc8p
Classé dans: rails 3.2 rvm bundler bundle 
novembre 1, 2011
Passer sous Ruby 1.9.3-p0 avec RVM

Mettez à jour la version de RVM => 1.9.2
$ rvm get latest

Mettez à jour la version de RubyGem => 1.8.11
$ gem update --system

Enfin installer Ruby 1.9.3
$ rvm install 1.9.3-p0

Ou avec rbenv :

$ brew update
$ brew install rbenv
$ brew install ruby-build
$ rbenv install 1.9.3-p0
$ rbenv global 1.9.3-p0

août 30, 2011
ImageMagick

ImageMagick est extrêmement puissant mais n’est pas très simple a utiliser ou du moins les docs me sont étrangement ésotérique.

Ayant dû manipuler des images je vous livre les commandes.

Afin de générer un graphique avec un grand nombre d’entrée j’ai du segmenter les envoient à Google Chart Image qui m’a donc renvoyé un morceau de Graphique à chaque appel, afin de livrer un graphique utilisable sur une seule image j’ai dû passer par plusieurs manipulations

L’image brut :

Image Brut

Premièrement supprimer les espaces

convert image_0.png -crop 300x1000+4+0 image_0_crop.png

Image cropée :

Image Cropee

La taille maximum de l’image renvoyé par Google Chart Image est de 300 000 pixels, afin d’optimiser le nombre de points tracé on ne va pas demander à Google Chart Image de nous ajouter les axes, mais nous allons les faire nous même :

Pour l’axe des abscisses on va ajouter des images d’axe vierge

puis on va créer l’image horodatée correspondante (Toutes les 10 minutes)

command = "convert -size 300x60 canvas:none -pointsize 20 -fill black -draw \"text 123,45 '"
command.concat(@date.advance(:minutes => +(5+(index*10))).strftime(ChartLine::TIME_FORMAT))
command.concat("'\" hour.png")

Puis on va composer l’image :

composite hour.png axis_of_x.png axe.png

On va coller le graphique dans une frame afin d’ajouter la place pour recevoir l’échelle des abscisses :

composite -gravity North image_0_crop.png frame.png image_0_frame.png

Maintenant on peut coller le morceau d’axe d’abscisse au morceau de graphique que nous avons

composite -gravity South axe.png frame.png image_0_axis.png

Ceci étant légèrement différent pour la première image car elle doit recevoir en + l’axe des ordonnées :

Pour cela on choisit une frame un peu plus large

composite -gravity East image_0_axis.png first_frame.png image_0_first.png

On colle l’axe des ordonnées

composite -gravity West axis_of_y.png image_0_first.png image_0_axis.png

Pour la suite on peut itérer sur toutes les images composées et on les collent :

convert image1.png image2.png image3.png +append -quality 75 imagefinale.png

5:52pm  |   URL: http://tmblr.co/ZhYFhx8xYx8A
  
Classé dans: imagemagick rails 
juin 6, 2011
Rvm Bundler Rails 3.1 Thin Ubuntu

Fichier /etc/init.d sous Ubuntu pour démarrer son app dans son environnement propre

  #! /bin/sh
  ### BEGIN INIT INFO
  # Provides:       <app_name>
  # Required-Start: $syslog
  # Required-Stop:  $syslog
  # Should-Start:       $local_fs
  # Should-Stop:        $local_fs
  # Default-Start:  2 3 4 5
  # Default-Stop:       0 1 6
  # Short-Description:  <app_name> - Site Web
  # Description:        <app_name> - Site Web
  ### END INIT INFO


  PATH=/usr/local/sbin:/usr/local/bin:/sbin:/bin:/usr/sbin:/usr/bin
  DAEMON=$HOME/.rvm/gems/ruby-1.9.2-p180@<app_name>/bin/thin
  DESC="<app_name>"
  NAME=<app_name>_env
  PROJECT_PATH=/var/www/$NAME # env

  check_thin() {
    for i in `ps aux|grep thin|grep '<app_name>.thin'|grep 'sock'|awk '{print $2}'`; 
    do 
        echo "Thin on $i"; 
        sleep 1; 
    done
  }

  test -x $DAEMON || exit 0

  set -e

  case "$1" in
    start)
        echo "Starting $DESC ..."
        rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.2-p180@<app_name>' -c \
        'cd /var/www/<app_name>_env/current/ && bundle exec thin -C \
        /etc/thin/<app_name>_env.yml start'
        echo "$DESC is started !"
    ;;
    stop)
        echo "Stopping $DESC ..."
        rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.2-p180@<app_name>' -c \
        'cd /var/www/<app_name>_env/current/ && bundle exec thin -C \
        /etc/thin/<app_name>_env.yml stop'
        echo "$DESC is stopped !"
    ;;
    restart|force-reload)
        echo "Restarting $DESC ..."
        rvm_path=$HOME/.rvm/ $HOME/.rvm/bin/rvm-shell '1.9.2-p180@<app_name>' -c \
        'cd /var/www/<app_name>_env/current/ && bundle exec thin -C \
        /etc/thin/<app_name>_env.yml restart'
        echo "$DESC is started !"
    ;;
    status)
        echo "Status"
        check_thin
    ;;
    *)
        N=/etc/init.d/<app_name>
        echo "Usage: $N {start|stop|restart|force-reload|status}" >&2
        exit 1
    ;;
  esac

  exit 0

9:25pm  |   URL: http://tmblr.co/ZhYFhx5qwSkX
  
Classé dans: rvm bundler rails 3.1 thin ubuntu 
mai 25, 2011
Ajouter une api key d’authentification dans toutes les requêtes ActiveResource pour Devise

J’ai chercher du coté de Rack en middleware pour ajouter les paramètres d’authentification attendu par devise lorsqu’on active l’option :token_authenticatable mais malheureusement je n’ai pas réussi à les ajouter…

Cependant j’ai trouvé une solution en surchargeant les méthodes d’ActiveResource

Ajouter la librairie suivante dans le répertoire /lib/active_resource/extend/ ne pas oublier de dé-commenter le ligne
“config.autoload_paths += %W(#{config.root}/lib)” dans config/application.rb

module ActiveResource #:nodoc:
  module Extend
    module AuthWithApi
      module ClassMethods
        def element_path_with_auth(*args)
          element_path_without_auth(*args).concat("?auth_token=#{self.api_key}")
        end
        def new_element_path_with_auth(*args)
          new_element_path_without_auth(*args).concat("?auth_token=#{self.api_key}")
        end
        def collection_path_with_auth(*args)
          collection_path_without_auth(*args).concat("?auth_token=#{self.api_key}")
        end
      end

      def self.included(base)
        base.class_eval do
          extend ClassMethods
          class << self
            alias_method_chain :element_path, :auth
            alias_method_chain :new_element_path, :auth
            alias_method_chain :collection_path, :auth
            attr_accessor :api_key
          end
        end
      end  
    end
  end  
end

dans les modèles il faut inclure le module

class Post < ActiveResource::Base
  include ActiveResource::Extend::AuthWithApi

  self.site = "http://application.localhost.com:3011/"
  self.format = :json

  self.api_key = 'jCxKPj8wJJdOnQJB8ERy'

  schema do
    string  :title
    string  :content
  end

end

Et le tour est joué !

mai 17, 2011
ActiveResource et Json

J’ai voulu mettre en place un client ActiveResource qui consomme du :json

J’ai créé un service de Blog simple

La migration :

class CreatePosts < ActiveRecord::Migration
  def self.up
    create_table :posts do |t|
      t.string :title
      t.text :content
      t.timestamps
    end
  end
end

Le modèle :

class Post < ActiveRecord::Base
end

Le contrôleur :

class PostsController < ApplicationController

    respond_to :html, :xml, :json

    def index
        @posts = Post.all
        respond_with(@posts)
    end

    def show
        @post = Post.find(params[:id])
        respond_with(@post)
    end
end

Le client ActiveResource

class Post < ActiveResource::Base

  self.site = "http://application.localhost.com:3011/"
  self.format = :xml

  schema do
    string  :title
    string  :content
  end

end

Jusque là tout est ok et fonctionne très bien, alors je décide de passer en Json

Le client ActiveResource

class Post < ActiveResource::Base

    self.site = "http://application.localhost.com:3011/"
    self.format = :json

    schema do
      string  :title
      string  :content
    end

end

Au moment de lister les posts j’obtiens le message suivant :

ActionController::RoutingError in Posts#index

Showing /.../app/views/posts/index.html.erb where line #... raised:

No route matches { :action=>"show", :controller=>"posts", :id=>
#<Post:... @attributes={"post"=>#<Post:... 
@attributes={"content"=>"...","id"=>1, "title"=>"..."}, 
@prefix_options={}>}, @prefix_options={}>}
Extracted source (around line #...):  

En fait le service de Blog renvoit le Json avec le :root comme il se doit, cependant ActiveResource ne le gère pas…

Vous devez ajouter la directive suivante dans le client :

Le modèle :

class Post < ActiveRecord::Base
    self.include_root_in_json = false
end

mai 1, 2011
Tous des gros cons ?

Article intéressant sur la conséquences d’Hadopi (entêtement du gouvernement et des majors)

9:05am  |   URL: http://tmblr.co/ZhYFhx4lg4Ko
Classé dans: hadopi 
avril 22, 2011
Application de Checkin

Voilà une petite application ad hoc pour permettre d’émarger votre présence dans un lieux commun. L’idée vient de l’espace de co-working que je fréquente La Cantine à Toulouse qui effectue un émargement manuel. Ce qui peut paraitre surprenant ou décevant pour une association qui évolue autour des acteurs du numériques de la région, mais money is money et time is money, en clair il faut non seulement du temps, des ressources mais aussi de l’argent pour mettre en place une application aussi simple que celle-ci et qui ne ramène pas d’argent … Dur dilemme !

Ce que fait l’application en quelques points :

Connexion

Lorsque que le co-worker chargera la page du portail il sera obligé de se connecter, sa connexion peut se faire via la délégation d’authentification, cependant un compte utilisateur devra être créé et la délégation devrait être couplée au compte. Si tel n’est pas le cas l’authentification renverra sur la page de compte.

Crédit

Le co-worker doit posséder des crédits pour pouvoir émarger. Un crédit permet d’émarger une demi-journée.

Émargement

Une fois authentifié avec un compte crée le co-worker pourra émarger. Il se verra proposer un écran avec un bouton émarger la matinée ou émargé l’après midi en fonction de l’heure, et une proposition pour l’émargement de la journée directement. L’émargement aura un état «disponible» et une heure de début et de fin de plage correspondant à la matinée ou l’après midi en cours.

Mon Compte

Le co-worker pourra visualisé la page de son compte, modifier ses informations, connaitre son solde.

Consultations des fiches des co-workers

En se connectant au portail de n’importe où le co-worker pourra accéder à l’ensemble des fiches des co-worker inscrit. Il pourra aussi voir les personnes ayant émargées et donc censées être présente dans l’espace de co-working. Cependant afin de limiter l’utilisation des informations à des fins autre que la communication naturelle que le co-working est censé amener les informations visible entre les co-worker se limiterons à la photo et au prénom. Afin d’avoir accès à plus d’informations le co-worker pourra effectuer une demande, si cette demande est accepter les 2 profils pourrons mutuellement avoir accès à l’ensemble de leurs informations.

Consultations des co-workers présent

Accès a la page des co-workers, un filtre permettra d’afficher les personnes présentes en fonction de la plage horaire.

Notification de présence

Un co-worker pourra être averti de la présence d’un autre co-worker à La Cantine. Cependant cette fonctionnalité ne sera offerte qu’aux co-workers étant déjà en relation.

Scénario

Le co-worker est invité à s’authentifier, il est inviter à compléter son compte si cela n’est pas fait, puis il est redirigé sur la page de compte où il peut effectuer son checkin, une fois le checkin il est redirigé sur la tronbinoscope des personnes présente.

L’application est disponible sur Github, toutes contributions sont les bienvenues !!!

2:24pm  |   URL: http://tmblr.co/ZhYFhx4W8F8C
  
Classé dans: github rails checkin app La Cantine 
avril 22, 2011
Nginx ProxyPass et Url routes générateur _url

Le problème que j’ai rencontré et que je n’ai qu’en parti résolu avec Nginx est au moment d’utiliser les helpers des routes _url sous rails Nginx ne définit l’url entant que host mais fournit le nom de l’upstream à la place.

Si l’on prend un cas concret voici un fichier de configuration Nginx qui redirige sur un server Thin

Fichier de configuration

upstream checkin {
    server  unix:/tmp/checkin.thin.0.sock;
}
# Suppression des www.
server { 
    listen 80; 
    server_name www.checkin.fr; 
    rewrite ^ http://checkin.fr$uri permanent; 
}
server {
  listen 80;
  client_max_body_size 50M;
  # sets the domain[s] that this vhost server requests for
  server_name www.checkin.fr;
  # doc root
  root /var/www/checkin/current/public;
  location / {
    # needed to forward user's IP address to rails
    proxy_set_header  X-Real-IP  $remote_addr;
    # Static cache
        if (-f $request_filename.html) {
      rewrite (.*) $1.html break;
    }
    # Everything else
    if (!-f $request_filename) {
      proxy_pass http://checkin;
      break;
    }
  }
  error_page   500 502 503 504  /500.html;
  location = /500.hwww.checkin.fr; 
    rewrite ^ http://checkin.fr$uri permanent; 
}
server {
  listen 80;
  client_max_body_size 50M;
  # sets the domain[s] that this vhost server requests for
  server_name www.checkin.fr;
  # doc root
  root /var/www/checkin/current/public;
  location / {
    # needed to forward user's IP address to rails
    proxy_set_header  X-Real-IP  $remote_addr;
    # Static cache
        if (-f $request_filename.html) {
      rewrite (.*) $1.html break;
    }
    # Everything else
    if (!-f $request_filename) {
      proxy_pass http://checkin;
      break;
    }
  }
  error_page   500 502 503 504  /500.html;
  location = /500.html {
    root   /var/www/checkin/public;
  }
}

Et bien votre host sera checkin au lieu checkin.fr

Pour une la route users_url vous obtenez http://checkin/users

users_url => http://checkin/users

Afin de contourner le problème j’ai nommé l’upstream avec le nom de domaine, même si c’est qu’un ersatz de solution ça fonctionne, je ne manquerai pas de mettre à jour ce billet si je trouve la solution

Environnement :

nginx -v      
nginx version: nginx/0.8.48
thin --version
thin 1.2.11 codename Bat-Shit Craz
rails --version
Rails 3.0.6

Mes coups de cœur Tumblr: Plus de coups de cœur... »