<?xml version="1.0" encoding="utf-8"?><?xml-stylesheet title="XSL formatting" type="text/xsl" href="http://jul.is.a.n0life.org/blog/feed/rss2/xslt" ?><rss version="2.0"
  xmlns:dc="http://purl.org/dc/elements/1.1/"
  xmlns:wfw="http://wellformedweb.org/CommentAPI/"
  xmlns:content="http://purl.org/rss/1.0/modules/content/">
<channel>
  <title>jul is a nolife - Ruby On Rails</title>
  <link>http://jul.is.a.n0life.org/blog/</link>
  <description></description>
  <language>ab</language>
  <pubDate>Thu, 09 Sep 2010 16:05:36 +0200</pubDate>
  <copyright></copyright>
  <docs>http://blogs.law.harvard.edu/tech/rss</docs>
  <generator>Dotclear</generator>
  
    
  <item>
    <title>Plugin cybermut pour rails</title>
    <link>http://jul.is.a.n0life.org/blog/post/2009/02/04/Plugin-cybermut-pour-rails</link>
    <guid isPermaLink="false">urn:md5:d292ca749c4ac3f5cae9b0d13e2f42b5</guid>
    <pubDate>Wed, 04 Feb 2009 00:21:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>CIC</category><category>cybermut</category><category>P@iement CIC</category><category>Paiement CIC</category><category>plugin</category><category>Ruby On Rails</category>    
    <description>    &lt;p&gt;Je finis par publier ce plugin &lt;a href=&quot;http://commerce.e-i.com/news/&quot; hreflang=&quot;fr&quot;&gt;cybermut&lt;/a&gt; que j'ai sous le coude depuis un moment, et que j'ai enfin utilisé en production&lt;/p&gt;

&lt;pre&gt;
script/plugin install http://svn.immateriel.fr/cybermut/trunk
&lt;/pre&gt;


&lt;p&gt;Le README:&lt;/p&gt;


&lt;p&gt;Basé sur le gem paypal et sur le &lt;a href=&quot;http://groups.google.com/group/railsfrance/msg/de3ce6d5c5a44fbd&quot; hreflang=&quot;fr&quot;&gt;code&lt;/a&gt; de Yann KLIS&lt;/p&gt;


&lt;p&gt;Dans environment.rb:&lt;/p&gt;
&lt;pre&gt;
Cybermut::Confirmation.action_url = &amp;quot;https://ssl.paiement.cic-banques.fr/test/paiement.cgi&amp;quot;
Cybermut::Confirmation.hmac_sha1_key = &amp;quot;SHA1_KEY&amp;quot;
Cybermut::Confirmation.hmac_sha1_pass = &amp;quot;SHA1_PASS&amp;quot;
&lt;/pre&gt;



&lt;p&gt;Dans la vue:&lt;/p&gt;
&lt;pre&gt;
cybermut_setup(no_commande, montant, tpe, options)
&lt;/pre&gt;


&lt;p&gt;Exemple:&lt;/p&gt;

&lt;pre&gt;
&amp;lt;%=  cybermut_form_tag %&amp;gt;
&amp;lt;%= cybermut_setup(&amp;quot;order10&amp;quot;, 100, &amp;quot;123456&amp;quot;,'societe'=&amp;gt;&amp;quot;nomsociete&amp;quot;, 'url_retour_ok'=&amp;gt;&amp;quot;http://site/paiement_ok&amp;quot;, 'url_retour_err'=&amp;gt;&amp;quot;http://site/paiement_erreur&amp;quot;) %&amp;gt;
&amp;lt;%= submit_tag &amp;quot;Payer maintenant&amp;quot;%&amp;gt;
&amp;lt;/form&amp;gt;
&lt;/pre&gt;


&lt;p&gt;La validation:&lt;/p&gt;

&lt;pre&gt;
def validate_cybermut_order
  if request.raw_post
    confirmation=Cybermut::Confirmation.new(request.raw_post)
    # verification que la commande existe dans la base
    if Order.exists?(confirmation.reference)
      @order=Order.find(confirmation.reference)
      # verification de la validité du message du serveur cybermut
      if confirmation.acknowledge
        # verification du total
        if @order.total == confirmation.montant_euros
          @order.validation
          logger.info &amp;quot;CYBERMUT: order #{@order.id} is OK&amp;quot;
        else
          logger.info &amp;quot;CYBERMUT: order #{@order.id} FAILS with data problem&amp;quot;
        end
      else
        logger.info &amp;quot;CYBERMUT: order #{@order.id} FAILS with validation
      end
    else
      logger.info &amp;quot;CYBERMUT: order #{confirmation.reference} FAILS not found&amp;quot;
    end
  end
  render :text=&amp;gt;confirmation.response
end
&lt;/pre&gt;



&lt;p&gt;Limitations&amp;nbsp;:
Pas de support d'une autre monnaie que l'euro&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2009/02/04/Plugin-cybermut-pour-rails#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2009/02/04/Plugin-cybermut-pour-rails#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/29</wfw:commentRss>
      </item>
    
  <item>
    <title>Passer de rails 2.0 à rails 2.1</title>
    <link>http://jul.is.a.n0life.org/blog/post/2008/06/18/Passer-de-rails-20-a-rails-21</link>
    <guid isPermaLink="false">urn:md5:0af108979374e17827700641f80a5445</guid>
    <pubDate>Wed, 18 Jun 2008 12:16:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;En voulant migrer l'un de mes projets Ruby on Rails de la version 2.0 à la version 2.1, j'ai découvert qu'en fait il n'y avait pas une totale rétro compatibilité. Une fois de plus, c'est assez désagréable de devoir mettre à jour son application vers une nouvelle version ... Voici quelques notes que j'ai trouvé à droite à gauche afin de faciliter la tâche.&lt;/p&gt;



&lt;p&gt;Tout d'abord, config.action_view.cache_template_extensions dans config/environments/development a été purement et simplement éjecté. Jusque là tout va bien, il y a juste à supprimer la ligne.&lt;/p&gt;



&lt;p&gt;Ensuite, il semble que le &lt;a href=&quot;http://www.ruby-forum.com/topic/155142#684083&quot; hreflang=&quot;fr&quot;&gt;''eager loading'' ai changé&lt;/a&gt;, ainsi lorsque l'on faisait&lt;/p&gt;

&lt;pre&gt;
Table1.find(:all, :include=&amp;gt;&amp;quot;table2&amp;quot;,:conditions=&amp;gt;[&amp;quot;table3_id=?&amp;quot;,1])
&lt;/pre&gt;


&lt;p&gt;table2 ayant une colonne table3_id
Pas de problème, un &lt;em&gt;left join&lt;/em&gt; était généré.
Dans rails 2.1, une erreur&lt;/p&gt;

&lt;pre&gt;
Mysql::Error: Unknown column 'table3_id' in 'where clause': SELECT * FROM `table1`     WHERE (table2_id=1)
&lt;/pre&gt;


&lt;p&gt;Je ne suis pas sur de comprendre quel est l'utilité du &lt;em&gt;include&lt;/em&gt; à présent, il n'empêche qu'il faut à présent&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
Table1.find(:all, :joins=&amp;gt;&amp;quot;table2&amp;quot;,:conditions=&amp;gt;[&amp;quot;table3_id=?&amp;quot;,1])
&lt;/pre&gt;


&lt;p&gt;pour obtenir le même résultat.&lt;/p&gt;



&lt;p&gt;Enfin, pas mal de plugins plantent lamentablement, par exemple &lt;a href=&quot;http://www.globalize-rails.org/&quot; hreflang=&quot;en&quot;&gt;Globalize&lt;/a&gt; ou le &lt;a href=&quot;http://wiki.rubyonrails.org/rails/pages/Theme+Support+Plugin&quot; hreflang=&quot;en&quot;&gt;plugin de thème&lt;/a&gt;.
Il semble que pour les deux ce soit un problème avec les &lt;a href=&quot;http://trac.globalize-rails.org/trac/globalize/ticket/194&quot; hreflang=&quot;en&quot;&gt;fonctions de template&lt;/a&gt;&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
ActionView::Base::register_template_handle
&lt;/pre&gt;


&lt;p&gt;étant remplacé par&lt;/p&gt;

&lt;pre&gt;
ActionView::Template.register_template_handler
&lt;/pre&gt;


&lt;p&gt;et&lt;/p&gt;

&lt;pre&gt;
pick_template_extension
&lt;/pre&gt;


&lt;p&gt;étant instancié via @finder&lt;/p&gt;

&lt;pre&gt;
@finder.pick_template_extension
&lt;/pre&gt;


&lt;p&gt;J'ai trouvé deux patch pour régler ça. Pour le plugin de thème c'est &lt;a href=&quot;http://terrbear.org/?p=30&quot; hreflang=&quot;en&quot;&gt;ici&lt;/a&gt;, et pour Globalize, &lt;a href=&quot;http://www.nateclark.com/articles/2008/06/11/globalize-plugin-for-rails-2-1&quot; hreflang=&quot;en&quot;&gt;là&lt;/a&gt;.
Problème pour Globalize, j'avais une erreur &quot;can't dup FalseClass&quot;. Je n'ai pas cherché à comprendre et j'ai hacké vite fait bien fait le fichier vendor/plugins/globalize/lib/globalize/rails/action_view.rb
avant la ligne&lt;/p&gt;

&lt;pre&gt;
pn = Pathname.new(template_file_name)
&lt;/pre&gt;


&lt;p&gt;J'ai juste ajouté&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
if !template_file_name
   template_file_name=&amp;quot;&amp;quot;
end
&lt;/pre&gt;



&lt;p&gt;Je suis sur que pleins d'autres trucs peuvent encore poser problème, mais pour l'instant mon application semble fonctionner.&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2008/06/18/Passer-de-rails-20-a-rails-21#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2008/06/18/Passer-de-rails-20-a-rails-21#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/28</wfw:commentRss>
      </item>
    
  <item>
    <title>Add an id to your has_and_belongs_to_many join table</title>
    <link>http://jul.is.a.n0life.org/blog/post/2008/04/03/Add-an-id-to-your-has_and_belongs_to_many-join-table</link>
    <guid isPermaLink="false">urn:md5:b11623d5e6e9ee1e0b6dfe1fc65b8f9e</guid>
    <pubDate>Thu, 03 Apr 2008 10:31:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;If you want to define a model for your has_and_belongs_to_many join table, you really need to care, because if your table has an id primary key, then the join will not work.&lt;/p&gt;


&lt;p&gt;Imagine that you have two tables Product and Keyword and you want to link these with a product_keywords
You will create a migration :&lt;/p&gt;

&lt;pre&gt;

 create_table :product_keywords do |t|
      t.column :product_id, :integer
      t.column :keyword_id, :integer
    end
&lt;/pre&gt;


&lt;p&gt;You need an id because you want easily access the table throught a model&lt;/p&gt;

&lt;pre&gt;

class ProductKeyword &amp;lt; ActiveRecord::Base
  belongs_to :product
  belongs_to :keyword
  # something like voting for keyword in product
  has_many :votes
end
&lt;/pre&gt;


&lt;p&gt;Then if you want to access the keywords with Product model&lt;/p&gt;

&lt;pre&gt;

class Product &amp;lt; ActiveRecord::Base
 has_and_belongs_to_many :keywords, 
:class_name=&amp;gt;&amp;quot;Keyword&amp;quot;, 
:join_table=&amp;gt;&amp;quot;product_keywords&amp;quot;, 
:foreign_key=&amp;gt;&amp;quot;product_id&amp;quot;, 
:association_foreign_key=&amp;gt;&amp;quot;keyword_id&amp;quot;
end
&lt;/pre&gt;


&lt;p&gt;This actually doesn't work!
Why? When the SQL statements will ask for the keywords columns, it will get all columns, including product_keywords. Since we have an id for keyword AND for product_keywords, the id results are not clear. We need to force the keywords column only.&lt;/p&gt;

&lt;pre&gt;

class Product &amp;lt; ActiveRecord::Base
 has_and_belongs_to_many :keywords, 
:class_name=&amp;gt;&amp;quot;Keyword&amp;quot;, 
:join_table=&amp;gt;&amp;quot;product_keywords&amp;quot;, 
:foreign_key=&amp;gt;&amp;quot;product_id&amp;quot;, 
:association_foreign_key=&amp;gt;&amp;quot;keyword_id&amp;quot;, 
:select=&amp;gt;&amp;quot;keywords.*&amp;quot;,
:insert_sql=&amp;gt;'INSERT INTO product_keywords (product_id, keyword_id) VALUES (#{id}, #{record.id})'

end
&lt;/pre&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2008/04/03/Add-an-id-to-your-has_and_belongs_to_many-join-table#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2008/04/03/Add-an-id-to-your-has_and_belongs_to_many-join-table#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/27</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails problems and errors : Expected ... to define ...</title>
    <link>http://jul.is.a.n0life.org/blog/post/2008/02/29/Rails-problems-and-errors-%3A-Expected-to-define</link>
    <guid isPermaLink="false">urn:md5:dcddf4e2bfa023ec95dfcdad1894a19b</guid>
    <pubDate>Fri, 29 Feb 2008 08:06:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>error</category><category>problem</category><category>Ruby On Rails</category>    
    <description>    &lt;pre&gt;

Expected /your/rails/dir/someclass.rb to define Someclass
&lt;/pre&gt;


&lt;p&gt;It seems that this error appears when something is missing, to know what is missing exactly, try to run&lt;/p&gt;

&lt;pre&gt; 
$ script/console 
&lt;/pre&gt;


&lt;p&gt;then&lt;/p&gt;

&lt;pre&gt;

 &amp;gt;&amp;gt; Someclass
&lt;/pre&gt;


&lt;p&gt;It will give you details about the problem.&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2008/02/29/Rails-problems-and-errors-%3A-Expected-to-define#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2008/02/29/Rails-problems-and-errors-%3A-Expected-to-define#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/26</wfw:commentRss>
      </item>
    
  <item>
    <title>Service web rails pour Second Life (2/2)</title>
    <link>http://jul.is.a.n0life.org/blog/post/2008/01/28/Service-web-rails-pour-Second-Life-2/2</link>
    <guid isPermaLink="false">urn:md5:908eab8ca8be9d064d2f80fa588ef540</guid>
    <pubDate>Mon, 28 Jan 2008 16:40:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category><category>Second Life</category>    
    <description>    &lt;p&gt;Pour continuer sur les traces du précédent article, intéressons nous à nouveau à Second Life et Ruby on Rails.
Dans cet article, nous allons voir comment communiquer depuis un objet dans le jeu vers un site Rails.
Plus simplement, nous n'allons cette fois pas utiliser le système de webservice de rails, mais uniquement les arguments d'url. Ce service minuscule aura juste pour but de convertir tous les caractères en majuscule.&lt;/p&gt;


&lt;p&gt;Cette fois nous commençons donc par la partie LSL&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

string texte=&amp;quot;Hello World&amp;quot;;
string texte_majuscule;

default
{
  state_entry()
    {
    
     string resultat;
     llHTTPRequest(&amp;quot;http://monserveur.fr/second_life/majuscule&amp;quot;, [HTTP_METHOD, &amp;quot;PUT&amp;quot;,HTTP_MIMETYPE,&amp;quot;application/x-www-form-urlencoded&amp;quot;], &amp;quot;texte=&amp;quot;+(string)texte);

    }

  http_response(key request_id, integer status, list metadata, string body) {
    texte_majuscule=body;
  }

}

&lt;/pre&gt;


&lt;p&gt;Le résultat est récupéré dans la fonction http_response.&lt;/p&gt;


&lt;p&gt;La partie rails est bien plus simple encore&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
class SecondLifeController &amp;lt; ApplicationController
 def majuscule
   render :text=&amp;gt;params[:texte].upcase
 end
end
&lt;/pre&gt;


&lt;p&gt;Bien sur il ne s'agit que d'un exemple, je suis sur que vous aurez de bien meilleurs idées que moi!&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2008/01/28/Service-web-rails-pour-Second-Life-2/2#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2008/01/28/Service-web-rails-pour-Second-Life-2/2#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/24</wfw:commentRss>
      </item>
    
  <item>
    <title>Second Life web service with rails (1/2)</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/07/11/Second-Life-web-service-with-rails-1/2</link>
    <guid isPermaLink="false">urn:md5:abc7dea589c4a5e3e93fd6125431aea9</guid>
    <pubDate>Wed, 11 Jul 2007 20:27:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category><category>Second Life</category>    
    <description>    &lt;p&gt;In this first part, we will see how to communicate with an in-world object from a ruby on rails application thanks to XML-RPC.
At the beginning, we define a second life structure (app/models/second_life_struct.rb) which represent the API format of second life :&lt;/p&gt;

&lt;pre&gt;

class SecondLifeStruct &amp;lt; ActionWebService::Struct
  member &amp;quot;Channel&amp;quot;, :string
  member &amp;quot;StringValue&amp;quot;, :string
  member &amp;quot;IntValue&amp;quot;, :int
end
&lt;/pre&gt;


&lt;p&gt;Next, we create a new rails API (app/apis/second_life_api.rb) which use the structure :&lt;/p&gt;

&lt;pre&gt;
class SecondLifeApi &amp;lt; ActionWebService::API::Base
  inflect_names false
  api_method &amp;quot;llRemoteData&amp;quot;, :expects=&amp;gt;[SecondLifeStruct], :returns=&amp;gt;[SecondLifeStruct]
end
&lt;/pre&gt;


&lt;p&gt;Before continuing, let's see the object LSL script which receive communication :&lt;/p&gt;

&lt;pre&gt;

default
{
  state_entry()
    {
     llOpenRemoteDataChannel(); 
    }

    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) 
    {
      if(type==REMOTE_DATA_CHANNEL) {
	llOwnerSay(&amp;quot;Communication channel: &amp;quot;+(string)channel);
      } 

      if(type==REMOTE_DATA_REQUEST) {
        llOwnerSay(sval);
        llRemoteDataReply(channel,message_id,&amp;quot;Everything is alright&amp;quot;,0);
      }
    }
}

&lt;/pre&gt;


&lt;p&gt;Communication channel is an unique key which permit to communicate back with this object from the Linden's webservice. We must copy this key for loading our rails web page (/second_life/test_object?channel=key)&lt;/p&gt;


&lt;p&gt;We just have to define the controller now:&lt;/p&gt;

&lt;pre&gt;
class SecondLifeController &amp;lt; ApplicationController
  web_client_api :second_life, :xmlrpc, &amp;quot;http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi&amp;quot;, :timeout=&amp;gt;90

  def test_object
    canal=params[:channel]
    begin
      resultat=second_life.llRemoteData(SecondLifeStruct.new(&amp;quot;Channel&amp;quot;=&amp;gt;canal,&amp;quot;StringValue&amp;quot;=&amp;gt;&amp;quot;Hello World!&amp;quot;,&amp;quot;IntValue&amp;quot;=&amp;gt;&amp;quot;0&amp;quot;))
      render :text=&amp;gt;resultat[&amp;quot;StringValue&amp;quot;]
    rescue
     render :text=&amp;gt;&amp;quot;Object doesn't respond&amp;quot;
    end
  end
end

&lt;/pre&gt;


&lt;p&gt;That's all! When we load the page, second life object says &quot;Hello World!&quot;
In the next post, we will see how to communicate in the other way : from in-world object to rails application.&lt;/p&gt;


&lt;p&gt;More informations about second life XML-RPC format  &lt;a href=&quot;http://www.lslwiki.net/lslwiki/wakka.php?wakka=XMLRPC&quot; hreflang=&quot;en&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/07/11/Second-Life-web-service-with-rails-1/2#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/07/11/Second-Life-web-service-with-rails-1/2#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/23</wfw:commentRss>
      </item>
    
  <item>
    <title>Service web rails pour Second Life (1/2)</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/06/13/Service-web-rails-pour-Second-Life-1/2</link>
    <guid isPermaLink="false">urn:md5:22be8367b1df9264642a8c1b14037bbc</guid>
    <pubDate>Wed, 13 Jun 2007 18:33:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category><category>Second Life</category>    
    <description>    &lt;p&gt;Dans cette première partie, nous verrons comment communiquer avec un objet in-world depuis une application ruby on rails grâce à XML-RPC.
Pour commencer on définit une structure second life (app/models/second_life_struct.rb) qui représentera le format de l'api second life&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;
class SecondLifeStruct &amp;lt; ActionWebService::Struct
  member &amp;quot;Channel&amp;quot;, :string
  member &amp;quot;StringValue&amp;quot;, :string
  member &amp;quot;IntValue&amp;quot;, :int
end
&lt;/pre&gt;


&lt;p&gt;Ensuite, on créé une nouvelle api (app/apis/second_life_api.rb) qui utilise cette structure:&lt;/p&gt;
&lt;pre&gt;
class SecondLifeApi &amp;lt; ActionWebService::API::Base
  inflect_names false
  api_method &amp;quot;llRemoteData&amp;quot;, :expects=&amp;gt;[SecondLifeStruct], :returns=&amp;gt;[SecondLifeStruct]
end
&lt;/pre&gt;


&lt;p&gt;Avant de continuer, intéressons nous rapidement au script LSL de l'objet qui permettra de recevoir la communication&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
default
{
  state_entry()
    {
     llOpenRemoteDataChannel(); 
    }

    remote_data(integer type, key channel, key message_id, string sender, integer ival, string sval) 
    {
      if(type==REMOTE_DATA_CHANNEL) {
	llOwnerSay(&amp;quot;Canal de communication : &amp;quot;+(string)channel);
      } 

      if(type==REMOTE_DATA_REQUEST) {
        llOwnerSay(sval);
        llRemoteDataReply(channel,message_id,&amp;quot;Tout va bien&amp;quot;,0);
      }
    }
}
&lt;/pre&gt;

&lt;p&gt;Le canal de communication correspond à un identifiant unique permettant de communiquer par la suite avec cet objet depuis le service web de Linden. Il faudra copier cet identifiant pour pouvoir appeler notre page dans rails (/second_life/tester_objet?canal=identifiant).&lt;/p&gt;


&lt;p&gt;Il ne reste plus qu'à définir le controlleur&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
class SecondLifeController &amp;lt; ApplicationController
  web_client_api :second_life, :xmlrpc, &amp;quot;http://xmlrpc.secondlife.com/cgi-bin/xmlrpc.cgi&amp;quot;, :timeout=&amp;gt;90

  def tester_objet
    canal=params[:canal]
    begin
      resultat=second_life.llRemoteData(SecondLifeStruct.new(&amp;quot;Channel&amp;quot;=&amp;gt;canal,&amp;quot;StringValue&amp;quot;=&amp;gt;&amp;quot;Bonjour tout le monde !&amp;quot;,&amp;quot;IntValue&amp;quot;=&amp;gt;&amp;quot;0&amp;quot;))
      render :text=&amp;gt;resultat[&amp;quot;StringValue&amp;quot;]
    rescue
     render :text=&amp;gt;&amp;quot;L'objet ne répond pas&amp;quot;
    end
  end
end
&lt;/pre&gt;


&lt;p&gt;Et voila, lorsque l'on se connecte à la page, l'objet dans second life nous dira &quot;Bonjour tout le monde !&quot;.&lt;/p&gt;


&lt;p&gt;Comme on vient de le voir, le système de service web de ruby on rails permet d'interfacer facilement votre application à second life.
Le prochain article montrera comment faire l'opération inverse&amp;nbsp;: communiquer depuis un objet second life vers une application rails.&lt;/p&gt;


&lt;p&gt;Pour plus d'information sur le format XML-RPC de second life, voir &lt;a href=&quot;http://www.lslwiki.net/lslwiki/wakka.php?wakka=XMLRPC&quot; hreflang=&quot;en&quot;&gt;ici&lt;/a&gt;.&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/06/13/Service-web-rails-pour-Second-Life-1/2#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/06/13/Service-web-rails-pour-Second-Life-1/2#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/22</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails vite fait : empêcher les bots de créer des sessions</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/04/06/Rails-vite-fait-%3A-empecher-les-bots-de-creer-des-sessions</link>
    <guid isPermaLink="false">urn:md5:17203e7a12b4a841249bbc540de8f8d2</guid>
    <pubDate>Fri, 06 Apr 2007 17:07:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Google</category><category>Ruby On Rails</category>    
    <description>    &lt;p&gt;Quand le traffic d'un site augmente; il y a fort à parier que googlebot, msnbot et d'autres viennent y jeter un coup d'oeil.
Le problème est que ces bots ne connaissent pas les cookies, et font générer une nouvelle session à rails à chacune de leurs visites. Ce qui peut vite devenir un cauchemar pour le répertoire tmp/sessions.&lt;/p&gt;


&lt;p&gt;Pour éviter cela, on peut empêcher les bots de créer une session, il suffit de déterminer si le visiteur est un bot et de désactiver les sessions. Dans le contrôleur&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

 session :off, 
  :if =&amp;gt; Proc.new { |request| request.user_agent =~ /(Baidu|Gigabot|Googlebot|Exabot|QihooBot|crawler|Crawler|Spider|Nutch|psbot|Seekbot|MJ12bot|IRLbot|libwww-perl|lwp-trivial|msnbot|SiteUptime|Slurp|WordPress|ZIBB|ZyBorg)/i }

&lt;/pre&gt;


&lt;p&gt;Il s'agit bien sur d'une liste non exhaustive des bots existants. Vous pouvez en trouver d'autres en étudiant un peu les logs de votre site.&lt;/p&gt;


&lt;p&gt;Source (en)&amp;nbsp;: &lt;a href=&quot;http://gurge.com/blog/2007/01/08/turn-off-rails-sessions-for-robots/&quot; hreflang=&quot;en&quot;&gt;http://gurge.com/blog/2007/01/08/turn-off-rails-sessions-for-robots/&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/04/06/Rails-vite-fait-%3A-empecher-les-bots-de-creer-des-sessions#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/04/06/Rails-vite-fait-%3A-empecher-les-bots-de-creer-des-sessions#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/21</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails vite fait : gestion de thèmes</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-gestion-de-themes</link>
    <guid isPermaLink="false">urn:md5:b353f8b53a7a4655671eb80d19b62e26</guid>
    <pubDate>Thu, 18 Jan 2007 19:15:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;On imagine un système simple de gestion de thèmes dans lequel on passe le nom du thème dans une variable de session.&lt;/p&gt;


&lt;p&gt;Tout d'abord on créé un répertoire de thèmes à la racine de son application&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
mkdir /repertoire/du/site/rails/themes
&lt;/pre&gt;


&lt;p&gt;Pour chaque thème, on a un sous-répertoire dans themes.
Par exemple un thème standard&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
mkdir /repertoire/du/site/rails/themes/standard
&lt;/pre&gt;

&lt;p&gt;Enfin pour notre thème on a un layout&amp;nbsp;: standard/layout.rhtml
Dans notre contrôleur, on définit une méthode de thème&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
def theme_layout
&amp;quot;../../themes/&amp;quot;+@session[:theme]+&amp;quot;/layout&amp;quot;
end
&lt;/pre&gt;

&lt;p&gt;A présent on peut utiliser le thème par render&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
render :use_full_path=&amp;gt;true, :layout=&amp;gt;:theme_layout
&lt;/pre&gt;

&lt;p&gt;ou alors dans tout le contrôleur&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
class MonController &amp;lt; ApplicationController
layout :theme_layout
end
&lt;/pre&gt;

&lt;p&gt;On peut définir quel thème utiliser n'importe où avec la variable de session&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;
@session[:theme]=&amp;quot;standard&amp;quot;
&lt;/pre&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-gestion-de-themes#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-gestion-de-themes#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/18</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails vite fait : cache et nom de page contenant un point</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-cache-et-nom-de-page-contenant-un-point</link>
    <guid isPermaLink="false">urn:md5:15bc566442c07ee4f1b08c13b4731392</guid>
    <pubDate>Thu, 18 Jan 2007 18:52:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;Les noms de page contenant un point (par exemple dans une action tag/:name pour un tag &quot;Web-2.0&quot;) ne sont pas correctement mises en cache avec cache_pages. Voici un petit hack vite fait pour régler le problème&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

caches_page :tag

after_filter {|c| 
      path=&amp;quot;public&amp;quot;+c.request.env[&amp;quot;PATH_INFO&amp;quot;]
      if File.exists?(path) and !File.directory?(path)        
        File.rename(path,path+&amp;quot;.html&amp;quot;)
      end
  }

&lt;/pre&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-cache-et-nom-de-page-contenant-un-point#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-cache-et-nom-de-page-contenant-un-point#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/17</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails vite fait : liste des pays en français</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-liste-des-pays-en-francais</link>
    <guid isPermaLink="false">urn:md5:fb3eeb656de1fa8dc1feed759835a012</guid>
    <pubDate>Thu, 18 Jan 2007 18:38:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;Il peut être pratique de pouvoir utiliser la fonction de helper country_select avec les noms de pays en français. Impossible de trouver une solution toute faite et rapidement applicable sur internet.&lt;/p&gt;


&lt;p&gt;La voici donc, en utilisant la liste du site http://www.iso.org.
Je vous passe les détails du script de conversion, voici directement le résultat, à mettre dans votre config/environment.rb&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;


ActionView::Helpers::FormOptionsHelper::COUNTRIES.replace [
&amp;quot;Afghanistan&amp;quot;, &amp;quot;Afrique du sud&amp;quot;, &amp;quot;Åland, îles&amp;quot;, &amp;quot;Albanie&amp;quot;, &amp;quot;Algérie&amp;quot;, &amp;quot;Allemagne&amp;quot;, &amp;quot;Andorre&amp;quot;, &amp;quot;Angola&amp;quot;, &amp;quot;Anguilla&amp;quot;, &amp;quot;Antarctique&amp;quot;, 
&amp;quot;Antigua-et-barbuda&amp;quot;, &amp;quot;Antilles néerlandaises&amp;quot;, &amp;quot;Arabie saoudite&amp;quot;, &amp;quot;Argentine&amp;quot;, &amp;quot;Arménie&amp;quot;, &amp;quot;Aruba&amp;quot;, &amp;quot;Australie&amp;quot;, &amp;quot;Autriche&amp;quot;, 
&amp;quot;Azerbaïdjan&amp;quot;, &amp;quot;Bahamas&amp;quot;, &amp;quot;Bahreïn&amp;quot;, &amp;quot;Bangladesh&amp;quot;, &amp;quot;Barbade&amp;quot;, &amp;quot;Bélarus&amp;quot;, &amp;quot;Belgique&amp;quot;, &amp;quot;Belize&amp;quot;, &amp;quot;Bénin&amp;quot;, &amp;quot;Bermudes&amp;quot;, &amp;quot;Bhoutan&amp;quot;, &amp;quot;Bolivie&amp;quot;, 
&amp;quot;Bosnie-herzégovine&amp;quot;, &amp;quot;Botswana&amp;quot;, &amp;quot;Bouvet, île&amp;quot;, &amp;quot;Brésil&amp;quot;, &amp;quot;Brunéi darussalam&amp;quot;, &amp;quot;Bulgarie&amp;quot;, &amp;quot;Burkina faso&amp;quot;, &amp;quot;Burundi&amp;quot;, &amp;quot;Caïmanes, îles&amp;quot;, 
&amp;quot;Cambodge&amp;quot;, &amp;quot;Cameroun&amp;quot;, &amp;quot;Canada&amp;quot;, &amp;quot;Cap-vert&amp;quot;, &amp;quot;Centrafricaine, république&amp;quot;, &amp;quot;Chili&amp;quot;, &amp;quot;Chine&amp;quot;, &amp;quot;Christmas, île&amp;quot;, &amp;quot;Chypre&amp;quot;, &amp;quot;Cocos 
(keeling), îles&amp;quot;, &amp;quot;Colombie&amp;quot;, &amp;quot;Comores&amp;quot;, &amp;quot;Congo&amp;quot;, &amp;quot;Congo, la république démocratique du&amp;quot;, &amp;quot;Cook, îles&amp;quot;, &amp;quot;Corée, république de&amp;quot;, &amp;quot;Corée, 
république populaire démocratique de&amp;quot;, &amp;quot;Costa rica&amp;quot;, &amp;quot;Côte d'ivoire&amp;quot;, &amp;quot;Croatie&amp;quot;, &amp;quot;Cuba&amp;quot;, &amp;quot;Danemark&amp;quot;, &amp;quot;Djibouti&amp;quot;, &amp;quot;Dominicaine, 
république&amp;quot;, &amp;quot;Dominique&amp;quot;, &amp;quot;Égypte&amp;quot;, &amp;quot;El salvador&amp;quot;, &amp;quot;Émirats arabes unis&amp;quot;, &amp;quot;Équateur&amp;quot;, &amp;quot;Érythrée&amp;quot;, &amp;quot;Espagne&amp;quot;, &amp;quot;Estonie&amp;quot;, &amp;quot;États-unis&amp;quot;, 
&amp;quot;Éthiopie&amp;quot;, &amp;quot;Falkland, îles (malvinas)&amp;quot;, &amp;quot;Féroé, îles&amp;quot;, &amp;quot;Fidji&amp;quot;, &amp;quot;Finlande&amp;quot;, &amp;quot;France&amp;quot;, &amp;quot;Gabon&amp;quot;, &amp;quot;Gambie&amp;quot;, &amp;quot;Géorgie&amp;quot;, &amp;quot;Géorgie du sud et les îles 
sandwich du sud&amp;quot;, &amp;quot;Ghana&amp;quot;, &amp;quot;Gibraltar&amp;quot;, &amp;quot;Grèce&amp;quot;, &amp;quot;Grenade&amp;quot;, &amp;quot;Groenland&amp;quot;, &amp;quot;Guadeloupe&amp;quot;, &amp;quot;Guam&amp;quot;, &amp;quot;Guatemala&amp;quot;, &amp;quot;Guernesey&amp;quot;, &amp;quot;Guinée&amp;quot;, 
&amp;quot;Guinée-bissau&amp;quot;, &amp;quot;Guinée équatoriale&amp;quot;, &amp;quot;Guyana&amp;quot;, &amp;quot;Guyane française&amp;quot;, &amp;quot;Haïti&amp;quot;, &amp;quot;Heard, île et mcdonald, îles&amp;quot;, &amp;quot;Honduras&amp;quot;, &amp;quot;Hong-kong&amp;quot;, 
&amp;quot;Hongrie&amp;quot;, &amp;quot;Île de man&amp;quot;, &amp;quot;Îles mineures éloignées des états-unis&amp;quot;, &amp;quot;Îles vierges britanniques&amp;quot;, &amp;quot;Îles vierges des états-unis&amp;quot;, &amp;quot;Inde&amp;quot;, 
&amp;quot;Indonésie&amp;quot;, &amp;quot;Iran, république islamique d'&amp;quot;, &amp;quot;Iraq&amp;quot;, &amp;quot;Irlande&amp;quot;, &amp;quot;Islande&amp;quot;, &amp;quot;Israël&amp;quot;, &amp;quot;Italie&amp;quot;, &amp;quot;Jamaïque&amp;quot;, &amp;quot;Japon&amp;quot;, &amp;quot;Jersey&amp;quot;, &amp;quot;Jordanie&amp;quot;, 
&amp;quot;Kazakhstan&amp;quot;, &amp;quot;Kenya&amp;quot;, &amp;quot;Kirghizistan&amp;quot;, &amp;quot;Kiribati&amp;quot;, &amp;quot;Koweït&amp;quot;, &amp;quot;Lao, république démocratique populaire&amp;quot;, &amp;quot;Lesotho&amp;quot;, &amp;quot;Lettonie&amp;quot;, &amp;quot;Liban&amp;quot;, 
&amp;quot;Libéria&amp;quot;, &amp;quot;Libyenne, jamahiriya arabe&amp;quot;, &amp;quot;Liechtenstein&amp;quot;, &amp;quot;Lituanie&amp;quot;, &amp;quot;Luxembourg&amp;quot;, &amp;quot;Macao&amp;quot;, &amp;quot;Macédoine, l'ex-république yougoslave de&amp;quot;, 
&amp;quot;Madagascar&amp;quot;, &amp;quot;Malaisie&amp;quot;, &amp;quot;Malawi&amp;quot;, &amp;quot;Maldives&amp;quot;, &amp;quot;Mali&amp;quot;, &amp;quot;Malte&amp;quot;, &amp;quot;Mariannes du nord, îles&amp;quot;, &amp;quot;Maroc&amp;quot;, &amp;quot;Marshall, îles&amp;quot;, &amp;quot;Martinique&amp;quot;, &amp;quot;Maurice&amp;quot;, 
&amp;quot;Mauritanie&amp;quot;, &amp;quot;Mayotte&amp;quot;, &amp;quot;Mexique&amp;quot;, &amp;quot;Micronésie, états fédérés de&amp;quot;, &amp;quot;Moldova, république de&amp;quot;, &amp;quot;Monaco&amp;quot;, &amp;quot;Mongolie&amp;quot;, &amp;quot;Monténégro&amp;quot;, 
&amp;quot;Montserrat&amp;quot;, &amp;quot;Mozambique&amp;quot;, &amp;quot;Myanmar&amp;quot;, &amp;quot;Namibie&amp;quot;, &amp;quot;Nauru&amp;quot;, &amp;quot;Népal&amp;quot;, &amp;quot;Nicaragua&amp;quot;, &amp;quot;Niger&amp;quot;, &amp;quot;Nigéria&amp;quot;, &amp;quot;Niué&amp;quot;, &amp;quot;Norfolk, île&amp;quot;, &amp;quot;Norvège&amp;quot;, 
&amp;quot;Nouvelle-calédonie&amp;quot;, &amp;quot;Nouvelle-zélande&amp;quot;, &amp;quot;Océan indien, territoire britannique de l'&amp;quot;, &amp;quot;Oman&amp;quot;, &amp;quot;Ouganda&amp;quot;, &amp;quot;Ouzbékistan&amp;quot;, &amp;quot;Pakistan&amp;quot;, 
&amp;quot;Palaos&amp;quot;, &amp;quot;Palestinien occupé, territoire&amp;quot;, &amp;quot;Panama&amp;quot;, &amp;quot;Papouasie-nouvelle-guinée&amp;quot;, &amp;quot;Paraguay&amp;quot;, &amp;quot;Pays-bas&amp;quot;, &amp;quot;Pérou&amp;quot;, &amp;quot;Philippines&amp;quot;, 
&amp;quot;Pitcairn&amp;quot;, &amp;quot;Pologne&amp;quot;, &amp;quot;Polynésie française&amp;quot;, &amp;quot;Porto rico&amp;quot;, &amp;quot;Portugal&amp;quot;, &amp;quot;Qatar&amp;quot;, &amp;quot;Réunion&amp;quot;, &amp;quot;Roumanie&amp;quot;, &amp;quot;Royaume-uni&amp;quot;, &amp;quot;Russie, fédération 
de&amp;quot;, &amp;quot;Rwanda&amp;quot;, &amp;quot;Sahara occidental&amp;quot;, &amp;quot;Sainte-hélène&amp;quot;, &amp;quot;Sainte-lucie&amp;quot;, &amp;quot;Saint-kitts-et-nevis&amp;quot;, &amp;quot;Saint-marin&amp;quot;, &amp;quot;Saint-pierre-et-miquelon&amp;quot;, 
&amp;quot;Saint-siège (état de la cité du vatican)&amp;quot;, &amp;quot;Saint-vincent-et-les grenadines&amp;quot;, &amp;quot;Salomon, îles&amp;quot;, &amp;quot;Samoa&amp;quot;, &amp;quot;Samoa américaines&amp;quot;, &amp;quot;Sao 
tomé-et-principe&amp;quot;, &amp;quot;Sénégal&amp;quot;, &amp;quot;Serbie&amp;quot;, &amp;quot;Seychelles&amp;quot;, &amp;quot;Sierra leone&amp;quot;, &amp;quot;Singapour&amp;quot;, &amp;quot;Slovaquie&amp;quot;, &amp;quot;Slovénie&amp;quot;, &amp;quot;Somalie&amp;quot;, &amp;quot;Soudan&amp;quot;, &amp;quot;Sri lanka&amp;quot;, 
&amp;quot;Suède&amp;quot;, &amp;quot;Suisse&amp;quot;, &amp;quot;Suriname&amp;quot;, &amp;quot;Svalbard et île jan mayen&amp;quot;, &amp;quot;Swaziland&amp;quot;, &amp;quot;Syrienne, république arabe&amp;quot;, &amp;quot;Tadjikistan&amp;quot;, &amp;quot;Taïwan, province de 
chine&amp;quot;, &amp;quot;Tanzanie, république-unie de&amp;quot;, &amp;quot;Tchad&amp;quot;, &amp;quot;Tchèque, république&amp;quot;, &amp;quot;Terres australes françaises&amp;quot;, &amp;quot;Thaïlande&amp;quot;, &amp;quot;Timor-leste&amp;quot;, 
&amp;quot;Togo&amp;quot;, &amp;quot;Tokelau&amp;quot;, &amp;quot;Tonga&amp;quot;, &amp;quot;Trinité-et-tobago&amp;quot;, &amp;quot;Tunisie&amp;quot;, &amp;quot;Turkménistan&amp;quot;, &amp;quot;Turks et caïques, îles&amp;quot;, &amp;quot;Turquie&amp;quot;, &amp;quot;Tuvalu&amp;quot;, &amp;quot;Ukraine&amp;quot;, 
&amp;quot;Uruguay&amp;quot;, &amp;quot;Vanuatu&amp;quot;, &amp;quot;Venezuela&amp;quot;, &amp;quot;Viet nam&amp;quot;, &amp;quot;Wallis et futuna&amp;quot;, &amp;quot;Yémen&amp;quot;, &amp;quot;Zambie&amp;quot;, &amp;quot;Zimbabwe&amp;quot;
]

&lt;/pre&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-liste-des-pays-en-francais#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/01/18/Rails-vite-fait-%3A-liste-des-pays-en-francais#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/16</wfw:commentRss>
      </item>
    
  <item>
    <title>Déploiement de ruby on rails avec apache 2.0 et mongrel</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/10/04/Deploiement-de-ruby-on-rails-avec-apache-20-et-mongrel</link>
    <guid isPermaLink="false">urn:md5:7224f3e34ed5fd8619bc8abc906a67e6</guid>
    <pubDate>Wed, 04 Oct 2006 09:59:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Apache</category><category>Ruby On Rails</category><category>Systèmes et Réseaux</category>    
    <description>    &lt;p&gt;Le principal problème de Ruby on Rails, actuellement, est son déploiement dans un environnement de production. Il existe pourtant un certain nombre de possibilités plus ou moins simples.&lt;/p&gt;
&lt;p&gt;La solution que j’ai retenu est d’utiliser la capacité de clustering de &lt;a href=&quot;http://mongrel.rubyforge.org/&quot;&gt;mongrel&lt;/a&gt; avec la version 2.0 de &lt;a href=&quot;http://apache.org&quot;&gt;apache&lt;/a&gt; .
Les développeurs de mongrel conseillent l’utilisation d'apache 2.2 et de son mod_load_balancer. Néammoins, apache 2.0 reste la version la plus simple à utiliser, car maintenue par les principales distributions (Debian en tête).&lt;/p&gt;
&lt;p&gt;En imaginant que nous avons déjà un environnement rails en place, nous allons commencer par installer mongrel:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ sudo gem install mongrel&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Une fois mongrel installé, configurons le pour une application donnée :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ sudo mongrel_rails cluster::configure -e production \ &lt;br /&gt;-p 8000 -N 3 -c /repertoire/de/notre/application \ &lt;br /&gt;-a 127.0.0.1 --user www-data --group www-data&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
Petite explication, nous configurons mongrel en cluster de trois processus (-N 3) commençant au port 8000 (-p 8000), ce qui nous lancera trois processus (8000,8001 et 8002).
A noter également que notre répertoire devra posséder les permissions www-data.
Nous pouvons à présent lancer le cluster:
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ sudo mongrel_rails cluster::start&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il faut maintenant configurer apache pour qu’il gère de manière transparente ce cluster. Pour cela, nous allons utiliser le module mod_proxy de la version 2.0. Voici le code pour un hôte virtuel (/etc/apache2/site-availables/monsite.fr dans Debian):&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;&amp;lt;VirtualHost *&amp;gt;&lt;br /&gt;    ServerName www.monsite.fr&lt;br /&gt;    ServerAdmin admin@monsite.fr&lt;br /&gt;    DocumentRoot /repertoire/de/notre/application/public&lt;br /&gt;&lt;br /&gt;    &amp;lt;Proxy *&amp;gt;&lt;br /&gt;        Order deny,allow&lt;br /&gt;        Allow from all&lt;br /&gt;    &amp;lt;/Proxy&amp;gt;&lt;br /&gt;&lt;br /&gt;    ProxyRequests Off&lt;br /&gt;    ProxyPassReverse / http://localhost:8000/&lt;br /&gt;    ProxyPassReverse / http://localhost:8001/&lt;br /&gt;    ProxyPassReverse / http://localhost:8002/&lt;br /&gt;    ProxyPreserveHost On&lt;br /&gt;    RewriteEngine On&lt;br /&gt;    RewriteMap  servers rnd:/etc/apache2/map.txt&lt;br /&gt;    RewriteRule ^/(images|stylesheets|javascripts)/?(.*) $0 [L]&lt;br /&gt;    RewriteRule ^/(.*)$ http://localhost:${servers:ports}/$1 [P,L]&lt;br /&gt;&lt;br /&gt;    &amp;lt;Directory /repertoire/de/notre/application/public/&amp;gt;&lt;br /&gt;        Options +FollowSymLinks&lt;br /&gt;        Order allow,deny&lt;br /&gt;        allow from all&lt;br /&gt;    &amp;lt;/Directory&amp;gt;&lt;br /&gt;&lt;br /&gt;    ErrorLog /var/log/apache2/monsite_error.log&lt;br /&gt;    LogLevel warn&lt;br /&gt;    CustomLog /var/log/apache2/monsite_access.log combined&lt;br /&gt;    ServerSignature On&lt;br /&gt;&amp;lt;/VirtualHost&amp;gt;&lt;br /&gt;&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;N’oubliez pas d’activer le module apache et le nouveau site.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;$ sudo a2enmod proxy&lt;br /&gt;$ sudo a2ensite monsite.fr&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Il ne reste plus qu’à relancer apache!
Les connexions vers www.monsite.fr seront ainsi redirigées automatiquement vers le cluster le plus approprié.&lt;/p&gt;
&lt;p&gt;Cette technique nous permet d’avoir une application rails supportant une charge plus importante en multipliant les clusters.&lt;/p&gt;
&lt;p&gt;Voir également (en anglais): &lt;a href=&quot;http://mongrel.rubyforge.org/docs/apache.html&quot;&gt;la doc de mongrel&lt;/a&gt;  et &lt;a href=&quot;http://times.usefulinc.com/2006/09/13-mongrel-apache20&quot;&gt;ce blog.&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
</channel>
</rss>