<?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</title>
  <link>http://jul.is.a.n0life.org/blog/</link>
  <description></description>
  <language>ab</language>
  <pubDate>Thu, 02 Feb 2012 15:26:03 +0100</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>Un hosts.deny pour apache 2</title>
    <link>http://jul.is.a.n0life.org/blog/post/2008/01/28/Un-hostsdeny-pour-apache-2</link>
    <guid isPermaLink="false">urn:md5:aeacf863f7681244abe4214e8f5b6e05</guid>
    <pubDate>Mon, 28 Jan 2008 17:12:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Apache</category><category>Systèmes et Réseaux</category>    
    <description>    &lt;p&gt;Pour bloquer l'accès à un site web pour une adresse spécifique, j'ai d'abord tout simplement pensé à /etc/hosts.deny, mais pour aller plus loin j'avais besoins d'une solution plus fine. Après quelques recherches j'ai donc trouvé un moyen de le faire efficacement grâce au mod_rewrite d'apache.&lt;/p&gt;


&lt;p&gt;On rajoute déjà les règles dans le fichier de son vhost&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

RewriteEngine On

RewriteMap hosts-deny txt:/etc/apache2/hosts.deny
RewriteCond ${hosts-deny:%{REMOTE_HOST}|NOT-FOUND} !=NOT-FOUND [OR]
RewriteCond ${hosts-deny:%{REMOTE_ADDR}|NOT-FOUND} !=NOT-FOUND
RewriteRule ^/.* - [F]

&lt;/pre&gt;


&lt;p&gt;Cette règle lit dans le fichier /etc/apache2/hosts.deny afin de lister les adresses ip ou domaines à bloquer&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

uneip -
unnomdedomaine -
 
&lt;/pre&gt;


&lt;p&gt;Il ne manque plus qu'a redémarrer apache&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

/etc/init.d/apache2 restart

&lt;/pre&gt;


&lt;p&gt;Les visiteurs étant listés dans /etc/apache2/hosts.deny se verront ainsi renvoyer vers une page &quot;Forbiden&quot;. On peut bien sur imaginer une redirection vers une page personnalisée genre (banni.html)&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

&amp;lt;html&amp;gt;
&amp;lt;head&amp;gt;
&amp;lt;title&amp;gt;Vous avez été banni&amp;lt;/title&amp;gt;
&amp;lt;/head&amp;gt;
&amp;lt;h1&amp;gt;Vous n'êtes plus le bienvenu ici&amp;lt;/h1&amp;gt;
&amp;lt;/html&amp;gt;

&lt;/pre&gt;


&lt;p&gt;On change simplement la ligne&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;

RewriteRule ^/.* - [F]

&lt;/pre&gt;

&lt;p&gt;Par&amp;nbsp;:&lt;/p&gt;
&lt;pre&gt;

RewriteRule ^/.* /banni.html [L]

&lt;/pre&gt;


&lt;p&gt;Source: &lt;a href=&quot;http://httpd.apache.org/docs/2.0/misc/rewriteguide.html&quot; title=&quot;http://httpd.apache.org/docs/2.0/misc/rewriteguide.html&quot;&gt;http://httpd.apache.org/docs/2.0/mi...&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2008/01/28/Un-hostsdeny-pour-apache-2#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2008/01/28/Un-hostsdeny-pour-apache-2#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/25</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 : détecter si l'utilisateur a activé les cookies</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/02/11/Rails-vite-fait-%3A-detecter-si-lutilisateur-a-active-les-cookies</link>
    <guid isPermaLink="false">urn:md5:bd5836223c1dfe021d76480a64a3d4d1</guid>
    <pubDate>Sun, 11 Feb 2007 19:33:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;Rails utilise activement les cookies, notamment pour gérer les sessions (variable @session). Si l'utilisateur a désactivé les cookies dans son navigateur, on se retrouve alors face à de nombreux problèmes.
Pour y pallier, on se propose de forcer l'utilisateur à activer ses cookies.&lt;/p&gt;


&lt;p&gt;On définit une fonction de vérification dans son contrôleur&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

 def cookies_required
    if @request.cookies[&amp;quot;_session_id&amp;quot;].to_s == ''
      if @params[:cookies_enabled].nil?
        redirect_to :controller=&amp;gt;@params[:controller],
        :action=&amp;gt;@params[:action],
        :cookies_enabled=&amp;gt;&amp;quot;testing&amp;quot;
      else
        render :text=&amp;gt;&amp;quot;Vous devez activer les cookies pour utiliser ce site!&amp;quot;
      end
    end
  end

&lt;/pre&gt;


&lt;p&gt;Puis on l'applique avant chaque action grâce à before_filter&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

  before_filter :cookies_required

&lt;/pre&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/02/11/Rails-vite-fait-%3A-detecter-si-lutilisateur-a-active-les-cookies#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/02/11/Rails-vite-fait-%3A-detecter-si-lutilisateur-a-active-les-cookies#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/20</wfw:commentRss>
      </item>
    
  <item>
    <title>Rails vite fait : forcer https pour certaines pages</title>
    <link>http://jul.is.a.n0life.org/blog/post/2007/02/11/Rails-vite-fait-%3A-forcer-https-pour-certaines-pages</link>
    <guid isPermaLink="false">urn:md5:d779a86a3a265b46ce021ad64c5c6781</guid>
    <pubDate>Sun, 11 Feb 2007 19:23:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Ruby On Rails</category>    
    <description>    &lt;p&gt;On peut laisser à rails le soin de gérer le protocole de certaines pages. Par exemple une page d'identification. Pour se simplifier la tâche, on utilise le before_filter du contrôleur.
On commence par écrire notre fonction de redirection dans le contrôleur&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

 def redirect_to_ssl
    redirect_to :protocol =&amp;gt; &amp;quot;https://&amp;quot; unless (@request.ssl?)
  end

&lt;/pre&gt;


&lt;p&gt;Ensuite, on applique notre filtre aux pages que l'on veut&amp;nbsp;:&lt;/p&gt;

&lt;pre&gt;

 before_filter :redirect_to_ssl, :only=&amp;gt;[:login]

&lt;/pre&gt;


&lt;p&gt;Et voilà&amp;nbsp;: http://monsite.fr/controller/login se transformera en https://monsite.fr/controller/login.&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2007/02/11/Rails-vite-fait-%3A-forcer-https-pour-certaines-pages#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2007/02/11/Rails-vite-fait-%3A-forcer-https-pour-certaines-pages#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/19</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>Transformer un Iomega high-speed ethernet en véritable NAS</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/11/13/Transformer-un-Iomega-high-speed-ethernet-en-veritable-NAS</link>
    <guid isPermaLink="false">urn:md5:827fa5c5e2bbcdeb5694adf67abd7457</guid>
    <pubDate>Mon, 13 Nov 2006 01:35:00 +0100</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Embarqué</category><category>Hack</category><category>Systèmes et Réseaux</category>    
    <description>    J'ai acheté, il y a quelques temps déjà, un disque réseau Iomega bas de gamme. Plutôt pratique à première vue, il permet de charger son disque à travers samba ainsi que de modifier quelques options avec une interface de gestion html. &lt;br /&gt;&lt;br /&gt;Vu le prix de celui-ci, rien de bien extraordinaire. Pourtant un certain nombre de limitations m'empêchaient de profiter pleinement de l'engin.
Tout d'abord, pas de partage nfs, le partage samba c'est bien quand on a windows, mais sinon, pas de permissions. En plus aucun droit d'accès au disque: on y accède directement avec tous les droits de lecture/écriture sans mot de passe. Enfin Iomega ne supporte déjà plus ce disque (il n'est d'ailleurs même plus sur leur site) donc pas de nouveau firmware à esperer.
&lt;br /&gt;&lt;br /&gt;En cherchant un peu sur internet, j'ai découvert qu'en fait, la machine tournerait sous linux. En poursuivant mes recherches (démontage de l'appareil à l'appui), je découvre qu'en fait le système embarqué est bien un linux et qu'il s'agit d'une carte &lt;a href=&quot;http://developer.axis.com/products/etrax100lx/index.html&quot;&gt;Axis Etrax 100LX&lt;/a&gt;. Avec un CPU RISC 32bits à 100Mhz, 32 Mo de RAM et surtout un environnement de cross-compilation et un tas d'outils linux disponibles en téléchargement sur le site d'Axis!&lt;br /&gt;&lt;br /&gt;Problème: le truc de Iomega est totalement fermé. Pas d'accès autre que samba et l'interface de gestion, et aucun autre signe de configuration possible du linux à l'interieur. Un serveur ftp semble tourner dessus mais&amp;nbsp; impossible de s'y connecter car je ne dispose pas du mot de passe vu que Iomega semblerait garder ce ftp uniquement au cas ou ils voudraient permettre une mise à jour du firmware. En conclusion, j'ai acheté un système sur lequel je n'ai pas les droits d'accès !l&lt;br /&gt;&lt;br /&gt;Après avoir tourné le problème dans tous les sens, j'ai finalement trouvé une solution d'une effrayante simplicité.&lt;br /&gt;Sachant qu'il s'agit d'un linux qui fait tourner samba, je sais que samba suit les liens symboliques unix pour les présenter en dur une fois le disque monté : il me suffit donc de créer un lien symbolique vers / depuis le répertoire que je peux voir dans samba!&lt;br /&gt;Pour cela il faut démonter le disque et le remonter dans un PC (PATA), monter la bonne partition, ajouter le lien puis tout remettre comme avant (j'imagine que le fait de démonter le disque enlève la garantie, mais bon osef).&lt;br /&gt;&lt;br /&gt;Une fois le disque enlevé de sa boite, on le met dans un PC. Imaginons qu'on le monte en esclave, alors on le verra apparaître en hdb dans linux. On découvre qu'il y a deux partition. A prioris /dev/hdb1 est une petite partition de 6Mo ou le firmware se colle au démarrage. /dev/hdb2 contient nos données: c'est là où l'on mettra notre lien.&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;# mount /dev/hdb2 /tmp&lt;br /&gt;# cd /tmp&lt;br /&gt;# ln -s / Root&lt;br /&gt;# umount /tmp&lt;/pre&gt;&lt;br /&gt;Voila, ça c'est fait. On remonte le tout comme avant: on a maintenant accès à l'arborescence du système dans Root lorsque l'on monte le disque réseau avec samba.&lt;br /&gt;Tout cela est bien beau, mais on ne peut pas faire grand chose de plus pour l'instant. Le top serait d'avoir un ssh ou un telnet pour pouvoir éxécuter à souhait des trucs dessus (je vous laisse imaginer).&lt;br /&gt;&lt;br /&gt;Il faut savoir que le système en lui même est en lecture seulement. Seul le répertoire /etc est en lecture/écriture. C'est déjà pas mal! On va pouvoir installer un ssh et un nfs qui se lancent au démarrage. N'oublions pas que nous avons tout l'environement de cross-compilation à disposition !&lt;br /&gt;&lt;br /&gt;La première étape consisterait en un remplacement du /etc/passwd, avec un mot de passe root que l'on connait. Ainsi on pourait déjà accéder au ftp. &lt;br /&gt;&lt;br /&gt;Pour le reste, bon courage. :)&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mise à jour dotclear2</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/10/21/Mise-a-jour-dotclear2</link>
    <guid isPermaLink="false">urn:md5:3c947185061c658d86aa9f1ff76a7f1d</guid>
    <pubDate>Sat, 21 Oct 2006 10:47:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Général</category>    
    <description>    J'ai fini la migration typo 2.6 à dotclear2. Plusieurs raisons à ça:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;notre machine a du mal à supporter ruby avec ses 256Mo de ram, du coup, ralentissement pour tous mes colloc's&lt;/li&gt;
&lt;li&gt;dotclear2 est vraiment génial.&lt;/li&gt;
&lt;/ul&gt;
J'attends avec impatience de pouvoir me prendre une dedibox. Bien meilleurs rapport qualité/prix que notre solution actuelle.&lt;br /&gt;Enfin, j'en ai profité pour faire un nouveau thème à partir de celui par défaut de dotclear.&lt;br /&gt;Et c'est tout!&lt;br /&gt;&lt;br /&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/2006/10/21/Mise-a-jour-dotclear2#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/2006/10/21/Mise-a-jour-dotclear2#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/13</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>
    
  <item>
    <title>Passer une commande en tâche de fond</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/07/24/Passer-une-commande-en-tache-de-fond</link>
    <guid isPermaLink="false">urn:md5:4af4faac92c20f2de01878a77ba9a443</guid>
    <pubDate>Mon, 24 Jul 2006 15:33:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Linux</category><category>Systèmes et Réseaux</category><category>Unix</category>    
    <description>    &lt;p&gt;Quel désespoir de voir la commande qu’on a lancé à midi ne pas être terminée au moment de quitter le travail…
Heureusement unix est la pour nous éviter de faire des heures sup’!&lt;/p&gt;
&lt;p&gt;Disons que la commande est lancée depuis un terminal X par un shell ouvert en ssh  :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;julbouln@lesitedistant:~$ commande&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On commence par susprendre la tâche avec un &lt;span class=&quot;caps&quot;&gt;CTRL&lt;/span&gt;+Z :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;[1]+  Stopped      commande&lt;br /&gt;julbouln@lesitedistant:~$&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On passe celui-ci en tâche de fond :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;julbouln@lesitedistant:~$ bg&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Le problème à présent est que la commande est toujours associée au terminal, donc si on quitte le shell, la commande se termine.
Heureusement il existe une commande pour  la détacher du terminal :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;julbouln@lesitedistant:~$ disown&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et voila!
On peut à présent quitter en laissant la commande se terminer tranquillement.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Client Last.fm embarqué</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/06/19/Client-Lastfm-embarque</link>
    <guid isPermaLink="false">urn:md5:16895ca423243394b31cd1c7f3395e8a</guid>
    <pubDate>Mon, 19 Jun 2006 09:14:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Embarqué</category><category>Hack</category>    
    <description>    &lt;p&gt;Cela faisait longtemps que mon iPaq trainait sur mon bureau sans que je puisse y trouver une très grande utilité. L’espace étant très limité sur ce modèle (h3600), je ne pouvais pas y installer grand chose.&lt;/p&gt;
&lt;p&gt;C’est en utilisant &lt;a href=&quot;http://www.last.fm&quot;&gt;Last.fm&lt;/a&gt; que j’ai trouvé une application originale: le transformer en radio Last.fm portative.
En effet, la petite carte WiFi permettant à l’engin de se connecter à internet depuis n’importe quel hotspot.&lt;/p&gt;
&lt;p&gt;J’ai donc fouillé un peu sur internet pour voir s'il n’existait pas déjà un client Last.fm pour cette plateforme. En vain.
Pensant simplement porter le client officiel, je me suis rendu compte que &lt;a href=&quot;http://opie.handhelds.org&quot;&gt;Opie&lt;/a&gt; utilisait encore Qt3, alors que le client, la version 4.&lt;/p&gt;
&lt;p&gt;C’est alors que je suis tombé sur un projet intéressant, &lt;a href=&quot;http://lizer.syslinx.org/shell-fm/&quot;&gt;Shell.FM&lt;/a&gt;, celui ci propose un client Last.fm entièrement en ligne de commande. Pour le cas d’une application embarquée, c’est assez délicat de contrôler un programme en mode console avec un stylet et un clavier virtuel. J’ai donc décidé de reprendre les sources de Shell.FM pour en faire un client avec &lt;a href=&quot;http://gpe.handhelds.org&quot;&gt;GPE&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;Malgré plusieurs petits problèmes, je suis tout de même parvenu à &lt;a href=&quot;http://jul.is.a.n0life.org/pages/gpefm&quot;&gt;un resultat plutôt satisfaisant !&lt;/a&gt;&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Ajouter un script au démarrage de la Debian</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/06/14/Ajouter-un-script-au-demarrage-de-la-Debian</link>
    <guid isPermaLink="false">urn:md5:2bad42e2e8a8f255d3311098be5e3ebd</guid>
    <pubDate>Wed, 14 Jun 2006 10:09:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Debian</category><category>Linux</category><category>Systèmes et Réseaux</category>    
    <description>    &lt;p&gt;Il peut être pratique de rajouter un script personnalisé au démarrage.
Pour ce faire, la Debian propose un outil de haut niveau pour faciliter la tâche : &lt;em&gt;update-rc.d&lt;/em&gt;.&lt;/p&gt;
Tout d’abord, il vous faut créer un script que vous placerez dans &lt;em&gt;/etc/init.d&lt;/em&gt;. &lt;br /&gt;MAJ: Il existe un fichier /etc/init.d/skeleton qui peut servir de modèle (merci tito).&lt;br /&gt;Appelons le &lt;em&gt;/etc/init.d/monscript&lt;/em&gt; par exemple :
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;#!/bin/sh&lt;br /&gt;case &quot;$1&quot; in&lt;br /&gt;  start|&quot;&quot;) &lt;br /&gt;        # au démarrage&lt;br /&gt;        ;;&lt;br /&gt;  stop)   &lt;br /&gt;        # à l'arret&lt;br /&gt;        ;;&lt;br /&gt;  *)&lt;br /&gt;        echo &quot;Usage: monscript [start|stop]&quot; &amp;gt;&amp;amp;2&lt;br /&gt;        exit 3&lt;br /&gt;        ;;&lt;br /&gt;esac&lt;/code&gt;
&lt;/pre&gt;
&lt;p&gt;Notez le &lt;em&gt;case ”$1”&lt;/em&gt; qui recupère le premier argument de la commande. Si l’argument est &lt;em&gt;start&lt;/em&gt; ou qu’il n’y en a pas, alors on exécute ce qu’il y a au niveau de &lt;em&gt;# au démarrage&lt;/em&gt;. Si l’argument est &lt;em&gt;stop&lt;/em&gt;, ce qu’il y a au niveau de &lt;em&gt;# à l’arret&lt;/em&gt;&lt;/p&gt;
Rajoutez lui le mode exécutable :
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# chmod +x /etc/init.d/monscript&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
Vous pouvez à présent tester votre script directement depuis la console :
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# /etc/init.d/monscript stop&lt;br /&gt;# /etc/init.d/monscript start&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
Ensuite, afin qu’il se lance automatiquement au démarrage, il faut le rajouter aux runlevels. Pour cela, utilisez simplement la commande update-rc.d :
&lt;pre&gt;&lt;code&gt;&lt;br /&gt;# update-rc.d monscript defaults 99&lt;br /&gt;&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;em&gt;update-rc.d&lt;/em&gt; possède un certain nombre d’options, nous utilisons les plus simples dans cet exemple :&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;em&gt;monscript&lt;/em&gt; correspond au fichier bash &lt;em&gt;/etc/init.d/monscript&lt;/em&gt; que nous venons de créer&lt;/li&gt;
&lt;li&gt;&lt;em&gt;defaults&lt;/em&gt; permet de couvrir tous les runlevels&lt;/li&gt;
&lt;li&gt;&lt;em&gt;99&lt;/em&gt; est le niveau de priorité. 99 étant le plus faible et 1 le plus élevé. Le niveau de priorité correspondant à l’ordre lors du démarrage, les plus faibles étant exécutés en dernier.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Vous n’avez plus qu’à redémarrer pour essayer le tout!&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Application de Google Maps</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/05/18/Application-de-Google-Maps</link>
    <guid isPermaLink="false">urn:md5:4108b0381b15eb7b8c052b4ca24c2446</guid>
    <pubDate>Thu, 18 May 2006 06:28:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Google</category><category>Web 2.0</category>    
    <description>    &lt;p&gt;Google propose aux développeurs une &lt;a href=&quot;http://www.google.com/apis/maps/&quot;&gt;API&lt;/a&gt;
très pratique pour son &lt;a href=&quot;http://www.google.fr/maps&quot;&gt;Google Maps&lt;/a&gt; .
J’en ai fait une application pratique et professionnelle pour les &lt;a href=&quot;http://www.oreilly.fr&quot;&gt;éditions O’Reilly&lt;/a&gt; .&lt;/p&gt;
&lt;p&gt;L’idée était de permettre aux visiteurs et éventuels lecteurs de trouver rapidement et facilement les libraires ayant un livre donné autour de chez eux.&lt;/p&gt;
&lt;p&gt;Par exemple, les Nancéens pourront &lt;a href=&quot;http://www.oreilly.fr/divers/eorgm.php?loc=54000&amp;amp;isbn=2841774082&quot;&gt;facilement trouver VoIP à 200%&lt;/a&gt;
chez leurs libraires locaux!&lt;/p&gt;
&lt;p&gt;Ce système, utilisant notre base interne, propose une probabilité de la présence d’un livre chez un libraire.&lt;/p&gt;
&lt;p&gt;Le principal problème de l’API Google Maps et qu’il ne permet pas de &lt;a href=&quot;http://www.google.com/apis/maps/faq.html#faq11&quot;&gt;placer une position sur une carte directement à partir d’une adresse&lt;/a&gt; . Il faut donc déterminer par nos propres moyens les latitudes/longitudes des endroits que l’ont veut placer. Bien qu’il existe un outil pour &lt;a href=&quot;http://www.geocoder.us&quot;&gt;faire cela simplement&lt;/a&gt; quand il s’agit d’adresses américaines, c’est une autre paire de manches pour nous européens.&lt;/p&gt;
&lt;p&gt;Dans un premier temps, il nous a fallu déterminer les positions de chacun des libraires avec qui nous travaillons, puis
j’ai du convertir des positions des communes de &lt;a href=&quot;http://www.laposte.fr/sna/&quot;&gt;la Poste&lt;/a&gt; qui étaient dans le système de &lt;a href=&quot;http://fr.wikipedia.org/wiki/Projection_de_Lambert&quot;&gt;projection Lambert&lt;/a&gt;   II vers le système de Google (gws84).&lt;/p&gt;
&lt;p&gt;J’ai fait cette conversion relativement facilement grâce au logiciel open source &lt;a href=&quot;http://proj.maptools.org/&quot;&gt;Proj4&lt;/a&gt; . Vous comprendrez le “relativement” en voyant la commande qui permet cela:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;cs2cs -f '%.3f' +proj=lcc +lat_0=46.8 +lat_1=45.898918 +lat_2=47.696014 +lon_0=2.3372291 \ &lt;br /&gt;+k_0=0.99987742 +x_0=600000 +y_0=2200000 +a=6378249.2 +b=6356515 +ellps=clrk80 \ &lt;br /&gt;+towgs84=-168,-60,320,0,0,0,0 +to +proj=latlong +datum=WGS84 +ellps=WGS84 +no_defs -s&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Cette commande prennant les x,y des coordonnées Lambert II dans le pipe unix et retournant les coordonnées pour google.&lt;/p&gt;
&lt;p&gt;Un second problème et la compatibilité des navigateurs. Avec firefox, aucun problème, on peut coder comme on le sent. Pour ceux voulant permettre une compatibilité avec IE, il faudra y penser dès le départ et &lt;a href=&quot;http://www.mapki.com/index.php?title=FAQs#Browser_Problems&quot;&gt;adapter le code&lt;/a&gt; en conséquence.&lt;/p&gt;
&lt;p&gt;Pour le reste, l’API Google Maps reste simplissime d’utilisation et configurable au plus haut point: icones des points et des ombres personnalisées,
choix des contrôleurs dans l’interface ou encore récupération des événements de l’utilisateur.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Installer Windows après une Debian</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/04/30/Installer-Windows-apres-une-Debian</link>
    <guid isPermaLink="false">urn:md5:548ee3b5196c1b673ea278fb625df3ec</guid>
    <pubDate>Sun, 30 Apr 2006 08:37:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Debian</category><category>Linux</category><category>Systèmes et Réseaux</category>    
    <description>    &lt;p&gt;Il arrive parfois que l’on veuille installer un Windows sur une machine où Linux est déjà installé. Le problème est que Windows efface le chargeur multi-os pour se mettre à la place.&lt;/p&gt;
&lt;p&gt;Heureusement il existe une technique rapide et simple pour réinstaller le chargeur.&lt;/p&gt;
&lt;p&gt;Prenons un exemple,
vous avez un disque partionné comme suit:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;/dev/hda1 : ext3 monté en / contenant Linux&lt;br /&gt;/dev/hda2 : swap&lt;br /&gt;/dev/hda3 : ext3 monté en /home&lt;br /&gt;/dev/hda4 : ntfs ou vfat contenant Windows&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Après avoir installé Windows, le système sur /dev/hda4 est chargé automatiquement au démarrage. Pour y remédier, il suffit d’utiliser le cd d’installation de Debian (un cd netinstall suffit).&lt;/p&gt;
&lt;p&gt;Mettez le dans le lecteur et faites comme si vous alliez installer la Debian. Vous pouvez sélectionner les options de configuration pour votre clavier. Ensuite, basculez dans la deuxième console (ALT-F2) et tappez entrée pour avoir un prompt.&lt;/p&gt;
&lt;p&gt;A présent, il vous faut charger votre partition Linux:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;mount -t ext3 /dev/hda1 /tmp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Dans l’installeur Sarge, il semble que les fichiers de disque n’ont pas le même shéma, si vous ne trouvez pas de /dev/hda1, utilisez /dev/ide/host0/bus0/target0/lun0/part1 à la place.&lt;/p&gt;
&lt;p&gt;Pour utiliser les commandes de votre propre système :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;chroot /tmp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Réinstallez le chargeur multi-os :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;grub-install /dev/hda&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et voila, vous devriez avoir un message indiquant que tout c’est bien passé ! Quittez votre système :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;exit&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Démontez le disque :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;umount /tmp&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Et redémarrez :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;reboot&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Au redémarrage, vous allez avoir le même écran de démarrage qu’avant avoir installé Windows. Démarrez votre Linux, vous pouvez rajouter l’entrée Windows à la main dans /boot/grub/menu.lst :&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;title       Windows NT/2000/XP&lt;br /&gt;root        (hd0,3)&lt;br /&gt;makeactive&lt;br /&gt;chainloader +1&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;ou lancer un dpkg-reconfigure grub, ce qui devrait détecter et intégrer directement le nouveau système.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Mise à jour</title>
    <link>http://jul.is.a.n0life.org/blog/post/2006/04/06/Mise-a-jour</link>
    <guid isPermaLink="false">urn:md5:082c0ce941dc9e6381654f229680bfef</guid>
    <pubDate>Thu, 06 Apr 2006 18:36:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
        <category>Général</category>    
    <description>    &lt;p&gt;Bon voilà c’est fait. J’ai craqué pour un nouveau style. Codé par mes petites mains musclées et malgré les nombreuses critiques de tous ceux à qui j’ai demandé l’avis… J’avais envie de fun, de couleurs, de vie ! C’est le printemps ! Les oiseaux chantent, les pigeons roucoulent… Tout ça.&lt;/p&gt;
&lt;p&gt;A noter également la traduction “vite fait” de &lt;a href=&quot;http://typosphere.org/&quot;&gt;Typo&lt;/a&gt;. Allez les gars, pensez au reste du monde et faites nous un joli truc localisé!&lt;/p&gt;
&lt;p&gt;Et c’est tout.&lt;/p&gt;</description>
    
    
    
      </item>
    
  <item>
    <title>Last.fm GPE Player</title>
    <link>http://jul.is.a.n0life.org/blog/post/pages/gpefm</link>
    <guid isPermaLink="false">urn:md5:e3d69ee37836181fae934cf3ebb388ff</guid>
    <pubDate>Sat, 01 Apr 2006 20:52:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
            
    <description>    &lt;h2&gt;About&lt;/h2&gt;
&lt;p&gt;&lt;span class=&quot;caps&quot;&gt;GPE&lt;/span&gt;.FM is a mini &lt;a href=&quot;http://www.last.fm/&quot;&gt;Last.fm&lt;/a&gt; player designed for embedded device. It is a quick made small hack using &lt;a href=&quot;http://lizer.syslinx.org/shell-fm/&quot;&gt;Shell.FM&lt;/a&gt; sourcecode and
&lt;span class=&quot;caps&quot;&gt;GTK&lt;/span&gt;/GPE toolkit.&lt;/p&gt;
&lt;p&gt;Since everyone loves screenshots :&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://rashitoul.net/%7Ejulbouln/download/gpe-fm_sc.png&quot; alt=&quot;&quot; /&gt;&lt;/p&gt;
&lt;hr /&gt;
&lt;h2&gt;Dependencies&lt;/h2&gt;
To use it, you need:
&lt;ul&gt;&lt;li&gt;&lt;a href=&quot;http://www.last.fm/&quot;&gt;Last.fm&lt;/a&gt; account&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://gpe.handhelds.org/&quot;&gt;GPE&lt;/a&gt; environment&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.underbit.com/products/mad/&quot;&gt;madplay&lt;/a&gt; mpeg player&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://www.openssl.org/&quot;&gt;openssl&lt;/a&gt; crypto library&lt;/li&gt;
&lt;/ul&gt;
&lt;hr /&gt;
&lt;h2&gt;Download&lt;/h2&gt;
&lt;p&gt;You can either download the &lt;a href=&quot;http://rashitoul.net/%7Ejulbouln/download/gpe-fm.tar.gz&quot;&gt;source code&lt;/a&gt; or the &lt;a href=&quot;http://rashitoul.net/%7Ejulbouln/download/gpe-fm_arm.tgz&quot;&gt;pre-compiled binary&lt;/a&gt; for &lt;span class=&quot;caps&quot;&gt;ARM&lt;/span&gt; familiar distribution .&lt;/p&gt;</description>
    
    
    
          <comments>http://jul.is.a.n0life.org/blog/post/pages/gpefm#comment-form</comments>
      <wfw:comment>http://jul.is.a.n0life.org/blog/post/pages/gpefm#comment-form</wfw:comment>
      <wfw:commentRss>http://jul.is.a.n0life.org/blog/feed/rss2/comments/12</wfw:commentRss>
      </item>
    
  <item>
    <title>À propos</title>
    <link>http://jul.is.a.n0life.org/blog/post/pages/apropos</link>
    <guid isPermaLink="false">urn:md5:65f4717d525a25cb3a69a8df3b4fdb4d</guid>
    <pubDate>Sat, 01 Apr 2006 20:33:00 +0200</pubDate>
    <dc:creator>jul</dc:creator>
            
    <description>    &lt;img alt=&quot;&quot; src=&quot;http://rashitoul.net/%7Ejulbouln/images/avatar1.png&quot; /&gt;&lt;br /&gt;    Julien Boulnois, 26 ans, actuellement administrateur système et réseau chez les &lt;a href=&quot;http://www.oreilly.fr&quot; hreflang=&quot;fr&quot; title=&quot;Editions O'Reilly&quot;&gt;Editions O'Reilly&lt;/a&gt;. Je suis spécialisé dans le domaine de l'open source.
Plus qu'un metier, l'informatique est pour moi une passion depuis plus de 10 ans. Je m'intéresse à beaucoup de domaines qui touchent de près ou de loin aux nouvelles technologies. Systèmes et réseaux, programmation ou multimédia, je suis un technophile averti et un geek.
Mon domaine de prédilection reste néammoins l'open source que je pratique aussi bien pour mon utilisation personnelle que professionnelle depuis de nombreuses années.
Vous pouvez récupérer mon &lt;a href=&quot;http://rashitoul.net/~julbouln/download/cv4.pdf&quot; hreflang=&quot;fr&quot; title=&quot;CV&quot;&gt;CV&lt;/a&gt;   et me &lt;a href=&quot;http://jul.is.a.n0life.org/blog/post/pages/mailto:julboulnATrashitoul.net&quot; hreflang=&quot;fr&quot; title=&quot;contacter&quot;&gt;contacter&lt;/a&gt;.</description>
    
    
    
      </item>
    
</channel>
</rss>
