<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>jbbarth's corner</title>
    <link></link>
    <language>en</language>
    <webMaster>jeanbaptiste.barth*AT*gmail*DOT*com (jbbarth)</webMaster>
    <copyright>Copyright 2010</copyright>
    <ttl>60</ttl>
    <pubDate>Thu, 04 Mar 2010 17:28:00 GMT</pubDate>
    <description></description>
    <item>
      <title>Partie 1 : le retour de la vengeance</title>
      <link>/archives/2010/3/4/partie_le_retour_de_la/</link>
      <pubDate>Thu, 04 Mar 2010 11:20:00 GMT</pubDate>
      <guid>/archives/2010/3/4/partie_le_retour_de_la/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;Que j&amp;#8217;aurais pu aussi sobrement appeler :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;refaisons le match&lt;/li&gt;
	&lt;li&gt;massacre &amp;agrave; la tron&amp;ccedil;onneuse&lt;/li&gt;
	&lt;li&gt;f*ck&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;find&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;yaml&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;digest/md5&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;EvaFile&lt;/span&gt;
  attr_accessor &lt;span class=&quot;sy&quot;&gt;:path&lt;/span&gt;

  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(path)
    &lt;span class=&quot;iv&quot;&gt;@path&lt;/span&gt; = path
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;infos&lt;/span&gt;
    &lt;span class=&quot;iv&quot;&gt;@infos&lt;/span&gt; ||= {&lt;span class=&quot;sy&quot;&gt;:size&lt;/span&gt; =&amp;gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.size(&lt;span class=&quot;iv&quot;&gt;@path&lt;/span&gt;).tap{|s| &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; s.to_s; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;&lt;span class=&quot;pc&quot;&gt;self&lt;/span&gt;.dup&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;; &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt; },
                &lt;span class=&quot;sy&quot;&gt;:last_modified&lt;/span&gt; =&amp;gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.mtime(&lt;span class=&quot;iv&quot;&gt;@path&lt;/span&gt;),
                &lt;span class=&quot;sy&quot;&gt;:md5_sum&lt;/span&gt; =&amp;gt; &lt;span class=&quot;co&quot;&gt;Digest&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;MD5&lt;/span&gt;.hexdigest(&lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.read(&lt;span class=&quot;iv&quot;&gt;@path&lt;/span&gt;))}
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;EvaDir&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(subdir)
    raise &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Give me a (sub)directory !&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; subdir.nil? || !&lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.directory?(subdir)
    &lt;span class=&quot;iv&quot;&gt;@subdir&lt;/span&gt; = subdir
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;files&lt;/span&gt;
    &lt;span class=&quot;iv&quot;&gt;@files&lt;/span&gt; ||= &lt;span class=&quot;co&quot;&gt;Find&lt;/span&gt;.find(&lt;span class=&quot;iv&quot;&gt;@subdir&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |f|
                 &lt;span class=&quot;co&quot;&gt;Find&lt;/span&gt;.prune &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.directory?(f)
                 &lt;span class=&quot;co&quot;&gt;EvaFile&lt;/span&gt;.new(f) &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.file?(f)
               &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;.compact
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;write_info_file&lt;/span&gt;(filename)
    path = &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.join(&lt;span class=&quot;iv&quot;&gt;@subdir&lt;/span&gt;,filename)
    &lt;span class=&quot;r&quot;&gt;begin&lt;/span&gt;
      info = &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.open(path,&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
    &lt;span class=&quot;r&quot;&gt;rescue&lt;/span&gt;
      &lt;span class=&quot;gv&quot;&gt;$stderr&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Error opening file &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;path&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; for writing...&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
    info.write &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Size: &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;size&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    info.write &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Files: &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;nb_files&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    files_hash = {}
    files.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |file|
      files_hash.merge!(&lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.basename(file.path) =&amp;gt; file.infos)
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
    info.write files_hash.to_yaml
    info.close_write
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;size&lt;/span&gt;
    &lt;span class=&quot;iv&quot;&gt;@size&lt;/span&gt; = files.inject(&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |memo, f|
              memo + f.infos[&lt;span class=&quot;sy&quot;&gt;:size&lt;/span&gt;]
            &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;nb_files&lt;/span&gt;
    files.length
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;EvaUtil&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;(dir)
    raise &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Give me a directory !&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; dir.nil? || !&lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.directory?(dir)
    &lt;span class=&quot;iv&quot;&gt;@dir&lt;/span&gt; = dir
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;subdirs&lt;/span&gt;
    &lt;span class=&quot;r&quot;&gt;return&lt;/span&gt; &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt;
    &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt; = [ &lt;span class=&quot;co&quot;&gt;EvaDir&lt;/span&gt;.new(&lt;span class=&quot;iv&quot;&gt;@dir&lt;/span&gt;) ]
    &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt; &amp;lt;&amp;lt; &lt;span class=&quot;co&quot;&gt;Find&lt;/span&gt;.find(&lt;span class=&quot;iv&quot;&gt;@dir&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |f|
                  &lt;span class=&quot;co&quot;&gt;EvaDir&lt;/span&gt;.new(f) &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.directory?(f)
                &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt; = &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt;.compact.uniq
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;generate_info_files&lt;/span&gt;(filename=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;infos.txt&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
    &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt;.each &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |s|
      s.write_info_file(filename)
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;generate_meta_info_file&lt;/span&gt;(filename=&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;metainfos.txt&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
    path = &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.join(&lt;span class=&quot;iv&quot;&gt;@dir&lt;/span&gt;,filename)
    &lt;span class=&quot;r&quot;&gt;begin&lt;/span&gt;
      meta = &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.open(path,&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;w&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
    &lt;span class=&quot;r&quot;&gt;rescue&lt;/span&gt;
      &lt;span class=&quot;gv&quot;&gt;$stderr&lt;/span&gt;.puts &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Error opening file &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;path&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; for writing...&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
    meta.write &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Total size: &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;size&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; bytes&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    meta.write &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Total number of files: &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;nb_files&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
    meta.write &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;Last modified (&amp;lt;24h) :&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt; &lt;/span&gt;&lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;#{&lt;/span&gt;last_modified.join(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;ch&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;  &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)&lt;span class=&quot;idl&quot;&gt;}&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt; &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; last_modified.any?
    meta.close_write
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;last_modified&lt;/span&gt;
    &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt;.inject([]) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |memo, subdir|
      memo &amp;lt;&amp;lt; subdir.files.select{|f| &lt;span class=&quot;co&quot;&gt;File&lt;/span&gt;.mtime(f) &amp;lt; &lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.at(&lt;span class=&quot;co&quot;&gt;Time&lt;/span&gt;.now.to_i - &lt;span class=&quot;i&quot;&gt;86400&lt;/span&gt;)}.map(&amp;amp;&lt;span class=&quot;sy&quot;&gt;:path&lt;/span&gt;)
      memo.flatten
      memo
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

  private
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;method_missing&lt;/span&gt;(symbol, *args)
    &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;%w(&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;nb_files size&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;)&lt;/span&gt;&lt;/span&gt;.include?(symbol.to_s)
      &lt;span class=&quot;iv&quot;&gt;@subdirs&lt;/span&gt;.inject(&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |memo, subdir|
         memo + subdir.send(symbol)
      &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;r&quot;&gt;else&lt;/span&gt;
      &lt;span class=&quot;r&quot;&gt;super&lt;/span&gt;
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

e = &lt;span class=&quot;co&quot;&gt;EvaUtil&lt;/span&gt;.new(&lt;span class=&quot;pc&quot;&gt;ARGV&lt;/span&gt;[&lt;span class=&quot;i&quot;&gt;0&lt;/span&gt;])
e.generate_info_files
e.generate_meta_info_file&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Garanti 100% non test&amp;eacute;, 100% fait sans l&amp;#8217;API, &lt;strong&gt;et surtout 100% fait avec un &amp;eacute;diteur de texte&lt;/strong&gt;. C&amp;#8217;est s&amp;ucirc;rement bourr&amp;eacute; de conneries, mais au moins avec un truc comme &amp;ccedil;a j&amp;#8217;aurais pas eu honte. Cela dit vue la longueur, je commence &amp;agrave; me pardonner d&amp;#8217;avoir barbouill&amp;eacute; ma copie de blanco, c&amp;#8217;&amp;eacute;tait infaisable sans &amp;ccedil;a. Coder sur papier est d&amp;eacute;finitivement un cauchemard. On se la refait dans 2 ans ;-)&lt;/p&gt;</description>
      <category domain="/archives/tags/mylife">mylife</category>
      <category domain="/archives/tags/ruby">ruby</category>
      <category domain="/archives/tags/tech">tech</category>
      <category domain="/archives/tags/thoughts">thoughts</category>
    </item>
    <item>
      <title>Un shell en ruby ?</title>
      <link>/archives/2010/2/25/un_shell_en_ruby/</link>
      <pubDate>Thu, 25 Feb 2010 20:00:00 GMT</pubDate>
      <guid>/archives/2010/2/25/un_shell_en_ruby/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;Dans 4 jours, je vais &lt;del&gt;me faire massacrer&lt;/del&gt; tenter un examen interne au boulot, cens&amp;eacute; valider mes aptitudes de &lt;em&gt;&amp;#8220;programmeur syst&amp;egrave;me&amp;#8221;&lt;/em&gt;. Cet examen comporte une &amp;eacute;preuve de d&amp;eacute;veloppement (sur papier, faut pas d&amp;eacute;conner), que la plupart des gens vont passer en Java ou C/C++. Mais tr&amp;egrave;s peu pour moi, j&amp;#8217;attaque en Ruby !&lt;/p&gt;
&lt;p&gt;Je lis donc des bouquins, qui pr&amp;eacute;sentent un squelette de shell en C. Et en Ruby ? Eh bien en fait, contre toute attente, c&amp;#8217;est super simple, voici un squelette fonctionnel :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;c&quot;&gt;#!/usr/bin/ruby&lt;/span&gt;

require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;readline&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;
require &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;open3&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;

&lt;span class=&quot;r&quot;&gt;class&lt;/span&gt; &lt;span class=&quot;cl&quot;&gt;Rshell&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;def&lt;/span&gt; &lt;span class=&quot;fu&quot;&gt;initialize&lt;/span&gt;
    loop &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt;
      cmd = &lt;span class=&quot;co&quot;&gt;Readline&lt;/span&gt;.readline(&lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;$ &lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;)
      exit &lt;span class=&quot;r&quot;&gt;if&lt;/span&gt; cmd.nil? &lt;span class=&quot;r&quot;&gt;or&lt;/span&gt; cmd == &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;exit&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;&amp;quot;&lt;/span&gt;&lt;/span&gt;
      &lt;span class=&quot;co&quot;&gt;Open3&lt;/span&gt;.popen3(cmd) &lt;span class=&quot;r&quot;&gt;do&lt;/span&gt; |stdin,stdout,stderr|
        &lt;span class=&quot;co&quot;&gt;STDOUT&lt;/span&gt;.print stdout.read
        &lt;span class=&quot;co&quot;&gt;STDERR&lt;/span&gt;.print stderr.read
      &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
    &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
  &lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;
&lt;span class=&quot;r&quot;&gt;end&lt;/span&gt;

&lt;span class=&quot;co&quot;&gt;Rshell&lt;/span&gt;.new&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Il ne faut pas s&amp;#8217;attendre &amp;agrave; des miracles, aucun builtin, pas de gestion du &lt;span class=&quot;caps&quot;&gt;PATH&lt;/span&gt;, mais on peut passer des commandes, diff&amp;eacute;rencier &amp;eacute;ventuellement &lt;span class=&quot;caps&quot;&gt;STDOUT&lt;/span&gt;/&lt;span class=&quot;caps&quot;&gt;STDERR&lt;/span&gt; pour le futur.&lt;/p&gt;
&lt;p&gt;Ca me donne l&amp;#8217;occasion de parler d&amp;#8217;un &lt;strong&gt;vrai&lt;/strong&gt; shell en Ruby, utilis&amp;eacute; chez Heroku, &lt;a href=&quot;http://adamblog.heroku.com/past/2008/2/19/rush_the_ruby_shell/&quot;&gt;Rush&lt;/a&gt;. J&amp;#8217;en reparlerai d&amp;egrave;s que j&amp;#8217;aurai test&amp;eacute; &amp;ccedil;a au quotidien au boulot :)&lt;/p&gt;</description>
      <category domain="/archives/tags/ruby">ruby</category>
      <category domain="/archives/tags/sysadmin">sysadmin</category>
      <category domain="/archives/tags/tech">tech</category>
    </item>
    <item>
      <title>Redmine Plugins #1 : Ajouter une option vrai/faux &#224; un plugin Redmine</title>
      <link>/archives/2010/2/20/redmine_plugins_ajouter_une_option/</link>
      <pubDate>Sat, 20 Feb 2010 16:42:00 GMT</pubDate>
      <guid>/archives/2010/2/20/redmine_plugins_ajouter_une_option/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;Je travaille en ce moment sur des plugins Engines pour &lt;a href=&quot;http://www.redmine.org/&quot;&gt;Redmine&lt;/a&gt;. Ces plugins me serviront au boulot, et permettront de laisser une situation un peu plus propre que les bidouillages actuels &amp;agrave; mon d&amp;eacute;part. En particulier en avan&amp;ccedil;ant sur le plugin de gestion d&amp;#8217;un datacenter (&lt;a href=&quot;http://code.jbbarth.com/projects/redmine-datacenter/wiki&quot;&gt;site&lt;/a&gt; et &lt;a href=&quot;http://github.com/jbbarth/redmine_datacenter.git&quot;&gt;d&amp;eacute;p&amp;ocirc;t github&lt;/a&gt;), j&amp;#8217;apprends &amp;eacute;norm&amp;eacute;ment de choses sur le fonctionnement de Rails/Redmine/Engines, et j&amp;#8217;entame donc une s&amp;eacute;rie d&amp;#8217;articles sur ces d&amp;eacute;couvertes. Ces articles supposent d&amp;#8217;avoir d&amp;eacute;j&amp;agrave; lu &lt;a href=&quot;http://www.redmine.org/wiki/redmine/Plugin_Tutorial&quot;&gt;le tutoriel du site&lt;/a&gt;, et je repartirai souvent de cet exemple.&lt;/p&gt;
&lt;p&gt;Cela donnera certainement lieu &amp;agrave; des entr&amp;eacute;es dans le wiki redmine.org ou des suggestions dans les tickets. Et puis &amp;ccedil;a m&amp;#8217;astreindra &amp;agrave; publier un peu, comme le fait &lt;a href=&quot;http://theadmin.org/&quot;&gt;Eric&lt;/a&gt; dans ses Daily Refactor du core Redmine &lt;a href=&quot;http://theadmin.org/articles/2010/01/25/daily-refactor-extract-method-in-the-bulk-time-entries-controller/&quot;&gt;depuis 3 semaines et pour les m&amp;ecirc;mes raisons&lt;/a&gt;, et aussi suite &amp;agrave; &lt;a href=&quot;http://www.dmathieu.com/&quot;&gt;cet article&lt;/a&gt; de Damien.&lt;/p&gt;
&lt;p&gt;Allons-y.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;init.rb&lt;/strong&gt; : on y ajoute la cl&amp;eacute; et la valeur par d&amp;eacute;faut du param&amp;egrave;tre qu&amp;#8217;on veut introduire, par exemple ici &amp;#8220;boolean_parameter&amp;#8221;. On pr&amp;eacute;cise &amp;eacute;galement un &lt;em&gt;partial&lt;/em&gt; qui permettra de g&amp;eacute;rer les param&amp;egrave;tres du plugin  :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;  settings &lt;span class=&quot;sy&quot;&gt;:default&lt;/span&gt; =&amp;gt; { &lt;span class=&quot;sy&quot;&gt;:boolean_parameter&lt;/span&gt; =&amp;gt; &lt;span class=&quot;pc&quot;&gt;true&lt;/span&gt; },
           &lt;span class=&quot;sy&quot;&gt;:partial&lt;/span&gt; =&amp;gt; &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;settings/my_plugin&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;app/views/settings/_my_plugin.html.erb&lt;/strong&gt; : on place ici un formulaire pour g&amp;eacute;rer nos param&amp;egrave;tres. Il sera automatiquement accessible dans la partie Administration &amp;gt; Plugins &amp;gt; lien &amp;#8220;Configurer&amp;#8221; sur votre plugin. &amp;#8220;plugin_my_plugin&amp;#8221; est &amp;agrave; remplacer dans ce qui suit par &amp;#8220;plugin_[nom de votre plugin]&amp;#8221; :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;ta&quot;&gt;&amp;lt;p&amp;gt;&lt;/span&gt;
  &lt;span class=&quot;ta&quot;&gt;&amp;lt;label&amp;gt;&lt;/span&gt;Param&amp;egrave;tre bool&amp;eacute;en&lt;span class=&quot;ta&quot;&gt;&amp;lt;/label&amp;gt;&lt;/span&gt; 
  &lt;span class=&quot;il&quot;&gt;&lt;span class=&quot;idl&quot;&gt;&amp;lt;%=&lt;/span&gt; check_box_tag &lt;span class=&quot;s&quot;&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;span class=&quot;k&quot;&gt;settings[boolean_parameter]&lt;/span&gt;&lt;span class=&quot;dl&quot;&gt;'&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;i&quot;&gt;1&lt;/span&gt;,
                    &lt;span class=&quot;co&quot;&gt;Setting&lt;/span&gt;[&lt;span class=&quot;sy&quot;&gt;:plugin_my_plugin&lt;/span&gt;][&lt;span class=&quot;sy&quot;&gt;:boolean_parameter&lt;/span&gt;] &lt;span class=&quot;idl&quot;&gt;%&amp;gt;&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;ta&quot;&gt;&amp;lt;/p&amp;gt;&lt;/span&gt;&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Et voil&amp;agrave; ! Ensuite, n&amp;#8217;importe o&amp;ugrave; dans votre plugin, vous pourrez utiliser :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;Setting&lt;/span&gt;[&lt;span class=&quot;sy&quot;&gt;:plugin_my_plugin&lt;/span&gt;][&lt;span class=&quot;sy&quot;&gt;:boolean_parameter&lt;/span&gt;]&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;En r&amp;eacute;alit&amp;eacute; en mettant &amp;#8220;1&amp;#8221; comme deuxi&amp;egrave;me param&amp;egrave;tre, vous ne stockerez pas un bool&amp;eacute;en, mais &amp;#8220;1&amp;#8221; (coch&amp;eacute;) ou &amp;#8220;nil&amp;#8221; (d&amp;eacute;coch&amp;eacute;). Si vous souhaitez obtenir &amp;#8220;true&amp;#8221; ou &amp;#8220;false&amp;#8221; absolument, vous pouvez utiliser :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;!!&lt;span class=&quot;co&quot;&gt;Setting&lt;/span&gt;[&lt;span class=&quot;sy&quot;&gt;:plugin_my_plugin&lt;/span&gt;][&lt;span class=&quot;sy&quot;&gt;:boolean_parameter&lt;/span&gt;]&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;A voir en vrai &lt;a href=&quot;http://github.com/jbbarth/redmine_datacenter/commit/fb0496504cb9a73ed080f27aed0930054dd815ec&quot;&gt;ici&lt;/a&gt;&lt;/p&gt;</description>
      <category domain="/archives/tags/plugins">plugins</category>
      <category domain="/archives/tags/rails">rails</category>
      <category domain="/archives/tags/redmine">redmine</category>
      <category domain="/archives/tags/ruby">ruby</category>
      <category domain="/archives/tags/tech">tech</category>
    </item>
    <item>
      <title>Hello CouchDB</title>
      <link>/archives/2010/2/8/hello_couchdb/</link>
      <pubDate>Mon, 08 Feb 2010 19:47:00 GMT</pubDate>
      <guid>/archives/2010/2/8/hello_couchdb/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;On me titille de part et d&amp;#8217;autre : Nicolas, Linux Mag (deux fois en 6 mois!), &lt;a href=&quot;http://www.dmathieu.com/2009/11/24/couchdb-et-ruby-couchrest/&quot;&gt;Damien&lt;/a&gt; et &lt;a href=&quot;http://www.dmathieu.com/2009/12/02/couchdb-et-requetes-avancees-les-vues/&quot;&gt;Damien&lt;/a&gt;, et des discussions par-ci par-l&amp;agrave;.&lt;/p&gt;
&lt;p&gt;Donc c&amp;#8217;est parti, j&amp;#8217;essaie de me faire une appli sur CouchDB. Avec plein d&amp;#8217;arri&amp;egrave;re pens&amp;eacute;es :&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;mieux maitriser l&amp;#8217;outil et les concepts sous-jacents pour mieux comprendre (et pourquoi pas contribuer &amp;agrave;) &lt;a href=&quot;http://wiki.opscode.com/display/chef/Home&quot;&gt;Chef&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;comparer &amp;ccedil;a &amp;agrave; MongoDB (voir le &lt;a href=&quot;http://railscasts.com/episodes/194-mongodb-and-mongomapper&quot;&gt;railscast&lt;/a&gt;) ; si je bute trop, j&amp;#8217;essaierai peut-&amp;ecirc;tre Mongo&lt;/li&gt;
	&lt;li&gt;en finir avec le gouffre conceptuel objet/relationnel ; j&amp;#8217;esp&amp;egrave;re que &amp;ccedil;a sera concluant de ce c&amp;ocirc;t&amp;eacute; :)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Je me fais une petite base de connaissances parce que le besoin commence &amp;agrave; &amp;ecirc;tre vraiment trop criant. J&amp;#8217;ai des tonnes d&amp;#8217;items non-lus et/ou &amp;agrave; garder dans mon reader &lt;span class=&quot;caps&quot;&gt;RSS&lt;/span&gt;, et j&amp;#8217;ai vraiment besoin d&amp;#8217;un outil pour organiser &amp;ccedil;a sous forme de tags (et si possible garder des copies locales des articles).&lt;/p&gt;
&lt;p&gt;Pour simplifier le tout, je commence &amp;agrave; partir sur du Rails 3 :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;echo 'gem &amp;quot;couchrest&amp;quot;' &amp;gt;&amp;gt; Gemfile
bundle install&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Des nouvelles dans les prochaines semaines, le projet sera comme d&amp;#8217;hab&amp;#8217; &lt;a href=&quot;http://github.com/jbbarth/&quot;&gt;sur github&lt;/a&gt;&lt;/p&gt;</description>
      <category domain="/archives/tags/couchdb">couchdb</category>
      <category domain="/archives/tags/rails">rails</category>
      <category domain="/archives/tags/ruby">ruby</category>
      <category domain="/archives/tags/tech">tech</category>
    </item>
    <item>
      <title>Rails 3.0 beta is out !</title>
      <link>/archives/2010/2/7/rails_beta_is_out/</link>
      <pubDate>Sun, 07 Feb 2010 21:22:00 GMT</pubDate>
      <guid>/archives/2010/2/7/rails_beta_is_out/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;&lt;a href=&quot;http://weblog.rubyonrails.org/2010/2/5/rails-3-0-beta-release&quot;&gt;Here&lt;/a&gt; we go :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;gem install tzinfo builder memcache-client rack rack-test rack-mount erubis mail text-format thor bundler i18n
gem install rails --pre&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Let&amp;#8217;s give it a try ;)&lt;/p&gt;</description>
      <category domain="/archives/tags/rails">rails</category>
      <category domain="/archives/tags/ruby">ruby</category>
      <category domain="/archives/tags/tech">tech</category>
    </item>
    <item>
      <title>Pense-b&#234;te sur l'utilisation de LUKS</title>
      <link>/archives/2010/1/4/pensebte_sur_lutilisation_de_luks/</link>
      <pubDate>Mon, 04 Jan 2010 18:42:00 GMT</pubDate>
      <guid>/archives/2010/1/4/pensebte_sur_lutilisation_de_luks/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;Voir &lt;a href=&quot;http://doc.ubuntu-fr.org/cryptsetup&quot;&gt;la doc Ubuntu&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Cr&amp;eacute;er un volume encrypt&amp;eacute; :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;sudo cryptsetup luksFormat -c aes -h sha256 /dev/sdb&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ajouter une cl&amp;eacute; :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;sudo cryptsetup luksAddKey /dev/sdb&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Voir les cl&amp;eacute;s :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;sudo cryptsetup luksDump /dev/sdb&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;Ouverture et formatage manuel :&lt;/p&gt;
&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;sudo cryptsetup luksOpen /dev/sdb disk
sudo mkfs.ext3 /dev/mapper/disk&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;</description>
      <category domain="/archives/tags/luks">luks</category>
      <category domain="/archives/tags/tech">tech</category>
      <category domain="/archives/tags/ubuntu">ubuntu</category>
    </item>
    <item>
      <title>Fous ta cagoule</title>
      <link>/archives/2009/12/23/fous_ta_cagoule/</link>
      <pubDate>Wed, 23 Dec 2009 09:54:00 GMT</pubDate>
      <guid>/archives/2009/12/23/fous_ta_cagoule/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;Je regarde une rediffusion de l&amp;#8217;intervention d&amp;#8217;Elisabeth Badinter devant la mission d&amp;#8217;information sur le port de la burqa. Elle est clairement contre, et elle avance des arguments int&amp;eacute;ressants en faveur d&amp;#8217;une &amp;#8220;interdiction&amp;#8221; (pas forc&amp;eacute;ment contraignante r&amp;eacute;glementairement ?). En particulier elle commence par discuter la libert&amp;eacute; de se v&amp;ecirc;tir, en argumentant le fait &amp;#8220;qu&amp;#8217;il n&amp;#8217;y a pas de v&amp;ecirc;tement du visage&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Une phrase hors discours m&amp;#8217;a interpell&amp;eacute; lorsqu&amp;#8217;elle &amp;eacute;voquait la question du port du voile &amp;#8220;pour se cacher des regards impurs d&amp;#8217;autres hommes&amp;#8221; :&lt;br /&gt;
&lt;em&gt;Entre vous et moi, dr&amp;ocirc;le de vision des choses de penser que tous les hommes qui regardent une femme ne r&amp;ecirc;vent que de la violer&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;Pom pom pom. Non ?&lt;/p&gt;
&lt;p&gt;Enfin, comme elle le dit bien (et &amp;ccedil;a serait cool qu&amp;#8217;un ou deux politiques se mettent au diapason), elle n&amp;#8217;est pas sp&amp;eacute;cialiste de l&amp;#8217;Islam, ni sp&amp;eacute;cialiste des lois ou de la politique, la question reste donc enti&amp;egrave;re. On va voir &amp;agrave; quel point l&amp;#8217;UMP devient un parti populiste :-)&lt;/p&gt;</description>
      <category domain="/archives/tags/actu">actu</category>
      <category domain="/archives/tags/thoughts">thoughts</category>
    </item>
    <item>
      <title>Vroum</title>
      <link>/archives/2009/12/22/vroum/</link>
      <pubDate>Tue, 22 Dec 2009 20:13:00 GMT</pubDate>
      <guid>/archives/2009/12/22/vroum/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p&gt;Tristan Nitot a fait un billet qui m&amp;#8217;a beaucoup int&amp;eacute;ress&amp;eacute; hier, &lt;a href=&quot;http://standblog.org/blog/post/2009/12/21/Quelques-notes-sur-la-culture-et-Internet&quot;&gt;Quelques notes sur la culture et Internet&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;D&amp;eacute;j&amp;agrave; &amp;ccedil;a fait des pistes de r&amp;eacute;flexion pour imaginer ce que sera la soci&amp;eacute;t&amp;eacute; de demain. On va nettement plus loin que les b&amp;ecirc;tises du gouvernement actuel (Christine is watching you :-)). Notamment sur le paradoxe de la disparition de la raret&amp;eacute; avec Internet : toute l&amp;#8217;&amp;eacute;contomie actuelle repose sur le fait que les produits sont &amp;#8220;rares&amp;#8221; : si je m&amp;#8217;ach&amp;egrave;te un CD, je paye toute une ribambelle de parasites (ce n&amp;#8217;est pas p&amp;eacute;joratif dans cette phrase) qui ont packag&amp;eacute;, transport&amp;eacute;, mis en rayon, etc. la musique que je veux &amp;eacute;couter au final. C&amp;#8217;est l&amp;agrave; que l&amp;#8217;informatique arrive : le transport, la duplication, voire la pub sont quasi gratuites. Comment b&amp;acirc;tir une &amp;eacute;conomie l&amp;agrave;-dessus ? Et comment les non-parasites (les cr&amp;eacute;ateurs pour la musique) peuvent vivre dans un tel mod&amp;egrave;le ? Le sujet m&amp;eacute;rite qu&amp;#8217;on y r&amp;eacute;fl&amp;eacute;chisse en tout cas :)&lt;/p&gt;
&lt;p&gt;Ensuite, &amp;agrave; titre professionnel, je ne suis jamais aussi content que lorsque j&amp;#8217;utilise de jolis outils libres, voire que je les adapte &amp;agrave; mes besoins (&lt;a href=&quot;http://www.redmine.org/&quot;&gt;redmine&lt;/a&gt; et &lt;a href=&quot;http://www.nagios.org/&quot;&gt;nagios&lt;/a&gt; sont de parfaits exemples du genre d&amp;#8217;errements que je peux avoir au boulot). A titre personnel, je d&amp;eacute;veloppe un peu sur mon temps libre (voir &lt;a href=&quot;http://github.com/jbbarth&quot;&gt;mon espace sur Github&lt;/a&gt;), je n&amp;#8217;utilise que des PCs sous des syst&amp;egrave;mes libres (ce n&amp;#8217;est pas vrai pour mon t&amp;eacute;l&amp;eacute;phone j&amp;#8217;admets) et j&amp;#8217;&amp;eacute;vang&amp;eacute;lise &amp;agrave; l&amp;#8217;occasion autour de moi. Bref, je baigne dans cette communaut&amp;eacute;.&lt;/p&gt;
&lt;p&gt;L&amp;#8217;article de Tristan met un peu en lumi&amp;egrave;re le moteur qui m&amp;#8217;agite lorsque je mets &amp;agrave; disposition des sources de mes programmes sur Internet, sans toutefois &amp;ecirc;tre complet. En dehors des aspects relationnels, communautaires, qui m&amp;#8217;int&amp;eacute;ressent, je dirais que j&amp;#8217;ai 3 moteurs dans ce genre de d&amp;eacute;marche. Dans le d&amp;eacute;sordre :&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;la reconnaissance des pairs ou des gens qui utiliseront mon code&lt;/li&gt;
	&lt;li&gt;la satisfaction de penser que des gens utiliseront mon code et en seront contents : c&amp;#8217;est proche mais tout de m&amp;ecirc;me diff&amp;eacute;rent, je n&amp;#8217;esp&amp;egrave;re pas forc&amp;eacute;ment une boite de chocolat, mais je suis content de penser que ce que j&amp;#8217;ai fait sera utile &amp;agrave; d&amp;#8217;autres (je pense par exemple &amp;agrave; Teamscript 4)&lt;/li&gt;
	&lt;li&gt;l&amp;#8217;am&amp;eacute;lioration continue : mettre mon code &amp;agrave; disposition sous une licence qui va bien, c&amp;#8217;est laisser la porte ouverte &amp;agrave; ce que d&amp;#8217;autres gens (potentiellement bien plus comp&amp;eacute;tents que moi) am&amp;eacute;liorent ce que j&amp;#8217;ai commenc&amp;eacute; &amp;agrave; faire ; c&amp;#8217;est comme &amp;ccedil;a que se construisent les meilleurs produits informatiques de nos jours (&amp;agrave; commencer par les OS)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Je trouve ces deux sujets vraiment passionnants. Dommage qu&amp;#8217;on entende jamais ce genre de th&amp;egrave;se &amp;agrave; plus haut niveau, et qu&amp;#8217;on s&amp;#8217;arr&amp;ecirc;te &amp;agrave; la b&amp;ecirc;te d&amp;eacute;fense d&amp;#8217;int&amp;eacute;r&amp;ecirc;ts priv&amp;eacute;s. Je suis compl&amp;egrave;tement d&amp;eacute;pass&amp;eacute; par la course folle aux profits qu&amp;#8217;on peut soup&amp;ccedil;onner chez de nombreux parasites des milieux culturels. La motivation devrait &amp;ecirc;tre de faire partager ce qu&amp;#8217;on aime, ce qui sort de notre t&amp;ecirc;te ou de nous. La gloire &amp;eacute;ternelle, l&amp;#8217;exposition m&amp;eacute;diatique, l&amp;#8217;argent qui coule &amp;agrave; flot&amp;#8230; bof.&lt;/p&gt;</description>
      <category domain="/archives/tags/misc">misc</category>
      <category domain="/archives/tags/mylife">mylife</category>
      <category domain="/archives/tags/thoughts">thoughts</category>
    </item>
    <item>
      <title>Voir ses requ&#234;tes dans un db/console Rails</title>
      <link>/archives/2009/11/9/voir_ses_requtes_dans_un/</link>
      <pubDate>Mon, 09 Nov 2009 21:05:00 GMT</pubDate>
      <guid>/archives/2009/11/9/voir_ses_requtes_dans_un/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;div class=&quot;CodeRay&quot;&gt;
  &lt;div class=&quot;code&quot;&gt;&lt;pre&gt;&lt;span class=&quot;co&quot;&gt;ActiveRecord&lt;/span&gt;::&lt;span class=&quot;co&quot;&gt;Base&lt;/span&gt;.logger = &lt;span class=&quot;co&quot;&gt;Logger&lt;/span&gt;.new(&lt;span class=&quot;co&quot;&gt;STDOUT&lt;/span&gt;)&lt;/pre&gt;&lt;/div&gt;
&lt;/div&gt;
&lt;p&gt;(&lt;a href=&quot;http://railsforum.com/viewtopic.php?id=29278&quot;&gt;thanks&lt;/a&gt;)&lt;/p&gt;</description>
      <category domain="/archives/tags/rails">rails</category>
      <category domain="/archives/tags/ruby">ruby</category>
      <category domain="/archives/tags/tech">tech</category>
    </item>
    <item>
      <title>Final countdown</title>
      <link>/archives/2009/10/20/final_countdown/</link>
      <pubDate>Tue, 20 Oct 2009 13:16:00 GMT</pubDate>
      <guid>/archives/2009/10/20/final_countdown/</guid>
      <author>jeanbaptiste.barth@gmail.com (JB)</author>
      <description>&lt;p style=&quot;text-align:center;&quot;&gt;&lt;script type=&quot;text/javascript&quot; src=&quot;http://www.ubuntu.com/files/countdown/display2.js&quot;&gt;&lt;/script&gt;&lt;/p&gt;</description>
      <category domain="/archives/tags/tech">tech</category>
      <category domain="/archives/tags/ubuntu">ubuntu</category>
    </item>
  </channel>
</rss>
