<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>SmartLogic Solutions Blog &#187; ubuntu</title>
	<atom:link href="http://blog.smartlogicsolutions.com/tag/ubuntu/feed/" rel="self" type="application/rss+xml" />
	<link>http://blog.smartlogicsolutions.com</link>
	<description>News and updates from the people at SmartLogic Solutions</description>
	<lastBuildDate>Tue, 30 Nov 2010 21:39:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.2.1</generator>
		<item>
		<title>Installing PostGIS 1.5 on PostgreSQL 8.4 on Ubuntu</title>
		<link>http://blog.smartlogicsolutions.com/2010/03/04/installing-postgis-1-5-0-on-postgresql-8-4-on-ubuntu-9-10/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/03/04/installing-postgis-1-5-0-on-postgresql-8-4-on-ubuntu-9-10/#comments</comments>
		<pubDate>Thu, 04 Mar 2010 19:54:02 +0000</pubDate>
		<dc:creator>Nick Gauthier</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nick Gauthier]]></category>
		<category><![CDATA[PostgreSQL]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[postgis]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=867</guid>
		<description><![CDATA[I had a bit of trouble installing the latest PostGIS 1.5 under PostgreSQL 8.4. Here are my instructions. These work on Ubuntu 8.04, 9.04, 9.10, 10.04, and 10.10. UPDATE This post has been updated to include the awesome instructions from Leo regarding using the postgis-unstable ppa. Thanks Leo! 1. Install PostGIS from PPA System -> [...]]]></description>
			<content:encoded><![CDATA[<p>I had a bit of trouble installing the latest PostGIS 1.5 under PostgreSQL 8.4. Here are my instructions. These work on Ubuntu 8.04, 9.04, 9.10, 10.04, and 10.10.</p>
<p><span id="more-867"></span></p>
<p><strong>UPDATE</strong></p>
<p>This post has been updated to include the awesome instructions from Leo regarding using the postgis-unstable ppa. Thanks Leo!</p>
<h3>1. Install PostGIS from PPA</h3>
<p>System -> Administration -> Software Sources</p>
<p>Click on the &#8220;Other Software&#8221; tab.</p>
<p>Click on &#8220;+Add&#8221;</p>
<p>Enter: &#8220;ppa:ubuntugis/ubuntugis-unstable&#8221;</p>
<p>More info: <a href="https://launchpad.net/~ubuntugis/+archive/ubuntugis-unstable">https://launchpad.net/~ubuntugis/+archive/ubuntugis-unstable</a></p>
<p>Now install the package &#8220;postgresql-8.4-postgis&#8221;</p>
<h3>2. Setup your database</h3>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">createdb my_db
createlang plpgsql my_db
psql <span style="color: #660033;">-d</span> my_db <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>postgis-<span style="color: #000000;">1.5</span><span style="color: #000000; font-weight: bold;">/</span>postgis.sql
psql <span style="color: #660033;">-d</span> my_db <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>postgis-<span style="color: #000000;">1.5</span><span style="color: #000000; font-weight: bold;">/</span>spatial_ref_sys.sql
psql <span style="color: #660033;">-d</span> my_db <span style="color: #660033;">-f</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>share<span style="color: #000000; font-weight: bold;">/</span>postgresql<span style="color: #000000; font-weight: bold;">/</span><span style="color: #000000;">8.4</span><span style="color: #000000; font-weight: bold;">/</span>contrib<span style="color: #000000; font-weight: bold;">/</span>postgis_comments.sql</pre></div></div>

<p>Now you should be able to make a geometry table.</p>
<h3>3. Setup your geometry table</h3>
<p>At this point I&#8217;m showing how to make an example table. Your usage of the PostGIS library will probably differ.</p>

<div class="wp_syntax"><div class="code"><pre class="sql" style="font-family:monospace;"><span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">SEQUENCE</span> points_id_seq;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">TABLE</span> points <span style="color: #66cc66;">&#40;</span> id <span style="color: #993333; font-weight: bold;">INTEGER</span> <span style="color: #993333; font-weight: bold;">PRIMARY</span> <span style="color: #993333; font-weight: bold;">KEY</span> <span style="color: #993333; font-weight: bold;">DEFAULT</span> <span style="color: #993333; font-weight: bold;">NEXTVAL</span><span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'points_id_seq'</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">SELECT</span> AddGeometryColumn<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'points'</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'location'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">4326</span><span style="color: #66cc66;">,</span> <span style="color: #ff0000;">'POINT'</span><span style="color: #66cc66;">,</span> <span style="color: #cc66cc;">2</span><span style="color: #66cc66;">&#41;</span>;
<span style="color: #993333; font-weight: bold;">CREATE</span> <span style="color: #993333; font-weight: bold;">INDEX</span> points_location_idx <span style="color: #993333; font-weight: bold;">ON</span> points <span style="color: #993333; font-weight: bold;">USING</span> GIST <span style="color: #66cc66;">&#40;</span> location <span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">//</span> <span style="color: #993333; font-weight: bold;">CREATE</span> a point
<span style="color: #993333; font-weight: bold;">INSERT</span> <span style="color: #993333; font-weight: bold;">INTO</span> points<span style="color: #66cc66;">&#40;</span>location<span style="color: #66cc66;">&#41;</span> <span style="color: #993333; font-weight: bold;">VALUES</span> <span style="color: #66cc66;">&#40;</span>ST_GeomFromText<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'POINT(-76.615657 39.327052)'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span>;
&nbsp;
<span style="color: #66cc66;">//</span> <span style="color: #993333; font-weight: bold;">RETURNS</span> the point
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> points <span style="color: #993333; font-weight: bold;">WHERE</span> ST_Distance<span style="color: #66cc66;">&#40;</span>location<span style="color: #66cc66;">,</span> ST_GeomFromText<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'POINT(-76 39)'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #cc66cc;">1</span>;
&nbsp;
<span style="color: #66cc66;">//</span> Does <span style="color: #993333; font-weight: bold;">NOT</span> <span style="color: #993333; font-weight: bold;">RETURN</span> the point
<span style="color: #993333; font-weight: bold;">SELECT</span> <span style="color: #66cc66;">*</span> <span style="color: #993333; font-weight: bold;">FROM</span> points <span style="color: #993333; font-weight: bold;">WHERE</span> ST_Distance<span style="color: #66cc66;">&#40;</span>location<span style="color: #66cc66;">,</span> ST_GeomFromText<span style="color: #66cc66;">&#40;</span><span style="color: #ff0000;">'POINT(-76 39)'</span><span style="color: #66cc66;">&#41;</span><span style="color: #66cc66;">&#41;</span> <span style="color: #66cc66;">&lt;</span> <span style="color: #66cc66;">.</span>1;</pre></div></div>

<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2008/06/13/ruby-on-rails-polymorphic-association-benchmarks/" rel="bookmark" class="crp_title">Ruby on Rails Polymorphic Association Benchmarks</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/01/16/ext4-on-ubuntu-904/" rel="bookmark" class="crp_title">EXT4 On Ubuntu 9.04</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/06/deploying-rails-apps-with-capistrano-without-root-or-sudo-privileges/" rel="bookmark" class="crp_title">Deploying Rails Apps with Capistrano without root or sudo Privileges</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/07/07/i-cant-upgrade-rubygems-from-111-to-120-on-ubuntu/" rel="bookmark" class="crp_title">I can&#8217;t upgrade RubyGems from 1.1.1 to 1.2.0 on Ubuntu</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/" rel="bookmark" class="crp_title">Setting Up Ubuntu 9.10 for Ruby On Rails Development</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/03/04/installing-postgis-1-5-0-on-postgresql-8-4-on-ubuntu-9-10/feed/</wfw:commentRss>
		<slash:comments>33</slash:comments>
		</item>
		<item>
		<title>Setting Up Ubuntu 9.10 for Ruby On Rails Development</title>
		<link>http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/</link>
		<comments>http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/#comments</comments>
		<pubDate>Mon, 01 Feb 2010 21:09:31 +0000</pubDate>
		<dc:creator>Adam Bachman</dc:creator>
				<category><![CDATA[Adam Bachman]]></category>
		<category><![CDATA[Configuration]]></category>
		<category><![CDATA[Linux]]></category>
		<category><![CDATA[MySQL]]></category>
		<category><![CDATA[Passenger]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Enterprise Edition]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[development]]></category>
		<category><![CDATA[environment]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=860</guid>
		<description><![CDATA[This is a document I put together at the beginning of 2010 while building yet another Ubuntu VM, digging through our internal documentation to try and find out what I needed. We've got the answers, and generally Ruby, Rails, and Ubuntu are pretty good about telling you how to install tools if you don't have them yet.

But the answers are spread out and distributed randomly. Plus, I can only see "The program '______' is currently not installed. You can install it by typing: sudo apt-get install ______" so many times before I lose interest and put off the task.

So, to prevent future headaches and help all of us out, I put together a how-to that can take a new Rails system from zero to code in a few minutes (depending on network speed) instead of half a day.]]></description>
			<content:encoded><![CDATA[<p>This is a document I put together at the beginning of 2010 while building yet another Ubuntu VM, digging through our internal documentation to try and find out what I needed. We&#8217;ve got the answers, and generally Ruby, Rails, and Ubuntu are pretty good about telling you how to install tools if you don&#8217;t have them yet.</p>
<p>But the answers are spread out and distributed randomly. Plus, I can only see &#8220;The program &#8216;______&#8217; is currently not installed. You can install it by typing: sudo apt-get install ______&#8221; so many times before I lose interest and put off the task.</p>
<p><span id="more-860"></span></p>
<p>So, to prevent future headaches and help all of us out, I put together a how-to that can take a new Rails system from zero to code in a few minutes (depending on network speed) instead of half a day. With no further ado,</p>
<h2>Setting up an Ubuntu box for Rails Development (including virtual machines)</h2>
<h4>Update everything</h4>
<pre>$ sudo aptitude update &amp;&amp; sudo aptitude dist-upgrade</pre>
<h4>Install necessary packages</h4>
<pre>$ sudo aptitude install build-essential vim \
  vim-runtime git-core subversion libsqlite3-dev</pre>
<p>We have projects in git (the newer ones) and svn, so we have to be able to switch fluidly between the two.</p>
<p>And I&#8217;m not trying to start a flame war, but Vim is the first choice for Rails development. You don&#8217;t have to take my word for it; <a href="http://weblog.jamisbuck.org/2008/10/10/coming-home-to-vim">Jamis Buck</a>, <a href="http://github.com/tpope">Tim Pope</a>, and <a href="http://www.adamlowe.me/2009/12/vim-destroys-all-other-rails-editors.html">Adam Lowe</a> all say the same. I recommend the NERDTree, FuzzyFinderTextMate, BufExplorer, and rails.vim plugins if nothing else.</p>
<h4>Install ruby</h4>
<pre>$ sudo aptitude install ruby1.8 ruby rdoc ruby1.8-dev \
  libpgsql-ruby1.8 libmysql-ruby1.8 irb libopenssl-ruby</pre>
<h4>Get rubygems from source. <a href="http://docs.rubygems.org/">http://docs.rubygems.org/</a></h4>
<pre>$ wget http://rubyforge.org/frs/download.php/60718/rubygems-1.3.5.tgz</pre>
<pre>$ tar xzvf rubygems-1.3.5.tgz</pre>
<pre>$ cd rubygems-1.3.5</pre>
<pre>$ sudo ruby setup.rb</pre>
<pre>$ sudo ln -s /usr/bin/gem1.8 /usr/bin/gem</pre>
<pre>$ sudo gem update --system</pre>
<h4>Update ~/.gemrc (at least the :sources: chunk)</h4>
<pre>---
gem: --no-ri --no-rdoc
:benchmark: false
:verbose: true
:backtrace: false
:update_sources: true
:sources:
- http://gemcutter.org
- http://gems.rubyforge.org/
- http://gems.github.com</pre>
<h4>Install and setup Passenger (optional)</h4>
<pre>$ sudo apt-get install apache2-prefork-dev</pre>
<pre>$ sudo gem install passenger</pre>
<pre>$ sudo passenger-install-apache2-module</pre>
<p>and follow the instructions passenger gives you. Most folks in the office run some form of an Apache-Passenger stack for development purposes. I can explain how that setup works in a future post.</p>
<h4>Install geminstaller</h4>
<pre>$ sudo gem install geminstaller</pre>
<p>Almost all of our legacy projects use <a href="http://geminstaller.rubyforge.org/">geminstaller</a> to manage gem dependencies. In the future, new projects will be moving to <a href="http://github.com/wycats/bundler">Bundler</a>, but legacy projects matter and upgrading subsystems is not always justified.</p>
<p>&#8220;If it ain&#8217;t broke, don&#8217;t fix it&#8221; and the corollary: &#8220;because you probably won&#8217;t be able to bill it to the client&#8221; both apply.</p>
<h4>Install common packages (optional, may be required by projects)</h4>
<pre>$ sudo aptitude install imagemagick</pre>
<pre>$ sudo gem install utility_belt open_gem redgreen</pre>
<p>The first (imagemagick) is used by the Paperclip gem to manage files attached to Rails models. The second are tools that make Rails development more manageable on the command line. I highly recommend them. Besides, I&#8217;ve been sneaking redgreen in as a test dependency on our projects, so if you&#8217;re a developer here you&#8217;ll have to install it anyways.</p>
<h4>Create an ssh key (follow instructions)</h4>
<pre>$ ssh-keygen</pre>
<h3>EXAMPLE PROJECT</h3>
<p>All the stuff above won&#8217;t let you test-code-deploy without hassles, so here&#8217;s a sample run through of what the last mile of project-specific setup looks like.</p>
<h4>Get the project. SVN, Git, whatever. Go to it.</h4>
<pre>$ svn co rails-project</pre>
<pre>$ cd rails-project</pre>
<h4>Run geminstaller</h4>
<pre>$ sudo geminstaller                                 # normal</pre>
<pre>$ sudo geminstaller -c config/test/geminstaller.yml # test env</pre>
<h4>Install necessary aptitude packages</h4>
<pre>$ sudo aptitude install texlive-latex-base</pre>
<p>Don&#8217;t ask.</p>
<h4>Create the test database</h4>
<p>Mysql:</p>
<pre>$ rake RAILS_ENV=test db:create</pre>
<p>Postgres (using your username or DB username in place of &#8220;username&#8221;):</p>
<pre>$ sudo -u postgres psql</pre>
<pre>postgres=# CREATE USER username SUPERUSER;</pre>
<pre>postgres=# CREATE DATABASE username OWNER username;</pre>
<p>If you get an error regarding PGconn.quote_ident (Rails 2.3.x on Ubuntu 8.04) patch <code>activerecord-2.3.4/lib/active_record/connection_adapters/postgresql_adapter.rb</code> and add the following:</p>
<pre>def PGconn.quote_ident(name)
  %("#{name}")
end</pre>
<p>immediately after the &#8220;class PGresult&#8221; definition at the top of the file. Once that&#8217;s all done, the following:</p>
<pre>$ rake RAILS_ENV=test db:create</pre>
<pre>$ rake RAILS_ENV=test db:schema:load</pre>
<pre>$ rake RAILS_ENV=test test</pre>
<p>should work.</p>
<h3>go have fun, write code, blow our minds</h3>
<p>So that&#8217;s how we roll. Awkward requirements will still crop up as we pick up new projects (or very old projects) so you&#8217;ll always need a bit of apt/gem fu to get you through the day. Leave questions here or drop me a line at <a href="mailto:adam@smartlogicsolutions.com">adam@smartlogicsolutions.com</a> or <a href="http://twitter.com/abachman">http://twitter.com/abachman</a>.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2008/07/07/i-cant-upgrade-rubygems-from-111-to-120-on-ubuntu/" rel="bookmark" class="crp_title">I can&#8217;t upgrade RubyGems from 1.1.1 to 1.2.0 on Ubuntu</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/04/26/integrity-ci-on-passenger-222-with-ruby-enterprise-edition-on-ubuntu-804/" rel="bookmark" class="crp_title">Integrity CI on Passenger 2.2.2 with Ruby Enterprise Edition on Ubuntu 8.04</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/01/14/aptinstaller-032-released/" rel="bookmark" class="crp_title">Aptinstaller 0.3.2 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/08/04/introducing-environmentalize-an-intuitive-environment-focused-config-structure-for-your-rails-applications/" rel="bookmark" class="crp_title">Introducing environmentalist: an intuitive, environment-focused config structure for your rails applications</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/06/deploying-rails-apps-with-capistrano-without-root-or-sudo-privileges/" rel="bookmark" class="crp_title">Deploying Rails Apps with Capistrano without root or sudo Privileges</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Find the Unique Sessions for a Rails Application</title>
		<link>http://blog.smartlogicsolutions.com/2009/05/04/find-the-unique-sessions-for-a-rails-application/</link>
		<comments>http://blog.smartlogicsolutions.com/2009/05/04/find-the-unique-sessions-for-a-rails-application/#comments</comments>
		<pubDate>Mon, 04 May 2009 15:32:47 +0000</pubDate>
		<dc:creator>Nick Gauthier</dc:creator>
				<category><![CDATA[Linux]]></category>
		<category><![CDATA[Nick Gauthier]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby on Rails]]></category>
		<category><![CDATA[log files]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=617</guid>
		<description><![CDATA[Today we&#8217;re going to look at how to find the number of unique sessions over a specific time frame for a rails application. We&#8217;ll be using the slow-actions gem. Slow-Actions is great tool for determining the slow areas of a rails application. Since it is built on a rails log parser, it can be used [...]]]></description>
			<content:encoded><![CDATA[<p>Today we&#8217;re going to look at how to find the number of unique sessions over a specific time frame for a rails application. We&#8217;ll be using the <a href="http://github.com/ngauthier/slow-actions/tree/master">slow-actions</a> gem.</p>
<p><span id="more-617"></span></p>
<p>Slow-Actions is great tool for determining the slow areas of a rails application. Since it is built on a rails log parser, it can be used for many other things. For example, here is some standard output from slow-actions when you want to know the speed of different user sessions within a specific date range:</p>
<pre>
slow-actions log/development.log --sessions --start-date=2009-03-01 --end-date=2009-04-01
           Cost    Average Max
+ ece0e17b48a5fe0fc766fa42f199fb66 (51 entries, 58% Error)
| Total:   2883.262 732.948 3100.00
| Render:  0.00000 0.00000 0.00000
| DB:      55.8220 14.1900 99.0000 

+ e1181ad94b34b41aff2a74ee62d5fb57 (10 entries, 30% Error)
| Total:   1563.912 676.276 1426.00
| Render:  0.00000 0.00000 0.00000
| DB:      14.5350 6.28500 19.0000 

+ 867bc340e6d65e673f29c57189feaf2b (133 entries, 0% Error)
| Total:   1083.138 221.450 386.000
| Render:  0.00000 0.00000 0.00000
| DB:      44.2030 9.03700 90.0000 

Etc...
</pre>
<p>Now, if we grep for &#8220;entries&#8221; we get a line for each session:</p>
<pre>
slow-actions log/development.log --sessions --start-date=2009-03-01 --end-date=2009-04-01 | grep entries
+ ece0e17b48a5fe0fc766fa42f199fb66 (51 entries, 58% Error)
+ e1181ad94b34b41aff2a74ee62d5fb57 (10 entries, 30% Error)
+ 867bc340e6d65e673f29c57189feaf2b (133 entries, 0% Error)
+ 99b39c7a9af55fc01056b5f127dc4c98 (75 entries, 0% Error)
+ 6ee15c4f3bc804ac68e9e868d9c3f7e6 (14 entries, 0% Error)
+ 80928c25c83590c4f89b91f8d4c8896d (9 entries, 0% Error)
+ c78cfa1cb086b3f473015b212ca3da11 (12 entries, 0% Error)
+ 48cd02cf6544493077c84eb16821bda2 (3 entries, 66% Error)
+ ac027817dcf87d473efb54cd737b2a80 (2 entries, 0% Error)
+ dff2ca2678852b06bbb6c7ca0a85b0a9 (1 entries, 0% Error)
+ 08ed3bc031c23bd3b2572ef7ce60d066 (1 entries, 0% Error)
</pre>
<p>Pipe that to word count, and we have the number of unique sessions within a specified time period:</p>
<pre>
slow-actions log/development.log --sessions --start-date=2009-03-01 --end-date=2009-04-01 | grep entries | wc -l
11
</pre>
<p>On a 54m log file, that takes only 0.761s!</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2009/03/13/slow-actions-in-rails-projects/" rel="bookmark" class="crp_title">Slow Actions in Rails Projects</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/07/11/problems-with-restful_authentication-plugin-and-internet-explorer-cookies/" rel="bookmark" class="crp_title">Problems with restful_authentication Plugin and Internet Explorer Cookies</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/01/22/ubuntu-byobu-landscape/" rel="bookmark" class="crp_title">Using Byobu and Landscape to improve remote Ubuntu sessions</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/02/03/properly-setting-http_referer-in-a-rails-integration-test-to-upload-file/" rel="bookmark" class="crp_title">Properly Setting HTTP_REFERER in a Rails Integration Test for a File Upload</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/11/12/watch-multiple-logs-in-a-single-terminal/" rel="bookmark" class="crp_title">Watch Multiple Logs in a Single Terminal</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2009/05/04/find-the-unique-sessions-for-a-rails-application/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Integrity CI on Passenger 2.2.2 with Ruby Enterprise Edition on Ubuntu 8.04</title>
		<link>http://blog.smartlogicsolutions.com/2009/04/26/integrity-ci-on-passenger-222-with-ruby-enterprise-edition-on-ubuntu-804/</link>
		<comments>http://blog.smartlogicsolutions.com/2009/04/26/integrity-ci-on-passenger-222-with-ruby-enterprise-edition-on-ubuntu-804/#comments</comments>
		<pubDate>Sun, 26 Apr 2009 17:38:28 +0000</pubDate>
		<dc:creator>John Trupiano</dc:creator>
				<category><![CDATA[Apache]]></category>
		<category><![CDATA[Continuous Integration]]></category>
		<category><![CDATA[Integrity]]></category>
		<category><![CDATA[Passenger]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Ruby Enterprise Edition]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[ci]]></category>
		<category><![CDATA[ree]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=592</guid>
		<description><![CDATA[I just spent a few hours trying to get this configuration sorted out, so I thought I&#8217;d share my notes. My goal was to get Integrity running on Passenger with Ruby Enterprise Edition. However, I couldn&#8217;t get the user Integrity/Apache was running as to use the proper PATH. Whenever Integrity would try to build my [...]]]></description>
			<content:encoded><![CDATA[<p>I just spent a few hours trying to get this configuration sorted out, so I thought I&#8217;d share my notes.  My goal was to get <a href="http://integrityapp.com/">Integrity</a> running on <a href="http://modrails.com/">Passenger</a> with <a href="http://rubyenterpriseedition.com/">Ruby Enterprise Edition</a>.  However, I couldn&#8217;t get the user Integrity/Apache was running as to use the proper PATH.</p>
<p>Whenever Integrity would try to build my project, I&#8217;d get an error about rake not being able to be found: <code>sh: rake: not found</code></p>
<p><span id="more-592"></span></p>
<p>This totally threw me.  I had added it to /etc/environment</p>
<pre>
PATH="/opt/ruby/bin:$PATH"
</pre>
<p>and so it was certainly on my PATH:</p>
<pre>
john@john-ci:~$ echo $PATH
/opt/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
</pre>
<p>I had also added it to /root/.bash_profile so that root would have it picked up:</p>
<pre>
john@john-ci:~$ sudo su -
root@john-ci:~# echo $PATH
/opt/ruby/bin:/usr/local/sbin:/usr/local/bin:/usr/sbin:/usr/bin:/sbin:/bin
</pre>
<p>So why wasn&#8217;t Apache/Integrity picking it up?  To seek this out, I opened up the Integrity source and edited /opt/ruby/lib/ruby/gems/1.8/gems/integrity-0.1.9.3/lib/integrity/project_builder.rb to output the values of `whoami` and $PATH to help me troubleshoot.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC00FF; font-weight:bold;">IO</span>.<span style="color:#9900CC;">popen</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;(echo `whoami` &amp;&amp; echo $PATH &amp;&amp; cd #{scm.working_directory} &amp;&amp; $
          |output| build.output = output.read }</span></pre></div></div>

<p>Doing this yielded the following output:</p>
<pre>
www-data
/usr/local/bin:/usr/bin:/bin
</pre>
<p>At this point, I wholly expected the PATH to not include /opt/ruby/bin, so this isn&#8217;t a surprise.  But why is this being set?</p>
<h3>The Real Problem</h3>
<p>The real issue here was that I was trying to set the PATH in scripts that only get run when a shell is entered.  Since apache starts up as a system process, it is not started from a shell, and does not have a PATH associated with it.  In fact, if you open up /etc/init.d/apache, you&#8217;ll see on one of the first few lines that the PATH is distinctly set:</p>
<pre>
ENV="env -i LANG=C PATH=/usr/local/bin:/usr/bin:/bin"
</pre>
<p>This was precisely the PATH I was seeing when I hacked Integrity to output its PATH just prior to failing the Rake command.  Now it&#8217;s fairly obvious that I just need to add in /opt/ruby/bin to the front of that PATH, and Integrity will be able to execute all of my ruby/rubygem executables (most importantly rake).</p>
<h3>Recap of Steps to Install</h3>
<ol>
<li><a href="http://rubyenterpriseedition.com/download.html">Download</a> and install REE</li>
<li>Create a symlink for /opt/ruby so it&#8217;s dead simple to upgrade when a new REE comes out: <code>sudo ln -s /opt/ruby-enterprise-whatever-version-you-installed /opt/ruby</code></li>
<li>edit /etc/environment to add /opt/ruby/bin to your shell PATH : <code>PATH=/opt/ruby/bin:$PATH</code></li>
<li>edit ~/.bash_profile to alias sudo so that sudo can inherit your environment : <code>alias sudo='sudo env PATH=$PATH'</code></li>
<li>Reload your environment to pick up the new PATH: <code>source /etc/environment &#038;&#038; source ~/.bash_profile</code></li>
<li>Install Passenger: <code>sudo gem install passenger &#038;&#038; passenger-install-apache2-module</code></li>
<li>Install Integrity Gem: <code>sudo gem install integrity</code></li>
<li>Install Integrity Home: <code>sudo integrity install --passenger ~www-data/integrity</code></li>
<li>Install do_sqlite3 Gem: <code>sudo gem install do_sqlite3</code></li>
<li>Prepare Integrity Database: <code>cd ~www-data/integrity &#038;&#038; sudo integrity migrate_db config.yml</code></li>
<li>Grant ownership of all integrity files to www-data: <code>sudo chown -R www-data:www-data ~www-data/integrity</code></li>
<li>Create Apache config for Integrity: <code>sudo nano -w /etc/apache2/sites-available/integrity</code>:
<pre>
<VirtualHost *>
  ServerName ci.yourdomain.com
  DocumentRoot /var/www/integrity/public
</VirtualHost>
</pre>
</li>
<li>Enable the site: <code>sudo ln -s /etc/apache2/sites-available/integrity /etc/apache2/sites-enabled/002-integrity</code></li>
<li>Edit /etc/init.d/apache2 and add /opt/ruby/bin to the PATH as described above: <code>ENV="env -i LANG=C PATH=/opt/ruby/bin:/usr/local/bin:/usr/bin:/bin"</code></li>
<li>Restart Apache: <code>sudo /etc/init.d/apache2 restart</code></li>
<li>Navigate to http://ci.yourdomain.com/ and start adding projects.</li>
</ol>
<p>Boy, that was a mouthful.  Please let me know if you&#8217;ve also been successful, and if there are any other steps you take to set up Integrity with REE and Passenger.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2009/06/10/shell-script-to-upgrade-ruby-enterprise-edition-while-maintaining-directory-naming-sanity/" rel="bookmark" class="crp_title">Shell Script to Upgrade Ruby Enterprise Edition while Maintaining Directory Naming Sanity</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/" rel="bookmark" class="crp_title">Setting Up Ubuntu 9.10 for Ruby On Rails Development</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/06/02/better-setup-for-environments-in-rails/" rel="bookmark" class="crp_title">Better setup for environments in Rails</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/07/07/i-cant-upgrade-rubygems-from-111-to-120-on-ubuntu/" rel="bookmark" class="crp_title">I can&#8217;t upgrade RubyGems from 1.1.1 to 1.2.0 on Ubuntu</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/08/04/introducing-environmentalize-an-intuitive-environment-focused-config-structure-for-your-rails-applications/" rel="bookmark" class="crp_title">Introducing environmentalist: an intuitive, environment-focused config structure for your rails applications</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2009/04/26/integrity-ci-on-passenger-222-with-ruby-enterprise-edition-on-ubuntu-804/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Benchmark Ruby Code with R, rsruby and better-benchmark</title>
		<link>http://blog.smartlogicsolutions.com/2008/10/08/benchmark-ruby-code-with-r-rsruby-and-better-benchmark/</link>
		<comments>http://blog.smartlogicsolutions.com/2008/10/08/benchmark-ruby-code-with-r-rsruby-and-better-benchmark/#comments</comments>
		<pubDate>Wed, 08 Oct 2008 16:53:38 +0000</pubDate>
		<dc:creator>John Trupiano</dc:creator>
				<category><![CDATA[Benchmarking]]></category>
		<category><![CDATA[John Trupiano]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[Ruby]]></category>
		<category><![CDATA[Testing]]></category>
		<category><![CDATA[benchmark]]></category>
		<category><![CDATA[mac osx]]></category>
		<category><![CDATA[R]]></category>
		<category><![CDATA[rsruby]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://blog.smartlogicsolutions.com/?p=275</guid>
		<description><![CDATA[I&#8217;ve found myself on a benchmarking kick these last couple of weeks. Sometime last week, I dug up the better-benchmark library written by Pistos. Pistos&#8217; library is basically just a wrapper for the rsruby gem, which is more or less an interface to R (similar to what rmagick is to ImageMagick). Combining these tools together, [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve found myself on a benchmarking kick these last couple of weeks.  Sometime last week, I dug up the <a href="http://github.com/Pistos/better-benchmark/tree/master">better-benchmark</a> library written by <a href="http://github.com/Pistos">Pistos</a>.  Pistos&#8217; library is basically just a wrapper for the <a href="http://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/">rsruby gem</a>, which is more or less an interface to <a href="http://www.r-project.org/">R</a> (similar to what <a href="http://rmagick.rubyforge.org/">rmagick</a> is to <a href="http://www.imagemagick.org/script/index.php">ImageMagick</a>).</p>
<p>Combining these tools together, we can do some pretty nifty code performance analysis in very few lines of code, e.g.</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'better-benchmark'</span>
&nbsp;
result = <span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">compare_realtime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:iterations</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">10</span><span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>iteration<span style="color:#006600; font-weight:bold;">|</span>
  save_the_world<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">with</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>iteration<span style="color:#006600; font-weight:bold;">|</span>
  save_the_world_and_save_the_girl<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">report_on</span> result</pre></div></div>

<p>I have <a href="http://github.com/jtrupiano/better-benchmark/tree/master">forked better-benchmark</a> and wrapped the library up into a <a href="http://www.rubygems.org/">RubyGem</a>.  </p>
<p><span id="more-275"></span></p>
<p>Currently, the gem is available from github:</p>
<pre>
$> sudo gem install jtrupiano-better-benchmark
</pre>
<p>Based on preliminary discussions with Pistos, he intends to merge my changes back into his branch.  I&#8217;ll update this post with the relevant details when that has been completed.</p>
<p>So, let&#8217;s get started by preparing your box for better-benchmark!</p>
<h2>Installing R</h2>
<h3>On Mac OSX</h3>
<p>This one&#8217;s simple.  AT&#038;T Research provides us with a <a href="http://r.research.att.com/">DMG</a>.</p>
<h3>On Ubuntu 8.0.4</h3>
<p>I first built this just fine on a Mac.  But, I decided that I wanted a dedicated VM where I could run some fairly intense benchmarks.  You&#8217;ll need to ensure you have the following apt packages installed:</p>
<p>* build-essential<br />
* g77 (fortran compiler)<br />
* x11-common</p>
<p>There may be a few others that are required, but I started on a pre-built box more or less ready to host rails apps, and so there may be a few other necessities I missed.  The following steps will install R from source on Ubuntu (I was unable to get the necessary R headers installed using apt-get or apititude), and prepare you for installing the rsruby gem.</p>
<pre>
$> sudo apt-get install build-essential g77 x11-common
$> cd /opt
$> wget http://lib.stat.cmu.edu/R/CRAN/src/base/R-2/R-2.7.2.tar.gz
$> tar xzf R-2.7.2.tar.gz
$> cd R-2.7.2
# --enable-R-shlib is important...it signals the installer to build and make available libR.so
$> ./configure --enable-R-shlib
$> make
$> sudo make install
</pre>
<h2>Installing rsruby</h2>
<p>Assuming you installed R fine, rsruby should be easily installed using gem.  If you have trouble, see the <a href="http://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/">installation instructions</a> on the project&#8217;s README.</p>
<p>Note that you&#8217;ll need to set the R_HOME environment variable prior to installing the gem.  On Mac, R_HOME=/Library/Frameworks/R.framework/Resources.  On Ubuntu (when installed from source), R_HOME=/usr/local/lib/R.  I find it helpful to just drop this into /etc/environment (on Ubuntu) so that this variable is set upon login.</p>
<pre>
$> export R_HOME=/path/to/R/for/your/OS
$> sudo gem install rsruby -- --with-R-dir=$R_HOME
</pre>
<h2>Installing better-benchmark</h2>
<p>Currently, you can get this directly off of my fork on github.</p>
<pre>
$> gem sources -a http://gems.github.com/
$> sudo gem install jtrupiano-better-benchmark
</pre>
<h2>Great, I have it, now what do I do with it??</h2>
<p>So now we&#8217;re ready to benchmark something.  The most important thing to understand when benchmarking is that you need to clearly identify what is part of the benchmark, and what is not.  Let&#8217;s take a look at a real-world example.  We&#8217;ll go through the following steps:</p>
<ol>
<li><strong>Hypothesize: </strong>define exactly what you&#8217;re looking to test, and take special care to describe what you are NOT testing.</li>
<li><strong>Plan: </strong>write out step by step how you will accomplish your benchmark</li>
<li><strong>Refine: </strong>identify which steps belong in the benchmark, and which are really setup/teardown aspects of the benchmark, and thus shouldn&#8217;t be included in the test.</li>
<li><strong>Test: </strong>run the benchmarks</li>
<li><strong>Rinse/Repeat: </strong>(as necessary) tweak your test parameters, tweak the tests, re-test </li>
</ol>
<h2>Real world example</h2>
<p>I was building a set of services that needed to download tens to hundreds of thousands of feeds regularly and perform some post-processing.  I pulled in the <a href="http://feed-normalizer.rubyforge.org/">feed-normalizer</a> gem.  My implementation plan called for me to write separate services, one for &#8220;pulling down&#8221; the feed, and one for &#8220;processing&#8221; the feed.  </p>
<p>My first approach entailed storing the feeds on the hard-drive as YAML (using the to_yaml function).  After running into <a href="http://blog.smartlogicsolutions.com/2008/09/04/ruby-patch-to-fix-broken-yamldump-for-multi-line-strings-stringto_yaml/">some obscure problems with YAML and multi-line strings</a>, I started to explore alternative persistence formats.  One that caught my attention was using the Marshall standard library to store the content as bytecode.  This brings me to my hypothesis:</p>
<p><strong>1) Hypothesis: </strong>Converting FeedNormalizer::Feed objects to bytecode using the Marshal library is faster than converting those same obejcts to YAML using the YAML library.</p>
<p>I also like to list out my goals at this stage:</p>
<ol>
<li>We only want to test the #dump conversion (object &#8211;> string) and the #read conversion (string &#8211;> object).  We do not want to test the write to disk and the read from disk portions.</li>
<li>We specifically want to test FeedNormalizer::Feed objects, since that&#8217;s what we&#8217;re using in our code.</li>
<li>Let&#8217;s benchmark YAML / Marshal #dump and #read methods specifically on FeedNormalizer::Feed objects</li>
</ol>
<p><strong>2) Plan: </strong> </p>
<ol>
<li>We have already grabbed roughly 100 feed downloads, and they are sitting as raw xml in test/raw_rss.</li>
<li>We&#8217;ll read them in, then benchmark YAML.dump vs. Marshal.dump</li>
<li>Then we&#8217;ll independently benchmark YAML.read vs. Marshal.read</li>
</ol>
<p><strong>3) Refine: </strong><br />
Here&#8217;s where we need to ensure that unnecessary processing doesn&#8217;t make its way into our benchmarks.  For instance, in order to benchmark Marshal#dump against YAML#dump, we&#8217;ll need to load up all of the FeedNormalizer::Feed objects (by reading them from disk and instantiating them) prior to starting the benchmark.</p>
<p><strong>4) Test: </strong><br />
It&#8217;s a ruby script, so go ahead and run it.  The set of options provided by better-benchmark are easily discernible from the <a href="http://github.com/jtrupiano/better-benchmark/tree/master/lib/better-benchmark/better-benchmark.rb">source file</a>.</p>
<p><strong>5) Rinse/Repeat: </strong><br />
Same story as always.</p>
<h2>Real Script Example</h2>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
<span style="color:#008000; font-style:italic;"># Author: John Trupiano</span>
<span style="color:#008000; font-style:italic;"># 2008-09-28</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># In order to run this benchmark, you need to have the better-benchmark library installed (http://github.com/Pistos/better-benchmark/tree/master)</span>
<span style="color:#008000; font-style:italic;"># better-benchmark depends on the rsruby gem (http://web.kuicr.kyoto-u.ac.jp/~alexg/rsruby/)</span>
<span style="color:#008000; font-style:italic;"># rsruby depends on an installation of the computing package R (http://mirrors.ibiblio.org/pub/mirrors/CRAN/)</span>
<span style="color:#008000; font-style:italic;">#</span>
<span style="color:#008000; font-style:italic;"># For details on setting up R, rsruby, and better-benchmark, see this blog post: http://blog.smartlogicsolutions.com/2008/10/08/benchmark-ruby-code-with-r-rsruby-and-better-benchmark</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># This is intended to be run from RAILS_ROOT, e.g.</span>
<span style="color:#008000; font-style:italic;"># /path/to/rails/root $&gt; ruby test/benchmark/yaml_bytecode_test.rb</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'openssl'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'yaml'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'feed-normalizer'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'lib/rss_parser'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'better-benchmark'</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># GOALS </span>
<span style="color:#008000; font-style:italic;"># 1) We only want to test the #dump conversion (object --&gt; string) and the #read conversion (string --&gt; object).  We do not want to test the write to disk and the read from disk portions.</span>
<span style="color:#008000; font-style:italic;"># 2) We specifically want to test FeedNormalizer::Feed objects, since that's what we're using in our code.</span>
<span style="color:#008000; font-style:italic;"># 3) Let's benchmark YAML / Marshal #dump and #read methods specifically on FeedNormalizer objects</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># PLAN</span>
<span style="color:#008000; font-style:italic;"># 1) We've grabbed roughly 100 feed downloads sitting in test/raw_rss.</span>
<span style="color:#008000; font-style:italic;"># 2) We'll read them in, then benchmark YAML.dump vs. Marshal.dump</span>
<span style="color:#008000; font-style:italic;"># 3) Then we'll independently benchmark YAML.read vs. Marshal.read</span>
&nbsp;
fn_feeds = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
root_dir = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;test&quot;</span>, <span style="color:#996600;">&quot;raw_rss&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
feed_ids = <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">1</span>..<span style="color:#006666;">62</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_a</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006666;">64</span>..<span style="color:#006666;">108</span><span style="color:#006600; font-weight:bold;">&#41;</span>.<span style="color:#9900CC;">to_a</span>
&nbsp;
<span style="color:#008000; font-style:italic;"># build a global hash fn_feeds that contains the FeedNormalizer::Feed entries</span>
feed_ids.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>feed_id<span style="color:#006600; font-weight:bold;">|</span>
  infile = <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span>root_dir, feed_id.<span style="color:#9900CC;">to_s</span>, feed_id.<span style="color:#9900CC;">to_s</span> <span style="color:#006600; font-weight:bold;">+</span> <span style="color:#996600;">'_dump.rss'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  fn_feeds<span style="color:#006600; font-weight:bold;">&#91;</span>feed_id<span style="color:#006600; font-weight:bold;">&#93;</span> = RssParser.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>infile, <span style="color:#ff3333; font-weight:bold;">:file</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#### BENCHMARK 1 ####</span>
result = <span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">compare_realtime</span><span style="color:#006600; font-weight:bold;">&#40;</span>
  <span style="color:#ff3333; font-weight:bold;">:iterations</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">25</span>,
  <span style="color:#ff3333; font-weight:bold;">:verbose</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>iteration<span style="color:#006600; font-weight:bold;">|</span>
  fn_feeds.<span style="color:#9900CC;">each_pair</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>feed_id, feed<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC00FF; font-weight:bold;">YAML</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>feed<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">with</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>iteration<span style="color:#006600; font-weight:bold;">|</span>
  fn_feeds.<span style="color:#9900CC;">each_pair</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>feed_id, feed<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC00FF; font-weight:bold;">Marshal</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>feed<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">report_on</span> result
&nbsp;
&nbsp;
<span style="color:#008000; font-style:italic;"># now, let's create separate collections storing the dumps</span>
yaml_dumps = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
marshal_dumps = <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">&#125;</span>
fn_feeds.<span style="color:#9900CC;">each_pair</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>feed_id, feed<span style="color:#006600; font-weight:bold;">|</span>
  yaml_dumps<span style="color:#006600; font-weight:bold;">&#91;</span>feed_id<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#CC00FF; font-weight:bold;">YAML</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>feed<span style="color:#006600; font-weight:bold;">&#41;</span>
  marshal_dumps<span style="color:#006600; font-weight:bold;">&#91;</span>feed_id<span style="color:#006600; font-weight:bold;">&#93;</span> = <span style="color:#CC00FF; font-weight:bold;">Marshal</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>feed<span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
<span style="color:#008000; font-style:italic;">#### BENCHMARK 2 ####</span>
result = <span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">compare_realtime</span><span style="color:#006600; font-weight:bold;">&#40;</span>
  <span style="color:#ff3333; font-weight:bold;">:iterations</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006666;">25</span>,
  <span style="color:#ff3333; font-weight:bold;">:verbose</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#006600; font-weight:bold;">&#41;</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>iteration<span style="color:#006600; font-weight:bold;">|</span>
  yaml_dumps.<span style="color:#9900CC;">each_pair</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>feed_id, yaml<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC00FF; font-weight:bold;">YAML</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>yaml<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>.<span style="color:#9900CC;">with</span> <span style="color:#006600; font-weight:bold;">&#123;</span> <span style="color:#006600; font-weight:bold;">|</span>iteration<span style="color:#006600; font-weight:bold;">|</span>
  marshal_dumps.<span style="color:#9900CC;">each_pair</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>feed_id, marshal<span style="color:#006600; font-weight:bold;">|</span>
    <span style="color:#CC00FF; font-weight:bold;">Marshal</span>.<span style="color:#9900CC;">dump</span><span style="color:#006600; font-weight:bold;">&#40;</span>marshal<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
<span style="color:#CC00FF; font-weight:bold;">Benchmark</span>.<span style="color:#9900CC;">report_on</span> result</pre></div></div>

<p>And for good measure, let&#8217;s take a look at the results.</p>
<pre>
john-trupianos-macbook-pro:trunk john$ ruby test/benchmark/yaml_bytecode_test.rb
.........................
Set 1 mean: 2.095 s
Set 1 std dev: 0.071
Set 2 mean: 0.123 s
Set 2 std dev: 0.019
p.value: 1.58214572048972e-14
W: 625.0
The difference (-94.1%) IS statistically significant.
.........................
Set 1 mean: 0.191 s
Set 1 std dev: 0.015
Set 2 mean: 0.022 s
Set 2 std dev: 0.012
p.value: 1.58214572048972e-14
W: 625.0
</pre>
<p>As R plainly tells us, the difference is statistically significant (those who remember their p-values from stats class raise your hands) for both benchmarks (note that I did run two separate benchmarks in this example, one for dumping and one for reading).  That said, considering I don&#8217;t have a need for this data to be human readable on my filesystem, I can safely conclude that using the Marshal library in lieu of the YAML library will give me a performance boost on both the read/dump methods.  Now, whether or not this boost is negligible in the scope of the greater system, well that&#8217;s a question for a separate benchmark.</p>
<p>(What I mean by this last part is that this #dump/#read portion of my whole system may be tiny.  If it only represents 0.5% of the processing time, then the improvement my example shows may be more or less negligible in the context of the whole system.  These are the types of questions you need to ask yourself when benchmarking.)</p>
<p>Primary take-home point:  <strong>know what you&#8217;re benchmarking, and benchmark what you don&#8217;t know</strong>.</p>
<div id="crp_related"><h3>Related Posts:</h3><ul><li><a href="http://blog.smartlogicsolutions.com/2008/09/04/ruby-patch-to-fix-broken-yamldump-for-multi-line-strings-stringto_yaml/" rel="bookmark" class="crp_title">Ruby: Patch to fix broken YAML.dump for multi-line strings (String#to_yaml)</a></li><li><a href="http://blog.smartlogicsolutions.com/2010/02/01/setting-up-ubuntu-9-10-for-ruby-on-rails-development/" rel="bookmark" class="crp_title">Setting Up Ubuntu 9.10 for Ruby On Rails Development</a></li><li><a href="http://blog.smartlogicsolutions.com/2008/07/07/i-cant-upgrade-rubygems-from-111-to-120-on-ubuntu/" rel="bookmark" class="crp_title">I can&#8217;t upgrade RubyGems from 1.1.1 to 1.2.0 on Ubuntu</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/01/14/aptinstaller-032-released/" rel="bookmark" class="crp_title">Aptinstaller 0.3.2 Released</a></li><li><a href="http://blog.smartlogicsolutions.com/2009/06/04/mount-options-to-improve-ext4-file-system-performance/" rel="bookmark" class="crp_title">Mount options to improve ext4 file system performance</a></li><li>Powered by <a href="http://ajaydsouza.com/wordpress/plugins/contextual-related-posts/">Contextual Related Posts</a></li></ul></div>]]></content:encoded>
			<wfw:commentRss>http://blog.smartlogicsolutions.com/2008/10/08/benchmark-ruby-code-with-r-rsruby-and-better-benchmark/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
	</channel>
</rss>

