<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-2544828409875322943</id><updated>2011-08-17T05:07:39.549+02:00</updated><category term='linux'/><category term='lecool'/><category term='postgres'/><category term='sysadmin'/><category term='mysql'/><category term='ajax'/><category term='autotest'/><category term='selenium'/><category term='conference'/><category term='politic'/><category term='spain'/><category term='rubyonrails'/><category term='netbeans'/><category term='green'/><category term='rspec'/><category term='SQlite'/><category term='tests'/><category term='blogger'/><category term='hireme'/><category term='agile'/><category term='plugin'/><category term='hacks'/><category term='mac'/><category term='railsconf'/><category term='ubuntu'/><category term='RubyCampLyon'/><category term='ide'/><category term='subversion'/><category term='database'/><title type='text'>21 croissants' Blog</title><subtitle type='html'></subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default?start-index=101&amp;max-results=100'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>114</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3103296910242481055</id><published>2009-08-17T15:28:00.003+02:00</published><updated>2009-08-17T15:54:22.986+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='green'/><title type='text'>3G Huawei E220 &amp; simyo.de on mac</title><content type='html'>Plug the modem and launch the MobileConnect application which is installed inside the E220.&lt;br /&gt;&lt;br /&gt;Create a new profile for simyo.de:&lt;br /&gt;&lt;br /&gt;&lt;img alt="http://img.skitch.com/20090817-trbwuudkf34umdstpdpsdupkbg.jpg" src="http://img.skitch.com/20090817-trbwuudkf34umdstpdpsdupkbg.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;telephone number of &lt;span style="font-weight: bold;"&gt;*99#&lt;/span&gt;&lt;br /&gt;Access Point Name: internet.eplus.de&lt;br /&gt;IP-Adresse: dynamic&lt;br /&gt;Primary DNS: 212.23.97.2&lt;br /&gt;Secondary DNS: 212.23.97.3&lt;br /&gt;Account name: simyo&lt;br /&gt;password: simyo&lt;br /&gt;&lt;br /&gt;Click "Connect" and you should be online. After I found these configuration data with google, it works the first time. If you have a problem or a suggestion, leave a comment. Remember this config will only work in Germany with simyo.de&lt;br /&gt;&lt;br /&gt;I am now ready to work with Rails on rails ;-) I will be indeed traveling a lot with the ICE, the German high speed train, which might  not be as fast as the French TGV but it is very comfortable and has electric plugs in all the seats.&lt;br /&gt;&lt;br /&gt;In this carbon junky world, I really hope that &lt;a href="http://cop15.dk/"&gt;Copenhagen 2009&lt;/a&gt; will enforce some regulations on &lt;a href="http://www.planestupid.com/"&gt;plane transports&lt;/a&gt;. Instead of stupid competition between EU states railways, EU should also learn from the UK Rails privatization disaster. It would be so nice if the next generation of Europeans could travel on high speed rails transports with a public owned, interconnected, affordable and fast European rails network...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3103296910242481055?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3103296910242481055/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3103296910242481055' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3103296910242481055'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3103296910242481055'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/08/3g-huawei-e220-simyode-on-mac.html' title='3G Huawei E220 &amp; simyo.de on mac'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-966972109163465903</id><published>2009-08-11T12:20:00.003+02:00</published><updated>2009-08-12T11:00:21.730+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Upgrade subclipse in Aptana Studio</title><content type='html'>At  work, we just upgraded to subversion 1.6.3 from 1.4.x and it took us a 1-2 days to solve configuration issues. In order to make our life easier during merges, we decided to go for Aptana Studio. Unfortunately, at the time of this writing, this IDE is bundled with Subclipse 1.4.&lt;br /&gt;&lt;br /&gt;Follow these manual steps to upgrade to http://subclipse.tigris.org/update_1.6.x&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;1. Remove Aptana Subversion Support&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Go to About Apanta Studio &lt;ul&gt;&lt;li&gt; In your Aptana Studio &lt;ul&gt;&lt;li&gt; On Windows, go to &lt;b&gt;Help&lt;/b&gt; and select &lt;b&gt;About Aptana Studio&lt;/b&gt; &lt;/li&gt;&lt;li&gt; On Mac, go to &lt;b&gt;Aptana Studio&lt;/b&gt; and select &lt;b&gt;About Aptana Studio&lt;/b&gt; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt; In you Eclipse &lt;ul&gt;&lt;li&gt; On Windows, go to &lt;b&gt;Help&lt;/b&gt; and select &lt;b&gt;About Eclipse SDK&lt;/b&gt; &lt;/li&gt;&lt;li&gt; On Mac, go to &lt;b&gt;Eclipse&lt;/b&gt; and select &lt;b&gt;About Eclipse SDK&lt;/b&gt; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;/ul&gt; &lt;/li&gt;&lt;li&gt; Select "Installation Details" &lt;/li&gt;&lt;li&gt; Select the" Installed Software" Tab &lt;/li&gt;&lt;li&gt; Select the plugins you would like to install and click "Uninstall".&lt;/li&gt;&lt;/ol&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.skitch.com/20090811-ms24i9a1tyafp81u9na64gii5t.jpg"&gt;&lt;img style="cursor: pointer; width: 735px; height: 516px;" src="http://img.skitch.com/20090811-ms24i9a1tyafp81u9na64gii5t.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;2. Install subclipse 1.6.x&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt; From the &lt;b&gt;Help&lt;/b&gt; menu, select &lt;b&gt;Install new Software ...&lt;/b&gt; &lt;/li&gt;&lt;li&gt; Select &lt;b&gt;Available Software&lt;/b&gt;. &lt;/li&gt;&lt;li&gt; Click the &lt;b&gt;Add Site...&lt;/b&gt; button. &lt;/li&gt;&lt;li&gt; In the &lt;b&gt;Location&lt;/b&gt; text box, type http://subclipse.tigris.org/update_1.6.x&lt;/li&gt;&lt;li&gt;Also add mylyn: http://download.eclipse.org/tools/mylyn/update/e3.4&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://img.skitch.com/20090811-ts34mpgtrbh25akc5wi1cpikgi.jpg"&gt;&lt;img style="cursor: pointer; width: 526px; height: 429px;" src="http://img.skitch.com/20090811-ts34mpgtrbh25akc5wi1cpikgi.jpg" alt="" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;3. Install Aptana RadRails&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="http://img.skitch.com/20090811-gswfp5bqm87pkwd76usumrd2et.jpg" src="http://img.skitch.com/20090811-gswfp5bqm87pkwd76usumrd2et.jpg" /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-966972109163465903?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/966972109163465903/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=966972109163465903' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/966972109163465903'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/966972109163465903'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/08/upgrade-subclipse-in-aptana-studio.html' title='Upgrade subclipse in Aptana Studio'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3436853964086969223</id><published>2009-07-29T09:04:00.001+02:00</published><updated>2009-07-29T09:06:05.519+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>to_yaml from mysql SELECT tip</title><content type='html'>Append \G at the end of a SELECT query .&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;select * from countries limit 5\G;&lt;br /&gt;&lt;br /&gt;*************************** 1. row ***************************&lt;br /&gt;          id: 4&lt;br /&gt;continent_id: 2&lt;br /&gt;   region_id: 14&lt;br /&gt;   permalink: afghanistan&lt;br /&gt;     name_en: Afghanistan&lt;br /&gt;     name_de: Afghanistan&lt;br /&gt;         lat: 33.9391&lt;br /&gt;         lng: 67.71&lt;br /&gt;   eu_member: 0&lt;br /&gt;      alpha2: NULL&lt;br /&gt;      alpha3: NULL&lt;br /&gt;*************************** 2. row ***************************&lt;br /&gt;          id: 8&lt;br /&gt;continent_id: 3&lt;br /&gt;   region_id: 19&lt;br /&gt;   permalink: albania&lt;br /&gt;     name_en: Albania&lt;br /&gt;     name_de: Albanien&lt;br /&gt;         lat: 41.1533&lt;br /&gt;         lng: 20.1683&lt;br /&gt;   eu_member: 0&lt;br /&gt;      alpha2: NULL&lt;br /&gt;      alpha3: NULL&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3436853964086969223?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3436853964086969223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3436853964086969223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3436853964086969223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3436853964086969223'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/07/toyaml-from-mysql-select-tip.html' title='to_yaml from mysql SELECT tip'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4875067887859373900</id><published>2009-07-13T09:18:00.004+02:00</published><updated>2009-07-13T16:06:36.444+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Fixing Bus Error BUG in ruby entreprise edition</title><content type='html'>If you  want to use ruby enterprise edition (ree) for your project, it's very important to install all the dependencies with the ree  gem command, especially if the gems rely on native code such as imagemagick, or ... bluecloth.&lt;br /&gt;&lt;br /&gt;I bumped into the following bug when I tried to run my specs with ree:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;$ /opt/ruby-enterprise-1.8.6-20090610/bin/ruby spec/models/advocacy_spec.rb&lt;br /&gt;/.gem/ruby/1.8/gems/bluecloth-2.0.0/lib/bluecloth_ext.bundle: &lt;span style="font-weight: bold;"&gt;[BUG] Bus Error&lt;/span&gt;&lt;br /&gt;ruby 1.8.6 (2008-08-11) [i686-darwin9.7.0]&lt;br /&gt;&lt;br /&gt;Abort trap&lt;/blockquote&gt;&lt;br /&gt;The solution was to install the bluecloth gem again, with reee gem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;:trunk$ /opt/ruby-enterprise-1.8.6-20090610/bin/gem install bluecloth&lt;br /&gt;WARNING:  Installing to ~/.gem since /opt/ruby-enterprise-1.8.6-20090610/lib/ruby/gems/1.8 and&lt;br /&gt;     /opt/ruby-enterprise-1.8.6-20090610/bin aren't both writable.&lt;br /&gt;Building native extensions.  This could take a while...&lt;br /&gt;Successfully installed bluecloth-2.0.4&lt;br /&gt;1 gem installed&lt;br /&gt;Installing ri documentation for bluecloth-2.0.4...&lt;br /&gt;Installing RDoc documentation for bluecloth-2.0.4...&lt;br /&gt;jm-macbook:trunk jeanmichel$ /opt/ruby-enterprise-1.8.6-20090610/bin/ruby spec/models/advocacy_spec.rb&lt;br /&gt;...&lt;br /&gt;&lt;br /&gt;Finished in 0.349809 seconds&lt;/blockquote&gt;&lt;br /&gt;The recent versions of rubygems use the ~/.gem/ruby/1.8/ folder so it make sense to install gems in your home folder so standard ruby and ree can share them.&lt;br /&gt;&lt;br /&gt;On a sidenote, running the specs with ree worked without any problem. memory consumption was lower but it did not improve the speed.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4875067887859373900?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4875067887859373900/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4875067887859373900' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4875067887859373900'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4875067887859373900'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/07/fixing-bus-error-bug-in-ruby-entreprise.html' title='Fixing Bus Error BUG in ruby entreprise edition'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4517715638163243754</id><published>2009-06-04T16:56:00.002+02:00</published><updated>2009-06-04T17:10:09.287+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>Before | After</title><content type='html'>&lt;h3&gt;Before:&lt;/h3&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;def self.find_expiring_soon(date_time = Time.now)&lt;br /&gt;@@expiring_soon ||= find(:all, :conditions =&gt; ["type_id = 1 AND completed = 0 AND created_at &lt; :date", { :date =&gt; (4.months + 14.days).ago(date_time) }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.find_expiring_soon_with_donations(date_time = Time.now)&lt;br /&gt;@@expiring_soon_with_donations ||= find(:all, :conditions =&gt; ["type_id = 1 AND completed = 0 AND donated_amount &gt; 0 AND created_at &lt; :date", { :date =&gt; (4.months + 14.days).ago(date_time) }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.find_expiring_soon_without_donations(date_time = Time.now)&lt;br /&gt;@@expiring_soon_with_donations ||= find(:all, :conditions =&gt; ["type_id = 1 AND completed = 0 AND donated_amount = 0 AND created_at &lt; :date", { :date =&gt; (4.months + 14.days).ago(date_time) }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.find_expiring_very_soon(date_time = Time.now)&lt;br /&gt;@@expiring_very_soon ||= find(:all, :conditions =&gt; ["type_id = 1 AND completed = 0 AND created_at &lt; :date", { :date =&gt; (6.months - 3.days).ago(date_time) }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;After:&lt;/h3&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;def self.find_expiring_soon_with_donations&lt;br /&gt;  find(:all,&lt;br /&gt;       :include =&gt; :donations,&lt;br /&gt;       :conditions =&gt; [&lt;br /&gt;         "expires_soon = 0&lt;br /&gt;         #{with_expiring_criterias}&lt;br /&gt;         AND donated_amount &gt; 0", { :date =&gt; four_months_and_a_half_ago }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.find_expiring_soon_without_donations&lt;br /&gt;  find(:all,&lt;br /&gt;       :conditions =&gt; [&lt;br /&gt;         "expires_soon = 0&lt;br /&gt;          #{with_expiring_criterias}&lt;br /&gt;          AND donated_amount = 0", { :date =&gt; four_months_and_a_half_ago }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.find_expiring_very_soon&lt;br /&gt;  find(:all,&lt;br /&gt;       :conditions =&gt; [&lt;br /&gt;         "expires_very_soon = 0&lt;br /&gt;          #{with_expiring_criterias}&lt;br /&gt;          ", { :date =&gt; (6.months - 3.days).ago(date_time) }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.find_expiring_now&lt;br /&gt;  find(:all,&lt;br /&gt;       :conditions =&gt; [&lt;br /&gt;         "expired = 0&lt;br /&gt;          #{with_expiring_criterias}", { :date =&gt; 6.months.ago }])&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def self.with_expiring_criterias # DRY&lt;br /&gt;  "AND type_id = #{ElementType::MONEY}&lt;br /&gt;   AND completed = 0&lt;br /&gt;   AND activated_at &lt; :date"    end    &lt;br /&gt;&lt;br /&gt;private_class_method :with_expiring_criterias   &lt;br /&gt;&lt;br /&gt;def self.four_months_and_a_half_ago        &lt;br /&gt;  @@FOUR_MONTHS_AND_A_HALF_AGO ||= (6.months - 6.weeks).ago(Time.now)  &lt;br /&gt;end    &lt;br /&gt;&lt;br /&gt;private_class_method :four_months_and_a_half_ago&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Much more lines of code (LOC), does it improve readability and understading?&lt;/li&gt;&lt;li&gt;hardcoded values replaced by objects (ElementType::MONEY), does it make easier to understand the meaning of numbers without knowing the DB model&lt;/li&gt;&lt;li&gt;duplicate SQL DRyed in a private method&lt;/li&gt;&lt;/ul&gt;Which version do you prefer?&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4517715638163243754?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4517715638163243754/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4517715638163243754' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4517715638163243754'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4517715638163243754'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/06/before-after.html' title='Before | After'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2216142698364322279</id><published>2009-04-30T15:06:00.002+02:00</published><updated>2009-04-30T15:27:21.047+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><title type='text'>Unix recursive Find and Replace</title><content type='html'>&lt;blockquote&gt;find spec ! -regex ".*.svn.*" -type f -exec grep -l "it_should_behave_like" {} \; | xargs sed -i "" "s/it_should_behave_like/#it_should_behave_like/"&lt;/blockquote&gt;&lt;br /&gt;Explanation:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;find spec             &lt;span style="font-style: italic;"&gt;find in ./spec folfer&lt;/span&gt;&lt;/li&gt;&lt;li&gt;! -regex ".*.svn.*"        &lt;span style="font-style: italic;"&gt;excluding .svn folders&lt;/span&gt;&lt;/li&gt;&lt;li&gt;-type f     &lt;span style="font-style: italic;"&gt;only files&lt;/span&gt;&lt;/li&gt;&lt;li&gt;-exec grep -l "it_should_behave_like" {} \;    &lt;span style="font-style: italic;"&gt;extra line to grep only files which contain "it_should_behave_like"&lt;/span&gt;&lt;/li&gt;&lt;li&gt;| xargs sed -i ""      &lt;span style="font-style: italic;"&gt;pipe to sed editor without creating any backup file (-i)&lt;/span&gt;&lt;/li&gt;&lt;li&gt;"s/ENTER OLD STRING OR TEXT TO REPLACE/ENTER REPLACEMENT STRING OR TEXT/"&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2216142698364322279?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2216142698364322279/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2216142698364322279' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2216142698364322279'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2216142698364322279'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/04/unix-recursive-find-and-replace.html' title='Unix recursive Find and Replace'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2803511880243241196</id><published>2009-04-29T12:13:00.002+02:00</published><updated>2009-04-29T12:16:18.776+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>svn trick: revert a folder when it can not be deleted</title><content type='html'>If you ever have this error message when running&lt;br /&gt;svn status&lt;br /&gt;!     C stories&lt;br /&gt;      &gt;   local delete, incoming edit upon update&lt;br /&gt;&lt;br /&gt;=&gt; Clean it with reverting the conflicted folder with:&lt;br /&gt;&lt;blockquote&gt;svn revert stories&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2803511880243241196?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2803511880243241196/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2803511880243241196' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2803511880243241196'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2803511880243241196'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/04/svn-trick-revert-folder-when-it-can-not.html' title='svn trick: revert a folder when it can not be deleted'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7262012232598616888</id><published>2009-04-29T11:37:00.002+02:00</published><updated>2009-04-29T11:47:22.934+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='sysadmin'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Setting up logrotate with capitate</title><content type='html'>How many Rails projects "forget" to set up a log rotation of their production logs and end up filling the hard disk with gigabytes of log ...&lt;br /&gt;&lt;br /&gt;Lots ;-) And mine before I found out about logrotate.&lt;br /&gt;&lt;br /&gt;Fortunately, there is one tool which help you to no to reinvent the wheel and set up a log rotation within minutes: capitate ;-)&lt;br /&gt;&lt;br /&gt;Install it:&lt;br /&gt;&lt;blockquote&gt;sudo gem install capitate &lt;/blockquote&gt;Add the following snippet to your conf/deploy.rb:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# See http://capitate.rubyforge.org&lt;br /&gt;require 'capitate' &lt;br /&gt;require 'capitate/recipes'&lt;br /&gt;&lt;br /&gt;# Add this line but remove it afterinstalling 'cap rails:logrotate:install'&lt;br /&gt;set :use_sudo, true&lt;br /&gt;&lt;/blockquote&gt;Run cap -T to see how many recipes you have now!&lt;br /&gt;&lt;br /&gt;Run &lt;br /&gt;&lt;blockquote&gt;cap logrotated:install_conf&lt;/blockquote&gt;&lt;br /&gt;It should install a new /etc/logrotate.d/rails_yourwebsite.com&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;/home/youruser/public_html/yourwebsite.com/shared/log/production.log {&lt;br /&gt;  size 10M&lt;br /&gt;  rotate 7&lt;br /&gt;  daily&lt;br /&gt;  missingok&lt;br /&gt;  notifempty&lt;br /&gt;  copytruncate &lt;br /&gt;}&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;That's it!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7262012232598616888?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7262012232598616888/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7262012232598616888' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7262012232598616888'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7262012232598616888'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/04/setting-up-logrotate-with-capitate.html' title='Setting up logrotate with capitate'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-646155872450854655</id><published>2009-03-26T18:33:00.002+01:00</published><updated>2009-03-26T18:42:33.683+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politic'/><title type='text'>Giving and Receiving</title><content type='html'>&lt;span style="text-decoration: underline;"&gt;&lt;/span&gt;&lt;blockquote&gt;&lt;span style="text-decoration: underline;"&gt;Mxxxxx&lt;/span&gt; has left a new comment on your post "xyz":&lt;br /&gt;&lt;br /&gt;totally useless. If i wanted to read this i would have read the txt file that came with the download.&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;This is the nice comment I just received about a post in my blog.&lt;br /&gt;&lt;br /&gt;Blogging is giving free content to the world, without expecting anything in return ...&lt;br /&gt;If this person was to meet me in person, would (s)he dare telling me the same thing???&lt;br /&gt;&lt;br /&gt;At the end of day, you should never, ever write aggressive text in sms, email, forum, twitter, blog, etc  ... Most of the time, if not always, you end up regretting your acts and only create negative energy.&lt;br /&gt;&lt;br /&gt;We live in a society which is always connected, maybe it's time to write less emails, send less texts, spend less time on the internet and behave like a nice person in the Real World. Lots of positive energy shalt be the outcome.&lt;br /&gt;&lt;br /&gt;Peace &amp;amp; Love :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-646155872450854655?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/646155872450854655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=646155872450854655' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/646155872450854655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/646155872450854655'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/03/giving-and-receiving.html' title='Giving and Receiving'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2759541696314450267</id><published>2009-03-23T15:32:00.011+01:00</published><updated>2009-03-25T16:46:07.181+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Netbeans usability</title><content type='html'>&lt;span style="color: rgb(0, 102, 0);"&gt;UPDATE:&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The netbeans community solved my problem in 24 hours!!! It was a bug due to a problem of deserialization ... Deleting the ~/.netbeans folder solved the problem. Check out &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=161070"&gt;http://www.netbeans.org/issues/show_bug.cgi?id=161070&lt;/a&gt;&lt;/span&gt;&lt;br /&gt;&lt;cooking_introduction&gt;&lt;/cooking_introduction&gt;&lt;blockquote&gt;One of thing I enjoy the most in life is cooking. I distrust most of the products processed by the food industry - gm, transfat, the list is too long... - and try to cook with local, raw and organics ingredient (when available at a fair price). The kitchen utensils I use must be of very good quality: the knifes must cut without effort, the pan must not contain carcinogen material, etc... As the whole cooking experience becomes slightly stressful if I have to cook with other utensils, I tend to bring my best knifes with me on holidays ;-)&lt;/blockquote&gt;&lt;br /&gt;To stick with the cooking metaphor, I see the code as the ingredients, the IDE being the kitchen utensils and the working and tested software the resulting meal.&lt;br /&gt;A lot of my productivity and the joy I feel crafting a beautiful software depends on my interaction with an IDE.&lt;br /&gt;&lt;br /&gt;I have been using Netbeans since february 2007, following its long path to become a mature IDE for Ruby on Rails. Most of the time, I have used the latest build, reported some issues and it has been a fun and productive experience.&lt;br /&gt;&lt;br /&gt;However, I am feeling a bit frustrated now, because of some recent changes in the behavior of the Output Window(CTRL+4) . I rely highly on &lt;a href="http://ph7spot.com/articles/getting_started_with_autotest"&gt;Autospec&lt;/a&gt; to run my unit tests. With Netbeans 6.5, I have the code on one widow and I use an undocked Output window on the right side in order to check out the tests results and open classes in 1 click. This is very handy because Netbeans opens the guilty class in the main window, at the exact location of the guilty line of the backtrace. This makes the whole development cycle "super" productive!&lt;br /&gt;&lt;br /&gt;&lt;img src="http://lh6.ggpht.com/_j7RekXQWzxQ/ScesbsAMnII/AAAAAAAABl8/808hmzbz0p0/s800/Screenshot.png" /&gt;&lt;br /&gt;&lt;br /&gt;Since Netbeans latest build 23rd of March 2009 (7.0?), this behavior has changed. It seems that the Output window behaves like any other window. By default, it opens in a normal tab, forcing you to constantly CTRL+TAB to switch between classes and output. If you undock it and you click on a backtrace, it will open it in the same undocked window as the Output!!!&lt;br /&gt;&lt;br /&gt;So unless you move theses windows to the main IDE, there is no way you can compare the tests output and the class itself.  As far as I am concerned, this is a serious usability issue and I'd like to discuss it with other netbeans users and netbeans IDE developers. In the following screenshot, you can see that every time I click on a backtrace, it opens the window in a tab next to the Output window ....&lt;br /&gt;&lt;img src="http://lh4.ggpht.com/_j7RekXQWzxQ/SceuWhwmFGI/AAAAAAAABmE/uSKxp2nmby4/s800/output.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;Please, please rollback the Output Window to its previous behavior!&lt;br /&gt;&lt;br /&gt;A last tip about running autospec. The netbeans Autospec implementation is flawed: output is polluted by zillions of %RSPEC_SUITE_FINISHED% and the constant scroll bar at the bottom is  very distracting. The solution is to run autospec with a simple "Run File" (shit +F6) of the script/autospec. This is much more productive and faster than the RSpec runner built into Netbeans and always works!&lt;br /&gt;&lt;br /&gt;In the future, I'd love to see a feature which would allow us to split the IDE in 3 vertical windows.&lt;br /&gt;If you look at &lt;a href="http://www.vimeo.com/2987044"&gt;Jon and Sandro on Pair Programming hashrocket video&lt;/a&gt;, you'll see that they have split their screen in 3: a class, the test class and autotest. Always take inspiration from the best!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2759541696314450267?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2759541696314450267/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2759541696314450267' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2759541696314450267'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2759541696314450267'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/03/netbeans-usability.html' title='Netbeans usability'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh6.ggpht.com/_j7RekXQWzxQ/ScesbsAMnII/AAAAAAAABl8/808hmzbz0p0/s72-c/Screenshot.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-959900226590925475</id><published>2009-02-10T13:22:00.009+01:00</published><updated>2009-02-12T11:54:42.062+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='green'/><title type='text'>The RSpec Book: Never Judge A Book By Its Cover</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://assets2.pragprog.com/images/covers/190x228/betas/achbd.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 190px; height: 228px;" src="http://assets2.pragprog.com/images/covers/190x228/betas/achbd.jpg" alt="" border="0" /&gt;&lt;/a&gt;The RSpec Book is &lt;a href="http://www.pragprog.com/titles/achbd/the-rspec-book"&gt;out in beta version&lt;/a&gt;!&lt;br /&gt;&lt;br /&gt;It's a long expected book for the BDD Community. The first time I mention this book was at the Paris on Rails 2007 conference. Since then, many changes happened and it seems that API and Practices are mature enough to release a book. As far as I am concerned, the biggest boost was given by Aslak with &lt;a href="http://cukes.info/"&gt;Cucumber&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Before adding more love, I'll write about 2 small caveats. It's still a bit hard to contribute to the RSpec project as code is a bit complex, I mean compares to bacon or shoulda. The other is the painful upgrading process since version 1.0: no matters what, I always end up spending 2-3 hours to fix my specs or autospec when I update the RSpec gem ...&lt;br /&gt;&lt;br /&gt;Apart from that, RSpec and cucumber are one of the things which make me feeling at home working with Ruby (on Rails). Being able to describe the business rules and features is a big step for the software industry. How many hours lost because of misunderstanding between customers and programmers???&lt;br /&gt;This book is aimed at programmers, my hope is that there will be other books following, targeting the customers (business analyst, project manager, end user). So little by little, we learn how to communicate clearly to each other and build better software ...&lt;br /&gt;&lt;p style="font-weight: bold;"&gt;Never Judge A Book By Its Cover!&lt;/p&gt;&lt;p&gt;The second part of this post has &lt;span style="font-weight: bold;"&gt;nothing to do&lt;/span&gt; with technology or the quality of the book. I want to question the choice of an  incandescent bulb to represent a technology as innovative as RSpec.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;I have been volunteering for 2 years in an &lt;a href="http://eco-union.org/"&gt;environmentalist NGO&lt;/a&gt; and one of the things I keep repeating is how bad for the environment are the old   incandescent bulbs. I guess pragmatic programmers editors and RSpec book authors are very busy finishing the book and have other priorities ...&lt;br /&gt;&lt;/p&gt;&lt;p&gt;However, in these times of "&lt;a href="http://www.guardian.co.uk/world/video/2009/jan/19/obama-green-revolution-environment"&gt;green revolution&lt;/a&gt;", I hope that many RSpec users feel concerned about environmental issues and ask David and other authors to pick another image cover. It's a detail, I know but we have to replace all these electricity greedy bulbs even in the book covers!&lt;br /&gt;&lt;/p&gt;&lt;p&gt;RSpec is for alpha geek -  the earlier adopters -  and I don’t identify myself to a technology born in the &lt;a href="http://en.wikipedia.org/wiki/Incandescent_light_bulb"&gt;XIX century&lt;/a&gt;  !!!&lt;/p&gt;    &lt;p&gt;Why not using a Compact Fluorescent bulb?&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://farm4.static.flickr.com/3052/2324613709_ee51050a0a_m.jpg"&gt;&lt;img style="margin: 0pt 10px 10px 0pt; float: left; cursor: pointer; width: 240px; height: 150px;" src="http://farm4.static.flickr.com/3052/2324613709_ee51050a0a_m.jpg" alt="" border="0" /&gt;&lt;/a&gt;Or even more alpha geek, an &lt;a href="http://en.wikipedia.org/wiki/LED_lamp"&gt;LED_lamp&lt;/a&gt; ?&lt;/p&gt;            &lt;p&gt;More information on &lt;a href="http://www.iea.org/Textbase/press/pressdetail.asp?PRESS_REL_ID=182"&gt;http://www.earth-policy.org/Updates/2007/Update66.htm&lt;/a&gt;&lt;/p&gt;&lt;p&gt;&lt;span style="font-weight: bold;"&gt;UPDATE:&lt;/span&gt; &lt;a href="http://www.iea.org/Textbase/press/pressdetail.asp?PRESS_REL_ID=182"&gt;International Energy Agency Press release&lt;/a&gt; : "Worldwide, grid-based electric lighting consumes &lt;span style="font-weight: bold;"&gt;19%&lt;/span&gt; of total global electricity production" ..."It shows that were end-users to install only efficient lamps that will save money over the life cycle of the lighting service. Following these measures would save more than 16 000 Mt of CO2 emissions over the same time frame – equivalent to about 6 years of current global car emissions – and would avoid USD 2 600 billion"&lt;/p&gt;&lt;p&gt;&lt;span class="caps"&gt;&lt;a href="http://www.thedailygreen.com/green-homes/eco-friendly/congress-incandescent-light-bulbs-ban-461217"&gt;http://www.thedailygreen.com/green-homes/eco-friendly/congress-incandescent-light-bulbs-ban-461217&lt;/a&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;I found the LED bulb image at &lt;a href="http://www.flickr.com/photos/partybooper_rob/2324613709/sizes/l/"&gt;http://www.flickr.com/photos/partybooper_rob/2324613709/sizes/l/&lt;/a&gt; (Collective Commons)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-959900226590925475?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/959900226590925475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=959900226590925475' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/959900226590925475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/959900226590925475'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/02/rspec-book-never-judge-book-by-its.html' title='The RSpec Book: Never Judge A Book By Its Cover'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm4.static.flickr.com/3052/2324613709_ee51050a0a_t.jpg' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3274759305627264096</id><published>2009-02-04T17:07:00.002+01:00</published><updated>2009-02-04T17:13:55.706+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Install rmagick on ruby entreprise edition</title><content type='html'>I was trying to install rmagick on an ubuntu 7.04 and&lt;br /&gt;&lt;br /&gt;"ERROR:  Error installing rmagick:&lt;br /&gt;    ERROR: Failed to build gem native extension."&lt;br /&gt;&lt;br /&gt;I found the solution in&lt;a href="http://209.85.229.132/search?q=cache:4Fg9BkjIq94J:www.urbanpuddle.com/articles/2008/01/22/compile-imagemagick-for-rmagick-2-0-0-gem+http://www.urbanpuddle.com/articles/2008/01/22/compile-imagemagick-for-rmagick-2-0-0-gemhelpful&amp;amp;hl=en&amp;amp;ct=clnk&amp;amp;cd=1&amp;amp;gl=es&amp;amp;client=firefox-a"&gt; google cache&lt;/a&gt;: install the 1.15.12 version !&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;sudo /opt/ruby-enterprise-1.8.6-20090113/bin/gem install rmagick -v 1.15.12&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3274759305627264096?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3274759305627264096/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3274759305627264096' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3274759305627264096'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3274759305627264096'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/02/install-rmagick-on-ruby-entreprise.html' title='Install rmagick on ruby entreprise edition'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5926737228251291491</id><published>2009-01-30T13:46:00.003+01:00</published><updated>2009-01-30T14:13:18.134+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='RubyCampLyon'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>RubyCamp Lyon 2009</title><content type='html'>J'ai appris l'existence de ce barcamp dans le blog de Ruby onRails - comme quoi, la lecture de RSS n'est pas que de la procrastination ;-)&lt;br /&gt;&lt;br /&gt; Dans la série "troublantes coïncidences", j'avais déjà prévu de passer sur Lyon le WE du samedi 21 février et ce pour des raisons personnelles. Ce barcamp tombe donc bien à point! Etant donné que je suis en train de planifier mon retour en France pour le second semestre 2009 - sans doute dans la région lyonnaise - cela sera une parfaite occasion de rencontrer les rubyistes locaux.&lt;br /&gt;&lt;br /&gt; Je compte faire un remix de mes présentations de &lt;a href="http://21croissants.blogspot.com/2008/12/paris-on-rails-2008.html"&gt;Paris on Rails 2008&lt;/a&gt; et &lt;a href="http://21croissants.blogspot.com/2008/10/back-from-citcon-amsterdam-2008.html"&gt;citcon amsterdam 2008&lt;/a&gt;:&lt;br /&gt; &lt;ul&gt;&lt;li&gt;La vengeance du concombre masqué: Tests d'Acceptance utilisateur avec &lt;a href="http://cukes.info/"&gt;cucumber&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Rouge, Vert, Refactor: Initiation au Test Driven Development avec &lt;a href="http://rspec.info/" target="_blank"&gt;RSpec&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;  Par rapport à Paris, je compte faire beaucoup plus court, 15 minutes - 10-15 slides - et beaucoup plus simple. Si vous avez des attentes particulières, je vous serai reconnaissant de bien vouloir me contacter ou de laisser un commentaire.&lt;br /&gt;&lt;br /&gt; Plus d'info sur &lt;a href="http://barcamp.org/RubyCampLyon"&gt;http://barcamp.org/RubyCampLyon&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5926737228251291491?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5926737228251291491/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5926737228251291491' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5926737228251291491'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5926737228251291491'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/01/rubycamp-lyon-2009.html' title='RubyCamp Lyon 2009'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1605531211085463024</id><published>2009-01-27T13:01:00.003+01:00</published><updated>2009-01-27T13:31:08.534+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>n-dash VS m-dash</title><content type='html'>The good thing with software engineering is that you learn a new thing every day. Computer programs depend on so many different layers, libraries, hardware that it should be no surprise that things go wrong all the time.&lt;br /&gt;&lt;br /&gt;One of the Agile practice to fight this entropy is &lt;a href="http://en.wikipedia.org/wiki/Unit_testing"&gt;unit testing&lt;/a&gt; and especially &lt;a href="http://www.amazon.com/Test-Driven-Development-Addison-Wesley-Signature/dp/0321146530"&gt;Test Driven Development&lt;/a&gt; (TDD). Since 2005, I work with TDD, writing the specs (tests) before the code and this is the best design method I have used so far! No more dead code :-)  Moreover, the final code looks really clean and the tests are the best up to date documentation with examples I will ever write.&lt;br /&gt;&lt;br /&gt;I am implementing a Schedule class which encapsulate event times such as in the flavorpill.com. Following TDD and being lazy(!), I  wrote the spec first so I copy pasted directly the "When" text from the &lt;a href="http://flavorpill.com/newyork/events/2008/11/14/broken-glass"&gt;event page&lt;/a&gt; in flavorpill to my editor:&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt; it "should output in a pretty format such as Tuesdays–Sundays (10am–5pm)" do&lt;br /&gt;   @schedule.starts_at = 10.am&lt;br /&gt;   @schedule.ends_at = 5.pm&lt;br /&gt;   @schedule.from_tuesday.to_sunday&lt;br /&gt;   @schedule.pretty_format.should equal("Tuesdays–Sundays (10am–5pm)")&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;=&gt;expected "Tuesdays–Sundays (10am–5pm)", got "Tuesdays-Sundays (10am-5pm)" (using .equal?)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Don't you see the difference? Me neither, and it took me at least 5 minutes to understand what was going wrong.&lt;br /&gt;&lt;br /&gt;After increasing the size of the font, it's a bit easier to spot:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:180%;"&gt;expected "Tuesdays–Sundays (10am–5pm)", got "Tuesdays-Sundays (10am-5pm)"&lt;/span&gt;&lt;br /&gt; &lt;br /&gt;Olala! A colleague of mine who works as an editor introduced me to the wonderful world of n-dash and m-dash. &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;&lt;p&gt;The hyphen is used to hyphenate compound words and between non-continuing numbers, e.g., phone numbers.&lt;/p&gt;  &lt;p&gt;The en dash &lt;span style="font-size:7;"&gt;- &lt;/span&gt;is used to "connect continuing, or inclusive, numbers -- dates, time, or reference numbers." [Chicago Manual of Style, sec. 5.115]&lt;/p&gt;  The em dash &lt;span style="font-size:7;"&gt;– &lt;/span&gt;is used "to denote a sudden break in thought that causes an abrupt change in sentence structure." [Chicago Manual of Style, sec. 5.106]&lt;/blockquote&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;Morality: copy-paste is evil!&lt;br /&gt;&lt;/p&gt;&lt;p class="western" style="margin-bottom: 0cm;"&gt;But be honest, who knows about these characters, did you learn it in english classes? As far as I am concerned, there is no key in the keyboard to type the m-dash...&lt;span style="font-size:7;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1605531211085463024?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1605531211085463024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1605531211085463024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1605531211085463024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1605531211085463024'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2009/01/n-dash-vs-m-dash.html' title='n-dash VS m-dash'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1900136798373032075</id><published>2008-12-03T13:35:00.006+01:00</published><updated>2008-12-04T16:06:43.981+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Paris on Rails 2008</title><content type='html'>Paris on Rails 2008 was my 3rd conference this year, after XP Days France and &lt;a href="http://21croissants.blogspot.com/2008/10/back-from-citcon-amsterdam-2008.html" target="_blank"&gt;citcon europe in Amsterdam&lt;/a&gt; . I talked about User Acceptance Testing with cucumber at webrat and selenium. Apologize to my non-french speaking readers, I will write the rest of this post in french.&lt;br /&gt;&lt;br /&gt;Je suis de retour de Paris on Rails 2008! Richard et Laurent de nuxos ont vraiment assuré l'organisation de la conf: merci messieurs, ce fut très pro!&lt;br /&gt;Ce que je retiendrais, en vrac:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Russ Olsen&lt;/span&gt;, en direct skype des US s'est levé à 5h du mat pour philosopher sur les langages de programmation. Son speech était comme du miel, c'est définitivement un"story teller": impressionant!&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Philippe Hanrigou&lt;/span&gt; nous a servi sur un plateau une présentation très intéressante sur les &lt;strong&gt;Tests d'acceptance web à forte valeur ajoutée. &lt;/strong&gt;Son utilisation de vidéos et de photos pour illustrer son propos m'a paru une excellente idée. Sur le plan technique, j'ai retenu 2-3 patterns que je vais implémenter ASAP&lt;strong&gt;&lt;br /&gt;   &lt;/strong&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;DHH&lt;/span&gt; est cool mais finalement, je ne sais pas si il apporte autre chose qu'un "icing on the cake" à une conférence plutot dense.&lt;br /&gt; &lt;/li&gt;&lt;li&gt;Les &lt;span style="font-weight: bold;"&gt;autres présentations&lt;/span&gt; étaient également enrichissantes, sauf peut-être liquid dont je n'ai pas compris la valeur ajoutée&lt;/li&gt;&lt;li&gt;Par rapport aux autres conf, le temps pour "&lt;span style="font-weight: bold;"&gt;socializer&lt;/span&gt;" était encore 1 fois trop limité. Il nous manque un apéro, un petit déjeuner, un goûter d'1 heure pour que l'on puisse échanger des cartes de visites et débattre. C'était un peu la course pour la pause déjeuner ... Quel contraste avec XP Days ou citcon où j'ai eu le temps de tisser de nombreux liens d'amitié lors de soirées d'anthologie et quelque peu éthyliques!&lt;br /&gt; &lt;/li&gt;&lt;li&gt;une autre suggestion afin de motiver la communauté: faire un "call for participants" avec un site web 2.0 qui permet de voter pour les propositions. La &lt;a href="http://app.conferenciarails.org/charlas/lista" target="_blank"&gt;conférence espagnole&lt;/a&gt; est un exemple à suivre.&lt;br /&gt; &lt;/li&gt;&lt;/ul&gt;Quant à ma présentation, ce fut quelque peu &lt;span style="font-weight: bold;"&gt;épique&lt;/span&gt; car je me suis trompé de fichier et j'ai découvert en live une version beta ! J'avoue avoir pas mal bosser pour préparer la conf et voir tous ces slides mal foutues alors que j'avais passé une partie du dimanche à les fignoler m'a filé un coup (aïe!) . L'année prochaine, j'aurais un script pour automatiser le backup sur memory stick et je vais lire les &lt;a href="http://slides.diigo.com/diigo?src=http%3A%2F%2Fwww.diigo.com%2Fuser%2Fjeanmichelg%2Fbook%2Bpresentation%3Ftab%3D250&amp;amp;title=My+Bookmarks+tagged+book+presentation" target="_blank"&gt;bouquins américains&lt;/a&gt; que Phillippe m'a conseillé pour les mettre en pratique.&lt;br /&gt;&lt;span style="display: block;"&gt;&lt;span style="display: block;" title="Link"&gt;&lt;img src="" alt="Link" border="0" /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;Pour ceux que ça intéresse, voici la denière version de ma présentation, avec quelque photos censurées ;-)&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_812963"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/garnierjm/tests-interfaces-web-avec-rails-presentation?type=powerpoint" title="Tests Interfaces Web avec Rails"&gt;Tests Interfaces Web avec Rails&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-0276058306357545 visible ontop" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=tests-interface-web-on-rails-1228307467611218-9&amp;amp;rel=0&amp;amp;stripped_title=tests-interfaces-web-avec-rails-presentation"&gt;&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=tests-interface-web-on-rails-1228307467611218-9&amp;amp;rel=0&amp;amp;stripped_title=tests-interfaces-web-avec-rails-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=tests-interface-web-on-rails-1228307467611218-9&amp;amp;rel=0&amp;amp;stripped_title=tests-interfaces-web-avec-rails-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/garnierjm/tests-interfaces-web-avec-rails-presentation?type=powerpoint" title="View Tests Interfaces Web avec Rails on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/cucumber"&gt;cucumber&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/acceptancetesting"&gt;acceptancetesting&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Vos questions sont les bienvenues, sachez que je compte démarrer un projet sur &lt;a href="http://github.com/garnierjm"&gt;github&lt;/a&gt; avec des exemples de features pour selenium et de specs pour RSpec.&lt;br /&gt;Malheureusement, je n'ai pas pu me rendre à la &lt;a href="http://www.rubyfrance.org/evenements/rails-party-2008"&gt;Rails Party&lt;/a&gt; organisé par Jean-François Trân et rubyfrance.org. Mais le programme avait l'air prometteur et j'avoue que je suis très fan de ces rencontres informelles. Si l'année prochaine, ils la refont et previennent un peu plus en avance, je me ferai tout mon possible pour être présent!&lt;br /&gt;&lt;br /&gt;Pour conclure ce long post, cette conférence m'a conforté dans ma décision de tenter ma chance de l'autre côté de l'Atlantique afin d'aquérir de nouvelles compétences. Il me reste tellement de choses à apprendre avant de devenir peut-être un jour un "master" en Rails (&lt;a href="http://www.amazon.com/Pragmatic-Programmer-Journeyman-Master/dp/020161622X"&gt;From &lt;em&gt;Journeyman to Master&lt;/em&gt;&lt;/a&gt;) !&lt;br /&gt;&lt;br /&gt;Donc, si tout va bien, je devrai être à San Francisco à partir de mars 2009. Si vous avez des contacts ou connaissez une start up on Rails, merci de le faire savoir ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1900136798373032075?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1900136798373032075/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1900136798373032075' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1900136798373032075'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1900136798373032075'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/12/paris-on-rails-2008.html' title='Paris on Rails 2008'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3141863215756816446</id><published>2008-11-19T16:40:00.001+01:00</published><updated>2008-11-19T16:44:55.093+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu hardy: Fan got crazy because of a bug in NetworkManager</title><content type='html'>Found the soluton in the ubuntu forum:&lt;br /&gt;&lt;a href="http://ubuntuforums.org/showthread.php?p=4559250#post4559250"&gt;http://ubuntuforums.org/showthread.php?p=4559250#post4559250&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Copy-paste from the forum:&lt;br /&gt;&lt;br /&gt;Last update:&lt;br /&gt;If you update hal to last version (0.5.11~rc2-1ubuntu2) you shouldn't have this issue anymore, and thus you could update network-manager again.&lt;br /&gt;&lt;br /&gt;To check your installed version:&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;apt-cache madison hal&lt;br /&gt;&lt;br /&gt;Quote:&lt;br /&gt;hal (0.5.11~rc2-1ubuntu2) hardy; urgency=low&lt;br /&gt;* debian/rules: build using --with-deprecated-keys, since we don't want to&lt;br /&gt;break packages that were assuming this worked right up through beta.&lt;br /&gt;LP: #204768.&lt;br /&gt;&lt;br /&gt;Old thread follows:&lt;br /&gt;'''''''''''''''''''''''''''''''''''''''&lt;br /&gt;&lt;br /&gt;I've read some posts here regarding wireless issues since last update.&lt;br /&gt;&lt;br /&gt;I had issues too, and noticed that NetworkManager was eating 100% CPU and avoiding wireless to work.&lt;br /&gt;&lt;br /&gt;So this is what I did:&lt;br /&gt;* Connect to the internet in other machine and download the previous version of network-manager:&lt;br /&gt;https://launchpad.net/ubuntu/hardy/i...0.6.6-0ubuntu1&lt;br /&gt;or directly:http://launchpadlibrarian.net/124982...untu1_i386.deb&lt;br /&gt;&lt;br /&gt;* Downgrade network-manager with:&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;sudo dpkg -i network-manager-gnome_0.6.6-0ubuntu1_i386.deb&lt;br /&gt;&lt;br /&gt;It will automaticly stop and restart NetworkAdmin.&lt;br /&gt;After that just configure again your connection.&lt;br /&gt;&lt;br /&gt;EDIT:Bug reports follow (as some users reported):&lt;br /&gt;#204931 - NetworkManager 100% cpu usage on WiFi&lt;br /&gt;https://bugs.launchpad.net/ubuntu/+bug/178530&lt;br /&gt;https://bugs.launchpad.net/ubuntu/+s...er/+bug/204868&lt;br /&gt;&lt;br /&gt;EDIT2: If you want to keep aptitude from installing the broken package:&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;sudo aptitude hold network-manager&lt;br /&gt;&lt;br /&gt;When you want to release it again:&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;sudo aptitude unhold network-manager&lt;br /&gt;&lt;br /&gt;To check its version after an update:&lt;br /&gt;Code:&lt;br /&gt;&lt;br /&gt;apt-cache madison network-manager&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3141863215756816446?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3141863215756816446/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3141863215756816446' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3141863215756816446'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3141863215756816446'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/11/ubuntu-hardy-fan-got-crazy-because-of.html' title='Ubuntu hardy: Fan got crazy because of a bug in NetworkManager'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2313783766868122911</id><published>2008-11-17T16:32:00.002+01:00</published><updated>2008-11-17T19:27:10.942+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Invalid Google Maps API key </title><content type='html'>Today, it took me 1 hour to find the reason why my google map was not showing in &lt;span style="font-style: italic;"&gt;production&lt;/span&gt; env whereas everything was fine in &lt;span style="font-style: italic;"&gt;development&lt;/span&gt; env. Needless to say I have a "view" spec +  a selenium acceptance test which pass.&lt;br /&gt;&lt;br /&gt;Google Maps API has only one error message for this kind of problem: "The Google Maps API key used on this web site was registered for a different web site. You can generate a new key for this web site at &lt;a target="_blank" rel="nofollow" href="http://code.google.com/apis/maps/"&gt;http://code.google.com/apis/maps/&lt;/a&gt;. "&lt;br /&gt;&lt;br /&gt;Therefore, I started looking at the wrong place and changed the key set up for the "production" environment in the &lt;span style="font-style: italic;"&gt;RAILS_ROOT + '/config/gmaps_api_key.yml&lt;/span&gt; many times without any success ...&lt;br /&gt;&lt;br /&gt;Finally, I ended up looking at the source of the page and it appeared that the key parameter was empty!&lt;br /&gt;&lt;pre id="line30"&gt;  &lt;&lt;span class="start-tag"&gt;script&lt;/span&gt;&lt;span class="attribute-name"&gt; src&lt;/span&gt;=&lt;span class="attribute-value"&gt;"http://maps.google.com/maps?file=api&amp;amp;v=2.x&amp;amp;key=&amp;amp;hl=" &lt;/span&gt;&lt;span class="attribute-name"&gt;type&lt;/span&gt;=&lt;span class="attribute-value"&gt;"text/javascript"&lt;/span&gt;&gt;&lt;!--&lt;span class="end-tag"&gt;script&gt;&lt;/pre&gt;Garps!!! To be honest, the google maps developers could add a new spec to their API to verify the provided key is not blank and return a clear error message ....&lt;br /&gt;&lt;br /&gt;The problem was located in the code of the plugin ym4r_gm which loads the key for a given Rails env:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;   class ApiKey&lt;br /&gt;     #Read the API key config for the current ENV&lt;br /&gt;     unless File.exist?(RAILS_ROOT + '/config/gmaps_api_key.yml')&lt;br /&gt;       raise GMapsAPIKeyConfigFileNotFoundException.new("File RAILS_ROOT/config/gmaps_api_key.yml not found")&lt;br /&gt;     else&lt;br /&gt;       env = ENV['RAILS_ENV'] || RAILS_ENV&lt;br /&gt;       GMAPS_API_KEY = YAML.load_file(RAILS_ROOT + '/config/gmaps_api_key.yml')[env]&lt;br /&gt;     end&lt;br /&gt;    &lt;br /&gt;     def self.get(options = {})       &lt;br /&gt;       if options.has_key?(:key)&lt;br /&gt;         options[:key]&lt;br /&gt;       elsif GMAPS_API_KEY.is_a?(Hash)&lt;br /&gt;         #For this environment, multiple hosts are possible.&lt;br /&gt;         #:host must have been passed as option&lt;br /&gt;         if options.has_key?(:host)&lt;br /&gt;           GMAPS_API_KEY[options[:host]]&lt;br /&gt;         else&lt;br /&gt;           raise AmbiguousGMapsAPIKeyException.new(GMAPS_API_KEY.keys.join(","))&lt;br /&gt;         end&lt;br /&gt;       else&lt;br /&gt;         #Only one possible key: take it and ignore the :host option if it is there&lt;br /&gt;         GMAPS_API_KEY&lt;br /&gt;       end&lt;br /&gt;     end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I am deploying my application with the "stage" environment ... As I did a copy-paste from a project which does not have such an environment and completely forgot to add a key value for "stage" I ended up with an empty key ...&lt;br /&gt;&lt;br /&gt;The plugin author did not write any unit tests for &lt;span style="font-family: monospace;"&gt;the &lt;/span&gt;ApiKey class and probably does not wok in a BDD style ... As a matter of fact, I had to refactor his code to be abble to write a spec.&lt;br /&gt;&lt;br /&gt;To solve the problem, I wrote a spec and added a:&lt;br /&gt;raise GMapsAPIKeyNotFoundException if GMAPS_API_KEY.blank?&lt;br /&gt;&lt;br /&gt;I also added a spec to check that my Google maps API key is valid in production mode so I can make sure everything will be fine without having to test manually the application.&lt;br /&gt;&lt;br /&gt;Do you also write some specs (tests) to verify some configuration in production mode? I also am thinking about dependencies which can be a total mess sometimes in ruby. For that, I am using geminstaller.&lt;br /&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2313783766868122911?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2313783766868122911/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2313783766868122911' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2313783766868122911'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2313783766868122911'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/11/invalid-google-maps-api-key.html' title='Invalid Google Maps API key '/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4727260898895108759</id><published>2008-11-10T11:13:00.004+01:00</published><updated>2009-01-19T15:28:03.473+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>dont_repeat_youself ruby gem</title><content type='html'>&lt;a href="http://blog.mattwynne.net/"&gt;Matt wynne&lt;/a&gt; sent me a link from &lt;a href="http://www.rubyinside.com/3-tools-for-drying-your-ruby-code-1305.html"&gt;rubyinside about three tools to for DRYing Your Ruby Code&lt;/a&gt;. It also seems that the number of tools available for ruby to &lt;a href="http://silkandspinach.net/2008/09/23/reek-a-code-smells-detector-for-ruby/"&gt;analyze the code quality and detect code smells&lt;/a&gt; is improving, that's a very good new!&lt;br /&gt;&lt;br /&gt;It seems a good timing to officially announce my first gem: &lt;a href="http://github.com/garnierjm/dont_repeat_youself/wikis"&gt;dont_repeat_youself&lt;/a&gt;&lt;br /&gt;My idea was to take Simon Harris ' &lt;a href="http://www.redhillconsulting.com.au/products/simian/"&gt;Simian&lt;/a&gt; and to add a few features:&lt;br /&gt;&lt;a href="http://www.redhillconsulting.com.au/products/simian/"&gt;&lt;/a&gt;&lt;ul&gt;&lt;li&gt;generate reports (HTML, Textmate, Netbeans) of duplicate lines in your code:&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW_5Q3BkGI/AAAAAAAAAVg/VyCDirNCdjE/s1600-h/dry_report.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW_5Q3BkGI/AAAAAAAAAVg/VyCDirNCdjE/s400/dry_report.png" alt="" id="BLOGGER_PHOTO_ID_5194268735740940386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;integrates nicely with&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://macromates.com/"&gt;&lt;img style="cursor: pointer; width: 55px; height: 57px;" src="http://3.bp.blogspot.com/_j7RekXQWzxQ/SBW80g3BkEI/AAAAAAAAAVQ/01uZM9wjKk4/s400/textmate-logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5194265355601678402" border="0" /&gt;&lt;/a&gt;and&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ruby.netbeans.org/"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW9qQ3BkFI/AAAAAAAAAVY/wUM5OlCDVyg/s400/NetBeansLogo-159_60px.jpg" alt="" id="BLOGGER_PHOTO_ID_5194266279019647058" border="0" /&gt;&lt;/a&gt;and it opens the guilty class directly in your favourite IDE. This should save a bit of time!&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ruby.netbeans.org/"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;integrates with unit testing frameworks:&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;# RSpec&lt;br /&gt;it { rails_application.&lt;br /&gt;with_threshold_of_duplicate_lines(4).&lt;br /&gt;should be_DRY }&lt;br /&gt;&lt;br /&gt;# Test::Unit&lt;br /&gt;assert_DRY(ruby_code_in_rails_plugin("dont_repeat_yourself"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Combine it with autotest &amp;amp; Continuous Integration and your tests / builds will fail if the code contains too many duplicate lines.&lt;br /&gt;&lt;br /&gt;To start playing:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Read the &lt;a href="http://github.com/garnierjm/dont_repeat_youself/wikis"&gt;github wiki&lt;/a&gt;&lt;/li&gt;&lt;li&gt;View the &lt;a href="http://www.21croissants.com/files/dry_screencast.html"&gt;1 min "amateur screencast of the Netbeans integration&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;Your FeedBACK is more than welcome! Post a comment in this blog or &lt;a href="http://www.21croissants.com/contact"&gt;contact me&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;If you want to contribute, please use the git repository:&lt;br /&gt;&lt;a href="http://github.com/garnierjm/dont_repeat_youself/"&gt;&lt;span style="font-family:monospace;"&gt;http://github.com/garnierjm/dry-report/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cool DRY logo by &lt;a href="http://codesmack.com/"&gt;CodeSmack&lt;/a&gt; (Please send me the t-shirt guys!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_j7RekXQWzxQ/R_oGqf3ZAvI/AAAAAAAAAPg/WvfCKbpiFiI/s1600-h/logo_dry.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_j7RekXQWzxQ/R_oGqf3ZAvI/AAAAAAAAAPg/WvfCKbpiFiI/s400/logo_dry.jpg" alt="" id="BLOGGER_PHOTO_ID_5186465248048644850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Based on Simian (Similarity Analyser) by Simon Harris from RedHill Consulting, see http://www.redhillconsulting.com.au/products/simian/&lt;br /&gt;Copyright (c) 2003-08 RedHill Consulting Pty. Ltd.  All rights reserved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4727260898895108759?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4727260898895108759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4727260898895108759' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4727260898895108759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4727260898895108759'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/11/dry-report-ruby-gem.html' title='dont_repeat_youself ruby gem'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW_5Q3BkGI/AAAAAAAAAVg/VyCDirNCdjE/s72-c/dry_report.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3895811292722069733</id><published>2008-11-06T11:29:00.003+01:00</published><updated>2008-11-06T12:24:41.349+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='netbeans'/><title type='text'>Trick for Netbeans 6.5 latest build and Autospec</title><content type='html'>On one hand, &lt;a href="http://ph7spot.com/articles/getting_started_with_autotest"&gt;Autotest&lt;/a&gt; is a definitely great idea. Since I am using it with RSpec, I have saved a lot of times  with it because it runs my tests automatically .&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;img src="img/blank.gif" alt="Link" class="gl_link" border="0" /&gt;&lt;br /&gt;&lt;br /&gt;On the other hand, the &lt;a href="http://www.netbeans.org/features/ruby/index.html"&gt;Netbeans ruby IDE&lt;/a&gt;  is getting better and better:&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;the auto-completion definitely rocks,&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;it's quite quick to open files and to Go to types (CTRL +O)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;the Refactoring "Rename" is very handy (although cover you back with tests to make sure!)&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;Debugging rocks even if it's broken in 6.5 (see &lt;a href="http://www.netbeans.org/issues/show_bug.cgi?id=152509"&gt;bug report&lt;/a&gt;)&lt;/span&gt;&lt;/span&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="on down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; is the test framework I use since 2007. I did embrace the whole BDD, "describe MyClass, it "should behave like ...." jargon because it feels so much natural than "assert_equals" ...&lt;br /&gt;&lt;br /&gt;These 3 tools combined together should make me the most productive Agile Rails programmer but unfortunately if you live on the edge:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://bits.netbeans.org/download/trunk/nightly/latest/"&gt;Netbeans&lt;/a&gt;-trunk-nightly-200811060201-ruby-linux.sh&lt;/li&gt;&lt;li&gt;&lt;a href="http://rspec.info/"&gt;RSpec&lt;/a&gt; 1.1.11&lt;/li&gt;&lt;li&gt;ZenTest 3.11.0&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;The right menu "Autotest" won't work ... It's probably the &lt;a href="http://21croissants.blogspot.com/2008/07/hack-to-make-autotest-work-in-netbeans.html"&gt;4th or 5th&lt;/a&gt; time it happens to me so I am used to it ;-) Even if I find it ironic that such tools written by TDD people should work a bit better.&lt;br /&gt;&lt;br /&gt;Fortunately, the solution is simple:&lt;br /&gt;&lt;pre&gt;1. Update to the latest rspec-rails gem&lt;br /&gt;[sudo] gem install rspec-rails&lt;br /&gt;ruby script/generate rspec&lt;br /&gt;&lt;/pre&gt;It will generate a script/autospec file. Just open it, and run it with SHIT + F6 as a normal Ruby program. One caveat, why you press the "stop" button, it won't kill the autotest spawned by this script. You'll have to kill it manually ...&lt;br /&gt;&lt;br /&gt;As a screencast is better than 1000 blog posts, I have made one to explain the netbeans software engineers and you what's the problem and how to solve it, just &lt;a href="http://www.21croissants.com/files/netbeans_autospec.html"&gt;click here to watch it&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;The only thing missing from Netbeans is official "git support" but I guess it should not take long as there is already an open source version &lt;a href="http://nbgit.org/" target="_blank" onclick="javascript:pageTracker._trackPageview ('/outbound/nbgit.org');"&gt;http://nbgit.org&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3895811292722069733?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3895811292722069733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3895811292722069733' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3895811292722069733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3895811292722069733'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/11/trick-for-netbeans-65-latest-build-and.html' title='Trick for Netbeans 6.5 latest build and Autospec'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2690680008387384302</id><published>2008-10-28T09:49:00.004+01:00</published><updated>2008-10-28T10:41:19.276+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='politic'/><category scheme='http://www.blogger.com/atom/ns#' term='tests'/><title type='text'>SNCF: 225 software engineers who don't write tests!</title><content type='html'>The biggest French e-commerce web site is &lt;a href="http://voyages-sncf.com"&gt;http://voyages-sncf.com&lt;/a&gt;, they sell train tickets for the &lt;em&gt;National  Railway&lt;/em&gt; of France providing high speed train travel to Europe. It's supposed to be a public company and provide an affordable, reliable and sustainable transport public service.&lt;br /&gt;&lt;br /&gt;In reality, the European Commission and a lot of people who fight for their private interest are trying to privatize it with marketing madness such as IDTGV: a train without driver (!!!) as they "attach" it behind another TGV train. This allow them to contract private staff and pay them less and with less social protection than scnf employees.&lt;br /&gt;&lt;br /&gt;The same people also created an over complex pricing system that no one but computers can understand (does it remind you some financial crisis?). This complexity was denounces by a &lt;a href="http://www.europe1.fr/Info/Actualite-Economie-et-Societe/Entreprises/La-SNCF-va-travailler-a-plus-de-clarte-pour-ses-tarifs/%28gid%29/172557"&gt;report written by a deputy in October 2008&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Despite a team of 225 people, I am kind of astonished by the poor quality of their latest site: http://www.tgv-europe.com/&lt;br /&gt;&lt;br /&gt;This is the kind of email you receive when you order a ticket through http://www.tgv-europe.com/:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;Delivered-To: anonymous@anonymous.com&lt;br /&gt;Received: by 10.86.4.12 with SMTP id 12cs66877fgd;&lt;br /&gt;       Thu, 23 Oct 2008 12:23:23 -0700 (PDT)&lt;br /&gt;Received: by 10.210.54.19 with SMTP id c19mr1159156eba.116.1224789802208;&lt;br /&gt;       Thu, 23 Oct 2008 12:23:22 -0700 (PDT)&lt;br /&gt;Return-Path: &lt;reply@tgv-europe.es&gt;&lt;br /&gt;Received: from voyages.sncf.fr (libellule.voyages-sncf.com [195.101.72.30])&lt;br /&gt;       by mx.google.com with ESMTP id j8si7755870gvb.1.2008.10.23.12.23.21;&lt;br /&gt;       Thu, 23 Oct 2008 12:23:22 -0700 (PDT)&lt;br /&gt;Received-SPF: neutral (google.com: 195.101.72.30 is neither permitted nor denied by best guess record for domain of reply@tgv-europe.es) client-ip=195.101.72.30;&lt;br /&gt;Authentication-Results: mx.google.com; spf=neutral (google.com: 195.101.72.30 is neither permitted nor denied by best guess record for domain of reply@tgv-europe.es) smtp.mail=reply@tgv-europe.es&lt;br /&gt;Date: Thu, 23 Oct 2008 21:23:21 +0200 (MEST)&lt;br /&gt;Message-ID: &lt;e66d574ae6198caf0000011d2b2938d50b37983418b35b88bc2d7633b54781c8@www.tgv-europe.com&gt;&lt;br /&gt;Reply-To: reply@tgv-europe.es&lt;/pre&gt;&lt;table class="BwDhwd"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="zyVlgb XZlFIc"&gt;&lt;table class="BwDhwd"&gt;&lt;tbody&gt;&lt;tr class="UszGxc"&gt;&lt;td class="UdFq5e"&gt;&lt;span class="HcCDpe"&gt;from&lt;/span&gt;&lt;/td&gt;&lt;td colspan="2" class="sA2K5"&gt;&lt;span class="HcCDpe"&gt;&lt;span class="JDpiNd"&gt;&lt;span style="font-weight: bold;"&gt;Unknow sender&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" class="UdFq5e"&gt;&lt;span class="HcCDpe"&gt;reply-to&lt;/span&gt;&lt;/td&gt;&lt;td colspan="2" class="sA2K5"&gt;&lt;span class="HcCDpe"&gt;&lt;span class="JDpiNd"&gt;&lt;img class="QrVm3d" id="upi" name="upi" jid="reply@tgv-europe.es" src="http://mail.google.com/mail/images/cleardot.gif" height="16" width="16" /&gt;&lt;/span&gt;reply@tgv-europe.es&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" class="UdFq5e"&gt;&lt;span class="HcCDpe"&gt;to&lt;/span&gt;&lt;/td&gt;&lt;td colspan="2" class="sA2K5"&gt;&lt;span class="HcCDpe"&gt;&lt;span class="JDpiNd"&gt;&lt;img class="OvtWcf QrVm3d" id="upi" name="upi" jid="jeanmichel.garnier@gmail.com" src="http://mail.google.com/mail/images/cleardot.gif" height="16" width="16" /&gt;&lt;/span&gt;myname@anoymous.com&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" class="UdFq5e"&gt;&lt;span class="HcCDpe"&gt;cc&lt;/span&gt;&lt;/td&gt;&lt;td colspan="2" class="sA2K5"&gt;&lt;span class="HcCDpe"&gt;&lt;span class="JDpiNd"&gt;&lt;img class="QrVm3d" id="upi" name="upi" jid="confirmation@raileurope.com" src="http://mail.google.com/mail/images/cleardot.gif" height="16" width="16" /&gt;&lt;/span&gt;confirmation@raileurope.com&lt;br /&gt;&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" class="UdFq5e"&gt;&lt;span class="HcCDpe"&gt;date&lt;/span&gt;&lt;/td&gt;&lt;td colspan="2" class="sA2K5"&gt;&lt;span class="HcCDpe"&gt;&lt;span class="JDpiNd"&gt;&lt;img src="http://mail.google.com/mail/images/cleardot.gif" height="16" width="16" /&gt;&lt;/span&gt;Thu, Oct 23, 2008 at 7:44 PM&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" class="UdFq5e"&gt;&lt;span class="HcCDpe"&gt;subject&lt;/span&gt;&lt;/td&gt;&lt;td colspan="2" class="sA2K5"&gt;&lt;span class="HcCDpe"&gt;&lt;span class="JDpiNd"&gt;&lt;img src="http://mail.google.com/mail/images/cleardot.gif" height="16" width="16" /&gt;&lt;/span&gt;Confirmación de su pedido&lt;/span&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="4"&gt;&lt;span class="HcCDpe"&gt;&lt;/span&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;td class="i8p5Ld"&gt;&lt;div class="XZlFIc UszGxc"&gt;&lt;span class="D05ws" idlink=""&gt;hide details&lt;/span&gt; &lt;span id=":2" class="rziBod" title="Thu, Oct 23, 2008 at 7:44 PM" alt="Thu, Oct 23, 2008 at 7:44 PM"&gt;Oct 23 (5 days ago)&lt;/span&gt; &lt;span&gt;&lt;/span&gt;&lt;/div&gt;&lt;/td&gt;&lt;td class="i8p5Ld cY8xve"&gt;&lt;div class="JbJ6Ye"&gt;&lt;table class="gQ8wIf" id=":4"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td class="cTzXV LtBCcf t9K9Me" idlink=""&gt;&lt;img class="DC6qBf" src="http://mail.google.com/mail/images/cleardot.gif" /&gt;&lt;/td&gt;&lt;td class="cTzXV t9K9Me" idlink=""&gt;&lt;div class="SvrlRe"&gt;Reply&lt;/div&gt;&lt;/td&gt;&lt;td class="t9K9Me"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td class="tKFvYb tP6gIf t9K9Me"&gt;&lt;img class="S1nudd" src="http://mail.google.com/mail/images/cleardot.gif" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/div&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;div class="utdU2e"&gt;&lt;div class="XwckWe ckChnd"&gt;&lt;b&gt;Images are not displayed.&lt;/b&gt;&lt;br /&gt;&lt;span class="G8gNXb HNy1cb" idlink=""&gt;Display images below&lt;/span&gt; - &lt;span class="dNDeCd HNy1cb" idlink=""&gt;Always display images from &lt;/span&gt;&lt;/div&gt;&lt;/div&gt;&lt;table width="600"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="" title="TGV Europe.com" alt="Logo TGV Europe" /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="" alt="arrondi" /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="" style="width: 15px; height: 1px;" /&gt;&lt;/td&gt;&lt;td&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="601"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;img src="" style="width: 10px; height: 1px;" /&gt;&lt;/td&gt;&lt;td&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="585"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="585"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="bottom" width="422"&gt;Confirmación de su pedido&lt;/td&gt;&lt;td height="26" valign="top" width="163"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top" width="425"&gt;&lt;img src="" height="25" width="1" /&gt;&lt;span&gt;Bienvenido Señor    XXXX&lt;/span&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td height="15"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Usted ha realizado una reserva en nuestro sitio el             23/10/2008 a las  20h44 A continuación le recordamos los detalles :&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="15"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top" width="425"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" width="50"&gt;&lt;img src="" height="19" width="19" /&gt;&lt;/td&gt;&lt;td width="375"&gt;Le recordamos que su equipaje debe llevar etiquetas con su nombre, apellidos y dirección.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="15"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td style="color: rgb(255, 0, 0);"&gt;Para garantizar las salidas TAV en las mejores condiciones, se pide en adelante al conjunto de los viajeros TAV acceder al tren como muy tarde 2 minutos antes de la hora de salida indicada en los billetes.&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="30"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="10" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="center" height="26" valign="middle" width="50"&gt;&lt;img src="" height="21" width="30" /&gt;&lt;/td&gt;&lt;td align="center" width="23"&gt;&lt;img src="" height="23" width="19" /&gt;&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;td width="211"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;  MONTPELLIER&lt;/td&gt;&lt;td&gt;&lt;img src="" /&gt;&lt;/td&gt;&lt;td&gt;LYON&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;td align="right" width="15"&gt;1&lt;/td&gt;&lt;td width="14"&gt;&lt;img src="" height="20" width="14" /&gt;&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;td style="font-size: 15px;" align="right" width="109"&gt;44.00€ &lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="10" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="5" height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td rowspan="5" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="70"&gt;Salida:&lt;/td&gt;&lt;td width="180"&gt;&lt;span&gt;MONTPELLIER&lt;/span&gt;&lt;/td&gt;&lt;td width="35"&gt;&lt;span&gt;13h56&lt;/span&gt;&lt;/td&gt;&lt;td width="35"&gt;&lt;img src="" height="1" width="35" /&gt;&lt;/td&gt;&lt;td width="104"&gt;16/12/2008&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Llegada:&lt;/td&gt;&lt;td&gt;&lt;span&gt;LYON PART DIEU&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;15h50&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="" height="1" width="35" /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td colspan="4"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img src="" /&gt;&lt;/td&gt;&lt;td valign="top"&gt; 06866&lt;/td&gt;&lt;td valign="top"&gt; - Plaza(s) sentada(s) garantizada(s)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="5" height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="6" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="5" height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td rowspan="5" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="70"&gt;Salida:&lt;/td&gt;&lt;td width="180"&gt;&lt;span&gt;LYON PART DIEU&lt;/span&gt;&lt;/td&gt;&lt;td width="35"&gt;&lt;span&gt;11h37&lt;/span&gt;&lt;/td&gt;&lt;td width="35"&gt;&lt;img src="" height="1" width="35" /&gt;&lt;/td&gt;&lt;td width="104"&gt;28/12/2008&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;Llegada:&lt;/td&gt;&lt;td&gt;&lt;span&gt;MONTPELLIER&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;span&gt;13h26&lt;/span&gt;&lt;/td&gt;&lt;td&gt;&lt;img src="" height="1" width="35" /&gt;&lt;/td&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;td colspan="4"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img src="" /&gt;&lt;/td&gt;&lt;td valign="top"&gt; 05113&lt;/td&gt;&lt;td valign="top"&gt; - Plaza(s) sentada(s) garantizada(s)&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="5" height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="6" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="20" width="154"&gt;Referencia -  Nombre asociado :&lt;/td&gt;&lt;td align="center" width="270"&gt;XYZSHIT - XXXX&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td align="center" valign="top" width="50"&gt;&lt;img src="" /&gt;&lt;/td&gt;&lt;td width="5"&gt;&lt;br /&gt;&lt;/td&gt;&lt;td height="30" width="389"&gt;&lt;span style="font-weight: normal;"&gt;El modo de retirada para este billete es:&lt;/span&gt;  &lt;span&gt;&lt;img src="" title="LIVRAISON" alt="IAD_WEB" height="1" width="1" /&gt;EL BILLETE IMPRESO&lt;/span&gt;&lt;/td&gt;&lt;td width="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="4" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="424"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td width="26"&gt;&lt;a href="http://www.tgv-europe.es/dynamic/consult.order?_CMD=searchAfterSaleOrder&amp;amp;ownerName=Garnier&amp;amp;pnrRef=QBJPQB&amp;amp;cmdOnBack=displayAfterSaleSearchForm&amp;amp;_LANG=ES&amp;amp;_AGENCY=VSCE_ES" target="_blank"&gt;&lt;img src="" border="0" /&gt;&lt;/a&gt;&lt;/td&gt;&lt;td width="394"&gt; &lt;a href="http://www.tgv-europe.es/dynamic/consult.order?_CMD=searchAfterSaleOrder&amp;amp;ownerName=Garnier&amp;amp;pnrRef=QBJPQB&amp;amp;cmdOnBack=displayAfterSaleSearchForm&amp;amp;_LANG=ES&amp;amp;_AGENCY=VSCE_ES" target="_blank"&gt;Imprima sus billetes ahora&lt;/a&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td valign="top"&gt;&lt;img src="" height="1" width="2" /&gt;&lt;img src="" /&gt;&lt;/td&gt;&lt;td width="394"&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Usted puede imprimir posteriormente desde la página de inicio :&lt;li&gt;Introduzca luego &lt;span&gt;GARNIER - QBJPQB&lt;/span&gt;to be translated&lt;/li&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td width="294"&gt;&lt;li&gt;Haga clic en el enlace " Imprimir su billete "&lt;/li&gt;&lt;/td&gt;&lt;td align="right" width="100"&gt;&lt;a href="http://www.tgv-europe.com/info_resa/popup/itgv/es/bi_ulterieurement.htm" target="_blank"&gt;Para más información, &lt;/a&gt; &lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;&lt;img src="" height="15" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2"&gt;Para más información práctica sobre el billete impreso, consulte &lt;a href="http://www.tgv-europe.com/info_resa/popup/thalys-gl/es/conditions_utilisation_apresvente.htm" target="_blank"&gt;las condiciones de uso&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;Para cualquier preguntas sobre el billete impreso, escriba a :&lt;a href="http://www.idtgv.com/dynamic/_ContactForm.do?type=setupClaim" target="_blank"&gt;Contacto&lt;/a&gt;.&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;td height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td height="5"&gt;&lt;img src="" height="5" width="1" /&gt;&lt;/td&gt;&lt;td height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="2" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="3" height="20"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;     &lt;table border="0" cellpadding="0" cellspacing="0" width="425"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td colspan="3" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td align="right" height="26" width="315"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;TOTAL&lt;/span&gt; &lt;span&gt;pagado&lt;/span&gt; &lt;/td&gt;&lt;td style="font-size: 15px;" align="right" width="109"&gt;44.00€ &lt;/td&gt;&lt;td height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" height="1"&gt;&lt;img src="" height="1" width="1" /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td colspan="3" height="15"&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;table border="0" cellpadding="0" cellspacing="0" width="100%"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;span&gt;Le agradecemos la confianza que ha depositado en nosotros y le deseamos un buen viaje.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;¡Visite nuestro sitio cuando lo desee!&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;tr&gt;&lt;td&gt;&lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;td width="10"&gt;&lt;img src="" height="1" width="10" /&gt;&lt;/td&gt;&lt;td valign="top" width="150"&gt;                                                                   &lt;br /&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;Bugs:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;The email sender does not appear in gmail: it says "Unknown sender", they pro&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The link "&lt;a href="http://www.idtgv.com/dynamic/_ContactForm.do?type=setupClaim" target="_blank"&gt;Contacto&lt;/a&gt;" (Contact) redirects to an 404 page in the http://www.idtgv.com/. This sound like a copy-paste from their previous work which probably was a copy-paste from &lt;a href="http://voyages-sncf.com/"&gt;http://voyages-sncf.com&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;The most annoying bug is not in the email but in the booking system when you buy a Return ticket. After you have selected a time for the first trip, it won't let you navigate through the different times for the return ... You can't press "back" and changing the time  won't work: it keeps displaying the times for the first trip!!!! At the end, it will take you 30 minutes to buy a ticket ...&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;If someone of the SNCF reads me, please simplify your system!!!! That will save a lot of time and headaches for citizens, sncf employees who sell the tickets and finally for the software engineers who don't write tests!&lt;br /&gt;&lt;br /&gt;At the end of the day, the European decision to push for privatization of  the railways and open it to competitions in 2011 is purely dogmatic. The invisible hand of "free market" will eventually lead  to the melt down of the system .  Even Margaret Thatcher thought privatizing British Rail was off limits ... To be coherent, the European Commission should subsidize more the road and air transport.&lt;br /&gt;&lt;br /&gt;As a an evangelist of automatic unit testing and user acceptance testing, I'd love to to a bit of consulting for them in order to reduce the frustration for millions of citizens, including me.&lt;br /&gt;&lt;br /&gt;As an ecologist, I will swallow my frustration and take the train for traveling in Europe as I did when I went from Barcelona to Amsterdam to attend the Citcon Europe conference.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2690680008387384302?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2690680008387384302/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2690680008387384302' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2690680008387384302'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2690680008387384302'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/10/sncf-225-software-engineers-who-dont.html' title='SNCF: 225 software engineers who don&apos;t write tests!'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4052245290225928939</id><published>2008-10-23T11:30:00.002+02:00</published><updated>2008-10-23T11:39:04.445+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Ubuntu 8.04 xorg.conf for Samsung SyncMaster 2243LNX</title><content type='html'>It took me 20 minutes so I thought I shared my configuration:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;# xorg.conf (xorg X Window System server configuration file)&lt;br /&gt;#&lt;br /&gt;# This file was generated by dexconf, the Debian X Configuration tool, using&lt;br /&gt;# values from the debconf database.&lt;br /&gt;#&lt;br /&gt;# Edit this file with caution, and see the xorg.conf manual page.&lt;br /&gt;# (Type "man xorg.conf" at the shell prompt.)&lt;br /&gt;#&lt;br /&gt;# This file is automatically updated on xserver-xorg package upgrades *only*&lt;br /&gt;# if it has not been modified since the last upgrade of the xserver-xorg&lt;br /&gt;# package.&lt;br /&gt;#&lt;br /&gt;# If you have edited this file but would like it to be automatically updated&lt;br /&gt;# again, run the following command:&lt;br /&gt;#   sudo dpkg-reconfigure -phigh xserver-xorg&lt;br /&gt;&lt;br /&gt;Section "Files"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;    Identifier    "Generic Keyboard"&lt;br /&gt;    Driver        "kbd"&lt;br /&gt;    Option        "CoreKeyboard"&lt;br /&gt;    Option        "XkbRules"    "xorg"&lt;br /&gt;    Option        "XkbModel"    "pc104"&lt;br /&gt;    Option        "XkbLayout"    "us"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;    Identifier    "Configured Mouse"&lt;br /&gt;    Driver        "mouse"&lt;br /&gt;    Option        "CorePointer"&lt;br /&gt;    Option        "Device"        "/dev/input/mice"&lt;br /&gt;    Option        "Protocol"        "ImPS/2"&lt;br /&gt;    Option        "ZAxisMapping"        "4 5"&lt;br /&gt;    Option        "Emulate3Buttons"    "true"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "InputDevice"&lt;br /&gt;    Identifier    "Synaptics Touchpad"&lt;br /&gt;    Driver        "synaptics"&lt;br /&gt;    Option        "SendCoreEvents"    "true"&lt;br /&gt;    Option        "Device"        "/dev/psaux"&lt;br /&gt;    Option        "Protocol"        "auto-dev"&lt;br /&gt;    Option        "HorizEdgeScroll"    "0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Device"&lt;br /&gt;    Identifier    "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"&lt;br /&gt;    Driver        "intel"&lt;br /&gt;    BusID        "PCI:0:2:0"&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Monitor"&lt;br /&gt;    Option "DPMS"&lt;br /&gt;    Identifier "Samsung2243LNX"&lt;br /&gt;    VendorName "Samsung"&lt;br /&gt;    ModelName "SyncMaster 2243LNX"&lt;br /&gt;    HorizSync 31.4 - 80.0&lt;br /&gt;    VertRefresh 56.000 - 75.000&lt;br /&gt;    Modeline "1680x1050" 146.25 1680 1784 1960 2240 1050 1053 1059 1089&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "Screen"&lt;br /&gt;    Identifier    "Default Screen"&lt;br /&gt;    Device        "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"&lt;br /&gt;    Monitor        "Samsung2243LNX"&lt;br /&gt;    DefaultDepth    24&lt;br /&gt;    SubSection "Display"&lt;br /&gt;        Depth 24&lt;br /&gt;        Modes "1680x1050" "1600x1200" "1440x1440" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480"&lt;br /&gt;                Virtual         2960 1050&lt;br /&gt;    EndSubSection&lt;br /&gt;EndSection&lt;br /&gt;&lt;br /&gt;Section "ServerLayout"&lt;br /&gt;    Identifier    "Default Layout"&lt;br /&gt;    Screen        "Default Screen"&lt;br /&gt;    InputDevice    "Generic Keyboard"&lt;br /&gt;    InputDevice    "Configured Mouse"&lt;br /&gt;&lt;br /&gt;    InputDevice    "Synaptics Touchpad"&lt;br /&gt;EndSection&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;For more details, please check out another post I wrote about setting up a &lt;a href="http://21croissants.blogspot.com/2008/01/dual-screen-on-ubuntu-gutsy-with.html"&gt;Dual screen on Ubuntu Gutsy with Toshiba laptop Intel 945&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4052245290225928939?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4052245290225928939/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4052245290225928939' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4052245290225928939'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4052245290225928939'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/10/ubuntu-804-xorgconf-for-samsung.html' title='Ubuntu 8.04 xorg.conf for Samsung SyncMaster 2243LNX'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8697129003087058530</id><published>2008-10-20T13:37:00.002+02:00</published><updated>2008-10-20T13:43:59.106+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Selenium on ubuntu hardy 8.04</title><content type='html'>The upgrade to ubuntu hardy went very smooth but unfortunately, a few softwares were broken and among them selenium remote control, which was unable to launch firefox.&lt;br /&gt;&lt;br /&gt;Here is a list of commands inspired from a &lt;a href="http://agentzh.blogspot.com/2007/07/setting-up-selenium-on-ubuntu-feisty.html"&gt;chinese blog&lt;/a&gt; I used to fix it by running firefox 2:&lt;br /&gt;&lt;br /&gt;Re-install firefox 2:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;apt-get install firefox-2&lt;br /&gt;&lt;/code&gt;&lt;code&gt;&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;Selenum server  firefox-bin, so let's visible in our PATH:&lt;br /&gt;&lt;pre&gt;&lt;code&gt;sudo ln -s /usr/lib/firefox/firefox-2-bin /usr/local/bin/firefox-bin&lt;/code&gt;&lt;/pre&gt; sudo ln -s /usr/lib/firefox/firefox-bin /usr/bin/&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Also, firefox-bin needs some shared library, and we need to tell the system where those libraries are by adding the following line to /etc/ld.so.conf&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace;"&gt;   /usr/lib/firefox&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;Then running the following command to update the .conf setting:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    $ sudo ldconfig&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;If we don't update ld's configuration, we will probably get the following error while running firefox-bin:&lt;br /&gt;&lt;br /&gt;&lt;span style="font-family: courier new,monospace;"&gt;    /usr/lib/firefox/firefox-bin: error while loading shared libraries: libmozjs.so: cannot open shared object file: No such file or directory&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8697129003087058530?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8697129003087058530/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8697129003087058530' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8697129003087058530'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8697129003087058530'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/10/selenium-on-ubuntu-hardy-804.html' title='Selenium on ubuntu hardy 8.04'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-9000543592230616032</id><published>2008-10-20T12:38:00.001+02:00</published><updated>2008-10-20T12:40:59.297+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>libMagick.so.9: cannot open shared object file: No such file or directory</title><content type='html'>&lt;blockquote&gt;/usr/lib/ruby/gems/1.8/gems/rmagick-1.15.10/lib/RMagick.so: libMagick.so.9: cannot open shared object file: No such file or directory - /usr/lib/ruby/gems/1.8/gems/rmagick-1.15.10/lib/RMagick.so (LoadError)&lt;/blockquote&gt;&lt;br /&gt;This problem happenned after I updated Ubuntu to 8.0.4 and Ruby to ruby 1.8.6 (2007-09-24 patchlevel 111) [i486-linux].&lt;br /&gt;&lt;br /&gt;Very simple solution: update to the latest version of rmagick!&lt;br /&gt;&lt;blockquote&gt;sudo gem update rmagick&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-9000543592230616032?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/9000543592230616032/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=9000543592230616032' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/9000543592230616032'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/9000543592230616032'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/10/libmagickso9-cannot-open-shared-object.html' title='libMagick.so.9: cannot open shared object file: No such file or directory'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6670700933497154423</id><published>2008-10-06T14:54:00.005+02:00</published><updated>2008-10-06T16:34:57.353+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>citcon Barcelona 2009?</title><content type='html'>On Saturday 4th of October 2008, the participants of the &lt;a href="http://citconf.com/amsterdam2008/"&gt;Continuous Integration and Testing Amsterdam 2008 conference&lt;/a&gt; voted at a large majority for Barcelona to hold the conference next year.&lt;br /&gt;&lt;br /&gt;I think this is going to be a challenge for the following reasons:&lt;br /&gt;&lt;ol&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Language.&lt;/span&gt; Spanish people have a poor command of English - as bad as French people - which might limit the communication and especially the affluence. Nearly half of the people in Amsterdam came from the NL! Despite my 2 years in London, I found it hard to follow native english speakers at citcon 2008...&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Agile Community&lt;/span&gt;. Does it exist in Barcelona? I don't think it does. There was no one from Spain at citcon 2008. When I worked for a spanish company, developers did not value or practice testing and Continuous Integration (especially the architects ;-) I would not expect any support neither sponsoring from spanish companies. For example, onlu 20 job offers out of 2812 contain the keyword "junit" in the main&lt;a href="http://www.infojobs.net"&gt; spanish job site&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Venue&lt;/span&gt;. Barcelona holds hundreds of conferences every year so it might be an hard time to find a free venue such as in IBM Amsterdam.&lt;br /&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="font-weight: bold;"&gt;Barcelona hype&lt;/span&gt;. Barcelona has been very good in the last 15 years to promote an image of "cool" city worldwide. It spends 74 000 000 € each year to promote its image and it has done well so far as the city is always packed with tourists and lots of people would love to live there (and earn a &lt;a href="http://www.cafebabel.com/eng/article/2564/the-1-000-euros-a-month-club.html"&gt;decent&lt;/a&gt; salary). Life is more expensive in Barcelona than most of medium size french cities and it's hard to find good and cheap accomodation if you don't book in advance.&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;As far as I am concerned, I'd suggest Berlin. It is is also a cool city, much cheaper than Barcelona and with lots of agile geeks ;-)&lt;br /&gt;&lt;br /&gt;Spanish people, please prove me I am wrong and &lt;a href="http://citconf.com/contact.php"&gt;contact the organizers&lt;/a&gt; to help!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6670700933497154423?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6670700933497154423/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6670700933497154423' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6670700933497154423'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6670700933497154423'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/10/citcon-barcelona-2009.html' title='citcon Barcelona 2009?'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2289020561642798921</id><published>2008-10-06T12:52:00.003+02:00</published><updated>2008-10-06T14:51:18.092+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='agile'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>Back from citcon amsterdam 2008</title><content type='html'>I am back from the  citcon amsterdam 2008 conference and I have to say one word:&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold; color: rgb(51, 204, 0);font-size:180%;" &gt;WOW!&lt;/span&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;I really liked the &lt;a href="http://citconf.com/amsterdam2008/"&gt;citcon conference&lt;/a&gt;, the people and the organization:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;it's a free conference, it's on Friday evening and Saturday so the people who show up are really passionate about the subject: Testing and Continuous Integration&lt;br /&gt;&lt;/li&gt;&lt;li&gt;They got so many sponsors and the venue was great, thanks IBM. However, 2 t-shirts might be a bit too much, I am looking forward to seeing a sustainable approach to goodies left by the sponsors ;-)&lt;br /&gt;&lt;/li&gt;&lt;li&gt;There so much time (+ beers &amp;amp; tapas) to socialize so you could talk to almost everybody. All the conferences should be like citcon! web 2.0 social networks are a waste of time, you meet the real people face to face !&lt;/li&gt;&lt;li&gt;The planning was decided on site with a lot of people proposing some sessions, everybody voting and everybody changing the time slots. This collective intelligence appeared a bit chaotic but the end result is astonishing&lt;br /&gt;&lt;/li&gt;&lt;li&gt;Special cheers to PJ and &lt;a href="http://blog.jeffreyfredrick.com/"&gt;Jeff&lt;/a&gt; who moderate the conference.&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;It's a shame they were too many tracks on parallel and you had to make some choices. I am going to add my notes to the &lt;a href="http://citconf.com/wiki/index.php?title=CITCONEurope2008Sessions"&gt;wiki&lt;/a&gt; of the conference.&lt;br /&gt;&lt;br /&gt;I have particpated to 2 sessions:&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_638661"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/garnierjm/fast-web-acceptance-testing-with-seleniumgrid-presentation?type=powerpoint" title="Fast web acceptance testing with selenium-grid"&gt;Fast web acceptance testing with selenium-grid&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-013866525503764304 visible ontop" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=fast-web-acceptance-testing-with-seleniumgrid-1223292103894172-9&amp;amp;stripped_title=fast-web-acceptance-testing-with-seleniumgrid-presentation"&gt;&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=fast-web-acceptance-testing-with-seleniumgrid-1223292103894172-9&amp;amp;stripped_title=fast-web-acceptance-testing-with-seleniumgrid-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=fast-web-acceptance-testing-with-seleniumgrid-1223292103894172-9&amp;amp;stripped_title=fast-web-acceptance-testing-with-seleniumgrid-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/garnierjm/fast-web-acceptance-testing-with-seleniumgrid-presentation?type=powerpoint" title="View Fast web acceptance testing with selenium-grid on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/citcon"&gt;citcon&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/2008"&gt;2008&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_638644"&gt;&lt;a style="margin: 12px 0pt 3px; font-family: Helvetica,Arial,Sans-serif; font-style: normal; font-variant: normal; font-weight: normal; font-size: 14px; line-height: normal; font-size-adjust: none; font-stretch: normal; display: block; text-decoration: underline;" href="http://www.slideshare.net/garnierjm/user-acceptance-testing-driven-by-humans-telling-stories-with-rspec-presentation?type=powerpoint" title="User Acceptance Testing Driven by Humans telling Stories (with RSpec)"&gt;User Acceptance Testing Driven by Humans telling Stories (with RSpec)&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-013866525503764304 visible ontop" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=user-acceptance-testing-driven-by-humans-with-rspec-1223291184765470-8&amp;amp;stripped_title=user-acceptance-testing-driven-by-humans-telling-stories-with-rspec-presentation"&gt;&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=user-acceptance-testing-driven-by-humans-with-rspec-1223291184765470-8&amp;amp;stripped_title=user-acceptance-testing-driven-by-humans-telling-stories-with-rspec-presentation"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=user-acceptance-testing-driven-by-humans-with-rspec-1223291184765470-8&amp;amp;stripped_title=user-acceptance-testing-driven-by-humans-telling-stories-with-rspec-presentation" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/garnierjm/user-acceptance-testing-driven-by-humans-telling-stories-with-rspec-presentation?type=powerpoint" title="View User Acceptance Testing Driven by Humans telling Stories (with RSpec) on SlideShare"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration: underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/citcon"&gt;citcon&lt;/a&gt; &lt;a style="text-decoration: underline;" href="http://slideshare.net/tag/2008"&gt;2008&lt;/a&gt;)&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;Later today, I will post another article into my blog to express what I think about organizing the conference in Barcelona !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2289020561642798921?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2289020561642798921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2289020561642798921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2289020561642798921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2289020561642798921'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/10/back-from-citcon-amsterdam-2008.html' title='Back from citcon amsterdam 2008'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8610873766258401951</id><published>2008-09-12T13:07:00.005+02:00</published><updated>2008-09-12T14:11:07.357+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ajax'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Using the MootTools AutoCompleter with Rails 2.x</title><content type='html'>Rails 2.x  has &lt;a href="http://ryandaigle.com/articles/2007/9/24/what-s-new-in-edge-rails-better-cross-site-request-forging-prevention"&gt;cross site request forging prevention feature&lt;/a&gt;. By defautl, all non-GET requests will be checked with a session token field to all forms.&lt;br /&gt;&lt;br /&gt;As the MootTools AutoCompleter uses 'POST' requests by default, you will run into the following problem:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;Processing TypusExtrasController#autocomplete_place (for 127.0.0.1 at 2008-09-12 13:02:30) [POST]&lt;br /&gt;Session ID: BAh7DToMdXNlcl9pZGkEde1AOjoMY2l0eV9pZGkGOgljaXR5Ig5iYXJjZWxv&lt;br /&gt;cHVzaQY=--d44a8439a97a5da236cea2f22dceb239456a3ed1&lt;br /&gt;Parameters: {"action"=&gt;"autocomplete_place", "value"=&gt;"A", "controller"=&gt;"typus_extras", "model"=&gt;"places"}&lt;br /&gt;&lt;br /&gt;ActionController::InvalidAuthenticityToken (ActionController::InvalidAuthenticityToken):&lt;br /&gt;  /usr/lib/ruby/gems/1.8/gems/actionpack-2.1.1/lib/action_controller/request_forgery_protection.rb:86:in `verify_authenticity_token'&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The solution is add a parameter to the javascript of the Autocompleter so it uses 'GET' requests instead:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="javascript"&gt;&lt;br /&gt;var completer = new Autocompleter.Ajax.Json(el, '/admin/places/autocomplete_place', {&lt;br /&gt;  minLength: 1,&lt;br /&gt;                      ajaxOptions: {method: 'get'}&lt;br /&gt;...&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8610873766258401951?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8610873766258401951/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8610873766258401951' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8610873766258401951'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8610873766258401951'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/09/using-moottools-autocompleter-with.html' title='Using the MootTools AutoCompleter with Rails 2.x'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1880855642795235853</id><published>2008-09-10T12:09:00.005+02:00</published><updated>2008-09-10T12:50:04.192+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='hacks'/><title type='text'>Loquo.com sucks &amp; Yahoo!Pipes rocks!</title><content type='html'>&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_0"&gt;loquo&lt;/span&gt;.com is definitely the main ads service in Barcelona (Spain?) . If you want to find a &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_1"&gt;flatshare&lt;/span&gt; (people willing to live in Barcelona can't afford to leave on their own or buy a property until the house market completes its &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_2"&gt;explosion&lt;/span&gt;), something second hand, this is the place to go!&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_3"&gt;loquo&lt;/span&gt;.com sucks. I am not talking about its old school user interface ... &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_4"&gt;At&lt;/span&gt; the end of the day, what's matter most in an 'ads' website is to find what you're looking for !!!&lt;br /&gt;&lt;br /&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_5"&gt;loquo&lt;/span&gt; does not have any kind of advanced search:&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;img alt="The image “http://lh4.ggpht.com/jeanmichel.garnier/SMefBJr8b1I/AAAAAAAABFg/dZmTpla4EWM/alquiler%20de%20habitaci%C3%B3n%20Barcelona%20%7C%20vivienda%20%7C%20Loquo%20Barcelona.png” cannot be displayed, because it contains errors." src="http://lh4.ggpht.com/jeanmichel.garnier/SMefBJr8b1I/AAAAAAAABFg/dZmTpla4EWM/alquiler%20de%20habitaci%C3%B3n%20Barcelona%20%7C%20vivienda%20%7C%20Loquo%20Barcelona.png" /&gt;&lt;br /&gt;&lt;br /&gt;You can't filter anything. Most of the ads specify "only girls", so if you're a guy you'll have to read these hundreds of "solo &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_6"&gt;chicas&lt;/span&gt;" ads. You can't filter by area or anything in the description.&lt;br /&gt;&lt;br /&gt;By contrast, &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_7"&gt;London&lt;/span&gt; based and free service &lt;a href="http://www.moveflat.com/"&gt;&lt;span class="blsp-spelling-error" id="SPELLING_ERROR_8"&gt;moveflat&lt;/span&gt;.com&lt;/a&gt; offers the most useful search filters "ever ever":&lt;br /&gt;&lt;span style="text-decoration: underline;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;img style="width: 885px; height: 327px;" alt="The image “http://lh6.ggpht.com/jeanmichel.garnier/SMefqgjo_oI/AAAAAAAABFo/fjg8q8DMqiw/London%20flatshare.png” cannot be displayed, because it contains errors." src="http://lh6.ggpht.com/jeanmichel.garnier/SMefqgjo_oI/AAAAAAAABFo/fjg8q8DMqiw/London%20flatshare.png" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another problems is the &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_9"&gt;repetition&lt;/span&gt; of ads. Adding an add is free so most people add their add many times to make sure they appear at the top of the search results. &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_10"&gt;Loquo&lt;/span&gt; displays the results order by date of publishing and you can't change the order ...&lt;br /&gt;&lt;br /&gt;Fortunately, Yahoo! pipes rocks and will help us to filter &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_11"&gt;loquo&lt;/span&gt; search results using the &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_12"&gt;RSS&lt;/span&gt; feeds. I have created a &lt;a href="http://pipes.yahoo.com/pipes/pipe.info?_id=ec3c706a70de42fe138569d84afae4c3"&gt;pipe&lt;/a&gt; you can tweak to adapt it to your needs. Here is an example of the output for 'a monitor OR &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_13"&gt;pantalla&lt;/span&gt; OR LCD with price&lt;= 150€:  &lt;script src="http://pipes.yahoo.com/js/listbadge.js"&gt;{"pipe_id":"ec3c706a70de42fe138569d84afae4c3","_btype":"list","pipe_params":{"maximum_price":"150"}}&lt;/script&gt;&lt;br /&gt;&lt;br /&gt;The fact that &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_14"&gt;loquo&lt;/span&gt; was bought by &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_15"&gt;ebay&lt;/span&gt; and since then no major feature was added tends to &lt;span class="blsp-spelling-corrected" id="SPELLING_ERROR_16"&gt;comfort&lt;/span&gt; me in my opinion that innovation comes mainly from the small guys. The creators probably got some money and left ...&lt;br /&gt;&lt;br /&gt;Once again, the contrast is huge with &lt;span class="blsp-spelling-error" id="SPELLING_ERROR_17"&gt;moveflat&lt;/span&gt;.com created by an &lt;a href="http://moveflat.com/cgi-bin/Free.asp"&gt;amateur&lt;/a&gt; who does not make money of it and did it for the sake of doing things well and help other people ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1880855642795235853?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1880855642795235853/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1880855642795235853' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1880855642795235853'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1880855642795235853'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/09/loquocom-sucks-yahoopipes-rocks.html' title='Loquo.com sucks &amp; Yahoo!Pipes rocks!'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh4.ggpht.com/jeanmichel.garnier/SMefBJr8b1I/AAAAAAAABFg/dZmTpla4EWM/s72-c/alquiler%20de%20habitaci%C3%B3n%20Barcelona%20%7C%20vivienda%20%7C%20Loquo%20Barcelona.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7620873057003567362</id><published>2008-09-09T11:40:00.003+02:00</published><updated>2008-09-09T11:49:25.166+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>has_many_polymorphs regression after the upgrade to Rails 2.1.1</title><content type='html'>vendor/plugins/has_many_polymorphs/lib/has_many_polymorphs/dependencies.rb:8: Dependencies is not a module (TypeError)&lt;br /&gt;&lt;br /&gt;This is dued to a Rails 2.1.1 refactoring in the location of the ActiveSupport::Dependencies module.&lt;br /&gt;Copy paste  the following code to your /has_many_polymorphs/lib/has_many_polymorphs/dependencies.rb to fix the problem:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;module ActiveSupport&lt;br /&gt;  module Dependencies&lt;br /&gt;    &lt;br /&gt;    mattr_accessor :injection_graph&lt;br /&gt;    self.injection_graph = Hash.new([])&lt;br /&gt;&lt;br /&gt;    # Add a dependency for this target.&lt;br /&gt;    def inject_dependency(target, *requirements)&lt;br /&gt;      target, requirements = target.to_s, requirements.map(&amp;:to_s)    &lt;br /&gt;      injection_graph[target] = ((injection_graph[target] + requirements).uniq - [target])&lt;br /&gt;      requirements.each {|requirement| mark_for_unload requirement }&lt;br /&gt;      _logger_debug "injection graph: #{injection_graph.inspect}" if Dependencies.log_activity&lt;br /&gt;    end&lt;br /&gt;&lt;br /&gt;    # Make sure any dependent constants of the constants added by &lt;tt&gt;yield&lt;/tt&gt; are reloaded.&lt;br /&gt;    def new_constants_in_with_injection(*descs, &amp;block) # chain&lt;br /&gt;&lt;br /&gt;      if Dependencies.log_activity&lt;br /&gt;        _logger_debug "autoloaded constants: #{autoloaded_constants.inspect}"&lt;br /&gt;        _logger_debug "explicitly unloadable constants: #{explicitly_unloadable_constants.inspect}" &lt;br /&gt;      end&lt;br /&gt;    &lt;br /&gt;      returning(new_constants_in_without_injection(*descs, &amp;block)) do |found|&lt;br /&gt;        _logger_debug "new constants: #{found.inspect}" if Dependencies.log_activity and found.any?&lt;br /&gt;        found.each do |constant|&lt;br /&gt;          injection_graph[constant].each do |requirement| &lt;br /&gt;            requirement.constantize&lt;br /&gt;            _logger_debug "constantized #{requirement}" if Dependencies.log_activity&lt;br /&gt;          end&lt;br /&gt;        end    &lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;    alias_method_chain :new_constants_in, :injection&lt;br /&gt;   &lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;I am using the plugin has_many_polymorphs to manage tags in languages. An event has a category which is in reality a tag we translate in 7 languages ...&lt;br /&gt;&lt;br /&gt;I inherited this plugin from the previous developper and I am looking forward to replace it by acts_as_taggable_on_steroids !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7620873057003567362?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7620873057003567362/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7620873057003567362' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7620873057003567362'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7620873057003567362'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/09/hasmanypolymorphs-regression-after.html' title='has_many_polymorphs regression after the upgrade to Rails 2.1.1'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1826262266356139089</id><published>2008-09-08T18:48:00.005+02:00</published><updated>2008-09-09T11:16:13.556+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>stack level too deep bug with Rails 2.1 &amp; will_paginate plugin</title><content type='html'>To live on the cutting edge of open source web frameworks (like Rails) is sometimes dangerous. How many times you have been slowed by some kind of regressions just after an upgrade to the latest version of a dependency?&lt;br /&gt;&lt;br /&gt;The problem I have solved today happened with Rails 2.1.1  and a "version" of the  will_paginate plugin I installed in May 2008.&lt;br /&gt;&lt;br /&gt;Here is an extract of the stacktrace so  google can index the information which will help other people to solve this problem quicker than I did ;-)&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;SystemStackError: stack level too deep&lt;br /&gt;  vendor/plugins/will_paginate/lib/will_paginate/finder.rb:92:in `method_missing_without_paginate'&lt;br /&gt;   vendor/plugins/will_paginate/lib/will_paginate/finder.rb:93:in `method_missing'&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;Googling "Rails 2.1 acts_as_taggable"", I found in a &lt;a href="http://www.gleisarbeiter.de/?p=48"&gt;german blog&lt;/a&gt; the solution:&lt;br /&gt;&lt;br /&gt;&lt;p&gt;As I also use the will_paginate plugin and there are known &lt;b&gt;stack level too depp&lt;/b&gt; problems with the old version of it, I tried to &lt;a href="http://blog.smartlogicsolutions.com/2008/06/03/error-in-will_paginate-gem-running-rails-2.1/" title="Error in will paginate gem running Rails 2.1" rel="nofollow"&gt;change it&lt;/a&gt; for the “Mislav” version of will_paginate and it solved the problem!&lt;/p&gt;will_paginate is now on github: &lt;a href="http://github.com/mislav/will_paginate/tree/master"&gt;http://github.com/mislav/will_paginate/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To conclude, we should always try to specify the version of the dependencies through Rails 2.1.x sytem or the more mature &lt;a href="http://geminstaller.rubyforge.org/"&gt;gemsintaller,&lt;/a&gt; which has a better spec coverage.&lt;br /&gt;&lt;br /&gt;To solve the problem of  plugins stability , I am dreaming about a Continuous Integration farm of &lt;a href="http://cruisecontrolrb.thoughtworks.com/"&gt;CruiseControl.rb&lt;/a&gt; running different versions of Rails and testing with &lt;a href="http://seleniumgrid.thoughtworks.com/"&gt;selenium-grid&lt;/a&gt; the plugins ...&lt;br /&gt;&lt;br /&gt;This would increase a *lot* the productivity of the Rails community, the plugins which would pass the tests of the "Farm" could be stamped "enterprise" ;-)&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1826262266356139089?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1826262266356139089/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1826262266356139089' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1826262266356139089'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1826262266356139089'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/09/stack-level-too-deep-bug-with-rails-21.html' title='stack level too deep bug with Rails 2.1 &amp; will_paginate plugin'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5765565857862278807</id><published>2008-09-04T10:14:00.004+02:00</published><updated>2008-09-04T10:25:11.101+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='spain'/><title type='text'>Do not host your sites in Piensa Solutions</title><content type='html'>September 2008: euro is very strong and dollar weak, which makes hosting of web sites very cheap in the US. Anyway, for Rails hosting, the offer is very limited in Europe ...&lt;br /&gt;&lt;br /&gt;Even if the cost of the service is important, what's matter most for a web site hosting is the quality of of the service and especially the response time and skills of the help desk.&lt;br /&gt;&lt;br /&gt;Let me tell a story about &lt;a href="http://www.piensasolutions.es/"&gt;Piensa Solutions&lt;/a&gt;. Some I know had an important web site hosted by them, theychose them because they claim 33 000 customers with 150 000 hosted sites.&lt;br /&gt;&lt;br /&gt;Because of a mistake of their billing departement, they decided to "stop" their server  without any warning and they needed more than 2 hours to reply. This is the email they sent:&lt;br /&gt;&lt;br /&gt;&lt;table style="margin-bottom: 15px;" align="center" border="0" cellpadding="0" cellspacing="0" width="582"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td style="border-bottom: 2px solid rgb(14, 4, 125);" align="right"&gt;&lt;a style="color: rgb(14, 4, 125);" href="http://www.piensasolutions.com/" target="_blank"&gt;&lt;img alt="Piensa Solutions" src="http://mail.google.com/mail/?ui=2&amp;amp;ik=44db2f4c39&amp;amp;attid=0.2&amp;amp;disp=emb&amp;amp;view=att&amp;amp;th=11c2c5860b50557a" border="0" height="55" width="45" /&gt;&lt;/a&gt;&lt;/td&gt;       &lt;/tr&gt;       &lt;tr&gt;         &lt;td   style="border-bottom: 2px solid rgb(0, 0, 0); padding: 15px 0px 10px; color: rgb(0, 0, 0); text-align: justify;font-family:Verdana,Arial,Helvetica,sans-serif;font-size:11px;" colspan="2"&gt;         &lt;p&gt;&lt;span style="font-size:85%;"&gt;Estimado cliente:&lt;/span&gt;&lt;/p&gt;         &lt;span style="font-size:85%;"&gt;Te informamos que en estos momentos tu hosting se encuentras cortado por impago ya que tiene pendiente una factura asociada al servicio, la X****. En el momento en que se abone dicha factura, a lo largo del día se reactivarán los servicios de tu alojamiento.&lt;br /&gt;       &lt;/span&gt;         &lt;p&gt;&lt;span style="font-size:85%;"&gt;Estamos a tu disposición para cualquier consulta o aclaración al respecto. &lt;/span&gt;&lt;/p&gt;         &lt;p&gt;&lt;span style="font-size:85%;"&gt;Un saludo,&lt;/span&gt;&lt;/p&gt;         &lt;p align="left"&gt;&lt;span style="font-size:85%;"&gt;--&lt;br /&gt;Facturación - &lt;span style="color: rgb(0, 0, 128);"&gt;&lt;strong&gt;Piensa Solutions&lt;/strong&gt;&lt;/span&gt;&lt;br /&gt;       &lt;a style="text-decoration: none;" href="mailto:soporte@piensasolutions.com" target="_blank"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;facturacion&lt;/span&gt;&lt;/a&gt;&lt;a style="text-decoration: none;" href="mailto:facturacion@piensasolutions.com" target="_blank"&gt;&lt;span style="color: rgb(0, 0, 0);"&gt;@piensasolutions.&lt;wbr&gt;com&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;       &lt;a href="http://www.piensasolutions.com/" target="_blank"&gt;&lt;span style="color: rgb(0, 0, 128);"&gt;www.piensasolutions.com&lt;/span&gt;&lt;/a&gt;&lt;/span&gt;&lt;/p&gt;         &lt;/td&gt;       &lt;/tr&gt;       &lt;tr&gt;         &lt;td style="padding: 0px;" colspan="2"&gt;         &lt;p style="font-size: 9px; color: rgb(88, 89, 90); padding-top: 5px; font-family: Verdana,Arial,Helvetica,sans-serif;"&gt;&lt;strong&gt;AVISO LEGAL&lt;/strong&gt;&lt;br /&gt;Este mensaje y sus ficheros adjuntos tienen carácter privado y confidencial y van dirigidos exclusivamente a sus destinatarios. Si ha recibido este mensaje por error, no debe &lt;span style="font-weight: bold;"&gt;revelarlo,&lt;/span&gt; copiarlo o distribuirlo en ningún sentido sin previo consentimiento por escrito de Piensa Solutions. Rogamos lo comunique al remitente y elimine dicho mensaje y cualquier documento adjunto que pudiera contener. De no hacerlo así puede vulnerar la legislación vigente.&lt;/p&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;Basicly, they say that:&lt;br /&gt;&lt;br /&gt;"You did not pay a bill so we cut your service" ...&lt;br /&gt;&lt;br /&gt;NO COMMENTS!!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5765565857862278807?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5765565857862278807/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5765565857862278807' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5765565857862278807'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5765565857862278807'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/09/do-not-host-your-sites-in-piensa.html' title='Do not host your sites in Piensa Solutions'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4941321809791757236</id><published>2008-08-01T16:19:00.002+02:00</published><updated>2008-08-01T16:31:09.520+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='SQlite'/><title type='text'>SQlite3::SQLException: SQL logic error or missing database</title><content type='html'>SQlite3 errors messages are not very clear ...&lt;br /&gt;&lt;br /&gt;"SQlite3::SQLException: SQL logic error or missing database" when inserting should be translated by:&lt;br /&gt;"Invalid id, there is alreay a record in the table with the same id"&lt;br /&gt;&lt;br /&gt;In general, we waste a lot of time because libraries authors focus on the "successfull" cases and can't think of all the cases where things can go wrong ...&lt;br /&gt;&lt;br /&gt;To play on the safe side, we could try to adopt a &lt;a href="http://en.wikipedia.org/wiki/Defensive_programming"&gt;defensive programming&lt;/a&gt; style and start to write tests (specs) of things which can can fail ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4941321809791757236?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4941321809791757236/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4941321809791757236' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4941321809791757236'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4941321809791757236'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/08/sqlite3sqlexception-sql-logic-error-or.html' title='SQlite3::SQLException: SQL logic error or missing database'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5745425719481478765</id><published>2008-08-01T13:30:00.004+02:00</published><updated>2008-08-01T16:41:16.539+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>ActiveRecord find method is quite flexible</title><content type='html'>Every day,  a new discovery about a Rails feature :-)&lt;br /&gt;&lt;br /&gt;It sounds like the "find" methods is not too picky about its parameter, if given a string instead of an integer, it will the find the record anyway. I wonder if the author of this code knew about it ...&lt;br /&gt;&lt;br /&gt;Event.find("7476-taranna")&lt;br /&gt;=&gt; #Event id: 7476, name: "Tarannà", place_id: 484, ...&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update:&lt;/span&gt;&lt;br /&gt;After Marius' comment, I googled a bit and found a &lt;a href="http://www.jroller.com/obie/entry/seo_optimization_of_urls_in"&gt;post by Obie Fernandez&lt;/a&gt; which explains the whole thing in details ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5745425719481478765?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5745425719481478765/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5745425719481478765' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5745425719481478765'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5745425719481478765'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/08/activerecord-find-method-is-quite.html' title='ActiveRecord find method is quite flexible'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5232816609926924414</id><published>2008-07-31T16:29:00.002+02:00</published><updated>2008-07-31T16:36:08.074+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>attr_accessible</title><content type='html'>If you use the  new &lt;span class="fixed_width"  style="font-family:Courier, Monospaced;"&gt;&lt;a href="http://github.com/technoweenie/restful-authentication/tree"&gt;'restful_authentication'&lt;/a&gt; plugin, you might have problems to update your User attributes:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;WARNING: Can't mass-assign these protected attributes: uploaded_data, display_name, first_name, last_name&lt;/blockquote&gt;&lt;br /&gt;The solution is to add these attributes in your User model with &lt;/span&gt;&lt;span class="fixed_width"  style="font-family:Courier, Monospaced;"&gt;attr_accessible:&lt;/span&gt;&lt;br /&gt;&lt;span class="fixed_width"  style="font-family:Courier, Monospaced;"&gt;&lt;br /&gt;&lt;blockquote&gt;# HACK HACK HACK -- how to do attr_accessible from here?&lt;br /&gt;  # prevents a user from submitting a crafted form that bypasses activation&lt;br /&gt;  # anything else you want your user to change should be added here.&lt;br /&gt;  attr_accessible :login, :email, :password, :password_confirmation,&lt;br /&gt;          :first_name,&lt;br /&gt;          :last_name,&lt;br /&gt;          :display_name,&lt;br /&gt;          :uploaded_data&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="fixed_width"  style="font-family:Courier, Monospaced;"&gt;attr_accessible s&lt;/span&gt;pecifies a white list of model attributes that can be set via# mass-assignment, such as update_attributes(attributes)&lt;br /&gt;&lt;br /&gt;Thanks to this Frederick Cheung who explained it in the &lt;a href="http://groups.google.com/group/rubyonrails-talk/browse_thread/thread/fe5263558f73a514?fwc=1"&gt;Rails mailing list&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5232816609926924414?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5232816609926924414/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5232816609926924414' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5232816609926924414'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5232816609926924414'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/07/attraccessible.html' title='attr_accessible'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6468529461559164533</id><published>2008-07-29T10:58:00.003+02:00</published><updated>2008-07-29T11:06:40.065+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Install a plugin on a svn Rails 2.1.0 app from github</title><content type='html'>&lt;pre&gt;I am still using subversion (shame!) but now more and more plugins are hosted on github ...&lt;br /&gt;To install a plugin with this configuration, you'll need the following commands:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;cd vendor/plugins&lt;br /&gt;git clone git://github.com/dchelimsky/rspec.git&lt;br /&gt;rm -rf rspec/.git&lt;br /&gt;svn add rspec&lt;br /&gt;svn commit . -m "added plugin&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6468529461559164533?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6468529461559164533/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6468529461559164533' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6468529461559164533'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6468529461559164533'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/07/install-plugin-on-svn-rails-210-app.html' title='Install a plugin on a svn Rails 2.1.0 app from github'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5596764788434800620</id><published>2008-07-17T16:15:00.004+02:00</published><updated>2008-07-17T16:30:09.554+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='politic'/><title type='text'>Internet is about giving quote</title><content type='html'>&lt;h3&gt;&lt;span style="font-weight: normal;"&gt;From &lt;/span&gt;&lt;a style="font-weight: normal;" href="http://www.intridea.com/blog/"&gt;http://www.intridea.com/blog/&lt;/a&gt;&lt;br /&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Preaching What We Practice&lt;/h3&gt;     &lt;p&gt;"We believe that community and collaboration are vital to the long-term prosperity of the internet. This blog is a way for us to share some of the lessons we’ve learned along the way with the community. You’ll see tips and tricks as well as plugin releases and general thoughts about the industry. We hope you enjoy it!"&lt;/p&gt;In an &lt;a href="http://www.earth-policy.org/Books/PB3/index.htm"&gt;unsustainable&lt;/a&gt; world where corporations (people) only do things if they can make a profit, that's a quote I like to read. The number of happy people happy to give in the Rails community makes me feel good and gives me a lot of hope about the future.&lt;br /&gt;Eventually, the critical mass of the "let's change the world" people will grow and we will see more &lt;a href="http://www.transparency.org/"&gt;transparency&lt;/a&gt; in the actions taken by the corporations and states.&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5596764788434800620?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5596764788434800620/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5596764788434800620' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5596764788434800620'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5596764788434800620'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/07/internet-is-about-giving-quote.html' title='Internet is about giving quote'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7320353146629932139</id><published>2008-07-15T12:26:00.006+02:00</published><updated>2008-07-17T16:06:43.483+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><title type='text'>Hack to make Autotest + RSpec &gt;=1.1.4 work in Netbeans</title><content type='html'>If you live on the edge (Netbeans Edge + Rails 2.1.0 + RSpec edge 1.1.4 + ZenTest 3.10.0) at the time of this writing - july 2008 - you'll have to hack autotest to be able to keep working with your favourite editor :-)&lt;br /&gt;&lt;br /&gt;Indeed, when I upgradded to the latest stable versions, the wonderful "Auto test"  feature in Netbeans stopped to work. It took me 45 minutes to find out what was happenning and to find a &lt;span style="font-style: italic;"&gt;solution, hem&lt;/span&gt; hack.&lt;br /&gt;&lt;br /&gt;As it says in the &lt;a href="http://github.com/dchelimsky/rspec/tree/master/History.txt"&gt;History file&lt;/a&gt;, there is now a command called "autospec" for running specs since RSpec 1.1.4. As Netbeans run the system command "/usr/bin/autotest", it won't discover any specs in your project&lt;br /&gt;&lt;br /&gt;A quick hack to make it work, Add the following to /usr/bin/autotest:&lt;br /&gt;ENV['RSPEC'] = 'true'&lt;br /&gt;which will tell autotest we are actually using specs. The sad truth is I don't understand why it works, I need to dig in the code of the rspec-rails plugin I guess ... Enough time wasted!&lt;br /&gt;&lt;br /&gt;I am not sure this change in will make RSpec users life easier ... Anyway, that's the way it is!&lt;br /&gt;&lt;br /&gt;For netbeans developpers, it will be quite tricky to make it work with different versions of RSpec. I guess they'll have to test what version of RSpec is installed and use autospec for RSpec &gt;= 1.1.4 ...&lt;br /&gt;&lt;br /&gt;My /usr/bin/autotest file:&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;#!/usr/bin/ruby1.8 -ws&lt;br /&gt;#&lt;br /&gt;# This file was generated by RubyGems.&lt;br /&gt;#&lt;br /&gt;# The application 'ZenTest' is installed as part of a gem, and&lt;br /&gt;# this file is here to facilitate running it.&lt;br /&gt;#&lt;br /&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;&lt;br /&gt;version = "&gt;= 0"&lt;br /&gt;&lt;br /&gt;if ARGV.first =~ /^_(.*)_$/ and Gem::Version.correct? $1 then&lt;br /&gt;version = $1&lt;br /&gt;ARGV.shift&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;ENV['RSPEC'] = 'true'&lt;br /&gt;gem 'ZenTest', version&lt;br /&gt;load 'autotest'&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7320353146629932139?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7320353146629932139/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7320353146629932139' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7320353146629932139'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7320353146629932139'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/07/hack-to-make-autotest-work-in-netbeans.html' title='Hack to make Autotest + RSpec &gt;=1.1.4 work in Netbeans'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-35986880021358645</id><published>2008-07-10T17:43:00.003+02:00</published><updated>2008-07-12T17:45:04.033+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>capitate rocks!</title><content type='html'>I have inherited a server with super sized  log files for Rails and nginx: hundred of GB ... All the files occupy 65G (including home partition), it seems a lot to me!&lt;br /&gt;&lt;br /&gt;The fact the person who configured is supposed to be an expert on Rails hosting and has a good "WWR reputation"  .... If s(he) "forgot" about such things, it gives  me a lot of hope regarding my  sysadmin skills:  I don't know anything but it's easy to learn...&lt;br /&gt;&lt;br /&gt;After a few googling, I found out about logrotate and then t &lt;a href="http://capitate.rubyforge.org/"&gt;capitate&lt;/a&gt;, which contain very usefull recipees for capistrano. Rails conventions and philosophy is about DRY and automatize all these repetitive tasks and capitate author &lt;span class="fn"&gt;Gabriel Handford has understood it very well and share its work to the community. THANKS :-)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;You could spend 5-10 minutes on each project configuring logrotate for all your dependencies (monit, sphinx, Rails, nginx ...). copy-paste et voila! how boring ...&lt;br /&gt;&lt;br /&gt;In &lt;span style="font-weight: bold;"&gt;1&lt;/span&gt; minute, using capitate, you can configure logrotate with a capistrano task!&lt;br /&gt;Install capitate (read the &lt;a href="http://capitate.rubyforge.org/"&gt;capitate&lt;/a&gt; well written doc) and&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;$ &lt;span style="color: rgb(0, 153, 0);"&gt;cap nginx:logrotate:install&lt;/span&gt;&lt;br /&gt;...&lt;br /&gt;$  &lt;span style="color: rgb(0, 153, 0);"&gt;cap rails:logrotate:install&lt;/span&gt;&lt;br /&gt;&lt;stringio:0xb74e45b4&gt;...&lt;br /&gt;&lt;br /&gt;VERY IMPORTANT: you need to specify:&lt;br /&gt;&lt;/stringio:0xb74e45b4&gt;&lt;blockquote&gt; set :use_sudo, true&lt;/blockquote&gt;&lt;br /&gt;to run that command otherwise it will fail with:&lt;br /&gt;** [out :: beta.lecool.com] install:&lt;br /&gt;** [out :: beta.lecool.com] cannot create regular file `/etc/logrotate.d/rails_beta.lecool.com'&lt;br /&gt;** [out :: beta.lecool.com] : Permission denied&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Let's contribute to this gem! Get the sources with&lt;br /&gt;&lt;blockquote&gt;git clone git://github.com/gabriel/capitate.git&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-35986880021358645?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/35986880021358645/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=35986880021358645' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/35986880021358645'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/35986880021358645'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/07/capitate-rocks.html' title='capitate rocks!'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8446820590928085090</id><published>2008-07-10T14:06:00.005+02:00</published><updated>2008-07-10T14:26:07.694+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Rake task parameters</title><content type='html'>A stupid mistake I did and I'd like to share so people don't waste their time.&lt;br /&gt;&lt;br /&gt;Don't use PATH or N as environment variables you want to use as parameters for your rake tasks.&lt;br /&gt;&lt;br /&gt;I am creating a plugin to backup mysql databases with a crontab and I wanted to make things as simple as possible for the end user to use the plugin. I first came up with the following command&lt;br /&gt;&lt;blockquote&gt;rake mysql_db:backup PATH=/tmp/pouet N=1&lt;/blockquote&gt;&lt;br /&gt;It was not working, giving error messages such  as:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sh: mysqldump: not found&lt;br /&gt;sh: gzip: not found&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Writing this post, I reckon it is quite obvious I should not have used PATH as a parameter for a rake task .... No wonder it could not find gzip .... But I did not think about it in the first place and started looking at rake and ruby code!&lt;br /&gt;&lt;br /&gt;So now the command is:&lt;br /&gt;&lt;blockquote&gt;rake mysql_db:backup PATH_BACKUP=/tmp/pouet NUMBER_OF_DUMPS=1 &lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;By the way, is there more *elegant* way than environement variables to pass parameters to a rake task???&lt;br /&gt;&lt;br /&gt;I am thinking I could use a prompt !&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8446820590928085090?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8446820590928085090/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8446820590928085090' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8446820590928085090'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8446820590928085090'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/07/rake-task-parameters.html' title='Rake task parameters'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7779605801071034369</id><published>2008-06-25T13:48:00.004+02:00</published><updated>2008-06-25T13:57:32.645+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='green'/><title type='text'>Green my apple</title><content type='html'>&lt;object classid="clsid:D27CDB6E-AE6D-11cf-96B8-444553540000" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,29,0" width="430" height="237"&gt;&lt;br /&gt; &lt;param name="movie" value="http://www.greenpeace.org/raw/content/international/assets/binaries/ranking-guide-8th-edition.swf" /&gt;&lt;br /&gt;&lt;br /&gt; &lt;param name="quality" value="high" /&gt;&lt;br /&gt; &lt;param name="menu" value="false" /&gt;&lt;br /&gt; &lt;param name="wmode" value="" /&gt;&lt;br /&gt; &lt;embed src="http://www.greenpeace.org/raw/content/international/assets/binaries/ranking-guide-8th-edition.swf" wmode="" quality="high" menu="false" pluginspage="http://www.macromedia.com/go/getflashplayer" type="application/x-shockwave-flash" width="430" height="237"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;/object&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Rails people have a cult for Apple and I have to say Iphone looks cool :-)&lt;br /&gt;It will be cooler when Apple will remove the Iphone components which can harm Nature (and humans are part of Nature ...)&lt;br /&gt;&lt;br /&gt;I support strongly Greenpeace for its campaigns and I have been voluteering now for 2 years in &lt;a href="http://www.eco-union.org/"&gt;eco-union&lt;br /&gt;&lt;/a&gt; a non-for-profit ecological association.&lt;br /&gt;&lt;br /&gt;So if you work for a company or public administration involved in sustainabe development and you need a web site, you know who to call.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7779605801071034369?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7779605801071034369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7779605801071034369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7779605801071034369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7779605801071034369'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/green-my-apple.html' title='Green my apple'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7713585494742681153</id><published>2008-06-16T19:59:00.002+02:00</published><updated>2008-06-16T20:11:39.631+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Banging my head with some rake error messages</title><content type='html'>It's the end of a long day.  The perfect timing to waste time on trivial issues ...  I completly agree with &lt;a href="http://addictedtonew.com/about/"&gt;John Nunemaker&lt;/a&gt; that &lt;a href="http://railstips.org/2008/6/10/programmers-should-give-up-more-often"&gt;http://railstips.org/2008/6/10/programmers-should-give-up-more-often&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;This one took 30 minutes instead of  2 minutes if my brain had been at 100% !&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt; rake -T --trace&lt;br /&gt;(in /home/jeanmichel/ruby/projects/myproject/myproject1.0)&lt;br /&gt;rake aborted!&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;uninitialized constant ActionMailer&lt;/span&gt;&lt;br /&gt;/usr/lib/ruby/gems/1.8/gems/rake-0.8.1/lib/rake.rb:2237:in `const_missing'&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/app/models/newsletter_mailer.rb:1&lt;br /&gt;/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'&lt;br /&gt;/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/lib/mailer/newsletters_sender.rb:1&lt;br /&gt;/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'&lt;br /&gt;/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/lib/tasks/mailing.rake:1&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/vendor/rails/railties/lib/tasks/rails.rb:7:in `load'&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/vendor/rails/railties/lib/tasks/rails.rb:7&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/vendor/rails/railties/lib/tasks/rails.rb:7:in `each'&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/vendor/rails/railties/lib/tasks/rails.rb:7&lt;br /&gt;/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `gem_original_require'&lt;br /&gt;/usr/local/lib/site_ruby/1.8/rubygems/custom_require.rb:27:in `require'&lt;br /&gt;/home/jeanmichel/ruby/projects/myproject/myproject1.0/Rakefile:10&lt;br /&gt;/usr/lib/ruby/gems/1.8/gems/rake-0.8.1/lib/rake.rb:2149:in `load'&lt;br /&gt;&lt;br /&gt;/usr/lib/ruby/gems/1.8/gems/rake-0.8.1/bin/rake:31&lt;br /&gt;/usr/bin/rake:19:in `load'&lt;br /&gt;/usr/bin/rake:19&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;This  was because my rake task requires a lib/newsletters_mailer.rb file which was had a&lt;br /&gt;&lt;blockquote&gt;require ''newsletter_mailer&lt;/blockquote&gt;&lt;br /&gt;importing a file app/models/newsletter_mailer.rb (typical class NewsletterMailer &lt; ActionMailer::Base)&lt;br /&gt;&lt;br /&gt;Don't ask me why I had this 'require' in place!!! Rails automatically imports models with all its magic.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7713585494742681153?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7713585494742681153/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7713585494742681153' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7713585494742681153'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7713585494742681153'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/banging-my-head-with-some-rake-error.html' title='Banging my head with some rake error messages'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6662049119031132141</id><published>2008-06-12T11:23:00.003+02:00</published><updated>2008-06-12T12:13:14.118+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Do no set svn global-ignores for schema.rb</title><content type='html'>In the subversion configuration file  ~/.subversion/config , you can set some global-ignores to a set of whitespace-delimited globs which Subversion will ignore in its 'status' output, and while importing or adding files and directories.&lt;br /&gt;&lt;br /&gt;Mine was:&lt;br /&gt;global-ignores = ._* *.log *.html-gzip-* ruby_sess.* *.rej .DS_Store schema.rb&lt;br /&gt;&lt;br /&gt;It happens that the Rails framework has a file called vendor/rails/activerecord/lib/active_record/schema.rb ...&lt;br /&gt;&lt;br /&gt;OOOPS! This file was not committed which broke the script/console ...&lt;br /&gt;&lt;br /&gt;Better removing &lt;span style="font-style: italic;"&gt;'schema.rb&lt;/span&gt;' from my global-ignores!&lt;br /&gt;&lt;br /&gt;Also worth checking the /etc/subversion/config file&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6662049119031132141?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6662049119031132141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6662049119031132141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6662049119031132141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6662049119031132141'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/do-no-set-svn-global-ignores-for.html' title='Do no set svn global-ignores for schema.rb'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2654635904989452122</id><published>2008-06-11T17:54:00.003+02:00</published><updated>2008-06-25T15:22:40.405+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>mysql command lines basic</title><content type='html'>&lt;blockquote&gt;mysql -u root&lt;/blockquote&gt;Welcome to the MySQL monitor.  Commands end with ; or \g.&lt;br /&gt;Your MySQL connection id is 21&lt;br /&gt;Server version: 5.0.45-Debian_1ubuntu3.3 Debian etch distribution&lt;br /&gt;&lt;br /&gt;Type 'help;' or '\h' for help. Type '\c' to clear the buffer.&lt;br /&gt;&lt;br /&gt;mysql&gt; &lt;blockquote&gt;use myapplicationl_development;&lt;/blockquote&gt;&lt;br /&gt;Reading table information for completion of table and column names&lt;br /&gt;You can turn off this feature to get a quicker startup with -A&lt;br /&gt;&lt;br /&gt;Database changed&lt;br /&gt;mysql&gt; &lt;blockquote&gt;SELECT * FROM mailing_jobs where status != 'done';&lt;/blockquote&gt;&lt;br /&gt;Empty set (0.00 sec)&lt;br /&gt;&lt;br /&gt;mysql&gt; show databases;&lt;br /&gt;&lt;br /&gt;mysql&gt; show tables;&lt;br /&gt;&lt;br /&gt;# Use back quotes for tables whose names contain spaces (very bad idea if you ask me)&lt;br /&gt;select count(*) from &lt;span style="font-size:180%;"&gt;`&lt;/span&gt;gmail account&lt;span style="font-size:180%;"&gt;`&lt;/span&gt;;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2654635904989452122?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2654635904989452122/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2654635904989452122' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2654635904989452122'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2654635904989452122'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/mysql-command-lines-basic.html' title='mysql command lines basic'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3139385244724142632</id><published>2008-06-11T17:24:00.002+02:00</published><updated>2008-06-11T17:30:20.494+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Capistrano deploy fails because of svn problem</title><content type='html'>&lt;span style="font-weight: bold;"&gt;If you come accross:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;/yourdomain2.0$ cap deploy&lt;br /&gt;  * executing `deploy'&lt;br /&gt;  * executing `deploy:update'&lt;br /&gt; ** transaction: start&lt;br /&gt;  * executing `deploy:update_code'&lt;br /&gt;    updating the cached checkout on all servers&lt;br /&gt;  * executing "if [ -d /home/yourdomain/public_html/beta.yourdomain.com/shared/cached-copy ]; then svn update -q  -r65 /home/yourdomain/public_html/beta.yourdomain.com/shared/cached-copy; else svn checkout -q  -r65 svn+ssh://yourdomain@dev.yourdomain.com/home/yourdomain/svn/yourdomain2.0/trunk /home/yourdomain/public_html/beta.yourdomain.com/shared/cached-copy; fi"&lt;br /&gt;    servers: ["beta.yourdomain.com"]&lt;br /&gt;    [beta.yourdomain.com] executing command&lt;br /&gt; ** [err] Permission denied, please try again.&lt;br /&gt; ** [err] Received disconnect from 666.999.999.999: 2: Too many authentication failures for yourdomain&lt;br /&gt; ** [err] svn: Connection closed unexpectedly&lt;br /&gt;    command finished&lt;br /&gt;*** [deploy:update_code] rolling back&lt;br /&gt;  * executing "rm -rf /home/yourdomain/public_html/beta.yourdomain.com/releases/20080610143536; true"&lt;br /&gt;    servers: ["beta.yourdomain.com"]&lt;br /&gt;    [beta.yourdomain.com] executing command&lt;br /&gt;    command finished&lt;br /&gt;command "if [ -d /home/yourdomain/public_html/beta.yourdomain.com/shared/cached-copy ]; then svn update -q  -r65 /home/yourdomain/public_html/beta.yourdomain.com/shared/cached-copy; else svn checkout -q  -r65 svn+ssh://yourdomain@dev.yourdomain.com/home/yourdomain/svn/yourdomain2.0/trunk /home/yourdomain/public_html/beta.yourdomain.com/shared/cached-copy; fi" failed on beta.yourdomain.com&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;The solution is quick and easy, add the following line to your capistrano deploy.rb:&lt;/span&gt;&lt;br /&gt;&lt;blockquote&gt;default_run_options[:pty] = true &lt;/blockquote&gt;&lt;br /&gt;Thanks Mr &lt;a href="http://groups.google.com/group/capistrano/browse_frm/thread/f46ae7124d778ea0/1a0b8ac73dfe1228?lnk=gst&amp;amp;q=Permission+denied%2C+please+try+again#1a0b8ac73dfe1228"&gt;capistrano Google group&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3139385244724142632?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3139385244724142632/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3139385244724142632' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3139385244724142632'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3139385244724142632'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/capistrano-deploy-fails-because-of-svn.html' title='Capistrano deploy fails because of svn problem'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4773760004732612529</id><published>2008-06-11T16:57:00.005+02:00</published><updated>2008-06-11T17:24:35.920+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Filling up my root partition with a table of 3.7Gb</title><content type='html'>Here we go again!&lt;br /&gt;&lt;br /&gt;Yesterday, I filled twice my linux partitions! The &lt;a href="http://21croissants.blogspot.com/2008/06/filling-up-my-root-partition-with-mysql.html"&gt;first time because I had mysql configure to use binlog&lt;/a&gt; and the second time because the Rails development log was filled with the details of the SQL query!!!&lt;br /&gt;&lt;br /&gt;This time, the size of the data for the 50 000 emails  filled the /var/lib/mysql/lecool_development/emails.MYD file which contains the data of the "emails" table.&lt;br /&gt;&lt;br /&gt;I used the following command to find the big files:&lt;br /&gt;&lt;blockquote&gt;sudo find / -xdev -size +104857600c&lt;/blockquote&gt;And it found:&lt;br /&gt;-rw-rw---- 1 mysql mysql 3942782004 2008-06-10 19:58 emails.MYD&lt;br /&gt;&lt;br /&gt;I deleted with a SQL "DELETE FROM emails" the data and that was it ...&lt;br /&gt;&lt;br /&gt;Hum hum, time to upgrade to a new hard drive with bigger partitions and configure mysql to store its data into the home partition ... or buy a mac??? Let's see in 2009 ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4773760004732612529?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4773760004732612529/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4773760004732612529' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4773760004732612529'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4773760004732612529'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/filling-up-my-root-partition-with-table.html' title='Filling up my root partition with a table of 3.7Gb'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4443091959125467622</id><published>2008-06-10T17:23:00.003+02:00</published><updated>2008-06-10T18:14:04.183+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mysql'/><title type='text'>Filling up my root partition with mysql logs</title><content type='html'>I was trying to optimize a script on Rails to send 50 000 emails (TODO Add link) and I came across a problem of  space with my root partition:&lt;br /&gt;&lt;br /&gt;The script crashed with an error message explaining that the hard drive was full.&lt;br /&gt;&lt;br /&gt;Using commands like&lt;br /&gt;&lt;blockquote&gt;du -s * | sort -nr | head&lt;/blockquote&gt;&lt;br /&gt;or the slower Ubuntu "Disk Usage   Analyser", it turned out that the /var/log/mysq was full of huge logs!!!&lt;br /&gt;&lt;br /&gt;/var/log/mysql$ ll&lt;br /&gt;total 1925788&lt;br /&gt;-rw-rw---- 1 mysql adm        98 2007-04-10 10:57 mysql-bin.000558&lt;br /&gt;-rw-rw---- 1 mysql adm       117 2008-06-01 15:01 mysql-bin.001456&lt;br /&gt;-rw-rw---- 1 mysql adm       117 2008-06-01 21:45 mysql-bin.001457&lt;br /&gt;-rw-rw---- 1 mysql adm       141 2008-06-02 09:45 mysql-bin.001458&lt;br /&gt;-rw-rw---- 1 mysql adm 104940360 2008-06-10 16:24 mysql-bin.001468&lt;br /&gt;-rw-rw---- 1 mysql adm 104940040 2008-06-10 16:25 mysql-bin.001469&lt;br /&gt;-rw-rw---- 1 mysql adm 104941440 2008-06-10 16:25 mysql-bin.001470&lt;br /&gt;... etc&lt;br /&gt;&lt;br /&gt;As a quick fix, I just deleted manually these files with&lt;br /&gt;sudo rm mysql-bin.00148*&lt;br /&gt;&lt;br /&gt;A more permanent solution,  &lt;a href="http://www.webhostingtalk.com/archive/index.php/t-133608.html"&gt;found on the web&lt;/a&gt;,  was to edit:&lt;br /&gt;&lt;blockquote&gt; sudo gedit /etc/mysql/my.cnf&lt;/blockquote&gt;&lt;br /&gt;Comment all references to log_bin:&lt;br /&gt;&lt;blockquote&gt;# log_bin            = /var/log/mysql/mysql-bin.log&lt;br /&gt;# WARNING: Using expire_logs_days without bin_log crashes the server! See README.Debian!&lt;br /&gt;# expire_logs_days    = 10&lt;br /&gt;# max_binlog_size         = 100M&lt;br /&gt;#binlog_do_db        = include_database_name&lt;br /&gt;#binlog_ignore_db    = include_database_name&lt;/blockquote&gt;&lt;blockquote&gt;sudo /etc/init.d/mysql restart&lt;/blockquote&gt;&lt;br /&gt;Obviously, I will have to refactor a bit the code of ar_mailer to take in account the fact that I am sending 50 000 identical newsletters to 50 000 people.&lt;br /&gt;ar_mailer uses a "emails" table with a "mail" column which is the email content. In my case, the "mail" is duplicated 50000 times + it's a 340KB HTML email. No wonder it filed my sql logs!&lt;br /&gt;&lt;br /&gt;Epilogue:&lt;br /&gt;I just found out about &lt;a href="http://blog.evanweaver.com/articles/2007/04/30/top-secret-tuned-mysql-configurations-for-rails/"&gt;Evan Weaver top-secret-tuned-mysql-configurations-for-rails post&lt;/a&gt;, I really loved the PS ;-)&lt;br /&gt;&lt;span style="font-size:180%;"&gt;# PS. Do not under any circumstances enable binlog&lt;br /&gt;&lt;br /&gt;&lt;span style="font-size:100%;"&gt;Next time, I have to configure mysql, I know what I'll use ...&lt;/span&gt;&lt;br /&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4443091959125467622?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4443091959125467622/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4443091959125467622' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4443091959125467622'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4443091959125467622'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/06/filling-up-my-root-partition-with-mysql.html' title='Filling up my root partition with mysql logs'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8012156249822208556</id><published>2008-05-29T13:52:00.002+02:00</published><updated>2008-05-29T15:32:10.336+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Dr Nic Pastiepacker is cool</title><content type='html'>When I start on a legacy project,  I like to print most of the source code so I can scribble some notes. I could read it on screen but I feel sooooooooo much confortable on paper. Of course, to save the environment, I print 2 pages on each sheet of paper ;-)&lt;br /&gt;&lt;br /&gt;So far, the printing process was quite manual: I opened a file, printed it, opened another, printed itm etc ...&lt;br /&gt;&lt;br /&gt;But, in the wonderful world of geeks hating repetitive manual tasks, someone came with a solution:&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://pastiepacker.rubyforge.org/"&gt;Dr Nic Pastiepacker&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;In 2 seconds, you "cd" to your project directory and type:&lt;br /&gt;&lt;br /&gt;sudo gem install pastiepacker&lt;br /&gt;pastiepacker -s &gt; to_print.txt&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;and that's it!&lt;br /&gt;&lt;span style="display: block;" id="formatbar_Buttons"&gt;&lt;span class="down" style="display: block;" id="formatbar_CreateLink" title="Link" onmouseover="ButtonHoverOn(this);" onmouseout="ButtonHoverOff(this);" onmouseup="" onmousedown="CheckFormatting(event);FormatbarButton('richeditorframe', this, 8);ButtonMouseDown(this);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;I wrote this post to tell the worlf about this cool tool but also to warn you that this won't work on linux because ruby files are not recognised like ascii files, you'll need to replace the /usr/lib/ruby/gems/1.8/gems/pastiepacker-1.0.0/lib/pastiepacker/conversion.rb by the follwing pastie:&lt;br /&gt;&lt;a href="http://pastie.caboo.se/205334"&gt;http://pastie.caboo.se/205334&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;I should definitely spend 45 min to patch Dr Nic git repo I know ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8012156249822208556?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8012156249822208556/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8012156249822208556' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8012156249822208556'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8012156249822208556'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/05/dr-nic-pastiepacker-is-cool.html' title='Dr Nic Pastiepacker is cool'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8917075687586978471</id><published>2008-05-21T10:28:00.002+02:00</published><updated>2008-05-21T10:40:18.589+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Installing sphinx on Ubuntu</title><content type='html'>Check out the home page: http://sphinxsearch.com/&lt;br /&gt;&lt;br /&gt;sphinx needs mysql_config program, install it with:&lt;br /&gt;sudo apt-get install libmysqlclient15-dev&lt;br /&gt;&lt;br /&gt;wget http://sphinxsearch.com/downloads/sphinx-0.9.8-rc2.tar.gz&lt;br /&gt;tar xvf  sphinx-0.9.8-rc2.tar.gz &amp;amp;&amp;amp; rm sphinx-0.9.8-rc2.tar.gz&lt;br /&gt;cd sphinx-0.9.8-rc2&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;br /&gt;&lt;br /&gt;WARNING: WORK IN PROGRES!!! I don't really know if sphinx works at this stage but it seems to be installed without errors&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8917075687586978471?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8917075687586978471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8917075687586978471' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8917075687586978471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8917075687586978471'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/05/installing-sphinx-on-ubuntu.html' title='Installing sphinx on Ubuntu'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7004932085245229833</id><published>2008-05-19T12:27:00.003+02:00</published><updated>2008-06-11T19:34:11.370+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='lecool'/><title type='text'>Working for lecool</title><content type='html'>I am now working for &lt;a href="http://lecool.com/"&gt;lecool&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;img alt="The image “http://lecool.com/images/intro_header.jpg” cannot be displayed, because it contains errors." src="http://lecool.com/images/intro_header.jpg" /&gt;&lt;br /&gt;&lt;br /&gt;As this is a small company and I am working alone, I have decided to write more on my blog in order to not feel alone and contribute to the growth of the Rails community.&lt;br /&gt;&lt;br /&gt;At lecool, the team is composed of people who speak 8 different languages, have different background and culture. It feels like the pure Barcelona experience ;-)&lt;br /&gt;&lt;br /&gt;You can find all my posts about my lecool experience with the &lt;a href="http://21croissants.blogspot.com/search/label/lecool"&gt;lecool tag&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7004932085245229833?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7004932085245229833/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7004932085245229833' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7004932085245229833'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7004932085245229833'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/05/working-for-lecool.html' title='Working for lecool'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3421917968585283292</id><published>2008-05-07T18:14:00.005+02:00</published><updated>2008-05-09T13:51:24.139+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><title type='text'>XP Day France 2008</title><content type='html'>Bonjour à la communauté Agile francophone!&lt;br /&gt;&lt;br /&gt;Je viens de mettre ma présentation "Intro a RSpec" à XP Day France 2008 dans slideshare:&lt;br /&gt;&lt;br /&gt;&lt;div style="width: 425px; text-align: left;" id="__ss_395976"&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpday-2008-bdd-1210330493010195-9"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpday-2008-bdd-1210330493010195-9"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 0px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpday-2008-bdd-1210330493010195-9"&gt;&lt;/a&gt;&lt;object style="margin: 0px;" height="355" width="425"&gt;&lt;param name="movie" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpday-2008-bdd-1210330493010195-9"&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;param name="allowScriptAccess" value="always"&gt;&lt;embed src="http://static.slideshare.net/swf/ssplayer2.swf?doc=xpday-2008-bdd-1210330493010195-9" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" height="355" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;&lt;a href="http://www.slideshare.net/?src=embed"&gt;&lt;img src="http://static.slideshare.net/swf/logo_embd.png" style="border: 0px none ; margin-bottom: -5px;" alt="SlideShare" /&gt;&lt;/a&gt; | &lt;a href="http://www.slideshare.net/garnierjm/intro-a-rspec-bdd-webapps-user-acceptance-testing?src=embed" title="View 'Intro a RSpec, BDD, webapps User Acceptance Testing' on SlideShare"&gt;View&lt;/a&gt; | &lt;a href="http://www.slideshare.net/upload?src=embed"&gt;Upload your own&lt;/a&gt;&lt;/div&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;Vous pouvez télécharger le pdf de ma présentation avec box.net. N'hésitez pas à me contacter pour des questions. Surtout les 150 personnes à qui j'ai distribué mes cartes de visite ;-)&lt;br /&gt;&lt;a style="left: 0px ! important; top: 12px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-07413301513973407 visible ontop" href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=pl1k10thcw&amp;amp;cl=0"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 12px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=pl1k10thcw&amp;amp;cl=0"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 12px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=pl1k10thcw&amp;amp;cl=0"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 12px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=pl1k10thcw&amp;amp;cl=0"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 12px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-05332800295434258 visible ontop" href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=pl1k10thcw&amp;amp;cl=0"&gt;&lt;/a&gt;&lt;embed src="http://www.box.net/static/flash/box_explorer.swf?widgetHash=pl1k10thcw&amp;amp;cl=0" wmode="transparent" type="application/x-shockwave-flash" height="345" width="460"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;N'hésitez pas à me contacter pour des questions.  Surtout les "150" personnes à qui j'ai distribué mes cartes de visite ;-)&lt;br /&gt;&lt;br /&gt;Je vous avouerai franchement que je me suis senti comme un poisson dans l'eau en discutant avec les participants: quelle énergie, quel amour de l'art, du travail bien fait!!!&lt;br /&gt;C'est décidé, mon futur sera Agile et je ferai tout pour travailler en 2009 avec / pour l'une des entreprises Agile de France et de Navarre.&lt;br /&gt;&lt;br /&gt;A ma grande surprise, Ruby on Rails n'a pas (encore) percé en France !!! Java règne en maître mais je suis confiant: le coup de foudre sera pour 2009!&lt;br /&gt;5 ans après la naissance de la technologie, adoptée massivement aux US (2006), en UK, les pays nordiques, en Allemagne (2007) et même en Espagne (2008) !!! Que des pays qui parlent couramment anglais à l'exception de l'Espagne .... Je m'interroge, le niveau d'anglais des informaticiens français ne leur permet pas de lire les &lt;a href="http://www.amazon.fr/rails-Computers-Internet-Livres-anglais/s/ref=sr_nr_n_0?ie=UTF8&amp;amp;rs=69633011&amp;amp;keywords=Rails&amp;amp;rh=i%3Aaps%2Ck%3ARails%2Ci%3Aenglish-books%2Cn%3A69633011%2Cn%3A78553011"&gt;56 (!!!) livres en anglais&lt;/a&gt; publiés à ce jour (09/05/2008) ???&lt;br /&gt;&lt;br /&gt;J'hallucine en couleur quand j'entends les doutes et peurs de me compatriotes sur Rails: "does it scale, does it work, etc ..."&lt;br /&gt;L'informatique n'est qu'une affaire de mode et de suivisme, l'humain est un mouton qui suit la masse!!!&lt;br /&gt;Or, Sun Microsystems, Thoughtworks et quelque milliers d'individus super smart ont pariés sur Rails. VOUS AVEZ ENCORE PEUR??? On se croirait en 1999 lorsque je voulais faire du java et qu'il n'y avait aucun projet et que des doutes.&lt;br /&gt;&lt;br /&gt;Pour revenir a XP Days France 2008, un petit commentaire sur les présentations auxquelles j'ai assistées.&lt;br /&gt;&lt;ul&gt;&lt;li&gt;         &lt;div class="orateur"&gt;Laboratoire Extreme Programming,  par Eric Mignot (Pyxis) et François Beauregard (Pyxis): 5 équipes de 4 personnes en "pair programming" sur le jeu du milebornes, histoire d'illustrer les grands principes de XP. Quel chaos mais vraiment ludique et instructif!!! Plus les animateurs sont vachement sympas&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;                &lt;div class="orateur_et"&gt;La pratique du conflit, Regis Medina, Crossbow Labs, Antoine Contal, Orange Online Multimedia, Pascal Pratmarty, Indépendant. LA MEILLEURE: QUEL SHOW!  &lt;/div&gt; Les orateurs étaient en tenue de Aïkido et nous ont fait bien marrés. Cette présentation m'a fait beaucoup réfléchir et j'ai passé une bonne partie du mercredi à penser à mon futur proche. Vous ne me croirez peut-être pas mais elle m'a aidé à décider d'arrêter de travailler pour mon client actuel et de passer à autre chose, plus human friendly!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;               &lt;div class="orateur_et"&gt;Laboratoire Erlang, Dominic Williams, Esmertec, Nicolas Charpentier, Esmertec, Fabrice Nourisson: merci pour les explications et la patience des animateurs. J'avoue que mon cerveau était un peu "low energy" et que j'ai vraiment du mal à comprendre les principes du langage mais peut-être un jour ...&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;           &lt;div class="orateur"&gt;Sujets éclair sur l'agilité, Yannick Ameur, Valtech: Lightning Talk en français. Pas mal de sujets, très bonne idée! Merci à Yannick de m'avoir parlé de la cifconf.&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;           &lt;div class="orateur"&gt;Agilité et avionique, Emmanuel Chenu, Thales Avionics: un retour d'expérience intéressant. WOW L'airbus A350 volera avec des logiciels "Agile". QUE des PROS!!!&lt;/div&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;           &lt;div class="orateur"&gt;Tests unitaires avec les librairies de Mock, Guillaume Carré, Xebia: après avoir écouté, j'avoue que java+eclipse permet de travailler de manière super facile avec les mocks. &lt;/div&gt;   &lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;Cette conf était vraiment géniale, merci à tous!&lt;br /&gt;&lt;br /&gt;Jean-Michel @ Café La Marine (wifi) @ Paris&lt;br /&gt;&lt;br /&gt;PS: Un "special thanks" à &lt;a href="http://ph7spot.com/"&gt;Philippe Hanrigou&lt;/a&gt; pour avoir relu ma présentation avec attention et pour son feedback&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3421917968585283292?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3421917968585283292/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3421917968585283292' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3421917968585283292'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3421917968585283292'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/05/xp-day-france-2008.html' title='XP Day France 2008'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1846121778189735968</id><published>2008-04-28T18:15:00.002+02:00</published><updated>2008-04-28T18:19:31.965+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><title type='text'>Specing actions which have session management turned off</title><content type='html'>The spec:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;  describe "rss action" do&lt;br /&gt;    before :each do&lt;br /&gt;      get :rss&lt;br /&gt;    end&lt;br /&gt;    &lt;br /&gt;    it "should turn off session management" do      &lt;br /&gt;      request.session_options.should be_false&lt;br /&gt;    end    &lt;br /&gt;    &lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;The controller:&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt; # turn off session management for only the atom and rss actions.&lt;br /&gt;  session :off, :only =&gt; %w(atom rss)&lt;br /&gt;  def rss&lt;br /&gt;    # ...  &lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1846121778189735968?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1846121778189735968/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1846121778189735968' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1846121778189735968'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1846121778189735968'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/04/specing-actions-which-have-session.html' title='Specing actions which have session management turned off'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5846432253110110706</id><published>2008-03-28T18:23:00.016+01:00</published><updated>2008-12-11T10:13:42.011+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='plugin'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>DRY</title><content type='html'>At last, my first Rails plugin!&lt;br /&gt;&lt;ul&gt;&lt;li&gt;generates a report of duplicate lines in your code to help you to follow the &lt;a href="http://en.wikipedia.org/wiki/Don%27t_repeat_yourself"&gt;DRY&lt;/a&gt; principle&lt;/li&gt;&lt;/ul&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW_5Q3BkGI/AAAAAAAAAVg/VyCDirNCdjE/s1600-h/dry_report.png"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW_5Q3BkGI/AAAAAAAAAVg/VyCDirNCdjE/s400/dry_report.png" alt="" id="BLOGGER_PHOTO_ID_5194268735740940386" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;integrates nicely with&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://macromates.com/"&gt;&lt;img style="cursor: pointer; width: 55px; height: 57px;" src="http://3.bp.blogspot.com/_j7RekXQWzxQ/SBW80g3BkEI/AAAAAAAAAVQ/01uZM9wjKk4/s400/textmate-logo.jpg" alt="" id="BLOGGER_PHOTO_ID_5194265355601678402" border="0" /&gt;&lt;/a&gt;and&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://ruby.netbeans.org/"&gt;&lt;img style="cursor: pointer;" src="http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW9qQ3BkFI/AAAAAAAAAVY/wUM5OlCDVyg/s400/NetBeansLogo-159_60px.jpg" alt="" id="BLOGGER_PHOTO_ID_5194266279019647058" border="0" /&gt;&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;integrates with :&lt;/li&gt;&lt;/ul&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;# With RSpec&lt;br /&gt;it { rails_application.&lt;br /&gt;with_threshold_of_duplicate_lines(4).&lt;br /&gt;  should be_DRY }&lt;br /&gt;&lt;br /&gt;# With Test::Unit&lt;br /&gt;assert_DRY(ruby_code_in_rails_plugin("dont_repeat_yourself"))&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;To start playing:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;ruby script/plugin install http://dryplugin.rubyforge.org/svn/vendor/plugins/dont_repeat_yourself/&lt;br /&gt;rake dry:report:html&lt;br /&gt;or rake dry:report:textmate if you're an happy mac user&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;If you want to contribute, please use the git repository:&lt;br /&gt;&lt;a href="http://github.com/garnierjm/dry-report/tree/master/rails_plugin/vendor/plugins/dont_repeat_yourself/"&gt;&lt;span style="font-family:monospace;"&gt;http://github.com/garnierjm/dry-report/tree/master/rails_plugin/vendor/plugins/dont_repeat_yourself/&lt;/span&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The doc:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Read the &lt;a href="http://dryplugin.rubyforge.org/svn/vendor/plugins/dont_repeat_yourself/README"&gt;README&lt;/a&gt;&lt;/li&gt;&lt;li&gt;View the &lt;a href="http://www.21croissants.com/files/dry_screencast.html"&gt;1 min amateur screencast of the Netbeans integration&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Examples of unit test helpers coming soon, for now look at &lt;a href="http://github.com/garnierjm/dry-report/tree/master/rails_plugin/vendor/plugins/dont_repeat_yourself/spec/rspec_custom_expectation_matchers_spec.rb"&gt;spec/rspec_custom_expectation_matchers_spec.rb&lt;/a&gt; and  &lt;a href="http://github.com/garnierjm/dry-report/tree/master/rails_plugin/vendor/plugins/dont_repeat_yourself/spec/test_unit_extension_spec.rb"&gt;spec/test_unit_extension_spec.rb&lt;/a&gt;&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;Your FeedBACK is more than welcome! Post a comment in this blog or &lt;a href="http://www.21croissants.com/contact"&gt;contact me&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Cool DRY logo by &lt;a href="http://codesmack.com/"&gt;CodeSmack&lt;/a&gt; (Please send me the t-shirt guys!)&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://3.bp.blogspot.com/_j7RekXQWzxQ/R_oGqf3ZAvI/AAAAAAAAAPg/WvfCKbpiFiI/s1600-h/logo_dry.jpg"&gt;&lt;img style="margin: 0px auto 10px; display: block; text-align: center; cursor: pointer;" src="http://3.bp.blogspot.com/_j7RekXQWzxQ/R_oGqf3ZAvI/AAAAAAAAAPg/WvfCKbpiFiI/s400/logo_dry.jpg" alt="" id="BLOGGER_PHOTO_ID_5186465248048644850" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;Based on Simian (Similarity Analyser) by Simon Harris from RedHill Consulting, see http://www.redhillconsulting.com.au/products/simian/&lt;br /&gt;Copyright (c) 2003-08 RedHill Consulting Pty. Ltd.  All rights reserved.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5846432253110110706?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5846432253110110706/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5846432253110110706' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5846432253110110706'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5846432253110110706'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/03/dry.html' title='DRY'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_j7RekXQWzxQ/SBW_5Q3BkGI/AAAAAAAAAVg/VyCDirNCdjE/s72-c/dry_report.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-9047158746008629507</id><published>2008-03-27T12:37:00.005+01:00</published><updated>2008-04-17T16:57:27.322+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='subversion'/><title type='text'>Marco is my svn master</title><content type='html'>I am using netbeans as an IDE for my work. This is a great IDE but sometimes a bit limited when dealing with subversion commands. I always ask a colleague of mine, Marco , who types faster than his shadow and knows everything about command lines some help about svn. In this post, I will compile what I have learned.&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;How to remove all svn properties from a folder&lt;/h4&gt;&lt;blockquote&gt;&lt;br /&gt;svn propdel svn:ignore tasks/&lt;br /&gt;property 'svn:ignore' deleted from 'tasks'.&lt;br /&gt;jeanmichel@21x100:~/ruby/projects/linqia/linqia_portal/lib$ svn status&lt;br /&gt;M     .&lt;br /&gt;M     tasks&lt;br /&gt;?      solr_reindexing/rspec_bcn_on_rails.rb&lt;br /&gt;jeanmichel@21x100:~/ruby/projects/myproject/lib$ svn commit tasks -m "Should remove the weird properties on tasks folder"&lt;br /&gt;Sending        tasks&lt;br /&gt;Committed revision 2208.&lt;/blockquote&gt;&lt;br /&gt;&lt;h4&gt;How to generate a diff between 2 versions&lt;/h4&gt;go to the folder where trunk / branch / tag is&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;svn diff -r 2114:2167 &gt; text_file.diff&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;h4&gt;Merging&lt;/h4&gt;&lt;br /&gt;&lt;br /&gt; svn merge --dry-run svn://svn.linqia.com/lalala/production@2354 svn://svn.linqia.com/klikee-website/lalala/production@2355&lt;br /&gt;Skipped missing target: 'script/sql/import/update_user_languages.sql'&lt;br /&gt;U    lib/tasks/import_communities.rake&lt;br /&gt;jeanmichel@21x100:~/ruby/projects/linqia/linqia_portal$ svn merge svn://svn.linqia.com/klikee-website/klikee/branches/production-v-1.1-08-04-2008@2354 svn://svn.linqia.com/klikee-website/klikee/branches/production-v-1.1-08-04-2008@2355&lt;br /&gt;Skipped missing target: 'script/sql/import/update_user_languages.sql'&lt;br /&gt;U    lib/tasks/import_communities.rake&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-9047158746008629507?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/9047158746008629507/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=9047158746008629507' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/9047158746008629507'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/9047158746008629507'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/03/marco-is-my-svn-master.html' title='Marco is my svn master'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5282864706389850667</id><published>2008-02-27T11:23:00.004+01:00</published><updated>2008-03-21T13:08:48.885+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Resize your swap partition if Ubuntu Gutsy slow</title><content type='html'>When I installed Ubuntu on my laptop, I was new to linux and set a swap partition of 1.2Gb although I only had 1Gb of RAM. At some point, I realized it was far too much but it looked like it was impossible to resize without formatting the whole thing!&lt;br /&gt;&lt;br /&gt;After the upgrade to Ubuntu Gutsy, my computer was slower and slower because it kept using the swap - sometimes 500Mb - even if some RAM was still available. In an attempt to solve this problem, I changed the  vm.swappiness to &lt;span style="font-weight: bold;"&gt;0&lt;/span&gt; (ZERO!) in the /etc/sysctl.conf file. I tried all sorts of values, but it did not work.&lt;br /&gt;&lt;br /&gt;At the end, after reading an article about &lt;a href="http://www.linux.com/articles/53924"&gt;GParted live CD&lt;/a&gt;, I resized my swap partition to 300Mb and that was it!!! The whole process took 2 hours but now my computer is not using swap at all. I just upgraded it to 3GB and everything is running smoothly :-)&lt;br /&gt;&lt;br /&gt;I won't buy a mac in 2008!&lt;br /&gt;&lt;br /&gt;After publishing the first version of this post, I came accross a &lt;a href="http://ubuntuforums.org/showthread.php?t=704099&amp;amp;highlight=gutsy+slow+swap"&gt;similar post in the excellent ubuntu forum&lt;/a&gt;. Because I had changed my swap partition was not even recognized by the OS: that's why it said "0" for swap ;-)&lt;br /&gt;Following the instructions, I could change my config  so my new swap partition is detected ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5282864706389850667?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5282864706389850667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5282864706389850667' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5282864706389850667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5282864706389850667'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/02/resize-your-swap-partition-if-ubuntu.html' title='Resize your swap partition if Ubuntu Gutsy slow'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7473791809041841681</id><published>2008-02-15T13:44:00.002+01:00</published><updated>2008-02-15T13:56:20.693+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='autotest'/><title type='text'>Reducing frequency of autotest file checks</title><content type='html'>&lt;div style="visibility: visible;" class="feedContent"&gt;&lt;p&gt;I am using RSpec 1.1.3 with &lt;a target="_blank" href="http://zentest.rubyforge.org/ZenTest/"&gt;ZenTest-3.9.1&lt;/a&gt; and I wanted to share my set up. &lt;/p&gt;&lt;p&gt;If your cpu is at 100% when &lt;a href="http://www.zenspider.com/ZSS/Products/ZenTest/"&gt;autotest&lt;/a&gt; is running and the fan noise is getting too much, don't worry there's something you can do.&lt;/p&gt; &lt;p&gt;You can reduce the frequency at which autotest checks for changes on your file system by adding  an initialize hook in your ~/.autotest configuration:&lt;/p&gt;&lt;blockquote&gt;gedit ~/.autotest&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;Autotest.add_hook :initialize do |at|&lt;br /&gt; # Reducing frequency of autotest file checks too 30 seconds. Default is 1s which makes my laptop very hoooot&lt;br /&gt; at.sleep = 30&lt;br /&gt;&lt;br /&gt; # Ignore files with suffix&lt;br /&gt; %w{.svn&lt;br /&gt;    .hg&lt;br /&gt;    .git&lt;br /&gt;    .rhtml&lt;br /&gt;    .png&lt;br /&gt;    .txt&lt;br /&gt;    .sh&lt;br /&gt;    .project&lt;br /&gt;    .rjs&lt;br /&gt;    .rake&lt;br /&gt;    .jpg&lt;br /&gt;    .xml&lt;br /&gt;    .xlst}.each { |exception| at.add_exception(exception) }&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;/p&gt;More information about autotest hooks in  &lt;a href="http://blog.davidchelimsky.net/" target="_blank"&gt;&lt;/a&gt;&lt;a href="http://blog.davidchelimsky.net/articles/2008/01/15/rspec-1-1-2-and-zentest-3-8-0"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;David Chelimsky blog&lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7473791809041841681?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7473791809041841681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7473791809041841681' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7473791809041841681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7473791809041841681'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/02/reducing-frequency-of-autotest-file.html' title='Reducing frequency of autotest file checks'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6349415870453085594</id><published>2008-01-29T11:22:00.000+01:00</published><updated>2008-12-11T10:13:42.304+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Load testing a Rails application with Tsung</title><content type='html'>First, RTFM :-) &lt;a href="http://tsung.erlang-projects.org/user_manual.html"&gt;http://tsung.erlang-projects.org/user_manual.html&lt;/a&gt;&lt;br /&gt;&lt;h3&gt;Installing erland and Tsung&lt;/h3&gt;&lt;br /&gt;Tsung is written in erlang and uses perl libraries to generate graphics.&lt;br /&gt;&lt;blockquote&gt;sudo apt-get install -Y erlang&lt;br /&gt;sudo apt-get install gnuplot-nox&lt;br /&gt;sudo apt-get install libtemplate-perl libhtml-template-perl libhtml-template-expr-perl&lt;br /&gt;&lt;br /&gt;wget http://www.process-one.net/downloads/tsung/1.2.1/tsung-1.2.1.tar.gz&lt;br /&gt;tar xvf tsung-1.2.1.tar.gz &amp;amp;&amp;amp; rm tsung-1.2.1.tar.gz&lt;br /&gt;rm -R tsung-1.2.1.tar.gz &amp;amp;&amp;amp; rm tsung-1.2.1.tar.gz&lt;br /&gt;cd tsung-1.2.1&lt;br /&gt;./configure&lt;br /&gt;make&lt;br /&gt;sudo make install&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Set up Tsung&lt;/h3&gt;&lt;br /&gt;Check  out the examples in &lt;tt&gt;/usr/share/doc/tsung/examples&lt;br /&gt;&lt;br /&gt;Here is my &lt;/tt&gt;&lt;tt&gt;~/.tsung/tsung.xml to let your start&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="xml"&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;tsung loglevel="notice" version="1.0"&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Client side setup : Tsung --&gt;&lt;br /&gt;&lt;clients&gt;&lt;br /&gt;  &lt;client host="localhost" use_controller_vm="true"&gt;&lt;br /&gt;&lt;/client&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- Server side setup : the web site under load testing --&gt;&lt;br /&gt;&lt;servers&gt;&lt;br /&gt;&lt;server host="localhost" port="3000" type="tcp"&gt;&lt;/server&gt;&lt;br /&gt;&lt;/servers&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- to start os monitoring (cpu, network, memory). Use an erlang   agent on the remote machine or SNMP. erlang is the default --&gt;&lt;br /&gt;&lt;monitoring&gt;&lt;br /&gt;  &lt;monitor host="localhost" type="erlang"&gt;&lt;/monitor&gt;&lt;br /&gt;&lt;/monitoring&gt;&lt;br /&gt;&lt;br /&gt;&lt;load&gt;&lt;br /&gt;&lt;!-- several arrival phases can be set: for each phase, you can set   the mean inter-arrival time between new clients and the phase   duration --&gt;&lt;br /&gt; &lt;arrivalphase phase="1" duration="10" unit="minute"&gt;&lt;br /&gt;   &lt;users interarrival="2" unit="second"&gt;&lt;/users&gt;&lt;br /&gt; &lt;/arrivalphase&gt;&lt;br /&gt;&lt;/load&gt;&lt;br /&gt;&lt;br /&gt;&lt;options&gt;&lt;br /&gt;&lt;br /&gt;  &lt;user_agent probability="80"&gt;Mozilla/5.0 (X11; U; Linux i686; en-US; rv:1.7.8) Gecko/20050513 Galeon/1.3.21&lt;/user_agent&gt;&lt;br /&gt;  &lt;user_agent probability="20"&gt;Mozilla/5.0 (Windows; U; Windows NT 5.2; fr-FR; rv:1.7.8) Gecko/20050511 Firefox/1.0.4&lt;/user_agent&gt;&lt;br /&gt;&lt;br /&gt;&lt;/options&gt;&lt;br /&gt;&lt;br /&gt;&lt;!-- start a session for a http user. the probability is the   frequency of this type os session. The sum of all session's   probabilities must be 100 --&gt;&lt;br /&gt;&lt;br /&gt;&lt;sessions&gt;&lt;br /&gt;&lt;session name="http-example" probability="100" type="ts_http"&gt;&lt;br /&gt;&lt;br /&gt;  &lt;!-- full url with server name, this overrides the "server" config value --&gt;&lt;br /&gt;&lt;br /&gt;  &lt;request&gt; &lt;http url="/" method="GET" version="1.1"&gt;&lt;/http&gt; &lt;/request&gt;&lt;br /&gt;&lt;br /&gt;  &lt;thinktime value="20" random="true"&gt;&lt;/thinktime&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/session&gt;&lt;br /&gt;&lt;/sessions&gt;&lt;br /&gt;&lt;/clients&gt;&lt;br /&gt;&lt;/tsung&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Run tsung with:&lt;br /&gt;&lt;blockquote&gt;tsung start&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Starting the Tsung recorder&lt;/h3&gt;Configure your browser&lt;br /&gt;If  you use your machine as tsung client and also for the webserver, don't forget to remove "localhost" from the "No proxy For" textfield otherwise all requests to your web application will bypass the proxy server used by the tsung recorder!&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://1.bp.blogspot.com/_j7RekXQWzxQ/R6w95d2Z3-I/AAAAAAAAACQ/BZXixFBI9E8/s1600-h/firefox_proxy.png"&gt;&lt;img style="cursor: pointer;" src="http://1.bp.blogspot.com/_j7RekXQWzxQ/R6w95d2Z3-I/AAAAAAAAACQ/BZXixFBI9E8/s400/firefox_proxy.png" alt="" id="BLOGGER_PHOTO_ID_5164570930161770466" border="0" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Commands:&lt;br /&gt;tsung recorder&lt;br /&gt;tsung stop_recorder&lt;br /&gt;&lt;br /&gt;Then you just have to copy the xml file generated the recoreder in &lt;tt&gt;~/.tsung/&lt;/tt&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Generating the html report&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;(make sure you have perl installed with the Template Toolkit is used for HTML  reports (see &lt;a href="http://template-toolkit.org/"&gt;&lt;tt&gt;http://template-toolkit.org/&lt;/tt&gt;&lt;/a&gt; . For ubuntu gutsy, there is package available&lt;br /&gt;&lt;br /&gt; cd to the log directory of your test (say &lt;tt&gt;~/.tsung/log/20040325-16:33/&lt;/tt&gt;) and use the script &lt;tt&gt;tsung_stats.pl&lt;/tt&gt;:&lt;br /&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;table border="0" cellpadding="0" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td colspan="3" bgcolor="black"&gt;&lt;table border="0" cellpadding="0" cellspacing="1"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td colspan="1" bgcolor="black"&gt;&lt;table border="0" cellpadding="0" cellspacing="1"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt; &lt;td&gt;&lt;table border="0" cellpadding="1" cellspacing="0"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt;&lt;pre class="verbatim"&gt;/usr/lib/tsung/bin/tsung_stats.pl&lt;br /&gt;&lt;/pre&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt; &lt;td colspan="1" bgcolor="black"&gt;&lt;table border="0" cellpadding="0" cellspacing="1"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt; &lt;/tr&gt; &lt;tr&gt;&lt;td colspan="3" bgcolor="black"&gt;&lt;table border="0" cellpadding="0" cellspacing="1"&gt; &lt;tbody&gt;&lt;tr&gt;&lt;td&gt; &lt;br /&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;/td&gt; &lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;&lt;br /&gt;(use &lt;span style="color:purple;"&gt;–help&lt;/span&gt; to view all available options)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6349415870453085594?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6349415870453085594/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6349415870453085594' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6349415870453085594'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6349415870453085594'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/load-testing-rails-application-with.html' title='Load testing a Rails application with Tsung'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_j7RekXQWzxQ/R6w95d2Z3-I/AAAAAAAAACQ/BZXixFBI9E8/s72-c/firefox_proxy.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1657547298212855048</id><published>2008-01-29T10:32:00.000+01:00</published><updated>2008-01-29T10:51:51.359+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Update rubygems to the latest version</title><content type='html'>&lt;blockquote&gt;sudo gem update --system&lt;/blockquote&gt;&lt;br /&gt;With Ubuntu (my version is Gutsy at the time of this writing), you will run with the problem&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://www.nickpeters.net/2007/12/31/fix-for-uninitialized-constant-gemgemrunner-nameerror/" rel="bookmark" title="Permanent Link: Fix for “uninitialized constant Gem::GemRunner (NameError)”"&gt;“uninitialized constant Gem::GemRunner (NameError)”&lt;/a&gt;&lt;/h2&gt;&lt;br /&gt;Take a look at http://www.nickpeters.net/2007/12/31/fix-for-uninitialized-constant-gemgemrunner-nameerror/ for the solution. I did a&lt;br /&gt;&lt;blockquote&gt;sudo cp /usr/bin/gem1.8 /usr/bin/gem&lt;/blockquote&gt;&lt;br /&gt;You'll need the latest version of rubygems for Rails 2.0.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1657547298212855048?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1657547298212855048/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1657547298212855048' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1657547298212855048'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1657547298212855048'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/update-rubygems-to-latest-version.html' title='Update rubygems to the latest version'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6514151695263932962</id><published>2008-01-25T17:24:00.000+01:00</published><updated>2008-01-25T17:48:54.971+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Dual screen on Ubuntu Gutsy with Toshiba laptop Intel 945</title><content type='html'>I have been learning a lot since I started using linux ubuntu:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;to install Dreamweaver with wine&lt;/li&gt;&lt;li&gt;to connect a network preinter with avahi and cups&lt;/li&gt;&lt;li&gt;and now I have finally managed to set up a "Dual screen" so I can be more &lt;a href="http://martinfowler.com/bliki/BigScreen.html"&gt;productive&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I found most of the information in the &lt;a href="http://www.thinkwiki.org/wiki/Xorg_RandR_1.2"&gt;xorg xrandr wik&lt;/a&gt;i, it took me 1 hour but the actual set up is very simple:&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;plug the external monitor before you swich on yout laptop and change the resolution with the GUI&lt;br /&gt;&lt;/li&gt;&lt;li&gt;back up yr /etc/X11/xorg.conf and generate a fresh one with&lt;br /&gt;&lt;pre&gt;&lt;code style="white-space: nowrap; color: rgb(73, 89, 136); background-color: white;"&gt;sudo dpkg-reconfigure -phigh xserver-xorg&lt;/code&gt;     &lt;/pre&gt;&lt;/li&gt;&lt;li&gt;Run &lt;span style="font-weight: bold;"&gt;xrandr --output LVDS --auto --left-of VGA  &lt;/span&gt;to see the size of the virtual screen you need, it will return an error message saying your current max size and the one you need&lt;br /&gt;&lt;/li&gt;&lt;li&gt;edit the /etc/X11/xorg.conf and add the magic line with virtual (don't use mine!)&lt;br /&gt;&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;blockquote&gt;Section "Screen"&lt;br /&gt;    Identifier    "Default Screen"&lt;br /&gt;    Device        "Intel Corporation Mobile 945GM/GMS, 943/940GML Express Integrated Graphics Controller"&lt;br /&gt;    Monitor        "Acer AL2251W"&lt;br /&gt;    DefaultDepth    24&lt;br /&gt;    SubSection "Display"&lt;br /&gt;        Modes        "1680x1680" "1680x1050" "1600x1200" "1440x1440" "1280x1024" "1152x864" "1024x768" "832x624" "800x600" "720x400" "640x480"&lt;br /&gt;                &lt;span style="font-weight: bold;"&gt;Virtual         2880 1200 &lt;/span&gt;&lt;br /&gt;    EndSubSection&lt;br /&gt;EndSection&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;log out, run &lt;span style="font-weight: bold;"&gt;xrandr --output LVDS --auto --left-of VGA&lt;br /&gt;&lt;/span&gt;&lt;span&gt;and that's it! You can also put the laptop screen on the right with the&lt;span style="font-weight: bold;"&gt; &lt;/span&gt;option&lt;span style="font-weight: bold;"&gt; --right-of&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;IMPORTANT, DO NOT USE :&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;img alt="The image “http://www.ubuntu.com/files/u1/710_displayconfig1.jpg” cannot be displayed, because it contains errors." src="http://www.ubuntu.com/files/u1/710_displayconfig1.jpg" /&gt;&lt;br /&gt;&lt;span&gt;&lt;br /&gt;It doesn't work! and will break your xorg.conf :-(&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6514151695263932962?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6514151695263932962/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6514151695263932962' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6514151695263932962'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6514151695263932962'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/dual-screen-on-ubuntu-gutsy-with.html' title='Dual screen on Ubuntu Gutsy with Toshiba laptop Intel 945'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8746787561728276369</id><published>2008-01-25T11:14:00.000+01:00</published><updated>2008-01-25T11:21:34.457+01:00</updated><title type='text'>Dealing with files whose status is !</title><content type='html'>subversion can be a pain in the a** !!!&lt;br /&gt;&lt;br /&gt;If you have some files whose status is :&lt;br /&gt;&lt;br /&gt;&lt;pre class="screen"&gt;&lt;blockquote&gt;ghost_file.txt !    Resource is missing or incomplete (removed by another tool than Subversion) You won't be able to commit them.&lt;/blockquote&gt;&lt;/pre&gt;The easiest hack to deal with it is to create the missing file and add it again to subversion.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;pico ghost_file.txt&lt;br /&gt;svn add ghost_file.txt&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;Time to move to &lt;a href="http://git.or.cz/"&gt;git&lt;/a&gt; or &lt;a href="http://www.selenic.com/mercurial/"&gt;mercurial&lt;/a&gt;!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8746787561728276369?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8746787561728276369/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8746787561728276369' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8746787561728276369'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8746787561728276369'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/dealing-with-files-whose-status-is.html' title='Dealing with files whose status is !'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6509732827080491383</id><published>2008-01-25T01:38:00.001+01:00</published><updated>2008-01-25T01:38:38.608+01:00</updated><title type='text'>21 croissants daily post 01/25/2008</title><content type='html'>&lt;p class='title'&gt;&lt;strong&gt;&lt;a href="http://groups.google.com/group/google-mail-updates-and-alerts-uk/browse_frm/thread/bda273b8a0ef6cb4/03d22eadca5b781e?hl=en-UK&amp;lnk=gst&amp;q=upgrade"&gt;Trick: Update gmail to the new interface&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;tags: &lt;a href='http://www.diigo.com/user/jeanmichelg/21croissantsblog'&gt;21croissantsblog&lt;/a&gt;, &lt;a href='http://www.diigo.com/user/jeanmichelg/gmail'&gt;gmail&lt;/a&gt;&lt;/p&gt;&lt;ul class='comments'&gt;&lt;li style="line-height:150%"&gt;It turns out that changing gmail language from English(UK) to English(US) activated the new interface !!! Google is the champion of communication!!! I was waiting like a pinguin ...&lt;br /&gt;&lt;span style="font-size: .8em;"&gt;&amp;nbsp;-&amp;nbsp;post by &lt;a href="http://www.diigo.com/user/jeanmichelg"&gt;jeanmichelg&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6509732827080491383?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6509732827080491383/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6509732827080491383' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6509732827080491383'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6509732827080491383'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/21-croissants-daily-post-01252008.html' title='21 croissants daily post 01/25/2008'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3079751881314446655</id><published>2008-01-21T15:07:00.000+01:00</published><updated>2008-01-21T15:17:47.990+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ubuntu'/><title type='text'>Connect a network Samsung printer connected to an airport router</title><content type='html'>1. Find the printer IP&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;avahi-browse --all --resolve&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;The output will be something like:&lt;br /&gt;&lt;br /&gt;= eth1 IPv4 Samsung ML-2010                               PDL Printer          local&lt;br /&gt;  hostname = [Linqia.local]&lt;br /&gt;  address = [192.168.0.201]&lt;br /&gt;  port = [9100]&lt;br /&gt;  txt = ["ty=Samsung ML-2010" "usb_STATUS=BUSY" "usb_CLS=PRINTER" "usb_MDL=ML-2010" "usb_CMD=GDI" "usb_MFG=Samsung" "priority=5" "pdl=U" "product=(Samsung ML-2010)" "note=Linqia" "qtotal=1" "txtvers=1"]&lt;br /&gt;&lt;br /&gt;2. Add the printer using the "Administration Printing" GUI.&lt;br /&gt;Select a APPSocket / HP Jet Direct and enter the ip address in the hostname field.&lt;br /&gt;Example: 192.168.0.201:9100&lt;br /&gt;&lt;br /&gt;3. Footomatik should already have the driver for your printer, you just have to select the model&lt;br /&gt;In my case: Samsung ML-2010&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3079751881314446655?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3079751881314446655/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3079751881314446655' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3079751881314446655'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3079751881314446655'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/connect-network-samsung-printer.html' title='Connect a network Samsung printer connected to an airport router'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-9140645523067869908</id><published>2008-01-09T17:42:00.000+01:00</published><updated>2008-01-09T18:14:07.054+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='postgres'/><title type='text'>Learning PL/pgSQL - SQL Procedural Language</title><content type='html'>I am working on my first project with Postgres and there are a couple of stuff I wanted to document:&lt;br /&gt;&lt;br /&gt;To install PL/pgSQL which is not installed by default (!), execute the SQL command on your db:&lt;br /&gt;&lt;blockquote&gt;CREATE LANGUAGE plpgsql; &lt;/blockquote&gt;Otherwise you will get the error message: "&lt;span&gt;&lt;span style="font-family:Arial, Helvetica, sans-serif;"&gt;ERROR:  language "plpgsql" does not exist&lt;/span&gt;&lt;/span&gt;" ...&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Another surprising missing feature is the inability to connect to other databases. It's not included by default in Postgres but seats in the postgres/contrib project within the funcion dblink.&lt;br /&gt;&lt;br /&gt;To install it on ubuntu:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;sudo apt-get -y install postgresql-8.2 postgresql-contrib&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;That's not finished! You have to run the script manually to install it.&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;psql -U postgres  your_database_name &lt; /usr/share/postgresql/8.2/contrib/dblink.sql&lt;/blockquote&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-9140645523067869908?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/9140645523067869908/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=9140645523067869908' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/9140645523067869908'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/9140645523067869908'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/learning-plpgsql-sql-procedural.html' title='Learning PL/pgSQL - SQL Procedural Language'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2286051934817045927</id><published>2008-01-02T17:50:00.000+01:00</published><updated>2008-01-02T17:55:19.126+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='database'/><title type='text'>Import / Export a postgres db</title><content type='html'>&lt;div class="wikipage"&gt; postgres is the database user. On ubuntu, you should run this command as the user "postgres": &lt;span style="font-weight: bold;"&gt;su postgres&lt;/span&gt; (password by default is 'password' !)     &lt;div id="searchable"&gt;&lt;p&gt; Dump a database into a sql script:&lt;br /&gt;&lt;/p&gt; &lt;p&gt;&lt;span style="font-weight: bold;"&gt; pg_dump database_name -Upostgres -W &gt; ~/dump_script.sql&lt;/span&gt; &lt;/p&gt; &lt;p&gt; Restore the database from sql script: &lt;/p&gt; &lt;p&gt;&lt;span style="font-weight: bold;"&gt; psql -U postgres &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;database_name&lt;/span&gt;&lt;span style="font-weight: bold;"&gt; -f - &lt; &lt;/span&gt;&lt;span style="font-weight: bold;"&gt;dump_script.sql&lt;/span&gt; &lt;/p&gt;&lt;/div&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2286051934817045927?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2286051934817045927/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2286051934817045927' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2286051934817045927'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2286051934817045927'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/import-export-postgres-db.html' title='Import / Export a postgres db'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8440742010519703797</id><published>2008-01-01T01:38:00.001+01:00</published><updated>2008-01-29T12:05:19.832+01:00</updated><title type='text'>21 croissants daily post 01/01/2008</title><content type='html'>&lt;p class="title"&gt;&lt;strong&gt;&lt;a href="http://www.elctech.com/2007/12/10/testing-without-the-database"&gt;Ruby on Rails: Testing without the database&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul class="comments"&gt;&lt;li style="line-height: 150%;"&gt;Unit Test = to test our code, not the class under test dependencies. Testing without the DB is also a good way of accelerating tests&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;br /&gt;&lt;a href="http://www.diigo.com/user/jeanmichelg"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8440742010519703797?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8440742010519703797/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8440742010519703797' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8440742010519703797'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8440742010519703797'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2008/01/21-croissants-daily-post-01012008.html' title='21 croissants daily post 01/01/2008'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8311501113930207256</id><published>2007-11-22T11:15:00.000+01:00</published><updated>2007-11-22T13:25:13.675+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='railsconf'/><title type='text'>Petite enquête sur vos attentes de Paris on Rails</title><content type='html'>&lt;p&gt;J'imagine que le site de Paris on Rails va rediriger pas mal de people sur mon blog alors j'en profite pour faire un petit sondage sur vos attentes:&lt;/p&gt;&lt;br /&gt;&lt;iframe src="http://polls.zoho.com/external/garnierjm/petite-enqu%C3%83%C2%AAte-sur-les-attentes-de-la-pr%C3%83%C2%A9sentation-les-tests-avec-ruby-on-rails" frameborder="0" height="210" width="460"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://polls.zoho.com/external/garnierjm/es-tu-familier-avec-le-test-driven-development" frameborder="0" height="210" width="460"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;&lt;iframe src="http://polls.zoho.com/external/garnierjm/utilises-tu-des-outils-de-tests-automatiques-d-ihm-webs-watir-selenium-etc" frameborder="0" height="210" width="460"&gt;&lt;/iframe&gt;&lt;br /&gt;&lt;br /&gt;Cela me permettra d'ajuster le contenu de ma présentation, qui n'est d'ailleurs que dans le stade d'une mindmap à l'heure oú j'ecris ce mot ...&lt;br /&gt;&lt;br /&gt;Si vous avez des suggestions, merci de poster un commentaire, je ne manquerai pas de publier ceux qui me paraissent constructifs. C'est pas beau l'internet participatif? D'autre part, je publierai toutes mes sources (présentations sur RSpec en anglais et liens) dans ce blog.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8311501113930207256?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8311501113930207256/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8311501113930207256' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8311501113930207256'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8311501113930207256'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/11/petite-enqute-sur-vos-attentes-de-paris.html' title='Petite enquête sur vos attentes de Paris on Rails'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8581577387022604610</id><published>2007-11-19T19:15:00.002+01:00</published><updated>2008-03-11T17:41:16.226+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><title type='text'>RSpec Resources</title><content type='html'>Subscribe to the RSS of my RSpec presentations:&lt;br /&gt;&lt;a href="http://www.box.net/public/13l9j3dioj/rss.xml" rel="alternate" title="Subscribe" type="application/rss+xml"&gt;&lt;img alt="" src="http://www.feedburner.com/fb/images/pub/feed-icon32x32.png" style="border: 0pt none ; display: none;" /&gt;&lt;/a&gt;&lt;br /&gt;(click on the RSS logo)&lt;br /&gt;&lt;br /&gt;&lt;a href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=13l9j3dioj&amp;amp;v=1"&gt;&lt;/a&gt;&lt;a style="left: 0px ! important; top: 12px ! important;" title="Block this object with Adblock Plus" class="abp-objtab-0004629584443033963 visible ontop" href="http://www.box.net/static/flash/box_explorer.swf?widgetHash=13l9j3dioj&amp;amp;v=1"&gt;&lt;/a&gt;&lt;embed src="http://www.box.net/static/flash/box_explorer.swf?widgetHash=13l9j3dioj&amp;amp;v=1" wmode="transparent" type="application/x-shockwave-flash" height="300" width="560"&gt;&lt;/embed&gt;&lt;br /&gt;&lt;br /&gt;My bookmarks with the 'rspec' tag:&lt;br /&gt;&lt;br /&gt;&lt;script type="text/javascript" src="http://preview.diigo.com/roll2/linkrolls?username=jeanmichelg&amp;l_type=0&amp;count=50&amp;style=neat&amp;title=&amp;tags=rspec" &gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href="http://preview.diigo.com/user/jeanmichelg" &gt;Rails tags&lt;/a&gt;&lt;/noscript&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8581577387022604610?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8581577387022604610/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8581577387022604610' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8581577387022604610'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8581577387022604610'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/11/rspec-presentations-resources.html' title='RSpec Resources'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8561662206319009642</id><published>2007-11-15T01:38:00.001+01:00</published><updated>2008-01-29T12:04:41.008+01:00</updated><title type='text'>21 croissants daily post 11/15/2007</title><content type='html'>&lt;p class="title"&gt;&lt;strong&gt;&lt;a href="http://www.nbarthelemy.com/2007/4/4/new-rails-plugin-local_auto_completer"&gt;nbarthelemy.com New Rails Plugin: local_auto_completer&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul class="comments"&gt;&lt;li style="line-height: 150%;"&gt;Plugin of the day!&lt;br /&gt;How many billons the plugins are there around??? I am making a few changes to it because I also want the id so I can use it with belongs_to associations attributes.&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;br /&gt;&lt;a href="http://www.diigo.com/user/jeanmichelg"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8561662206319009642?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8561662206319009642/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8561662206319009642' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8561662206319009642'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8561662206319009642'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/11/21-croissants-daily-post-11152007.html' title='21 croissants daily post 11/15/2007'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3193370507959446717</id><published>2007-11-09T01:38:00.001+01:00</published><updated>2008-01-29T12:04:24.407+01:00</updated><title type='text'>21 croissants daily post 11/09/2007</title><content type='html'>&lt;p class="title"&gt;&lt;strong&gt;&lt;a href="http://weblog.jamisbuck.org/2007/1/5/brevity-vs-clarity"&gt;the { buckblogs :here }: Brevity vs. Clarity&lt;/a&gt;&lt;/strong&gt;&lt;/p&gt;&lt;ul class="comments"&gt;&lt;li style="line-height: 150%;"&gt;Ruby on Rails code should be like a poem ;- )&lt;br /&gt;Code shoule be readable by humans, when I read code containing 2 ternary operators, it takes me 5 min to understand it ... What's the point? Apart from not wanting other to change it??? Fortunately, I have some tests and I am not scared to refactor ...&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;br /&gt;&lt;a href="http://www.diigo.com/user/jeanmichelg"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3193370507959446717?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3193370507959446717/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3193370507959446717' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3193370507959446717'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3193370507959446717'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/11/21-croissants-daily-post-11092007.html' title='21 croissants daily post 11/09/2007'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1208533775993541070</id><published>2007-11-07T10:00:00.000+01:00</published><updated>2007-11-07T10:15:57.322+01:00</updated><title type='text'>RSpec at Paris on Rails 2007</title><content type='html'>&lt;div class="resume"&gt;Last year, I gave a talk about &lt;a href="http://2006.conferenciarails.org/conferenciantes.php#jeanmichel"&gt;testing Rails at the first  Spanish RailsConf&lt;/a&gt; in Madrid. It was quite a challenge because I am not fluent in Spanish and it was the first time since university I was talking in front of such a large public.&lt;br /&gt;This year, I will have the honour to talk after &lt;a href="http://weblog.rubyonrails.com/2007/10/29/paris-on-rails-november-15th"&gt;DHH&lt;/a&gt; at Paris on Rails 2007 on the 10th of december 2007. I will attempt to evangelize the crowd about the beauty of BDD and show some demos with RSpec, Autotest, RCov, ....&lt;br /&gt;&lt;br /&gt;You'll find all details at the &lt;a href="http://paris.onrails.info/conferenciers"&gt;conference page&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;Here is the full details in French:                         &lt;p&gt;Les Tests avec Ruby on Rails&lt;/p&gt;                         &lt;p&gt;La nécessité d'écrire des tests automatisés fait l'unanimité auprès de la                           communauté Rails. Mais, par où commencer? On les écrit &lt;b&gt;après&lt;/b&gt; avoir                           implémenté une nouvelle fonctionnalité ou encore &lt;b&gt;avant&lt;/b&gt;, afin de                           spécifier le comportement de nos objets dans un langage naturel proche du                           jargon métier parlé par les utilisateurs.&lt;/p&gt;                            &lt;p&gt;Et quand on a terminé d'écrire ces fameux tests, comment en tirer le meilleur                             parti? Comment être certain que ce "commit" de 2 lignes de code ne va pas                             casser une fonctionnalité majeure d'un module développé par un autre collègue?&lt;br /&gt;                            Quand peut-on considérer que l'on a écrit suffisamment de tests?&lt;br /&gt;                            Faut-il aller jusqu'à automatiser les tests de l'IHM afin de garantir que les                             interfaces AJAX fonctionnent avec tous les navigateurs et OS du marché?&lt;/p&gt;                              &lt;p&gt;Pendant cette présentation, nous évoquerons le&lt;/p&gt;                             &lt;ul&gt;&lt;li&gt;&lt;a href="http://fr.wikipedia.org/wiki/Test_Driven_Development" id="ro19" title="TDD"&gt;TDD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://behaviour-driven.org/" id="nm1p" title="BDD"&gt;BDD&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://rspec.rubyforge.org/" id="wfmv" title="RSpec"&gt;RSpec&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.railsfrance.org/node/873" id="gbe" title="AutoTest"&gt;AutoTest&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.labo-sun.com/resource-fr-articles-1254-0-Java-build-cruisecontrol-l-outil-d-integration-continue-a-avoir-dans-sa-boite-a-outils.htm" id="y312" title="CruiseControl"&gt;CruiseControl&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.boldr.fr/tags/rcov" id="uy3b" title="Rcov"&gt;Rcov&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://blog.valtech.fr/wordpress/2007/06/24/selenium-automatisation-de-tests-fonctionnels/" id="x8ie" title="Selenium"&gt;Selenium&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;                             &lt;p&gt;et quelques autres outils tout en apportant les réponses à ces questions.&lt;/p&gt;                           &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1208533775993541070?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1208533775993541070/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1208533775993541070' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1208533775993541070'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1208533775993541070'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/11/rspec-at-paris-on-rails-2007.html' title='RSpec at Paris on Rails 2007'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5736998063833135886</id><published>2007-11-05T01:39:00.001+01:00</published><updated>2008-01-29T11:59:32.028+01:00</updated><title type='text'>21 croissants daily post 11/05/2007</title><content type='html'>&lt;p class="title"&gt;&lt;strong&gt;&lt;a href="http://ubuntuforums.org/showthread.php?t=587450"&gt;device-mapper: table: 245:1: linear: dm-linear: device lookup failed - Ubuntu Forums&lt;/a&gt;&lt;/strong&gt; &lt;/p&gt;&lt;ul class="comments"&gt;&lt;li style="line-height: 150%;"&gt;This "sudo aptitude remove evms" saved my life, after the upgrade to Ubuntu gutsy from Fesity, my computer went crazy and was displaying billons of lines "&lt;strong&gt;device-mapper: table: 245:1: linear: dm-linear: device lookup failed". I had to try to type this command line while the screen was continuously displaying these lines !!! Not sure I will keep with linux (I want a MAC)!&lt;/strong&gt;&lt;br /&gt;&lt;span style="font-size:0;"&gt;&lt;br /&gt;&lt;a href="http://www.diigo.com/user/jeanmichelg"&gt;&lt;/a&gt;&lt;/span&gt;&lt;/li&gt;&lt;/ul&gt;&lt;div class="highlights"&gt;&lt;div class="content"&gt;device-mapper: table: 245:1: linear: dm-linear: device lookup failed&lt;/div&gt;&lt;ul&gt;&lt;/ul&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5736998063833135886?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5736998063833135886/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5736998063833135886' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5736998063833135886'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5736998063833135886'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/11/21-croissants-daily-post-11052007.html' title='21 croissants daily post 11/05/2007'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8264426840514428519</id><published>2007-10-24T15:43:00.000+02:00</published><updated>2007-10-24T15:50:40.638+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><title type='text'>Output the rspec report to an html file</title><content type='html'>&lt;blockquote&gt;rake spec&lt;/blockquote&gt;&lt;br /&gt;Create a spec.opts with:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;--format&lt;br /&gt;html:doc/rspec_report.html&lt;br /&gt;--loadby&lt;br /&gt;mtime&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;=&gt; It will generate a rspec_report.html file in your  doc folder!!!&lt;br /&gt;&lt;br /&gt;The rspec documentation actually explains it but I missed an example to start using it ...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8264426840514428519?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8264426840514428519/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8264426840514428519' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8264426840514428519'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8264426840514428519'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/10/output-rspec-report-to-html-file.html' title='Output the rspec report to an html file'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4554426110242532471</id><published>2007-10-04T17:10:00.000+02:00</published><updated>2007-10-04T18:06:33.327+02:00</updated><title type='text'>Do not use an IDE to commit with svn your rails frozen gems!</title><content type='html'>After having lost a couple of hours trying to commit my rails/vendor both with netbeans and subeclipse, I think it's time to come back to old school command line: it's 10 times faster and do no take 100% CPU!!!&lt;br /&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Go to the vendor folder&lt;/li&gt;&lt;li&gt;svn add rails&lt;/li&gt;&lt;li&gt;svn commit -m "Added vendor/rails version 1.2.3"&lt;/li&gt;&lt;/ul&gt;Done!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4554426110242532471?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4554426110242532471/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4554426110242532471' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4554426110242532471'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4554426110242532471'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/10/do-not-use-ide-to-commit-with-svn-your.html' title='Do not use an IDE to commit with svn your rails frozen gems!'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5354001134773831725</id><published>2007-09-28T19:56:00.000+02:00</published><updated>2007-09-28T20:23:44.457+02:00</updated><title type='text'>Playing with float arithmetics with Ruby: how to truncate decimals</title><content type='html'>I needed to truncate a float to 4 decimals because I am using geocoding in my app and Google map returns coordinates with a lot of decimals ...&lt;br /&gt;&lt;br /&gt;After &lt;a href="http://www.nabble.com/How-to-truncate-float-number-after-dot--tf4150359.html"&gt;reading this post in the ruby-talk mailing list&lt;/a&gt;, I decided to take a break in my development and write the following code :&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;require 'benchmark'&lt;br /&gt;&lt;br /&gt;class Float&lt;br /&gt;  def truncate_decimals_with_printf(number_of_decimals_after_dot)&lt;br /&gt;    ("%.#{number_of_decimals_after_dot}f" % self).to_f&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def truncate_decimals_with_regexp(number_of_decimals_after_dot)&lt;br /&gt;    match = Regexp.compile("\\d*." + "\\d" * number_of_decimals_after_dot).match(self.to_s)&lt;br /&gt;    match[0].to_f&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  def truncate_decimals_with_arithmetic(number_of_decimals_after_dot)&lt;br /&gt;    x = 10 ** number_of_decimals_after_dot&lt;br /&gt;    (self * x).round.to_f / x&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;describe "Float.truncate_decimals" do&lt;br /&gt;  &lt;br /&gt;  it "could truncate decimals using printf" do&lt;br /&gt;    1.12349.truncate_decimals_with_printf(4).should == 1.1234&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  it "could truncate decimals using a regexp" do&lt;br /&gt;    1.12349.truncate_decimals_with_regexp(4).should == 1.1234&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  it "could truncate decimals using arithmetic" do&lt;br /&gt;    1.12349.truncate_decimals_with_arithmetic(4).should == 1.1234&lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;  it "Benchmark:" do    &lt;br /&gt;    Benchmark.bm(10) do |timer|&lt;br /&gt;      timer.report('arithmetic') { 1.12349.truncate_decimals_with_arithmetic(4) }&lt;br /&gt;      timer.report('printf') { 1.12349.truncate_decimals_with_printf(4) }&lt;br /&gt;      timer.report('regexp') { 1.12349.truncate_decimals_with_regexp(4) }      &lt;br /&gt;    end    &lt;br /&gt;  end&lt;br /&gt;  &lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;The result:&lt;br /&gt;&lt;br /&gt;Float.truncate_decimals&lt;br /&gt;- could truncate decimals using printf (FAILED - 1)&lt;br /&gt;- could truncate decimals using a regexp&lt;br /&gt;- could truncate decimalsusing arithmetic (FAILED - 2)&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;                user     system      total        real&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;arithmetic  0.000000   0.000000   0.000000 (  &lt;span style="color: rgb(255, 0, 0);"&gt;0.000015&lt;/span&gt;)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;printf      0.000000   0.000000   0.000000 (  0.000017)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;regexp      0.000000   0.000000   0.000000 (  0.000028)&lt;/span&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;- Benchmark:&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;1)&lt;br /&gt;'Float.truncate_decimals could truncate decimals using printf' FAILED&lt;br /&gt;expected: 1.1234,&lt;br /&gt;     got: 1.1235 (using ==)&lt;br /&gt;/home/jeanmichel/ruby/projects/iss2.0/spec/models/float_spec.rb:22:&lt;br /&gt;&lt;br /&gt;2)&lt;br /&gt;'Float.truncate_decimals could truncate using arithmetic' FAILED&lt;br /&gt;expected: 1.1234,&lt;br /&gt;     got: 1.1235 (using ==)&lt;br /&gt;/home/jeanmichel/ruby/projects/iss2.0/spec/models/float_spec.rb:30:&lt;br /&gt;&lt;br /&gt;Finished in 0.008598 seconds&lt;br /&gt;&lt;br /&gt;4 examples, 2 failures&lt;br /&gt;&lt;br /&gt;The arithmetric solution is the fastest! Faster than printf ! Computers are good at division and multiplication ;-) The regexp is damned slow, however it's the only one which actually fullfill the specs ;-)&lt;br /&gt;&lt;br /&gt;Any idea how to change other implementations ?&lt;br /&gt;&lt;br /&gt;Today, I have lost a few hours because the arithmetic implementation was working on my dev box, a Linux 2.6.20-16-386 i686 GNU with a ruby 1.8.5 (2006-08-25) [i486-linux] and NOT at all on my production server, a &lt;br /&gt;Linux i686 i686 i386 GNU/Linux with a ruby 1.8.4 (2005-12-24) [i386-linux] ...&lt;br /&gt;&lt;br /&gt;At the end, I used the printf version, which is OK because I don't care about the rounding...&lt;br /&gt;&lt;br /&gt;Most important rule: you should always get a stage server IDENTICAL to your production server and run the tests / specs on it before deploying!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5354001134773831725?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5354001134773831725/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5354001134773831725' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5354001134773831725'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5354001134773831725'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/09/playing-with-float-arithmetics-with.html' title='Playing with float arithmetics with Ruby: how to truncate decimals'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1650321343753322837</id><published>2007-09-17T17:03:00.000+02:00</published><updated>2007-09-17T23:30:36.163+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Hola RailsConf Europa</title><content type='html'>Escribo este mensaje para los que hayan visto mi mensaje en el message board, y que quieran saber un poco más sobre 21 croissants.&lt;br /&gt;&lt;br /&gt;Soy un programador Rails desde el 2006 y me encantan el "testing", BDD, RSpec, selenium, etc ... Echa un ojo a mi &lt;a href="http://2006.conferenciarails.org/ponencias-video.php?v=testingrails"&gt;ponencia a Rails Hispana&lt;/a&gt; en el 2006&lt;br /&gt;&lt;br /&gt;Para resumir, después de  5 años de Java, en Paris, Londres y Barcelona, empiezo mi actividad de autónomo con &lt;a href="http://www.eco-union.org/"&gt;eco-union&lt;/a&gt;, una asociación ecologista y estoy buscando clientes (ONGs / Asociaciones / Servicios públicos o PYMES.&lt;br /&gt;&lt;br /&gt;Me gustaría escribir tutoriales sobre RSpec y introducir este framework.  Me gustaría saber que te parece el Rspec y el testing.&lt;br /&gt;&lt;br /&gt;Mándame un mensaje si quieres quedar en la RailsConf.&lt;br /&gt;&lt;br /&gt;Hasta pronto!&lt;br /&gt;&lt;br /&gt; Jean-Michel&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1650321343753322837?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1650321343753322837/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1650321343753322837' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1650321343753322837'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1650321343753322837'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/09/hola-railsconf-europa.html' title='Hola RailsConf Europa'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2145786498758804257</id><published>2007-09-17T16:40:00.000+02:00</published><updated>2007-09-17T23:31:41.054+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='conference'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Bonjour RailsConf Europe</title><content type='html'>J'écris ce post au cas oú tu sois tombé sur ma carte de visite dans le message board de la RailsConf et tu voudrais en savoir un peu plus sur 21croissants.&lt;br /&gt;&lt;br /&gt;En 1 ligne, je développe avec Rails depuis 1 an et des brouettes et je suis passionné par le "testing", BDD, RSpec, selenium, etc ...&lt;br /&gt;&lt;br /&gt;Pour résumer en quelque lignes, après 5 ans de java successivement à Paris, Londres puis Barcelone, je commence mon activité de freelancer dans le cadre de &lt;a href="http://www.eco-union.org/"&gt;eco-union&lt;/a&gt;, association écologiste à Barcelone et je recherche des clients potentiels (ONGs/ associations / services publiques ou PMEs). Je n'ai pas encore décidé si j'allais rester en Espagne, et je suis donc intéressé par toutes les entreprises francophones (petite structures!) qui utilisent Rails et une méthode Agile.&lt;br /&gt;&lt;br /&gt;Je recherche également des partenaires freelancers intéressés par offrir des prestations de formation sur Ruby on Rails en français ou en anglais pour 2008.&lt;br /&gt;&lt;br /&gt;J'ai l'intention d'écrire des mini-tutoriels (screencasts) sur RSpec et présenter ce framework lors de la prochaine Paris On Rails. N'hésite pas à me donner ton point de vue sur ce framework et le testing en général.&lt;br /&gt;&lt;br /&gt;Envoie moi un email si tu as envie de me rencontrer en personne pendant la RailsConf.&lt;br /&gt;&lt;br /&gt;A bientôt j'espère!&lt;br /&gt;&lt;br /&gt;Jean-Michel&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2145786498758804257?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2145786498758804257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2145786498758804257' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2145786498758804257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2145786498758804257'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/09/bonjour-railsconf-europe.html' title='Bonjour RailsConf Europe'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3069416829466204105</id><published>2007-09-03T11:12:00.000+02:00</published><updated>2007-09-03T11:38:46.471+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Cheap Rails hosting</title><content type='html'>I pay about 10$ / month for the hosting of my apps at &lt;a href="http://site5.com"&gt;site5&lt;/a&gt;&lt;br /&gt;So far, I haven't had any major problem but I wonder if it's not time to move to a more powerful configuration with a more qualified support.&lt;br /&gt;&lt;br /&gt;I am not saying site5 support is not competent but they are a bit slow. Most of the time, there are different people who reply to my questions. I suspect they only have a few rails experts and a lot of people in their support with no specific specialization...&lt;br /&gt;&lt;br /&gt;Moreover, they are still using ruby 1.8.4, rubygems 0.9.2 and rails 1.1.6, more than 6 months after the release of Rails 1.2.3!!!&lt;br /&gt;&lt;br /&gt;When asking about moving to mongrel instead of the quite unstable fcgi, they reply they have not planned it ...&lt;br /&gt;&lt;br /&gt;Any host to recommand apart from &lt;a href="http://railsmachine.com"&gt;Railsmachine&lt;/a&gt;?&lt;br /&gt;&lt;br /&gt;I am going to try the startup at &lt;a href="http://www.primetime.no/services/application.html"&gt;primetime&lt;/a&gt;, a norwegian company whose engineers are top-notch gurus in linux and Rails.&lt;br /&gt;&lt;br /&gt;It happens they are also friends of mine from Oslo ;-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3069416829466204105?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3069416829466204105/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3069416829466204105' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3069416829466204105'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3069416829466204105'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/09/cheap-rails-hosting.html' title='Cheap Rails hosting'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2418139545001361191</id><published>2007-08-31T16:02:00.001+02:00</published><updated>2008-06-19T12:42:28.175+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Configuring Rails To Use Gmail’s SMTP Server</title><content type='html'>&lt;p&gt;Nothing original here I am afraid.&lt;br /&gt;I copied Google's cache from http://blog.pomozov.info/posts/how-to-send-actionmailer-mails-to-gmailcom.html&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;ol&gt;&lt;li&gt;Save the following code within your rails app in lib/smtp_tls.rb&lt;/li&gt;&lt;/ol&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;&lt;br /&gt;require "openssl"&lt;br /&gt;require "net/smtp"&lt;br /&gt;&lt;br /&gt;Net::SMTP.class_eval do&lt;br /&gt;private&lt;br /&gt;def do_start(helodomain, user, secret, authtype)&lt;br /&gt;raise IOError, 'SMTP session already started' if @started&lt;br /&gt;check_auth_args user, secret, authtype if user or secret&lt;br /&gt;&lt;br /&gt;sock = timeout(@open_timeout) { TCPSocket.open(@address, @port) }&lt;br /&gt;@socket = Net::InternetMessageIO.new(sock)&lt;br /&gt;@socket.read_timeout = 60 #@read_timeout&lt;br /&gt;#@socket.debug_output = STDERR #@debug_output&lt;br /&gt;&lt;br /&gt;check_response(critical { recv_response() })&lt;br /&gt;do_helo(helodomain)&lt;br /&gt;&lt;br /&gt;if starttls&lt;br /&gt;  raise 'openssl library not installed' unless defined?(OpenSSL)&lt;br /&gt;  ssl = OpenSSL::SSL::SSLSocket.new(sock)&lt;br /&gt;  ssl.sync_close = true&lt;br /&gt;  ssl.connect&lt;br /&gt;  @socket = Net::InternetMessageIO.new(ssl)&lt;br /&gt;  @socket.read_timeout = 60 #@read_timeout&lt;br /&gt;  #@socket.debug_output = STDERR #@debug_output&lt;br /&gt;  do_helo(helodomain)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;authenticate user, secret, authtype if user&lt;br /&gt;@started = true&lt;br /&gt;ensure&lt;br /&gt;unless @started&lt;br /&gt;  # authentication failed, cancel connection.&lt;br /&gt;  @socket.close if not @started and @socket and not @socket.closed?&lt;br /&gt;  @socket = nil&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def do_helo(helodomain)&lt;br /&gt; begin&lt;br /&gt;  if @esmtp&lt;br /&gt;    ehlo helodomain&lt;br /&gt;  else&lt;br /&gt;    helo helodomain&lt;br /&gt;  end&lt;br /&gt;rescue Net::ProtocolError&lt;br /&gt;  if @esmtp&lt;br /&gt;    @esmtp = false&lt;br /&gt;    @error_occured = false&lt;br /&gt;    retry&lt;br /&gt;  end&lt;br /&gt;  raise&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def starttls&lt;br /&gt;getok('STARTTLS') rescue return false&lt;br /&gt;return true&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def quit&lt;br /&gt;begin&lt;br /&gt;  getok('QUIT')&lt;br /&gt;rescue EOFError, OpenSSL::SSL::SSLError&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;ol&gt;&lt;li value="2"&gt;Add this code &lt;strong&gt;to &lt;em&gt;config/environment.rb&lt;/em&gt;&lt;br /&gt;&lt;/strong&gt;&lt;br /&gt;require “smtp_tls” &lt;p&gt;ActionMailer::Base.smtp_settings = {&lt;br /&gt;:address  =&gt; “smtp.gmail.com”,&lt;br /&gt;:port  =&gt; 587,&lt;br /&gt;:authentication  =&gt; :plain,&lt;br /&gt;:user_name  =&gt; “someone@openrain.com”,&lt;br /&gt;:password  =&gt; ’someonesPassword’&lt;br /&gt;} &lt;/p&gt;&lt;/li&gt;&lt;li&gt;Use ActionMailer as normal.&lt;/li&gt;&lt;/ol&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2418139545001361191?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2418139545001361191/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2418139545001361191' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2418139545001361191'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2418139545001361191'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/08/configuring-rails-to-use-gmails-smtp.html' title='Configuring Rails To Use Gmail’s SMTP Server'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3567925017233042928</id><published>2007-08-30T13:07:00.029+02:00</published><updated>2009-10-07T15:23:54.320+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='linux'/><title type='text'>Linux 101</title><content type='html'>&lt;h1&gt;&lt;br /&gt;&lt;/h1&gt;The (sad but real) truth is I am new to Linux, even if I have been using Unix systems (solaris based), back in 1995 at the university. My teachers were quite uncompetent and as my home pc was windows based, I did not learn as much as I could have done and forget little by little the few things I knew ...&lt;br /&gt;As I have decided to use this blog as a personal public knowledge database, I have decided to post about all the simple commands I learn.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;firefox, how to synchronise bookmarks&lt;/h3&gt;I am using both Linux Ubuntu and Windows XP on my laptop (with dual boot), I am using the foxmarks extenstion to keep my "Bookmarks Tool folder" synchronised. I kepp all my personal bookmarks on my del.icio.us&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;man&lt;/h3&gt;To quit, type "q"&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;vi&lt;/h3&gt;to edit a file: vi file_name.rb, then type "i" to edit&lt;br /&gt;More commands on http://www.comptechdoc.org/os/linux/usersguide/linux_ugvi.html&lt;br /&gt;&lt;br /&gt;To quit:&lt;br /&gt;If you were editing the file, escape the edition mode with the escape key.&lt;br /&gt;&lt;a href="http://images.google.es/imgres?imgurl=http://www.viksoe.dk/code/images/esc.png&amp;amp;imgrefurl=http://www.viksoe.dk/code/asciidesktop.htm&amp;amp;amp;h=45&amp;amp;w=46&amp;amp;sz=2&amp;amp;hl=en&amp;amp;start=16&amp;amp;amp;tbnid=_FNlFHHRCiDhtM:&amp;amp;tbnh=45&amp;amp;tbnw=46&amp;amp;prev=/images%3Fq%3Descape%2Bkey%26imgsz%3Dicon%26svnum%3D10%26hl%3Den%26lr%3D%26client%3Dfirefox%26rls%3Dorg.mozilla:en-US:unofficial%26sa%3DN"&gt;&lt;img style="border: 1px solid ; width: 43px; height: 43px;" src="http://images.google.es/images?q=tbn:_FNlFHHRCiDhtM:http://www.viksoe.dk/code/images/esc.png" /&gt;&lt;/a&gt;&lt;br /&gt;:q&lt;br /&gt;&lt;br /&gt;To save:&lt;br /&gt;:wq&lt;h3&gt;sudo&lt;/h3&gt;To do things that required "root" privileges.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;configuration : /etc directory&lt;/h3&gt;&lt;br /&gt;To add a folder to the PATH variable, the "best" seems to edit the file ~/.bashrc&lt;br /&gt;gedit ~/.bashrc&lt;br /&gt;&lt;br /&gt;and append at the end of the file:&lt;br /&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;PATH=$PATH:~/programs/scripts &lt;/span&gt; &lt;span style="background-color: rgb(204, 255, 255);"&gt;export PATH&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;Taken from http://ubuntuforums.org/showthread.php?t=269793&amp;amp;highlight=PATH&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;bash&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;dl compact="yes"&gt;&lt;dt&gt;When I start my machine for work, I end up launching more or less the same application. I wanted to write a quick script which allows to launch all these applications in one-click!&lt;/dt&gt;&lt;dd&gt;Reading http://www.mkssoftware.com/docs/man1/sh.1.asp, I found about the &amp;amp;&lt;br /&gt;&lt;/dd&gt;&lt;dd&gt;&lt;br /&gt;&lt;/dd&gt;&lt;dt&gt;&lt;tt&gt;&amp;amp;&lt;/tt&gt; &lt;/dt&gt;&lt;dd&gt; &lt;p class="firstline"&gt; asynchronously executes the &lt;i&gt;command&lt;/i&gt; that precedes it. This means that the shell just starts the &lt;i&gt;command&lt;/i&gt; running and then immediately goes on to take new input, before the &lt;i&gt;command&lt;/i&gt; finishes execution. &lt;/p&gt;  &lt;/dd&gt;&lt;/dl&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;creating alias&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;gedit ~/.bashrc&lt;br /&gt;Append alias at the end of the file:&lt;br /&gt;alias ll='ls -l'&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;Locking the screen with the "key menu" is not cool!&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;&lt;/span&gt;&lt;/span&gt;&lt;/h3&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;I was looking for a software which would allow me to customize keyboard shortcuts and I came accross &lt;/span&gt;&lt;/span&gt;&lt;a title="keytouch" href="http://keytouch.sourceforge.net/"&gt;keytouch&lt;/a&gt;  &lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt; , which seems great but you have to configure your keyboard in order to use it.&lt;br /&gt;I thought I could do that later and then share my work to the community ...&lt;br /&gt;Oooops! There was a side effect, every time I hitted the "menu" key&lt;/span&gt;&lt;/span&gt;, it was locking my screen! After 1 day of clumsy locking and having lost 30 minutes searching into ubuntu forums what was happening, I decided to uninstall keytouch. Bingo!&lt;br /&gt;It was such an improductive hour! Next time, I won't spend more than 15 minutes on that kind of shits ...&lt;br /&gt;&lt;br /&gt;I didn't know the name of this *&amp;amp;$·%· key, this is how does it look like:&lt;br /&gt;&lt;img src="http://docs.google.com/File?id=ah42b2m3mkwv_7hsnk4x" /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="background-color: rgb(204, 255, 255);"&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;The "menu key" or "application key" is on the right side&lt;br /&gt;&lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;h2&gt;Killing process which belong to a certain user&lt;/h2&gt;&lt;br /&gt;ps -ef | grep process_name&lt;br /&gt;skill -9 -u 'username' -c process_name&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Deleting a directory (reccursively)&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;rm -Rf directory_path&lt;br /&gt;&lt;/blockquote&gt;&lt;h3&gt;Copying an entire directory&lt;/h3&gt;The following command will copy "src" inside "dest"&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;cp -R src/ dest/&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;uses the backslash ( ) for directories whose name contain spaces o&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;blockquote&gt;cp -R /windows/Program Files/Macromedia/ ~/.wine/Program Files/&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Display hidden files (files starting with dot)&lt;/h3&gt;ls -a&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Display the list of process running and ... KILL!&lt;/h3&gt;ps -ef&lt;br /&gt;kill -9 id_process&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Display the list of process running and their memory footprint&lt;br /&gt;&lt;/h3&gt;&lt;br /&gt;&lt;blockquote&gt;&lt;tt&gt;ps -eo pid,pmem,size,args --sort=-size&lt;/tt&gt;&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;It shows every process ID with the percentage of memory used, the actual KB of memory used and the full command w/ command line options. And sorts everything by used memory.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Environements variables&lt;/h3&gt;Display all env variables:&lt;br /&gt;&lt;blockquote&gt;env&lt;br /&gt;&lt;/blockquote&gt;Display one env variable&lt;br /&gt;&lt;blockquote&gt;echo $LOGON&lt;br /&gt;&lt;/blockquote&gt;&lt;blockquote&gt;Assign a value to an env variable&lt;br /&gt;export PATH=${PATH}:${ANT_HOME}/bin&lt;br /&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h3&gt;Chmod reccursively&lt;/h3&gt;chmod -R ...&lt;br /&gt;Check out the informations in &lt;a title="http://www.ss64.com/bash/chmod.html" href="http://www.ss64.com/bash/chmod.html" id="x8rl"&gt;http://www.ss64.com/bash/chmod.html&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Copy files through ssh using scp&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;scp username@server.com:/path_to/files path_to_local_destination_file&lt;br /&gt;&lt;a name="SECTION0061620000000000000000"&gt;&lt;br /&gt;&lt;/a&gt;&lt;h2&gt; &lt;/h2&gt;  &lt;p&gt; Examples:-  &lt;/p&gt;&lt;p&gt;   &lt;/p&gt;&lt;blockquote&gt; &lt;tt&gt;scp myfile you@remote.machine.org:/userdisk/yourdir&lt;/tt&gt;  &lt;/blockquote&gt;    &lt;p&gt; Copy the file called ``myfile'' from the current directory to the directory called ``userdisk/yourdir'' belonging to the user ``you'' on the computer ``remote.machine.org''.  &lt;/p&gt;&lt;p&gt;   &lt;/p&gt;&lt;blockquote&gt; &lt;tt&gt;scp "you@remote.machine.org:/userdisk/yourdir/*" ./ &lt;/tt&gt;  &lt;/blockquote&gt;    &lt;p&gt; Copy all files from the directory called ``userdisk/yourdir'' belonging to the user ``you'' on the computer ``remote.machine.org'' to the current directory.  For further information see section &lt;a href="http://www-pnp.physics.ox.ac.uk/%7Ewest/intro_manual/node238.html#network_ssh"&gt;8.7&lt;/a&gt;.  &lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Console commands&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;ul&gt;&lt;li&gt;CTRL + R : will search in all the commands typed not only in the current session&lt;/li&gt;&lt;li&gt;cd - : to come back to previous folder&lt;/li&gt;&lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;Process commands&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;before the comand:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;nice&lt;/blockquote&gt;&lt;br /&gt;A nice value of −20 is the highest priority and 19 is the lowest priority. The default nice value for processes is inherited by its parent process, usually 0&lt;br /&gt;&lt;blockquote&gt;nohup&lt;/blockquote&gt; enabling the command to keep running after the user who issues the command has logged out&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;'a command '&amp;amp;&amp;amp; notify-send 'Done'&lt;/blockquote&gt;&lt;br /&gt;will pop up when the command has finnished&lt;br /&gt;&lt;br /&gt;Call another shell script:&lt;br /&gt;&lt;br /&gt;&lt;blockquote&gt;source ~/another_bash.sh&lt;/blockquote&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Swap&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;My system uses a lot of swap and I have no idea of how to tell it to use the RAM when it's available ...&lt;br /&gt;I've found this:&lt;br /&gt;&lt;br /&gt;cat /proc/sys/vm/swappiness&lt;br /&gt;60&lt;br /&gt;The value of 60 is often the default on SuSE Linux systems. This value ranges from 0 (less likely to swap) to 100 (very likely to swap). I notice that by setting it to 10, the system uses much less swap memory than before.&lt;br /&gt;/proc/sys/vm/swappiness&lt;br /&gt;The above code will set the value temporarily. To set it permanently so that it takes effect on each boot, edit the /etc/sysctl.conf file and add the line:&lt;br /&gt;&lt;br /&gt;vm.swappiness=10&lt;br /&gt;Changing the value contained into swappiness should help you tuning how your system swap.&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Setting up public key authentication over SSH&lt;/h2&gt; &lt;div class="entryBody"&gt; &lt;span class="catImg"&gt;&lt;a href="http://www.petefreitag.com/category/apple.cfm" title="Apple category"&gt;&lt;br /&gt;&lt;/a&gt;&lt;/span&gt; &lt;p&gt;Every time I want to setup public key authentication over SSH, I have to look it up, and I've never found a simple guide, so here's mine.&lt;/p&gt; &lt;h4&gt;Generate key on local machine&lt;/h4&gt; &lt;pre&gt;ssh-keygen -t rsa&lt;/pre&gt; &lt;p&gt;It will ask you for a password but you can leave it blank.&lt;/p&gt; &lt;p&gt;Note you could also pick &lt;code&gt;-t dsa&lt;/code&gt; if you prefer.&lt;/p&gt; &lt;h4&gt;Ensure that the remote server has a .ssh directory&lt;/h4&gt; &lt;p&gt;Make sure the server your connecting to has a &lt;code&gt;.ssh&lt;/code&gt; directory in your home directory. If it doesn't exist you can run the &lt;code&gt;ssh-keygen&lt;/code&gt; command above, and it will create one with the correct permissions.&lt;/p&gt; &lt;h4&gt;Copy your local public key to the remote server&lt;/h4&gt; &lt;p&gt;If your remote server doesn't have a file called &lt;code&gt;~/.ssh/authorized_keys2&lt;/code&gt; then we can create it. If that file already exists, you need to append to it instead of overwriting it, which the command below would do:&lt;/p&gt; &lt;pre&gt;scp ~/.ssh/id_rsa.pub remote.server.com:.ssh/authorized_keys2&lt;br /&gt;&lt;br /&gt;To copy to an existing  .ssh/authorized_keys (99% of time):&lt;/pre&gt;&lt;blockquote&gt;cat ~/.ssh/id_rsa.pub | ssh user_name@remote.machine.com 'cat &gt;&gt; .ssh/authorized_keys' &lt;/blockquote&gt;&lt;p&gt;You may also be able to remove the exact known host with the following command via ssh on your local machine. Remember to replace mt-example.com with your own domain.&lt;br /&gt;    &lt;/p&gt;&lt;pre&gt;&lt;code&gt;ssh-keygen -R mt-example.com &lt;/code&gt;&lt;/pre&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Finding a file&lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;Here's an example &lt;code&gt;find&lt;/code&gt; command using a search criteria and the default action:   &lt;pre class="Indent"&gt;find / -name foo&lt;/pre&gt;  will search the whole system for any files named &lt;code&gt;foo&lt;/code&gt; and display them. &lt;a href="http://www.hccfl.edu/pollock/Unix/FindCmd.htm"&gt;More examples here.&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Finding a file containing a string&lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;For example search for a string called redeem reward in all text files located in /home/tom/*.txt directory, use&lt;br /&gt;&lt;code&gt;$ grep "redeem reward" /home/tom/*.txt&lt;/code&gt;&lt;/p&gt; &lt;h3&gt;Task: Search all subdirectories recursively&lt;/h3&gt; &lt;p&gt;You can search for a text string all files under each directory, recursively with &lt;span style="color: rgb(255, 0, 0);"&gt;&lt;strong&gt;-r&lt;/strong&gt;&lt;/span&gt;option:&lt;br /&gt;&lt;code&gt;$ grep -r "redeem reward" /home/tom&lt;/code&gt;&lt;/p&gt; &lt;h3&gt;&lt;br /&gt;&lt;/h3&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Recursively remove .svn directories&lt;/h2&gt;&lt;pre&gt;&lt;blockquote&gt;find . -type d -name .svn | xargs rm -rf&lt;/blockquote&gt;&lt;br /&gt;&lt;/pre&gt;&lt;h2 class="entryTitle"&gt;How to exit a process&lt;/h2&gt;&lt;pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;[18:29:18] … What about Ctrl + Z&lt;br /&gt;[18:29:26] … ?&lt;br /&gt;[18:29:39] Marco i: now write 'jobs&lt;br /&gt;[18:29:40] … '&lt;br /&gt;[18:29:41] … jobs&lt;br /&gt;[18:29:52] : Stopped                 telnet localhost 11211&lt;br /&gt;[18:30:01] : do: kill %1&lt;br /&gt;[18:30:11] … It kills the first stopped job.&lt;br /&gt;[18:30:18]: [1]+  Terminated              telnet localhost 11211&lt;br /&gt;[18:30:23] Marco Lazzeri: ok&lt;br /&gt;[18:30:27] … now you're out&lt;br /&gt;[18:30:33] Jean-Michel Garnier: OK, I will add this trick to my linux trick. Thanks again&lt;br /&gt;[18:30:39] Marco i: but having ctrl + ] as font increaser is NOT good ; )&lt;br /&gt;[18:31:00] … You know that with CTRL + Z you can stop jobs.&lt;br /&gt;[18:31:21] … Then if you issue 'bg' you send it to background&lt;br /&gt;[18:31:36] … While if you issue 'fg' you take it back to your screen: foreground.&lt;br /&gt;[18:31:44] Jean-Michel Garnier: I have learned it today&lt;br /&gt;[18:31:57] Marco i: It can be uself.&lt;br /&gt;[18:31:59] … useful&lt;br /&gt;[18:32:05] … especially when working on remote systems.&lt;br /&gt;[18:32:16] … when you don't have graphical shell&lt;br /&gt;[18:32:29] … or when opening more terminals is a waste of time&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Remote control with vnc&lt;/h2&gt;&lt;p&gt;vncviewer -fullscreen 192.168.2.23:0&lt;/p&gt;If you want to quit vncviewer: Press 'F8' and select Quit viewer&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;RFormat an external USB hard drive to ext2&lt;/h2&gt;&lt;br /&gt;&lt;blockquote&gt;sudo umount /dev/sdb1&lt;br /&gt;[sudo] password for jeanmichel:&lt;br /&gt;jeanmichel@21x100:~$ mkfs.ext2 /dev/sdb1&lt;br /&gt;mke2fs 1.40.2 (12-Jul-2007)&lt;br /&gt;warning: 424 blocks unused.&lt;br /&gt;&lt;br /&gt;Filesystem label=&lt;br /&gt;OS type: Linux&lt;br /&gt;Block size=4096 (log=2)&lt;br /&gt;Fragment size=4096 (log=2)&lt;br /&gt;61166016 inodes, 122093568 blocks&lt;br /&gt;6104699 blocks (5.00%) reserved for the super user&lt;br /&gt;First data block=0&lt;br /&gt;Maximum filesystem blocks=0&lt;br /&gt;3726 block groups&lt;br /&gt;32768 blocks per group, 32768 fragments per group&lt;br /&gt;16416 inodes per group&lt;br /&gt;Superblock backups stored on blocks:&lt;br /&gt;&lt;/blockquote&gt;&lt;h2 class="entryTitle"&gt;Tar / Untar a file&lt;/h2&gt;Tar:&lt;br /&gt;&lt;pre&gt;tar czf /path/to/output/folder/filename.tar.gz /path/to/folder&lt;/pre&gt;Untar:&lt;br /&gt;tar xvf tsung-1.2.1.tar.gz &amp;amp;&amp;amp; rm tsung-1.2.1.tar.gz&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;CPU Usage&lt;/h2&gt;&lt;blockquote&gt;top&lt;/blockquote&gt;&lt;br /&gt;type "1" to see mutliple cups&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Hard drive Usage&lt;/h2&gt;&lt;br /&gt;du -s * | sort -nr | head&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;How to check if an IP is denied from ssh acces&lt;br /&gt;&lt;/h2&gt;&lt;br /&gt;grep &lt;a href="http://88.6.173.50/" target="_blank"&gt;88.6.173.50&lt;/a&gt; /etc/hosts.deny&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;How to make multiple folders&lt;br /&gt;&lt;/h2&gt;&lt;p&gt; You can make multiple folders in &lt;i&gt;bash&lt;/i&gt; and other shells with {folder1,folder2} : &lt;/p&gt; &lt;p&gt; &lt;code&gt;&lt;/code&gt;&lt;/p&gt;&lt;blockquote&gt;mkdir /usr/local/src/bash/{old,new,dist,bugs}&lt;/blockquote&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Which version of packages I have installed?&lt;br /&gt;&lt;/h2&gt;&lt;blockquote&gt;dpkg -l | grep openssl&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;/blockquote&gt;  &lt;p&gt;&lt;/p&gt;&lt;h2 class="entryTitle"&gt;Configure /etc/init.d&lt;br /&gt;&lt;/h2&gt;&lt;blockquote&gt;sudo sysv-rc-conf &lt;/blockquote&gt;&lt;br /&gt;provides a terminal GUI for managing "/etc/rc{runlevel}.d/"&lt;br /&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Free space on hard drive&lt;/h2&gt;&lt;p&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;DF command reports &lt;/span&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;how much &lt;strong&gt;free&lt;/strong&gt; disk space is available for each mount you have. When executing DF, I like to use the -h option, which returns the output in a more readable format:&lt;/span&gt;&lt;/p&gt; &lt;p&gt;&lt;span style=";font-family:Verdana;font-size:85%;"  &gt;&lt;em&gt;wtn@wtn2:~$ df -h&lt;br /&gt;Filesystem            Size  Used Avail    Use%    Mounted on&lt;br /&gt;/dev/sda1             7.5G  2.1G  5.1G    30%    /&lt;/em&gt;&lt;/span&gt;&lt;/p&gt;&lt;h2 class="entryTitle"&gt;What time is it?&lt;/h2&gt; &lt;p&gt;&lt;/p&gt;&lt;blockquote&gt;$ date&lt;/blockquote&gt;&lt;br /&gt;Thu Jul 17 08:30:46 GMT 2008&lt;br /&gt;&lt;br /&gt;&lt;h2&gt;&lt;a href="http://www.howtogeek.com/howto/ubuntu/see-what-version-of-a-package-is-installed-on-ubuntu/" rel="bookmark" title="Permanent Link: See What Version of a Package Is Installed on Ubuntu"&gt;&lt;/a&gt;See What Version of a Package Is Installed on Ubuntu&lt;/h2&gt;&lt;blockquote&gt;dpkg -s &lt;packagename&gt;&lt;/packagename&gt;&lt;/blockquote&gt;&lt;br /&gt;&lt;h2 class="entryTitle"&gt;Is drive mounted?&lt;/h2&gt;&lt;pre class="alt2" dir="ltr" style="border: 1px inset ; margin: 0px; padding: 6px; overflow: auto; width: 640px; height: 98px; text-align: left;"&gt;if [ ! -d /backup/mydir ]; then&lt;br /&gt;echo "drive not mounted"&lt;br /&gt;fi&lt;/pre&gt;&lt;h2&gt;List processes with ports they use&lt;/h2&gt;netstat -nlp&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3567925017233042928?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3567925017233042928/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3567925017233042928' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3567925017233042928'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3567925017233042928'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/08/linux-101-sad-but-real-truth-is-i-am.html' title='Linux 101'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8997048669675685720</id><published>2007-07-29T22:35:00.000+02:00</published><updated>2007-09-19T00:12:21.733+02:00</updated><title type='text'>Propuesta Rails Hispana 2007</title><content type='html'>Para la conferencia Rails Hispana en noviembre 2007, me gustaria presentar una ponencia sobre rspec.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt; rspec on Rails&lt;/span&gt;&lt;br /&gt;El "Behaviour Driven Development" (&lt;a href="http://behaviour-driven.org/" title="BDD"&gt;BDD&lt;/a&gt;) fue inspirado por las teorías de &lt;a href="http://es.wikipedia.org/wiki/Hip%C3%B3tesis_de_Sapir-Whorf" title="Sapir Worf"&gt;Sapir Worhf&lt;/a&gt;. Según estas, las palabras que usamos cambian nuestra manera de pensar.&lt;br /&gt;&lt;p&gt;&lt;a href="http://rspec.rubyforge.org/index.html" target="_blank" title="rspec"&gt;rspec&lt;/a&gt; es un framework de BDD que permite usar el lenguaje natural para especificar el comportamiento del código Ruby con ejemplos ejecutables que ayudan en el proceso de diseño y se pueden usar como documentación y tests. &lt;/p&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;describe&lt;/span&gt; &lt;span style="font-style: italic;"&gt;"Charla sobre rspec"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;  it&lt;/span&gt; &lt;span style="font-style: italic;"&gt;"debería explicar"&lt;/span&gt; do&lt;br /&gt;&lt;ul&gt;   &lt;li&gt;     Conceptos clave de rspec a través de un ejemplo práctico y analogías con     Test::Unit&lt;br /&gt;&lt;/li&gt;   &lt;li&gt;     Ejemplos de especificaciones de Modelos, Controladores y Vistas (con     &lt;a href="http://www.openqa.org/selenium-rc/ruby.html" title="Selenium"&gt;Selenium&lt;/a&gt;)   &lt;/li&gt;   &lt;li&gt;     rspec como especificaciones funcionales&lt;/li&gt; &lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;  end&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;  it&lt;/span&gt; &lt;span style="font-style: italic;"&gt;"debería presentar"&lt;/span&gt; &lt;span style="font-weight: bold;"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;     GUIs&lt;/li&gt;&lt;li&gt;&lt;a href="http://eigenclass.org/hiki.rb?rcov" title="rcov"&gt;rcov&lt;/a&gt; y     &lt;a href="http://glu.ttono.us/articles/2006/12/19/tormenting-your-tests-with-heckle" title="Heckle"&gt;Heckle&lt;/a&gt;     para mejorar la cobertura y la calidad de los specs&lt;/li&gt;&lt;li&gt;     rspec +     &lt;a href="http://nubyonrails.com/articles/autotest-rails" title="Autotest"&gt;Autotest&lt;/a&gt;     para automatizar la ejecución de los specs&lt;/li&gt;&lt;li&gt;     rspec +     &lt;a href="http://blog.aslakhellesoy.com/2007/5/23/jruby-bundles-rspec" title="jruby"&gt;jruby&lt;/a&gt;     para especificar programas java&lt;/li&gt;&lt;/ul&gt;                    &lt;ul&gt;    &lt;/ul&gt;&lt;span style="font-weight: bold;"&gt;  end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;end&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8997048669675685720?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8997048669675685720/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8997048669675685720' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8997048669675685720'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8997048669675685720'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/07/para-la-conferencia-rails-hispana-en.html' title='Propuesta Rails Hispana 2007'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7686790823802365550</id><published>2007-07-07T20:31:00.004+02:00</published><updated>2008-03-11T17:41:29.591+01:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>My Rails bookmarks</title><content type='html'>&lt;script type="text/javascript" src="http://preview.diigo.com/roll2/linkrolls?username=jeanmichelg&amp;l_type=0&amp;count=50&amp;style=neat&amp;title=&amp;tags=rubyonrails" &gt;&lt;/script&gt;&lt;noscript&gt;&lt;a href="http://preview.diigo.com/user/jeanmichelg" &gt;Rails tags&lt;/a&gt;&lt;/noscript&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7686790823802365550?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7686790823802365550/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7686790823802365550' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7686790823802365550'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7686790823802365550'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/07/my-bookmarks-about-rails.html' title='My Rails bookmarks'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5501652240905597120</id><published>2007-07-06T17:42:00.001+02:00</published><updated>2007-07-06T19:07:41.448+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='blogger'/><title type='text'>Struggling with blogger</title><content type='html'>I have been struggling for so many hours with the google blogger template system!!! So far, this has been quite a frustrative experience. So I thought I shared the source code of my template so people can benefit the hacks I have found:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;Hide the blogger header &lt;/li&gt;&lt;li&gt;&lt;a href="http://www.ruzee.com/blog/shadedborder"&gt;Use Shaded border with javascript&lt;/a&gt;&lt;/li&gt;&lt;li&gt;Use the &lt;a href="http://code.google.com/p/syntaxhighlighter/"&gt;javascript syntax hightlighter&lt;/a&gt;, this one took me 3 hours!&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;On the whole, the xml based template language used by google is a good anti-pattern of a very complex and unreadable view language. The only way to work with this "cr*p" is Trial and errors ... Very frustrating!&lt;br /&gt;&lt;br /&gt;Fortunately, there are still independant individuals who innovate in the open source world, check out the &lt;a href="http://rashkovskii.com/assets/2007/6/26/lilu_oslo.swf"&gt;genius idead&lt;/a&gt; of &lt;a href="http://rashkovskii.com/"&gt;Yuri Rashkovskii&lt;/a&gt; , a 25 years old nice ukranian geek (I have met him in Oslo). I will blog about lilu as soon as I have the chance to play with it.&lt;br /&gt;&lt;br /&gt;I wanted to include the code of my template so you could copy-paste it but once again Blogger f*cked up everything (sic) and did not display it properly ...So please &lt;a href="http://www.21croissants.com/files/blogger-template.xml"&gt;download it here&lt;/a&gt; !!!&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5501652240905597120?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5501652240905597120/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5501652240905597120' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5501652240905597120'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5501652240905597120'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/07/struggling-with-blogger.html' title='Struggling with blogger'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4053934545583847146</id><published>2007-06-28T23:33:00.003+02:00</published><updated>2008-04-10T12:22:29.896+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='ide'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><title type='text'>Getting the latest netbeans ruby-ide automatically</title><content type='html'>&lt;blockquote&gt;&lt;/blockquote&gt;&lt;span style="font-weight: bold;"&gt;Update 12/11/2007: Blogger had completly destroyed the formatting of the code, I had a received a few emails telling me the script did not work. I have once again copy pasted it and it should work, I apologize if I have wasted your time, I should really move to a serious blogging system !!!&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span style="font-weight: bold;"&gt;Update 10/04/2008: &lt;span style="color: rgb(255, 0, 0);"&gt;THE SCRIPT DOES NOT WORK ANYMORE&lt;/span&gt;.&lt;/span&gt; The Netbeans changed their nightly build system, you can download the latest version and install netbeans manually from &lt;a href="http://bits.netbeans.org/download/trunk/nightly/latest/"&gt;http://bits.netbeans.org/download/trunk/nightly/latest/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;I am using netbeans since april 2007 as my primary Rails editor on Linux ubuntu. I used to work with Radrails (now Aptana) because I used to be a java developper and work with Eclipse.&lt;br /&gt;&lt;br /&gt;When RadRails "dissapeared", I started looking for alternative IDEs and so far I am very happy with netbeans.&lt;br /&gt;&lt;br /&gt;&lt;a href="http://blogs.sun.com/tor/"&gt;Tor Norbye&lt;/a&gt; and his team are very active (and responsive!) and keep delivering new features all every week! The only way to use these features - as far as I am concerned - is to download the latest build from the Continuous Integration server at &lt;a href="http://deadlock.netbeans.org/hudson/job/ruby/"&gt;http://deadlock.netbeans.org/hudson/job/ruby/&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;To save a bit of time, I have written a script to install the latest netbeans ruby-ide automatically. You need to install the mechanize gem first.&lt;br /&gt;&lt;br /&gt;This script will:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;connect to the Continuous Integration server of sun (http://deadlock.netbeans.org/hudson/job/ruby/)&lt;/li&gt;&lt;li&gt;Guess what's the latest stable build file name and download it to a temp location (depending on your OS)&lt;/li&gt;&lt;li&gt;rename the old install&lt;/li&gt;&lt;li&gt;unzip the build to the netbeans installation folder&lt;/li&gt;&lt;li&gt;delete the downloaded zip from the tmp location&lt;/li&gt;&lt;/ul&gt;Usage:&lt;br /&gt;&lt;p&gt;You need to install mechanize:&lt;/p&gt;&lt;p&gt;gem install mechanize&lt;/p&gt;&lt;p&gt;Hten, copy the following code to a ruby file and adapt the last two lines to your configuration. The 1st paramater is the "netbeans installation folder" and the&lt;br /&gt;second one your tmp folder.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;br /&gt;script = NetbeansUpdaterScript.new("/home/jeanmichel/ruby/programs", "/tmp")&lt;br /&gt;&lt;br /&gt;script.run&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;require 'rubygems'&lt;br /&gt;require 'hpricot'&lt;br /&gt;require 'open-uri'&lt;br /&gt;require 'mechanize'&lt;br /&gt;require 'fileutils'&lt;br /&gt;&lt;br /&gt;class GenericScript&lt;br /&gt;def download_from(url, save_as)&lt;br /&gt;  mechanize = WWW::Mechanize.new  &lt;br /&gt;  mechanize.get(url).save_as(save_as)&lt;br /&gt;  puts "downloaded " + url + " and saved to " + save_as&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def remove(file_or_directory)  &lt;br /&gt;  FileUtils.remove_dir(file_or_directory, true) if File.directory?(file_or_directory)&lt;br /&gt;  FileUtils.rm file_or_directory if File.file?(file_or_directory)&lt;br /&gt;  puts "remove " + file_or_directory&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def unzip_file(file, target_dir) &lt;br /&gt;  system(&lt;br /&gt;  "unzip", "-q", file, "-d", target_dir&lt;br /&gt;  ) or raise "Error extracting (#{$?}): unzip #{file.inspect} -d #{target_dir.inspect}"&lt;br /&gt;  puts "unzip " + file + " to " + target_dir&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def is_using_mac?&lt;br /&gt;  RUBY_PLATFORM == /darwin/&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class NetbeansUpdaterScript &lt; tmp_folder = "/tmp" netbeans_installation_folder =" netbeans_installation_folder" netbeans_folder_path =" @netbeans_installation_folder" tmp_folder =" tmp_folder" netbeans_installer_file =" @tmp_folder" doc =" Hpricot(open(" last_stable_build_number =" doc.inner_html" last_stable_build_number=" + @last_stable_build_number.to_s     @last_stable_build_number   end       def url_latest_build                     get_last_stable_build_number          if is_using_mac?       " script =" NetbeansUpdaterScript.new("&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I have used this script for a week and it seems to work alright but I'd be happy to hear some &lt;a href="http://21croissants.blogspot.com/2006/01/contact-me.html"&gt;feedback&lt;/a&gt; about the code or any problem you might have.&lt;br /&gt;&lt;/p&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4053934545583847146?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4053934545583847146/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4053934545583847146' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4053934545583847146'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4053934545583847146'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/06/untitled.html' title='Getting the latest netbeans ruby-ide automatically'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-2609880946699837054</id><published>2007-06-28T19:53:00.001+02:00</published><updated>2007-06-29T12:56:42.044+02:00</updated><title type='text'>Upgrading to Ubuntu Feisty</title><content type='html'>&lt;br&gt;At last, I upgraded to the latest stable version of Ubuntu last week. So far, I am very pleased: my firefox, amarok, openoffice and netbeans were very unstable and now everything seems to worl like a charm! The network manager is also very cool: 30s to connecto to a WPA2 network!&lt;br&gt;&lt;br&gt;However, the 3D and funky effects (Berryl window manager) don't work perfectly so I had to uninstall them (I can live without!).&lt;br&gt;&lt;br&gt;Apart from the fact I could not find a good software for screencasting, I am very happy with Ubuntu even if I'll probably buy a mac in 2008 anyway &lt;br&gt;&lt;br&gt;Well done Ubuntu!&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-2609880946699837054?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/2609880946699837054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=2609880946699837054' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2609880946699837054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/2609880946699837054'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/06/upgrading-to-ubuntu-feisty.html' title='Upgrading to Ubuntu Feisty'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-97659774570386461</id><published>2007-06-08T13:47:00.000+02:00</published><updated>2007-06-15T18:48:17.676+02:00</updated><title type='text'>L_Appel du 8 juin</title><content type='html'>&lt;span style="font-style: italic;"&gt;“Ici Paris, la Blogosphère parle aux francophones:&lt;/span&gt;  &lt;span style="font-style: italic;"&gt;Les pingouins  qui, depuis de nombreuses années, sont à la tête des geeks francophones  ont formé un projet de livrer des applications en retard avec du code  non testé. Ces applications, alléguant la défaite de nos comités QA, se  sont mis en rapport avec le GrandBugQuiNiqueTout pour cesser le combat.&lt;/span&gt;  &lt;span style="font-style: italic;"&gt;Certes,  nous avons été, nous sommes, submergés par la tradition du cycle en  cascade, la tradition du “Ca marche a 83%” et la loi de Murphy, de  l'ennemi.&lt;/span&gt;  &lt;span style="font-style: italic;"&gt;Infiniment plus que leur nombre, ce sont l'absence de  tests unitaires, une mauvaise communication et l'incompétence des  personnes chargées du planning qui nous font reculer. Ce sont l'absence  de reconnaissance de l'excellence technique des geeks qui aiment le  travail bien fait, la horde de fichiers de configuration XML qui  dupliquent sans fin les même informations et le manque d'”Agilité” des  projets (Planning en continue, Itérations courtes, Tests Unitaires,  Intégration Continue, Rétrospective) en générale qui ont surpris nos  chefs au point de les amener là où ils en sont aujourd'hui.&lt;/span&gt;  &lt;span style="font-style: italic;"&gt;....&lt;/span&gt;&lt;span style="font-style: italic;"&gt;".&lt;/span&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;a href="http://www.gopetition.com/online/12621.html"&gt;Le Texte complet de la pétition de l'Appel du 8 juin 7, Signe-la (pour rire) &lt;/a&gt;&lt;br /&gt;&lt;/div&gt;&lt;br /&gt;J'ai un rêve: publier un e-book en français pour début 2008 d'une centaine de pages de recettes sur le &lt;a href="http://behaviour-driven.org/"&gt;BDD&lt;/a&gt; on Rails avec &lt;a target="_blank" href="http://rspec.rubyforge.org/"&gt;rspec&lt;/a&gt;.  Le titre provisoire est T.G.V.: "Testing à Grande Vitesse", en honneur à l'excellent système de transport publique de la SNCF.&lt;br /&gt;Etant donné que je n'ai eu aucun contact avec la communauté Rails de France et de Navarre depuis 5 ans, je vais avoir besoin de sérieux coups de main pour me mettre à la page;-) Ecris-moi a jean tiret michel suivi d'un arobababase 21 croissant au PLURIEL petit point COM (j'ai tres peur des spammeurs) ou laisse un commentaire à ce post. Pour commencer, voici une petite idée de ce que j'ai derrrière la tête avec l'application web2.0 de mind mapping collaboratif mind42.com:&lt;br /&gt;&lt;br /&gt;   &lt;iframe src="http://www.mind42.com/pub/mindmap?mid=dc2a6088-3362-4c36-bfb8-5bfc732deec8" frameborder="0" height="400" width="700"&gt;  &lt;/iframe&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-97659774570386461?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/97659774570386461/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=97659774570386461' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/97659774570386461'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/97659774570386461'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/06/lappel-du-8-juin.html' title='L_Appel du 8 juin'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8786298957717041539</id><published>2007-06-07T17:19:00.001+02:00</published><updated>2007-07-09T11:23:18.586+02:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='rspec'/><category scheme='http://www.blogger.com/atom/ns#' term='rubyonrails'/><category scheme='http://www.blogger.com/atom/ns#' term='selenium'/><title type='text'>Selenium reports with screenshots using RSpec and imagemagick on ubuntu</title><content type='html'>&lt;p&gt;&lt;br /&gt;After having read Aslak Hellesoy's post &lt;a href="http://blog.aslakhellesoy.com/2006/12/2/getting-screenshots-from-watir"&gt;Watir reports with screenshots using RSpec and Win32::Screenshot&lt;/a&gt;, I got very excited because this was exactly the kind of thing I had been daydreaming while taking my morning shower (don't you?).&lt;br /&gt;     Aslak's article explains how to use Watir and Internet Explorer on Windows to generate rspec reports with screenshots. Garps! I am working on linux (ubuntu Feisty) as I can't afford a mac (yet) and can't stand Windows. I got a bit frustrated because I wanted to do the same thing on my ubuntu.&lt;br /&gt;&lt;br /&gt;So, I decided to do a bit of researches and x*y*z hours later (sic), I got my selenium+rspec taking screenshots! My intention is to contribute to the RSpec sub-project spec_ui.&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;How does it work?&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;To get a 30s answer, please watch the &lt;a href="http://rollerjm.free.fr/pro/spec_ui_selenium_linux.swf"&gt;flah screencast&lt;/a&gt; I have made of netbeans executing rake spec:selenium, running the selenium server, Webrick, lanching firefox and taking a screenshot after having maximized the screen.&lt;br /&gt;&lt;br /&gt;Here is the code in spec_helper.rb :&lt;br /&gt;&lt;/p&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt; config.before(:all, :behaviour_type =&gt; :view) do       &lt;br /&gt;    selenium_remote_control_manager = SeleniumRemoteControlManager.new&lt;br /&gt;    selenium_remote_control_manager.start_webrick&lt;br /&gt;    selenium_remote_control_manager.start_selenium_server&lt;br /&gt;    @browser = selenium_remote_control_manager.get_firefox&lt;br /&gt;    @browser.start&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; config.after(:each, :behaviour_type =&gt; :view) do&lt;br /&gt;   Spec::Ui::ScreenshotFormatter.take_screenshot_of(@browser)&lt;br /&gt; end&lt;br /&gt;&lt;br /&gt; config.after(:all, :behaviour_type =&gt; :view) do&lt;br /&gt;   @browser.kill! rescue nil&lt;br /&gt; end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;And the code of contact_list_spec.rb:&lt;/p&gt;&lt;br /&gt;&lt;pre name="code" class="ruby"&gt;&lt;br /&gt;describe "/contact/list", :behaviour_type =&gt; :view  do &lt;br /&gt; include SeleniumSpecHelper&lt;br /&gt;&lt;br /&gt; it "should provide a description automatically (TODO extract)" do       &lt;br /&gt;   open "/contact/list"&lt;br /&gt;   @browser.is_text_present("Frequently Texted").should be_true&lt;br /&gt;   # This line will fail :-)&lt;br /&gt;   @browser.is_text_present("All Contact Tak tak").should be_true       &lt;br /&gt; end&lt;br /&gt;  &lt;br /&gt;end &lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;&lt;br /&gt;&lt;p&gt;&lt;br /&gt;I have used &lt;span style="font-weight: bold;"&gt;imagemagick &lt;/span&gt;&lt;span&gt;to capture the screenshot.&lt;/span&gt;&lt;/p&gt;&lt;br /&gt;&lt;br /&gt;&lt;div style="text-align: center;"&gt;&lt;span style="font-weight: bold;"&gt;What's next?&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;&lt;/div&gt;&lt;br /&gt;&lt;p&gt;I have had the chance to meet Aslak at an &lt;a href="http://irb.no/"&gt;irb meeting&lt;/a&gt; in the beautiful Oslo and we talked about rspec and selenium. He told me about the idea of generating screencast from the execution of a selenium rspec and I have started to implement it. I am really close to get a solution but I will publish it by the end of july.&lt;br /&gt;&lt;br /&gt;Here are a few features I'd like to have / implement for testing Rails Views:&lt;/p&gt;&lt;br /&gt;&lt;ul&gt;&lt;li&gt;a nice BNL compatible with watir and selenium&lt;br /&gt;&lt;/li&gt;&lt;li&gt;take a screenshot from the specs in order to generate nice documentation, not only when a spec fails&lt;br /&gt;&lt;/li&gt;&lt;li&gt;generate a good looking html doc with a sidebar - a la javadoc. And an AJAX search a la gotapi.com ;-) In a funky world, this would be connected to subversion and allow specs to be updated&lt;br /&gt;&lt;/li&gt;&lt;li&gt;to be completed ...&lt;br /&gt;&lt;/li&gt;&lt;/ul&gt;&lt;br /&gt;&lt;p&gt;To conclude, I hope that tools such as &lt;a href="http://www.greenpeppersoftware.com/"&gt;greenpepper&lt;/a&gt; and RSpec are announcing the beginning of the end of "Microsoft Word" and "PrintScreen" as tools for writing specifications. Obviously, there will be some serious Manager / Customer / Developper resistance before accepting that tests are part of the delivery and THE only accurate specifications but let's wait for 5-10 years and see in 2012 how people work ;-)&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8786298957717041539?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8786298957717041539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8786298957717041539' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8786298957717041539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8786298957717041539'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/06/selenium-reports-with-screenshots-using.html' title='Selenium reports with screenshots using RSpec and imagemagick on ubuntu'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3122269490480206320</id><published>2007-06-05T20:43:00.000+02:00</published><updated>2007-06-06T12:23:59.704+02:00</updated><title type='text'>RSpec Changes log RSS</title><content type='html'>The excellent BDD framework &lt;a href="http://rspec.rubyforge.org/"&gt;RSpec&lt;/a&gt; has been very active these days, and the 1.0 version was immediatly followed by minor uptates. As their web site seems to not contain a blog or RSS feed,&lt;span&gt;&lt;span&gt; I have used the excellent idea and tool &lt;a href="http://page2rss.com/"&gt;page2rss.com&lt;/a&gt; to generate a RSS feed on changes from the &lt;/span&gt;&lt;/span&gt;&lt;br /&gt;&lt;div class="info"&gt;&lt;p&gt;&lt;span class="url"&gt;&lt;a href="http://rspec.rubyforge.org/changes.html"&gt;http://rspec.rubyforge.org/changes.html&lt;/a&gt;&lt;/span&gt;&lt;span&gt;&lt;span&gt; &lt;/span&gt;&lt;/span&gt; page.&lt;br /&gt;&lt;/p&gt;&lt;p&gt;&lt;br /&gt;&lt;/p&gt;&lt;p&gt;   To receive updates for this page in RSS format copy-paste &lt;a type="application/rss+xml" href="http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html"&gt;this link&lt;/a&gt; (http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html) into your feed reader.    &lt;/p&gt;&lt;/div&gt;&lt;div id="pageBody"&gt;&lt;div class="spacer"&gt;&lt;div class="flash"&gt; &lt;/div&gt;    &lt;/div&gt;   &lt;/div&gt;   &lt;div id="pageTools"&gt;    &lt;p&gt;If you use one of the following reader, just click to the link to subscribe to Feed:&lt;/p&gt;         &lt;ul class="feed"&gt;&lt;li&gt;&lt;a href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fpage2rss%2Ecom%2Fpage%2Fatom%3Furl%3Drspec%2Erubyforge%2Eorg%2Fchanges%2Ehtml"&gt;&lt;img class="icon" alt="Subscribe with Google Reader" src="http://www.google.com/reader/ui/favicon.ico" height="16" width="16" /&gt;&lt;/a&gt;&lt;a href="http://fusion.google.com/add?feedurl=http%3A%2F%2Fpage2rss%2Ecom%2Fpage%2Fatom%3Furl%3Drspec%2Erubyforge%2Eorg%2Fchanges%2Ehtml"&gt;Google Reader&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.bloglines.com/sub/http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html"&gt;&lt;img class="icon" alt="Subscribe with Bloglines" src="http://www.bloglines.com/favicon.ico" height="16" width="16" /&gt;&lt;/a&gt;&lt;a href="http://www.bloglines.com/sub/http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html"&gt;Bloglines&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fpage2rss%2Ecom%2Fpage%2Fatom%3Furl%3Drspec%2Erubyforge%2Eorg%2Fchanges%2Ehtml"&gt;&lt;img class="icon" alt="Add to My Yahoo!" src="http://www.yahoo.com/favicon.ico" height="16" width="16" /&gt;&lt;/a&gt;&lt;a href="http://add.my.yahoo.com/rss?url=http%3A%2F%2Fpage2rss%2Ecom%2Fpage%2Fatom%3Furl%3Drspec%2Erubyforge%2Eorg%2Fchanges%2Ehtml"&gt;My Yahoo!&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fpage2rss%2Ecom%2Fpage%2Fatom%3Furl%3Drspec%2Erubyforge%2Eorg%2Fchanges%2Ehtml"&gt;&lt;img class="icon" alt="Add to Netvibes" src="http://www.netvibes.com/favicon.ico" height="16" width="16" /&gt;&lt;/a&gt;&lt;a href="http://www.netvibes.com/subscribe.php?url=http%3A%2F%2Fpage2rss%2Ecom%2Fpage%2Fatom%3Furl%3Drspec%2Erubyforge%2Eorg%2Fchanges%2Ehtml"&gt;Netvibes&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;         &lt;ul class="feed"&gt;&lt;li&gt;&lt;a type="application/rss+xml" href="http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html"&gt;&lt;img src="http://page2rss.com/images/feed-icon16x16.png" alt="RSS 2.0" class="icon" height="14" width="14" /&gt;&lt;/a&gt;&lt;a type="application/rss+xml" href="http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html"&gt;RSS 2.0&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a type="application/rss+xml" href="http://page2rss.com/page/rss?url=rspec.rubyforge.org/changes.html"&gt;&lt;img src="http://page2rss.com/images/feed-icon16x16.png" alt="Atom 1.0" class="icon" height="14" width="14" /&gt;&lt;/a&gt;&lt;a type="application/atom+xml" href="http://page2rss.com/page/atom?url=rspec.rubyforge.org/changes.html"&gt;Atom 1.0&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;    &lt;/div&gt;I have also shared my netvibes rspec tab which includes RSS on the mailing list archives (user &amp; developper).&lt;br /&gt;If you are using netvibes, you can add it by cliking on &lt;a href="http://www.netvibes.com/subscribe.php?preconfig=6ae4fc777ec0456cc508c971b39dfe9b" target="_blank"&gt;&lt;img src="http://www.netvibes.com/img/add2netvibes.gif" alt="Add to Netvibes" border="none" height="17" width="91" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Otherwise, here are 2 screenshots to give you a ruff idea:&lt;br /&gt;&lt;br /&gt;The different modules (RSS and links):&lt;br /&gt;&lt;img src="http://writer.zoho.com/ImageDisplay.im?name=La%20homepage%20de%20Jean-Michel%20%281305%29.png&amp;amp;accId=47486000000002007" /&gt;&lt;br /&gt;&lt;br /&gt;If you want to suggest more, please contact me ;-)&lt;br /&gt;&lt;br /&gt;Netvibes has a new feature which allow to preview web sites without leaving the netvibes window. Just clik on the right hand corner button: "Show website". Doing this, I can skim first through the titles and then preview the web sites to read the details of each post: so cool!&lt;br /&gt;&lt;br /&gt;&lt;img alt="" src="http://writer.zoho.com/ImageDisplay.im?name=La%20homepage%20de%20Jean-Michel%20%281214%29.png&amp;accId=47486000000002007" style="width: 757px;" align="bottom" border="0" hspace="0" vspace="0" /&gt;&lt;br /&gt;&lt;br /&gt;Don't wait, install &lt;a href="http://www.netvibes.com/"&gt;netvibes&lt;/a&gt; now!&lt;br /&gt;&lt;br /&gt;The RSS for the user &amp;amp; developpers' list comes from &lt;a href="http://www.nabble.com/RSpec-f17459.html"&gt;nabble.com&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;Before finding out about nabble, I have been trying for the first time Yahoo!pipes and I have to say I love it!!! I have a feeling it's going to be one of my favourite gadget. It is a very user friendly tool with a fantastic user interface, it took me 45 minutes to write the pipe which generates the url http://page2rss.com/page/atom?url=rubyforge.org/pipermail/rspec-devel/2007-June/thread.html&lt;br /&gt;from today's date. The only issue was that Yahoo!pipes truncated the post content because the RSS generated by the page2rss.com did not give a title to the posts ...&lt;br /&gt;&lt;br /&gt;Technorati Tags     &lt;a href="http://technorati.com/tag/bdd" rel="tag"&gt;bdd&lt;/a&gt;,&lt;a href="http://technorati.com/tag/rubyonrails" rel="tag"&gt;rubyonrails&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3122269490480206320?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3122269490480206320/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3122269490480206320' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3122269490480206320'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3122269490480206320'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/06/rspec-changes-log-rss.html' title='RSpec Changes log RSS'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5691285281407015640</id><published>2007-06-05T20:41:00.001+02:00</published><updated>2007-06-05T20:41:51.272+02:00</updated><title type='text'>Set up rspec on Rails</title><content type='html'>I have described the steps to install and configure &lt;a href="http://rspec.rubyforge.org"&gt;rspec&lt;/a&gt;, the Autotest module from &lt;a href="http://zentest.rubyforge.org/ZenTest/"&gt;ZenTest&lt;/a&gt; and a notifier for Ubuntu.&lt;br&gt;&lt;br&gt;&lt;h3&gt;Make sure you have the latest rubygems (0.9.4)&lt;/h3&gt;&lt;font size="-1"&gt;sudo gem &lt;b&gt;update&lt;/b&gt; --system &lt;/font&gt;&lt;br&gt;&lt;h3&gt;Installing&amp;nbsp; rspec&lt;/h3&gt;At the time of this writing - 5th of June 2007 - latest version of rspec is 1.0.4, and we'll install it in the vendor/plugins:&lt;br&gt;&lt;span style="font-family: monospace;"&gt;&lt;br&gt;&lt;/span&gt;&lt;pre&gt;&lt;span style="font-family: monospace;"&gt;&lt;/span&gt;cd &amp;lt;your project home&amp;gt;&lt;br&gt;ruby script/plugin install svn://rubyforge.org/var/svn/rspec/tags/CURRENT/rspec&lt;br&gt;ruby script/plugin install svn://rubyforge.org/var/svn/rspec/tags/CURRENT/rspec_on_rail&lt;/pre&gt;Check out http://rspec.rubyforge.org/ for updates (I could not find a RSS) but I guess Aslak will be updates on his &lt;a href="http://blog.aslakhellesoy.com/"&gt;blog.&lt;/a&gt;&lt;br&gt;&lt;br&gt;Warning: if you had installed rspec before, run a "gem list" to check if you have a web_spec rogue gem, you must delete it before carrying on, &lt;a href="http://blog.zenspider.com/archives/2007/05/autotestrspecrubygems_problems.html"&gt;more details in Zenspider's blog&lt;/a&gt;.&lt;br&gt;&lt;h3&gt;    Installing and configuring Zentest&lt;/h3&gt;Latest version of ZenTest is 3.6.0, run&lt;br&gt;&lt;pre&gt;sudo gem install ZenTest&lt;/pre&gt;Thankfully due to the extensible nature of autotest, we'll be able to set up a notifier for ubuntu by adding the following to your &lt;code&gt;&amp;lt;Rails project root&amp;gt;/.autotest&lt;/code&gt; file:&lt;p&gt;&lt;br&gt;&lt;/p&gt;        &lt;table class="CodeRay"&gt;&lt;tbody&gt;&lt;tr&gt;&lt;td onclick="function onclick(event) {      with (this.firstChild.style) {          display = display == " ?="" none="" :="" ;="" }="" title="click to toggle" class="line_numbers"&gt;&lt;pre&gt;&lt;tt&gt;&lt;br&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt;&lt;/tt&gt;&lt;tt&gt;&lt;br&gt;&lt;/tt&gt;&lt;strong&gt;&lt;/strong&gt;&lt;tt&gt;&lt;br&gt;&lt;/tt&gt;&lt;tt&gt;&amp;nbsp;&lt;/tt&gt;&lt;/pre&gt;&lt;/td&gt;    &lt;td class="code"&gt;&lt;pre ondblclick="function ondblclick(event) {      with (this.style) {          overflow = overflow == " |="" overflow="=" ?="" visible="" :="" auto="" ;="" }=""&gt;&lt;tt&gt;&lt;br&gt;&lt;/tt&gt;&lt;span class="co"&gt;#!/usr/bin/env ruby&lt;br&gt;&lt;br&gt;module Autotest::GnomeNotify&lt;br&gt;&lt;br&gt;  # Time notification will be displayed before disappearing automatically&lt;br&gt;  EXPIRATION_IN_SECONDS = 4&lt;br&gt;  ERROR_STOCK_ICON = "gtk-dialog-error"&lt;br&gt;  SUCCESS_STOCK_ICON = "gtk-dialog-info"&lt;br&gt;&lt;br&gt;  # Convenience method to send an error notification message&lt;br&gt;  #&lt;br&gt;  # [stock_icon]   Stock icon name of icon to display&lt;br&gt;  # [title]        Notification message title&lt;br&gt;  # [message]      Core message for the notification&lt;br&gt;  def self.notify stock_icon, title, message&lt;br&gt;    options = "-t #{EXPIRATION_IN_SECONDS * 1000} -i #{stock_icon}"&lt;br&gt;    system "notify-send #{options} '#{title}' '#{message}'"&lt;br&gt;  end&lt;br&gt;&lt;br&gt;  Autotest.add_hook :red do |at|&lt;br&gt;    notify ERROR_STOCK_ICON, "Tests failed", "#{at.files_to_test.size} tests failed"&lt;br&gt;  end&lt;br&gt;&lt;br&gt;  Autotest.add_hook :green do |at|&lt;br&gt;    notify SUCCESS_STOCK_ICON, "All tests passed, good job!", ""&lt;br&gt;  end&lt;br&gt;&lt;br&gt;end&lt;br&gt;&lt;br&gt;# a pop up window will appear to display the tests results&lt;br&gt;# More examples in /usr/lib/ruby/gems/1.8/gems/zentest-3.5.0/example_dot_autotest.rb&lt;br&gt;&lt;br&gt;# see http://ph7spot.com/articles/getting_started_with_autotest&lt;br&gt;&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/tbody&gt;&lt;/table&gt;The GnomeNotify was written by Philippe Hanrigou, a French Thoughtworker living in California, he has written the &lt;a href="http://ph7spot.com/articles/getting_started_with_autotest"&gt;best "getting started" guide to Autotest&lt;/a&gt;. To install libnotify on ubuntu, run:&lt;br&gt;&lt;pre class="command-box"&gt;sudo apt-get install libnotify-bin&lt;/pre&gt;&lt;br&gt;&lt;p&gt;Finally, from the Rails project’s root, type:&lt;/p&gt;    &lt;p&gt;&lt;code&gt;autotest &lt;br&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;&lt;br&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;&lt;p&gt;          Pressing &lt;code&gt;Control-C&lt;/code&gt; twice in quick succession will exit Autotest back to        the shell prompt.&lt;/p&gt;&lt;br&gt;&lt;h3&gt;&lt;a class="ItemAnchor" title="netbeans" name="netbeans"&gt;&lt;/a&gt;Integration with netbeans&lt;/h3&gt;&lt;br&gt;&lt;p&gt;As far as I am concerned, netbeans ruby-ide is the first IDE to integrate autotest. Select your project root in the Projects windows, right click and then "Auto Test". This will open an output window and run Autotest. This is very cool, check out the screenshot:&lt;/p&gt;&lt;br&gt;&lt;img alt="" src="http://writer.zoho.com:80/ImageDisplay.im?name=netbeans.png&amp;amp;accId=47486000000002007" align="bottom" border="0" hspace="0" vspace="0"&gt;&lt;br&gt;&lt;p&gt;&lt;br&gt;&lt;/p&gt;&lt;br&gt;&lt;pre class="command-box"&gt;&lt;br&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5691285281407015640?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5691285281407015640/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5691285281407015640' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5691285281407015640'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5691285281407015640'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/06/set-up-rspec-on-rails.html' title='Set up rspec on Rails'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-3586185252582713753</id><published>2007-05-28T18:03:00.001+02:00</published><updated>2007-05-28T18:08:34.599+02:00</updated><title type='text'>Checking out a svn project with netbeans</title><content type='html'>I am using site5 for my rails hosting (for how long? The fcgi is just not stable ...) and I host the source code of my projects with subversion.&lt;br&gt;&lt;br&gt;The svn integration in Netbeans can be slightly improved, as I could not check out my project using the GUI, I ended up using the command line and then imported the rails project into Netbeans ...&lt;br&gt;svn co svn+ssh://YOUR_USER_NAME_HERE@21croissants.com/home/YOUR_USER_NAME_HERE/rails/svn_repository/YOUR_PROJECT_HERE/trunk YOUR_PROJECT_NAME_IN_YR_LOCAL_MACHINE_HERE&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-3586185252582713753?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/3586185252582713753/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=3586185252582713753' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3586185252582713753'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/3586185252582713753'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/05/checking-out-svn-project-with-netbeans.html' title='Checking out a svn project with netbeans'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5083540702319959520</id><published>2007-05-11T18:00:00.001+02:00</published><updated>2007-05-11T18:00:19.108+02:00</updated><title type='text'>Do not forget to set up the routes when using the REST Controller generator</title><content type='html'>&lt;h1&gt;    NameError in    Contact#index  &lt;/h1&gt;    &lt;p&gt;    Showing &lt;i&gt;app/views/contact/index.rhtml&lt;/i&gt; where line &lt;b&gt;#18&lt;/b&gt; raised:    &lt;/p&gt;&lt;pre&gt;&lt;code&gt;undefined local variable or method `new_contact_path' for #&amp;lt;#&amp;lt;Class:0xb768e1bc&amp;gt;:0xb768e194&amp;gt;&lt;/code&gt;&lt;/pre&gt;      &lt;p&gt;Extracted source (around line &lt;b&gt;#18&lt;/b&gt;):  &lt;/p&gt;&lt;pre&gt;&lt;code&gt;15: &lt;br&gt;16: &amp;lt;br /&amp;gt;&lt;br&gt;17: &lt;br&gt;18: &amp;lt;%= link_to 'New contact', new_contact_path %&amp;gt;&lt;/code&gt;&lt;/pre&gt;              &lt;p&gt;&lt;code&gt;RAILS_ROOT: script/../config/..&lt;/code&gt;&lt;/p&gt;                  &lt;a href="http://0.0.0.0:3000/contact#" onclick="document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Application-Trace').style.display='block';; return false;"&gt;Application Trace&lt;/a&gt; |              &lt;a href="http://0.0.0.0:3000/contact#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Full-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='block';; return false;"&gt;Framework Trace&lt;/a&gt; |              &lt;a href="http://0.0.0.0:3000/contact#" onclick="document.getElementById('Application-Trace').style.display='none';document.getElementById('Framework-Trace').style.display='none';document.getElementById('Full-Trace').style.display='block';; return false;"&gt;Full Trace&lt;/a&gt;             &lt;div id="Application-Trace" style="display: block;"&gt;        &lt;pre&gt;&lt;code&gt;#{RAILS_ROOT}/app/views/contact/index.rhtml:18:in `_run_rhtml_47app47views47contact47index46rhtml'&lt;br&gt;app/controllers/contact_controller.rb:6:in `index'&lt;br&gt;app/controllers/contact_controller.rb:6:in `index'&lt;br&gt;&lt;br&gt;&lt;/code&gt;&lt;/pre&gt;&lt;p style="font-family: times new roman,times,serif;"&gt;&lt;font size="3"&gt;&lt;code&gt;&lt;div style="font-size: 20px; font-weight: bold; color: rgb(120, 120, 190);"&gt;Don't forget to set up the routes.rb when using the REST Controller generator !&lt;br&gt;&lt;br&gt;Edit the routes.rb and:&lt;br&gt;&lt;br&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;&lt;pre&gt;ActionController::Routing::Routes.draw do |map|&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # The priority is based upon order of creation: first created -&amp;gt; highest priority.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # Sample of regular route:&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # map.connect 'products/:id', :controller =&amp;gt; 'catalog', :action =&amp;gt; 'view'&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # Keep in mind you can assign values other than :controller and :action&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&amp;nbsp; # Sample of named route:&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # map.purchase 'products/:id/purchase', :controller =&amp;gt; 'catalog', :action =&amp;gt; 'purchase'&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # This route can be invoked with purchase_url(:id =&amp;gt; product.id)&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&amp;nbsp; # You can have the root of your site routed by hooking up '' &lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # -- just remember to delete public/index.html.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; map.connect '', :controller =&amp;gt; "sms", :action =&amp;gt; 'new'&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&amp;nbsp; # Allow downloading Web Service WSDL as a file with an extension&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; # instead of a file named 'wsdl'&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; map.connect ':controller/service.wsdl', :action =&amp;gt; 'wsdl'&lt;/pre&gt;&lt;pre&gt;&lt;br&gt;&amp;nbsp; # Install the default route as the lowest priority.&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; map.connect ':controller/:action/:id'&lt;/pre&gt;&lt;pre&gt;&amp;nbsp;&lt;/pre&gt;&lt;pre&gt;&amp;nbsp; map.resources :contact&lt;/pre&gt;&lt;pre&gt;en&lt;span style="font-family: mon;"&gt;d&lt;br&gt;&lt;br&gt;(I can't stand Zoho writer horrible interface: it's the most UNuser &lt;br&gt;friendly interface I have ever seen: you can't set the style of&lt;br&gt;the text to "normal")&lt;br&gt;&lt;/span&gt;&lt;/pre&gt;&lt;/span&gt;&lt;pre&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/code&gt;&lt;/font&gt;&lt;font size="3"&gt;&lt;code&gt; &lt;/code&gt;&lt;/font&gt;&lt;/p&gt;&lt;p&gt;&lt;code&gt;&lt;/code&gt;&lt;/p&gt;      &lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5083540702319959520?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5083540702319959520/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5083540702319959520' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5083540702319959520'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5083540702319959520'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/05/do-not-forget-to-set-up-routes-when.html' title='Do not forget to set up the routes when using the REST Controller generator'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4976776896730130664</id><published>2007-05-11T12:53:00.001+02:00</published><updated>2007-05-11T12:53:03.522+02:00</updated><title type='text'>Bitter Browser manual configuration sample script</title><content type='html'>&amp;lt;!-- BITTY BROWSER : WWW.BITTY.COM : {BEGIN} --&amp;gt; &amp;lt;script type="text/javascript"&amp;gt;&lt;br&gt;&amp;lt;!--&lt;br&gt;&lt;br&gt;/* Bitty Browser tips &amp;amp; tricks: */&lt;br&gt;/* http://www.bitty.com/manual/ */&lt;br&gt;&lt;br&gt;bitty = {contents: [{&lt;br&gt;service: "bitty:browser",&lt;br&gt;title: "Bitty Browser",&lt;br&gt;width: "100%",&lt;br&gt;height: "1000",&lt;br&gt;titlebar: {display: "off"},&lt;br&gt;buttonbar: {textlabels: "off"},&lt;br&gt;searchbar: {display: "off"},&lt;br&gt;homepage: {contents: [{website: ""}]}&lt;br&gt;}]};&lt;br&gt;&lt;br&gt;// --&amp;gt;&lt;br&gt;&amp;lt;/script&amp;gt;&amp;lt;script src="http://b1.bitty.com/b2script/" type="text/javascript"&amp;gt;&amp;lt;/script&amp;gt; &lt;br&gt;&amp;lt;!-- BITTY BROWSER : WWW.BITTY.COM : {END} --&amp;gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4976776896730130664?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4976776896730130664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4976776896730130664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4976776896730130664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4976776896730130664'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/05/bitter-browser-manual-configuration.html' title='Bitter Browser manual configuration sample script'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8663500417133079970</id><published>2007-05-10T17:29:00.001+02:00</published><updated>2007-05-10T17:29:22.285+02:00</updated><title type='text'>XP Day France 2007</title><content type='html'>Last week I went to Paris in order to assist to the &lt;a href="http://xp-france.net/index.php?option=com_content&amp;amp;task=view&amp;amp;id=33&amp;amp;Itemid=100"&gt;second XP Day France&lt;/a&gt; conference which was held in Paris. This was an excellent opportunity to catch up with the french speaking Agile &amp;amp; Rails communities. After all, I left Paris almost 5 years ago - in july 2002 ! Nethertheless, I am feeling deeply connected to my home country and I really can't stand bad croissants full of vegetable hydrogenated fat ;-) I have met and talked with passionate people, among others:&lt;br&gt;&lt;ul&gt;&lt;li&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;Laurent Bossavit,&lt;/span&gt; Paris, &lt;span style="font-weight: bold;"&gt;The&lt;/span&gt; organizer who did a very good job, the conference place rooms food &amp;amp; drinks were quite good. Laurent is an independant Agile consultant and offer &lt;a href="http://www.bossavit.com/consultant/services.phtml"&gt;training services about Agile practices&lt;/a&gt;&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;Richard Piacentini&lt;/span&gt;, Paris, who created &lt;a href="http://www.railsfrance.org/"&gt;RailsFrance&lt;/a&gt;, organized &lt;a href="http://paris.onrails.info/"&gt;Paris on Rails&lt;/a&gt; and is a founder of &lt;a href="http://nuxos.fr/"&gt;nuxos.fr&lt;/a&gt;, a consulting company on open source and Rails projects.&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: rgb(255, 255, 102);" name="firstlastname" id="fullname_119985635"&gt;Ludovic Blaas&lt;/span&gt;, Besançon (my home town!!!), Agile coach at &lt;a href="http://www.parkeon.com"&gt;Parkeon&lt;/a&gt; ex Schlumberger where people work with Pair Programming, unit testing, Continuous Integration and so on. Allez Besac!&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;Olivier Lafontan&lt;/span&gt;, UK, Agile consultant at &lt;a href="http://www.exoftware.com/"&gt;exoftware&lt;/a&gt;&lt;span style="background-color: rgb(255, 255, 255);"&gt;. I attended 2 excellent session given by Olivier: "XP Game" perfect training session to re-learn how to do the planning and "Numbers which sell Agile methods" which focussed on ROI of Agile projects and how to give a business value to customer stories&lt;br&gt;&lt;/span&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;p&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;Pascal &lt;/span&gt;&lt;span id="_user_pvc@nayima.be" style="color: rgb(0, 0, 0); background-color: rgb(255, 255, 102);"&gt;Van Cauwenberghe&lt;/span&gt;, Brussels, &lt;a href="http://nayima.be/"&gt;nayima&lt;/a&gt;, gave a very good presentation on identifying bottlenecks on projects. Pascal is one of the inventor of the famous XP Game, he has also a looooot of experience in programming&lt;br&gt;&lt;/p&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;Jacques Couvreur&lt;/span&gt;, Geneva, &lt;a href="http://hortis.ch/"&gt;hortis.ch&lt;/a&gt;, gave a return on experience about Pair Programming&lt;br&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;Jérôme Laurens&lt;/span&gt;, Paris, founder of &lt;a href="http://www.ss2j.com/"&gt;ss2j&lt;/a&gt;, part of the "sustainable" and ethical consulting network &lt;a title="" target="_blank" href="http://www.excilys.com"&gt;ss2j&lt;/a&gt;&lt;font face="Arial"&gt;&lt;font color="#664444"&gt;&lt;a href="http://www.excilys.com/" target="_blank" onclick="return top.js.OpenExtLink(window,event,this)"&gt;&lt;br&gt;&lt;/a&gt;&lt;/font&gt;&lt;/font&gt;&lt;/li&gt;&lt;li&gt;&lt;span style="background-color: rgb(255, 255, 102);"&gt;François Beauregard&lt;/span&gt;, Montreal gave a talk about &lt;a href="http://www.greenpeppersoftware.com"&gt;GreenPepper&lt;/a&gt;, a product which is a mix of BDD / wiki and FIT&lt;br&gt;&lt;/li&gt;&lt;/ul&gt;If you read in French and want to join the hip crowd of happy Rails developers, &lt;a href="http://www.editions-eyrolles.com/Panier/?add=1&amp;amp;ouv_ean13=9782212120790"&gt;BUY THIS BOOK&lt;/a&gt;! This is the second edition, updated for Rails 1.2.3, translated by Laurent &lt;span class="nom-auteur"&gt;Julliard &lt;/span&gt;and Richard Piacentini and published at "Editions Eyrolles". A Must Have !&lt;br&gt;&lt;br&gt;&lt;img style="width: 276px; height: 331px;" alt="The image “http://www.editions-eyrolles.com/Scan/MaxiScan/9782212120790.jpg” cannot be displayed, because it contains errors." src="http://www.editions-eyrolles.com/Scan/MaxiScan/9782212120790.jpg" align="" border="1" hspace="0" vspace="0"&gt;&lt;br&gt;&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8663500417133079970?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8663500417133079970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8663500417133079970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8663500417133079970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8663500417133079970'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/05/xp-day-france-2007.html' title='XP Day France 2007'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7051522559184456654</id><published>2007-04-13T17:38:00.001+02:00</published><updated>2007-04-13T17:38:33.732+02:00</updated><title type='text'>Procrastinating on Ubuntu</title><content type='html'>Music plays an important role in my life: it makes me very happy ;-) Yesterday, I went out until 4am to listen to Dj set de Will Holland a.k.a Quantic. Good music is like sport or finding a tricky bug after a good night of sleep: a natural flash of pure serotonine. In a world where most people need to get drunk or take drugs (cigaret, skunk, cocaine, ...) to feel good, I am happy to have a clean brain still depending on natural stimulations ....&lt;br&gt;&lt;br&gt;I have been using ubuntu Edgy on my Toshiba SATELLITE M100-184 since September 2006 - 6 months at the time of this post - and I have to say I am not convinced yet it the best choice I have ver made. Yesterday, I spent 2 hours (including a 20 minutes for updating this blog) to have subversion worked with Netbeans. Today, I have spent 1 hour to have sound on my computer !!! It was working perfectly fine until I ran an automatic update and .... Pchhhhh!&lt;br&gt;&lt;br&gt;After some intensive googling, I came across a t&lt;a href="https://help.ubuntu.com/community/HdaIntelSoundHowto"&gt;roubleshooting post about my sound card&lt;/a&gt; - the HDA Intell &amp;amp; Realtek ALC861 - &lt;br&gt;The sound came back but it was very low volume!!! Arghh :-((((&lt;br&gt;&lt;br&gt;Fortunately, someone has had the s&lt;a href="https://launchpad.net/ubuntu/+source/linux-source-2.6.20/+bug/93859/comments/6"&gt;ame problem on Feisty and posted a solution&lt;/a&gt; ... Very lucky! I have no clue how these people find these solutions but I am very grateful to them!&lt;br&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;sudo gedit   /etc/modprobe.d/alsa-base&lt;/span&gt;&lt;br&gt;&lt;br&gt;and append at the end of the file:&lt;br&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;options snd-hda-intel model=auto&lt;/span&gt;&lt;br&gt;&lt;br&gt;I am thinking to wait for another 6 months and then make the move to Apple if I am still spending my time procrastinating on configuration issued instead of doing real work!&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7051522559184456654?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7051522559184456654/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7051522559184456654' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7051522559184456654'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7051522559184456654'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/04/procrastinating-on-ubuntu.html' title='Procrastinating on Ubuntu'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-446870836362330024</id><published>2007-04-11T14:17:00.001+02:00</published><updated>2007-04-11T14:17:15.391+02:00</updated><title type='text'>Set up subversion for Netbeans on Ubuntu Edgy</title><content type='html'>The subversion support on Radrails was flawned and I have been loosing a few days before finding out that the &lt;a href="http://blog.maxdunn.com/articles/2006/12/07/svn-malformed-network-data-error-in-eclipse"&gt;subclipse needed to be updated&lt;/a&gt;. Now, history is repeating and I am fighting some configuration monsters to get the good looking netbeans subversion support to work!&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;First issue: The &lt;span style="background-color: rgb(255, 255, 102);"&gt;SVN executables&lt;/span&gt; are not set by default!&lt;/span&gt;&lt;br&gt;&lt;br&gt;Open the options / Miscellaneous / Subversion and set the /usr/local/bin/ folder as in the following screenshot.&lt;br&gt;&lt;br&gt;&lt;img alt="" src="http://writer.zoho.com:80/ImageDisplay.im?name=subversion_executable_path_netbeans.png&amp;amp;accId=47486000000002007" align="bottom" border="0" hspace="0" vspace="0"&gt;&lt;br&gt;&lt;br&gt;Important, you have to input the svn executable &lt;span style="font-weight: bold;"&gt;folder&lt;/span&gt;, not the executable file. Unfortunately, there is no validation run by netbeans to check if your entry is valid!&lt;br&gt;&lt;br&gt;A sidenote to Netbeans developpers, this is typically the kind of things which should be automatic, like in RadRails and Eclipse ;-)&lt;br&gt;&lt;br&gt;&lt;span style="font-weight: bold;"&gt;Second issue: The &lt;span style="background-color: rgb(255, 255, 102);"&gt;subversion version&lt;/span&gt; installed on Ubuntu Edgy won't work with netbeans!&lt;/span&gt;&lt;br&gt;&lt;br&gt;Ubuntu Edgy comes with version subversion 1.3, we'll need to upgrade to 1.4.2 manually because the synaptic repository does not contain anything ...&lt;br&gt;Here is a &lt;a href="http://higepon.blogspot.com/2006/12/install-subversion-142-to-ubuntu-edgy.html"&gt;script inspired by Higepon&lt;/a&gt; which should make the whole thing easier, go to a tmp folder, copy &amp;amp; paste into a sh file and don't forget to make it executable with &lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;chmod +x install_svn_1.4.2.sh&lt;/span&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;&lt;br&gt;&lt;br&gt;sudo apt-get -y remove libsvn0&lt;br&gt;sudo apt-get -y remove subversion&lt;br&gt;sudo apt-get -y install libneon25 libneon25-dev&lt;br&gt;sudo apt-get -y install libapr1.0-dev&lt;br&gt;sudo apt-get -y install libaprutil1.0-dev&lt;br&gt;sudo apt-get -y install libdb4.2-dev&lt;br&gt;sudo apt-get -y install libdb4.2&lt;br&gt;sudo apt-get -y install libsqlite3-0&lt;br&gt;sudo apt-get -y install libsqlite3-dev&lt;br&gt;sudo apt-get -y install libldap-dev&lt;br&gt;sudo apt-get -y install libpq-dev&lt;br&gt;sudo apt-get -y install libexpat1-dev&lt;br&gt;wget http://subversion.tigris.org/downloads/subversion-1.4.2.tar.bz2&lt;br&gt;tar vxf subversion-1.4.2.tar.bz2&lt;br&gt;cd subversion-1.4.2&lt;br&gt;./configure --with-ssl&lt;br&gt;make&lt;br&gt;sudo make install&lt;/span&gt;&lt;br&gt;&lt;br&gt;The official &lt;font&gt;&lt;font class="para"&gt;&lt;a href="http://subversion.netbeans.org/faq/index.html#q60_2_1"&gt;NetBeans Subversion Support F.A.Q.&lt;/a&gt; is also a good source of informations.&lt;br&gt;&lt;/font&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-446870836362330024?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/446870836362330024/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=446870836362330024' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/446870836362330024'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/446870836362330024'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/04/set-up-subversion-for-netbeans-on.html' title='Set up subversion for Netbeans on Ubuntu Edgy'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-8121265917855778659</id><published>2007-04-05T11:16:00.001+02:00</published><updated>2007-05-07T17:07:04.847+02:00</updated><title type='text'>TGV</title><content type='html'>Premier post en français!&lt;br /&gt;&lt;br /&gt;Il y a quelque jours, j'ai décidé de commencer la rédaction d'un mini e-book en français qui devrait  s'intituler TGV - Testing à Grande Vitesse - en honneur au nouveau record de vitesse battu par la SNCF le 3 avril 2007.&lt;br /&gt;&lt;br /&gt;&lt;span style="font-style: italic;"&gt;&lt;br /&gt;&lt;/span&gt;Etant donné que je n'ai eu aucun contact avec la communauté Rails de France et de Navarre, j'ai pensé faire une petite enquête d'opinion sur ses attentes.&lt;br /&gt;&lt;br /&gt;Bon, la tout de suite, c'est un ptit post mais j'ajouterai des zoho surveys!&lt;br /&gt;&lt;br /&gt;&lt;div&gt;&lt;object height="335" width="425"&gt;&lt;param name="movie" value="http://www.dailymotion.com/swf/1ehOen439sIo5boKs"&gt;&lt;param name="allowfullscreen" value="true"&gt;&lt;embed src="http://www.dailymotion.com/swf/1ehOen439sIo5boKs" type="application/x-shockwave-flash" allowfullscreen="true" height="335" width="425"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;&lt;b&gt;&lt;a href="http://www.dailymotion.com/video/x1m894_record-tgv-high-speed-sncf-euronews"&gt;Record TGV High Speed  SNCF Euronews&lt;/a&gt;&lt;/b&gt;&lt;br /&gt;&lt;i&gt;Uploaded by &lt;a href="http://www.dailymotion.com/supersaiyan"&gt;supersaiyan&lt;/a&gt;&lt;/i&gt;&lt;/div&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-8121265917855778659?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/8121265917855778659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=8121265917855778659' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8121265917855778659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/8121265917855778659'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/04/tgv.html' title='TGV'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-6762075959597431989</id><published>2007-04-03T13:34:00.001+02:00</published><updated>2007-04-03T13:34:47.483+02:00</updated><title type='text'>Quick tip: change the short link to java executable in Unbuntu</title><content type='html'>sudo update-alternatives --config java&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-6762075959597431989?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/6762075959597431989/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=6762075959597431989' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6762075959597431989'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/6762075959597431989'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/04/quick-tip-change-short-link-to-java.html' title='Quick tip: change the short link to java executable in Unbuntu'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-5139857403102988956</id><published>2007-03-30T17:00:00.001+02:00</published><updated>2007-03-30T17:00:05.358+02:00</updated><title type='text'>A quick_dirty trick to set ENV[RAILS_ENV]</title><content type='html'>&lt;font size="2"&gt;&amp;nbsp;&lt;/font&gt;I am using webbrick or Mongrel in development mode and Apache + fcgi in production mode on my site5 server (I'd recommand them, they are very reactive).&lt;br&gt;&lt;br&gt;I have read that you're supposed to set &lt;style type="text/css"&gt;--  		@page { size: 21cm 29.7cm; margin: 2cm }  		P { margin-bottom: 0.21cm }  	--&amp;gt;&lt;/style&gt;&lt;font size="2"&gt;ENV['RAILS_ENV'] to 'production' in environment.rb&lt;br&gt;As I am using capistrano de deploy my webapplication, I have tried to move that setting to dispatch.fcgi and it works! No need to get 2 versions of environment.rb (1 for developement &amp;amp; test and 1 for production)&lt;br&gt;&lt;br&gt;Maybe there is a more elegant solution, I'd love to hear about it!&lt;br&gt;&lt;/font&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-5139857403102988956?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/5139857403102988956/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=5139857403102988956' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5139857403102988956'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/5139857403102988956'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/03/quickdirty-trick-to-set-envrailsenv.html' title='A quick_dirty trick to set ENV[RAILS_ENV]'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7569291080198301135</id><published>2007-03-29T17:32:00.001+02:00</published><updated>2007-03-29T17:32:32.199+02:00</updated><title type='text'>Firefox 2.0.3 keeps crashing on my Ubuntu Edgy Eft</title><content type='html'>Since the lasted automatic update on the 25/03/2007, firefox has been very unstable. Every 20 minutes or so, it crashes with the following message:&lt;br&gt;&lt;br&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;"The application 'Gecko' lost its connection to the display :0.0;&lt;br&gt;most likely the X server was shut down or you killed/destroyed the application."&lt;/span&gt;&lt;br&gt;  &lt;br&gt;&lt;meta http-equiv="CONTENT-TYPE" content="text/html; charset=utf-8"&gt;&lt;title&gt;&lt;/title&gt;&lt;meta name="GENERATOR" content="OpenOffice.org 2.0  (Linux)"&gt;&lt;meta name="AUTHOR" content="Jean-Michel Garnier"&gt;&lt;meta name="CREATED" content="20061102;13053200"&gt;&lt;meta name="CHANGEDBY" content="Jean-Michel Garnier"&gt;&lt;meta name="CHANGED" content="20070329;16420900"&gt;I am investigating the problem following &lt;style type="text/css"&gt;&lt;!--  		@page { size: 21cm 29.7cm; margin: 2cm }  		P { margin-bottom: 0cm }  		P.western { font-size: 10pt }  		H1 { margin-top: 0cm; margin-bottom: 0cm; background: #ffff00; page-break-before: auto; page-break-after: auto }  		H1.western { font-family: "Nimbus Sans L", sans-serif; font-size: 10pt; font-weight: medium }  		H1.cjk { font-family: "DejaVu Sans"; font-size: 16pt }  		H1.ctl { font-family: "DejaVu Sans"; font-size: 16pt }  	--&gt;  	&lt;/style&gt;    &lt;p&gt;https://wiki.ubuntu.com/MozillaTeam/Bugs?action=show&amp;amp;redirect=DebuggingFirefox advices&lt;/p&gt;&lt;br&gt;&lt;p&gt;The same version of firefox running on Windows XP runs absolutely fine, I am looking forward to reporting to the ubuntu community!!! So far, I have no clue, could it be my installation of ubuntu???&lt;/p&gt;&lt;br&gt;&lt;p&gt;The sad truth was that before this update, firefox was more stable in Windows too ...&lt;br&gt;&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7569291080198301135?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7569291080198301135/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7569291080198301135' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7569291080198301135'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7569291080198301135'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/03/firefox-203-keeps-crashing-on-my-ubuntu_29.html' title='Firefox 2.0.3 keeps crashing on my Ubuntu Edgy Eft'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-1378402392313212374</id><published>2007-02-27T17:06:00.001+01:00</published><updated>2007-02-27T17:06:47.843+01:00</updated><title type='text'>Clearing Out Rails file-bases Sessions with cron</title><content type='html'>Adapted from Agile Web Development on Rails:&lt;br&gt;The session handler in Rails doesn’t do automated housekeeping. This means that once the data for a session is created, it isn’t automatically cleared out after the session expires. This can quickly spell trouble. The default ﬁle-based session handler will run into trouble long before the database-based session handler will, but both handlers will create an endless amount of data. Since Rails doesn’t clean up after itself, you’ll need to do it yourself. The easiest way is to run a script periodically, you could put the following command into a script&lt;br&gt;that will delete ﬁles that haven’t been touched in the last 1 hour every morning at 4am.&lt;br&gt;&lt;br&gt;In the bash, run the command:&lt;br&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;crontab -e&lt;/span&gt;&lt;br&gt;&lt;br&gt;You'll enter a command line editor vi like, type "I" and copy-paste the following command:&lt;br&gt;&lt;span style="border: 1px solid rgb(139, 69, 19); padding-right: 5px; padding-left: 5px; color: rgb(0, 0, 102); background-color: rgb(255, 153, 51);"&gt;0 4 * * * cd ~/YOUR_RAILS_APPS_HOME_FOLDER_HERE/; find tmp/sessions -name 'ruby_sess.*' -amin +60 -exec rm -rf {} \;&lt;/span&gt;&lt;br&gt;&lt;br&gt;To save, type ESC, then wq in order to save the file and quit.&lt;br&gt;&lt;br&gt;As far as I am concerned, I can't stand these command line software which don't give a clue about how to use them. I am sooooo looking forward a rebirth of some Pao Alto 70 spirit in the domain of User Interface: I want to see 3D, vocal commands, predictive User Interfaces !!! Damn the Monopoles!!!!&lt;br&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-1378402392313212374?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/1378402392313212374/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=1378402392313212374' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1378402392313212374'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/1378402392313212374'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/02/clearing-out-rails-file-bases-sessions.html' title='Clearing Out Rails file-bases Sessions with cron'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4113368359111763846</id><published>2007-02-21T22:12:00.001+01:00</published><updated>2007-02-21T22:12:36.217+01:00</updated><title type='text'>MySQL Database access problem in Ruby on Rails</title><content type='html'>  I was having the following problem repetitively  when using rake to run the tests on my ubuntu Edgy Eft machine:&lt;br&gt;rake aborted!&lt;br&gt;Lost connection to MySQL server during query&lt;br&gt;/config/../vendor/rails/activerecord/lib/active_record/vendor/mysql.rb:1127:in `write'&lt;br&gt;&lt;br&gt;As I am using Radrails since the beginning  of my ruby career , I have never found out before!!! Indeed, Radrails must use another driver than my plain ruby to access the mysql database.&lt;br&gt;&lt;br&gt;It turned out that installing the libmysql-ruby solved the problem:&lt;br&gt;&lt;span style="font-weight: bold;"&gt;sudo apt-get install libmysql-ruby&lt;/span&gt;  &lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4113368359111763846?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4113368359111763846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4113368359111763846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4113368359111763846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4113368359111763846'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/02/mysql-database-access-problem-in-ruby.html' title='MySQL Database access problem in Ruby on Rails'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-4838073438175610893</id><published>2007-02-14T20:05:00.001+01:00</published><updated>2007-02-15T10:38:58.219+01:00</updated><title type='text'>Deploying a rails application on site5</title><content type='html'>It took me a while - 2 days and a half ! - but I finnaly managed to deploy my application on site5 using &lt;a href="http://rubyforge.org/projects/capistrano/"&gt;capistrano!&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;The toughest part was understanding this error message:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;error: directory is writable by others: (/home/xxxxxx/rails/webapps/xxxx/releases/20070213163348/public)&lt;br /&gt;[warn] FastCGI: (dynamic) server "/home/xxxxx/public_html/xxxxx/dispatch.fcgi"&lt;br /&gt;has failed to remain running for 30 seconds given 3 attempts, its restart interval has been backed off&lt;br /&gt;to 600 seconds&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;It turned out - as I found in the &lt;a href="http://forums.site5.com/showpost.php?p=90814&amp;postcount=37"&gt;site5 forum&lt;/a&gt; - that site5 has CGI/FCGI configured to shut down scripts that are group- or  world-writable. As of 1.3, Capistrano issues a "chmod g+w" command over  the entire check-out branch.&lt;br /&gt;&lt;br /&gt;The solution was to change the permissions in a &lt;span class="symbol"&gt;:after_update_code task.&lt;br /&gt;&lt;br /&gt;The thing is, site5 is cheap but it so sloooooooooow! not sure how long I am going to pay for such a service.&lt;br /&gt;&lt;br /&gt;&lt;/span&gt;    &lt;style&gt;  pre {      background-color: #f1f1f3;      color: #112;      padding: 10px;      font-size: 1.1em;      overflow: auto;      margin: 4px 0px;            width: 95%;  }    /* Syntax highlighting */  pre .normal {}  pre .comment { color: #005; font-style: italic; }  pre .keyword { color: #A00; font-weight: bold; }  pre .method { color: #077; }  pre .class { color: #074; }  pre .module { color: #050; }  pre .punct { color: #447; font-weight: bold; }  pre .symbol { color: #099; }  pre .string { color: #944; background: #FFE; }  pre .char { color: #F07; }  pre .ident { color: #004; }  pre .constant { color: #07F; }  pre .regex { color: #B66; background: #FEF; }  pre .number { color: #F99; }  pre .attribute { color: #5bb; }  pre .global { color: #7FB; }  pre .expr { color: #227; }  pre .escape { color: #277; }&lt;/style&gt;&lt;span style="font-family:monospace;"&gt;&lt;br /&gt;&lt;/span&gt;&lt;span class="symbol"&gt;&lt;br /&gt;&lt;/span&gt;  &lt;style&gt; pre {     background-color: #f1f1f3;     color: #112;     padding: 10px;     font-size: 1.1em;     overflow: auto;     margin: 4px 0px;           width: 95%; }  /* Syntax highlighting */ pre .normal {} pre .comment { color: #005; font-style: italic; } pre .keyword { color: #A00; font-weight: bold; } pre .method { color: #077; } pre .class { color: #074; } pre .module { color: #050; } pre .punct { color: #447; font-weight: bold; } pre .symbol { color: #099; } pre .string { color: #944; background: #FFE; } pre .char { color: #F07; } pre .ident { color: #004; } pre .constant { color: #07F; } pre .regex { color: #B66; background: #FEF; } pre .number { color: #F99; } pre .attribute { color: #5bb; } pre .global { color: #7FB; } pre .expr { color: #227; } pre .escape { color: #277; } &lt;/style&gt;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;span class="comment"&gt;# Capistrano deployment script on site 5&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Jean-Michel Garnier&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Tested with capistrano 1.40 14/02/2007&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;#&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Inspired by http://fluctisonous.com/2006/11/19/moving-home-with-capistrano-on-site5&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# And Kyle Daigle http://forums.asmallorange.com/index.php?showtopic=8892&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Usage:&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# the first time: cap setup&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Then to initialize the db the first time- if you have a bootstrap task like in mephisto -&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# env BOOTSTRAP=true cap  deploy&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# &lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# otherwise: cap deploy&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Customize these variables&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:application&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;bicinostrum&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:user&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;your userlogin at site5&lt;span class="punct"&gt;"&lt;/span&gt;            &lt;span class="comment"&gt;# defaults to the currently logged in user&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:password&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span&gt;&lt;span class="comment"&gt;your site5 password&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;      &lt;span class="comment"&gt; &lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:domain&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;21croissants.com&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;      &lt;span class="comment"&gt;# your applications domain name&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;#set :deploy_server, "you.server.name" # the url of your server &lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:public_html&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;/home/&lt;span class="expr"&gt;#{user}&lt;/span&gt;/public_html/&lt;span class="expr"&gt;#{application}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:svn_repositoty_home&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;rails/svn_repository&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:rails_apps_home&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;rails/webapps&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Do not change these variables&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:use_sudo&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="constant"&gt;false&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:rails_env&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;production&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:deploy_to&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;/home/&lt;span class="expr"&gt;#{user}&lt;/span&gt;/&lt;span class="expr"&gt;#{rails_apps_home}&lt;/span&gt;/&lt;span class="expr"&gt;#{application}&lt;/span&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:repository&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;svn+ssh://&lt;span class="expr"&gt;#{user}&lt;/span&gt;@&lt;span class="expr"&gt;#{domain}&lt;/span&gt;/home/&lt;span class="expr"&gt;#{user}&lt;/span&gt;/&lt;span class="expr"&gt;#{svn_repositoty_home}&lt;/span&gt;/&lt;span class="expr"&gt;#{application}&lt;/span&gt;/trunk&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# ROLES&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# You can define any number of roles, each of which contains any number of&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# machines. Roles might include such things as :web, or :app, or :db, defining&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# what the purpose of each machine is. You can also specify options that can&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# be used to single out a specific subset of boxes in a particular role, like&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# :primary =&amp;gt; true.&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;role&lt;/span&gt; &lt;span class="symbol"&gt;:web&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;domain&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;role&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="ident"&gt;domain&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;role&lt;/span&gt; &lt;span class="symbol"&gt;:db&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt;  &lt;span class="ident"&gt;domain&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# SSH OPTIONS ?&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;set&lt;/span&gt; &lt;span class="symbol"&gt;:svn_passphrase&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# ssh_options[:port] = 25&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# TASKS&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# =============================================================================&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# Define tasks that run on all (or only some) of the machines. You can specify&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# a role (or set of roles) that each task should be executed on. You can also&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# narrow the set of servers to a subset of a role by specifying options, which&lt;/span&gt;&lt;br /&gt;&lt;span class="comment"&gt;# must match the options given for the servers to select (like :primary =&amp;gt; true)&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;desc&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;Restart the web server. Overrides the default task for Site5 use&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:restart&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;skill -9 -u&lt;span class="expr"&gt;#{user}&lt;/span&gt; -cdispatch.fcgi&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:after_setup&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="constant"&gt;CMD&lt;/span&gt;  &lt;br /&gt;  &lt;span class="ident"&gt;ln&lt;/span&gt; &lt;span class="punct"&gt;-&lt;/span&gt;&lt;span class="ident"&gt;s&lt;/span&gt; &lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="ident"&gt;home&lt;/span&gt;&lt;span class="punct"&gt;/&lt;/span&gt;&lt;span class="comment"&gt;#{user}/#{rails_apps_home}/#{application}/current/public/ #{public_html}&lt;/span&gt;&lt;span class="string"&gt;&lt;/span&gt;&lt;span class="constant"&gt;&lt;br /&gt;CMD&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="ident"&gt;task&lt;/span&gt; &lt;span class="symbol"&gt;:after_update_code&lt;/span&gt;&lt;span class="punct"&gt;,&lt;/span&gt; &lt;span class="symbol"&gt;:roles&lt;/span&gt; &lt;span class="punct"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="symbol"&gt;:app&lt;/span&gt; &lt;span class="keyword"&gt;do&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;find &lt;span class="expr"&gt;#{release_path}&lt;/span&gt;/public -type d -exec chmod 0755 {} &lt;span class="escape"&gt;\\&lt;/span&gt;;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;find &lt;span class="expr"&gt;#{release_path}&lt;/span&gt;/public -type f -exec chmod 0644 {} &lt;span class="escape"&gt;\\&lt;/span&gt;;&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;"&lt;/span&gt;&lt;span class="string"&gt;chmod 0755 &lt;span class="expr"&gt;#{release_path}&lt;/span&gt;/public/dispatch.*&lt;/span&gt;&lt;span class="punct"&gt;"&lt;/span&gt;&lt;br /&gt;&lt;br /&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="constant"&gt;ENV&lt;/span&gt;&lt;span class="punct"&gt;['&lt;/span&gt;&lt;span class="string"&gt;BOOTSTRAP&lt;/span&gt;&lt;span class="punct"&gt;']&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="constant"&gt;EOF&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;    cd &lt;span class="expr"&gt;#{release_path}&lt;/span&gt; &amp;&amp;amp; rake db:bootstrap RAILS_ENV=production&lt;br /&gt;&lt;/span&gt;&lt;span class="constant"&gt;    EOF&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;else&lt;/span&gt;&lt;br /&gt;  &lt;span class="ident"&gt;run&lt;/span&gt; &lt;span class="punct"&gt;&amp;lt;&amp;lt;-&lt;/span&gt;&lt;span class="constant"&gt;EOF&lt;/span&gt;&lt;span class="string"&gt;&lt;br /&gt;    cd &lt;span class="expr"&gt;#{release_path}&lt;/span&gt; &amp;amp;&amp;amp; rake db:migrate RAILS_ENV=production&lt;br /&gt;&lt;/span&gt;&lt;span class="constant"&gt;    EOF&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;span class="keyword"&gt;end&lt;/span&gt;&lt;br /&gt;&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-4838073438175610893?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/4838073438175610893/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=4838073438175610893' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4838073438175610893'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/4838073438175610893'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/02/deploying-rails-application-on-site5.html' title='Deploying a rails application on site5'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-2544828409875322943.post-7704381204991366301</id><published>2007-02-13T16:48:00.000+01:00</published><updated>2007-05-07T17:12:17.677+02:00</updated><title type='text'>Unlocking an HTC S620 WIFI phone in 5 minutes / Resisting to telco thanks to voip</title><content type='html'>&lt;div&gt;&lt;img alt="http://www.pianetacellulare.it/Modelli/immagini/s620_htc.jpg" src="http://www.pianetacellulare.it/Modelli/immagini/s620_htc.jpg" style="width: 165px; height: 276px;" /&gt;&lt;/div&gt;&lt;br /&gt;&lt;br /&gt;In most of european countries, there are 3-5 operators who have agreed to maintain very expensive prices for mobile phone communications and text messaging.  This is obviously an unofficially agreement and there will be some kind of justice one day, probably from the  &lt;a title="organization" href="http://ec.europa.eu/information_society/activities/roaming/index_en.htm"&gt;European Commission&lt;/a&gt;... &lt;a title="534 000 000 €" href="http://www.mobileeurope.co.uk/news/news_story.ehtml?o=1695"&gt;&lt;/a&gt;&lt;br /&gt;     &lt;br /&gt;       But today is a great day, I have unlocked in 5 minutes the HTC S620 I bought on eBay in the US for 220€ using &lt;a href="http://www.imei-check.co.uk/dashunlock.php" title="IMEI-Check services"&gt;IMEI-Check services&lt;/a&gt; (20 pounds). This is still cheaper than the 489€ retail price in Europe! I did not want to buy any Microsoft based device but I was not convinced by what I read about symbian os smart-phones (correct me if I am wrong).&lt;br /&gt;     &lt;br /&gt;&lt;img alt="The image “http://en.fon.com/lib/tools/fgf/home_images/en/en_logoFon.png” cannot be displayed, because it contains errors." src="http://en.fon.com/lib/tools/fgf/home_images/en/en_logoFon.png" /&gt;&lt;br /&gt;&lt;br /&gt;Hopefully, there are a lot of open Wifi networks (still) + the fact the &lt;a href="http://www.fon.com/" title="FON network"&gt;FON network&lt;/a&gt; is growing rapidly, I am confident I will be able to use Skype and call for free my relatives abroad, make voip phone calls at the rate of 12 centimes instead of 18 centimes (I am not sure about that, the price system of mobile phone communication was not not made to be readable) (plus the fact they always fucking charge the first minute even if the conversation lasted 1 second), and especially send text messages for &lt;span style="font-weight: bold;"&gt;7 &lt;/span&gt;centimes instead of 20 centimes with my current pay-as-go contract!!!&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/2544828409875322943-7704381204991366301?l=21croissants.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://21croissants.blogspot.com/feeds/7704381204991366301/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=2544828409875322943&amp;postID=7704381204991366301' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7704381204991366301'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/2544828409875322943/posts/default/7704381204991366301'/><link rel='alternate' type='text/html' href='http://21croissants.blogspot.com/2007/02/unlocking-htc-s620-wifi-phone-in-5.html' title='Unlocking an HTC S620 WIFI phone in 5 minutes / Resisting to telco thanks to voip'/><author><name>Jean-Michel</name><uri>http://www.blogger.com/profile/12541109166975793396</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>1</thr:total></entry></feed>
