<?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>John&#039;s Tidbits</title>
	<atom:link href="http://inodes.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://inodes.org</link>
	<description>Moo - Development, Trouble-shooting and Random thoughts...</description>
	<lastBuildDate>Mon, 01 Mar 2010 00:09:19 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Careful what you call your server!</title>
		<link>http://inodes.org/2010/03/01/careful-what-you-call-your-server/</link>
		<comments>http://inodes.org/2010/03/01/careful-what-you-call-your-server/#comments</comments>
		<pubDate>Mon, 01 Mar 2010 00:09:19 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[kvm]]></category>
		<category><![CDATA[lvm]]></category>
		<category><![CDATA[ubuntu]]></category>
		<category><![CDATA[virtialisation]]></category>

		<guid isPermaLink="false">http://inodes.org/?p=236</guid>
		<description><![CDATA[I was setting up a server recently and I was using KVM to virtualise a whole lot of hosts. Being fairly unimaginative I decided to call the machine kvm. As usual I used LVM for the disks. Now on Ubuntu this means that by default the VG will be called the same as the host [...]]]></description>
			<content:encoded><![CDATA[<p>I was setting up a server recently and I was using KVM to virtualise a whole lot of hosts. Being fairly unimaginative I decided to call the machine kvm. As usual I used LVM for the disks. Now on Ubuntu this means that by default the VG will be called the same as the host name. This means the root LV will appear on the system as <strong>/dev/kvm/root</strong>.</p>
<p>When they KVM modules are loaded, they try and create a device called <strong>/dev/kvm</strong>. This fails pretty miserably since <strong>/dev/kvm</strong> is already a directory due to LVM shenanigans.</p>
<p>Not all is lost though if you&#8217;ve done a lot of setup like I had. You can rename VGs. Simply boot from your Ubuntu install CD, choose rescue mode and then jump into a shell. First you deactivate the LVs using</p>
<pre>
vgchange -a n
</pre>
<p>then you can rename the VG using</p>
<pre>
vgrename kvm kvmvg
</pre>
<p>Not sure whether I should file this problem as a bug. It is a bit of a weird situation.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2010/03/01/careful-what-you-call-your-server/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Less is more for ISOs</title>
		<link>http://inodes.org/2010/01/28/less-is-more-for-isos/</link>
		<comments>http://inodes.org/2010/01/28/less-is-more-for-isos/#comments</comments>
		<pubDate>Thu, 28 Jan 2010 01:35:50 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[cd]]></category>
		<category><![CDATA[iso]]></category>
		<category><![CDATA[less]]></category>
		<category><![CDATA[surprising]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://inodes.org/?p=229</guid>
		<description><![CDATA[I was tidying up some data recently and found a couple of ISO images lying around with cryptic file names. I didn&#8217;t have cdinfo installed, so I though I&#8217;d run less hoping that the binary data would have some useful text in it. Instead I was surprised to see the following:

CD-ROM is in ISO 9660 [...]]]></description>
			<content:encoded><![CDATA[<p>I was tidying up some data recently and found a couple of ISO images lying around with cryptic file names. I didn&#8217;t have <strong>cdinfo</strong> installed, so I though I&#8217;d run <strong>less</strong> hoping that the binary data would have some useful text in it. Instead I was surprised to see the following:</p>
<pre>
CD-ROM is in ISO 9660 format
System id: LINUX
Volume id: Ubuntu-Server 9.10 i386
Volume set id:
Publisher id:
Data preparer id:
Application id: GENISOIMAGE ISO 9660/HFS FILESYSTEM CREATOR
   (C) 1993 E.YOUNGDALE (C) 1997-2006 J.PEARSON/J.SCHILLING
   (C) 2006-2007 CDRKIT TEAM
Copyright File id:
Abstract File id:
Bibliographic File id:
Volume set size is: 1
Volume set sequence number is: 1
Logical block size is: 2048
Volume size is: 327972
El Torito VD version 1 found, boot catalog is in sector 1804
Joliet with UCS level 3 found
Rock Ridge signatures version 1 found
Eltorito validation header:
    Hid 1
    Arch 0 (x86)
    ID ''
    Key 55 AA
    Eltorito defaultboot header:
        Bootid 88 (bootable)
        Boot media 0 (No Emulation Boot)
        Load segment 0
        Sys type 0
        Nsect 4
        Bootoff 704 1796

/.disk
/README.diskdefines
&lt;snip&gt;File system listing&lt;/snip&gt;
</pre>
<p>Looks like less runs <strong>isoinfo -f -R -J -i ubuntu-9.10-server-i386.iso</strong>. So I did have the tools I needed installed, I just didn&#8217;t know it yet <img src='http://inodes.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2010/01/28/less-is-more-for-isos/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Linux Australia Elections, Last chance to vote!</title>
		<link>http://inodes.org/2010/01/10/linux-australia-elections-last-chance-to-vote/</link>
		<comments>http://inodes.org/2010/01/10/linux-australia-elections-last-chance-to-vote/#comments</comments>
		<pubDate>Sun, 10 Jan 2010 04:38:20 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[community]]></category>
		<category><![CDATA[election]]></category>
		<category><![CDATA[lca]]></category>

		<guid isPermaLink="false">http://inodes.org/?p=223</guid>
		<description><![CDATA[If you haven&#8217;t done so, please go and vote in the Linux Australia elections. If you aren&#8217;t a member then just join first, membership is free.
I&#8217;m running for the position of Treasurer, but you don&#8217;t need to vote for me since I&#8217;m running unopposed.
I&#8217;m running on a common platform with a group of other like [...]]]></description>
			<content:encoded><![CDATA[<p>If you haven&#8217;t done so, please go and vote in the Linux Australia elections. If you aren&#8217;t a member then just join first, membership is free.</p>
<p>I&#8217;m running for the position of Treasurer, but you don&#8217;t need to vote for me since I&#8217;m running unopposed.</p>
<p>I&#8217;m running on a common platform with a group of other like minded individuals. You can find the details of the platform <a href="http://docs.google.com/Doc?docid=0AQ1T1dSjXs2iYWpneGdnYzUzanpnXzR3c2R6ZmNoaA&#038;hl=en">here</a>.</p>
<p>The main reason I&#8217;m running is I believe that Linux Australia can achieve so much more than it does today. Linux Australia should not simply be a conduit for linux.conf.au.</p>
<p>I want to help turn Linux Australia into an organisation that is relevant to all of us. It should be an organisation that not only fosters and supports the community but also represents the community.</p>
<p>We should offer supportive services to our members, spread the FOSS message through the community as well as actively lobby government for the things we believe in.</p>
<p>Most importantly it is essential that we all become involved. The community is nothing without people to move it forwards. So I would encourage you to vote for</p>
<p><strong>President</strong> James Turnbull<br />
<strong>Vice President</strong> Lindsay Holmwood<br />
<strong>Secretary</strong> Peter Lieverdink<br />
<strong>Treasurer</strong> John Ferlito</p>
<p><strong>Ordinary Committee Members</strong><br />
    Alice Boxhall<br />
    Elspeth Thorne</p>
<p>Once you have finished voting, go and join the <a href="http://lists.linux.org.au">mailing lists</a> and get involved.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2010/01/10/linux-australia-elections-last-chance-to-vote/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Adding multiple database support to Cucumber</title>
		<link>http://inodes.org/2009/10/08/adding-multiple-database-support-to-cucumber/</link>
		<comments>http://inodes.org/2009/10/08/adding-multiple-database-support-to-cucumber/#comments</comments>
		<pubDate>Thu, 08 Oct 2009 06:46:16 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[activerecord]]></category>
		<category><![CDATA[cucumber]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>
		<category><![CDATA[transactions]]></category>
		<category><![CDATA[vquence]]></category>

		<guid isPermaLink="false">http://inodes.org/?p=210</guid>
		<description><![CDATA[The Vqmetrics application needs to connect to two different databases. The first holds the videos, authors and their relevant statistics, while the second database holds the users, monitors and trackers.
We do this by specifying two databases in config/database.yml.

development:
  database: vqmetrics_devel
  &#60; &#60;: *login_dev_local
&#160;
vqdata_development: &#38;VQDATA_TEST
  database: vqdata_devel
  &#60;&#60;: *login_dev_local

So by default the [...]]]></description>
			<content:encoded><![CDATA[<p>The <a href="http://vquence.com.au">Vqmetrics</a> application needs to connect to two different databases. The first holds the videos, authors and their relevant statistics, while the second database holds the users, monitors and trackers.</p>
<p>We do this by specifying two databases in <strong>config/database.yml</strong>.</p>

<div class="wp_syntax"><div class="code"><pre class="yaml" style="font-family:monospace;">development:
  database: vqmetrics_devel
  &lt; &lt;: *login_dev_local
&nbsp;
vqdata_development: &amp;VQDATA_TEST
  database: vqdata_devel
  &lt;&lt;: *login_dev_local</pre></div></div>

<p>So by default the <strong>vqmetrics_devel</strong> database will be used. When we need to specify a  model where we need to connect to the <strong>vqdata_devel</strong> database we use</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Video <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
  establish_connection <span style="color:#996600;">&quot;vqdata_#{RAILS_ENV}&quot;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>and for migrations that need to connect to this database we do the following.</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> InitialSetup <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Migration</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">connection</span>
    Video.<span style="color:#9900CC;">connection</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>This setup works really well. However recently I moved this application to using <a href="http://cukes.info">Cucumber</a> for testing. Tests worked fine the first time they are run but not the second time.</p>
<p>I discovered that the transaction on the second database where not being rolled back as they should be. Cucumber only sets up the first database for roll back by using </p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">connection</span></pre></div></div>

<p>where it should be rolling them all back by looping through</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>.<span style="color:#9900CC;">connection_handler</span>.<span style="color:#9900CC;">connection_pools</span>.<span style="color:#9900CC;">values</span>.<span style="color:#9900CC;">map</span> <span style="color:#006600; font-weight:bold;">&#123;</span><span style="color:#006600; font-weight:bold;">|</span>pool<span style="color:#006600; font-weight:bold;">|</span> pool.<span style="color:#9900CC;">connection</span><span style="color:#006600; font-weight:bold;">&#125;</span></pre></div></div>

<p>I've filed a bug at <a href="https://rspec.lighthouseapp.com/projects/16211-cucumber/tickets/480-cucumber-only-turns-on-transactions-for-one-database">lighthouseapp</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/10/08/adding-multiple-database-support-to-cucumber/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>rm -rf /usr/lib</title>
		<link>http://inodes.org/2009/09/15/rm-rf-usrlib/</link>
		<comments>http://inodes.org/2009/09/15/rm-rf-usrlib/#comments</comments>
		<pubDate>Tue, 15 Sep 2009 04:06:55 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[rm updatedb recovery backups]]></category>

		<guid isPermaLink="false">http://inodes.org/blog/?p=198</guid>
		<description><![CDATA[So in another case of tab completion gone wrong I ended up staring at the following on my laptop.

johnf@zoot:~/dev/vquence/metrics/trunk$ sudo rm -rf /usr/lib
^C

The command only ran for a few seconds so the damage wasn&#8217;t to bad, but what did I lose?
The locate command came to my rescue. locate runs out of cron, usually once a [...]]]></description>
			<content:encoded><![CDATA[<p>So in another case of tab completion gone wrong I ended up staring at the following on my laptop.</p>
<pre>
johnf@zoot:~/dev/vquence/metrics/trunk$ sudo rm -rf /usr/lib
^C
</pre>
<p>The command only ran for a few seconds so the damage wasn&#8217;t to bad, but what did I lose?</p>
<p>The <strong>locate</strong> command came to my rescue. locate runs out of cron, usually once a day, and creates a database with a list of every file on your machine. You can then use it to search for files. So to work out what was missing I did the following.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># Get the list of files before we removed them</span>
<span style="color: #c20cb9; font-weight: bold;">locate</span> <span style="color: #660033;">--regexp</span> <span style="color: #ff0000;">'.'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>before_rm
&nbsp;
<span style="color: #666666; font-style: italic;"># update the locate database</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">updatedb</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Get the list of current files on the system</span>
<span style="color: #c20cb9; font-weight: bold;">locate</span> <span style="color: #660033;">--regexp</span> <span style="color: #ff0000;">'.'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>after_rm
&nbsp;
<span style="color: #666666; font-style: italic;"># Create a list of what's missing</span>
<span style="color: #c20cb9; font-weight: bold;">diff</span> <span style="color: #660033;">-u</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>before_rm <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>after_rm <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>diff_rm
<span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #ff0000;">'^-'</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>diff_rm <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/^-//'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>missing_rm
&nbsp;
<span style="color: #666666; font-style: italic;"># Ask the dpkg system what packages those files belong to</span>
<span style="color: #000000; font-weight: bold;">for</span> i <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>missing_rm<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #000000; font-weight: bold;">do</span>
    <span style="color: #c20cb9; font-weight: bold;">dpkg</span> <span style="color: #660033;">-S</span> <span style="color: #007800;">$i</span>;
<span style="color: #000000; font-weight: bold;">done</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/:$//;s/,//g'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>packages
&nbsp;
<span style="color: #666666; font-style: italic;"># Reinstall those packages</span>
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> reinstall <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #000000; font-weight: bold;">/</span>tmp<span style="color: #000000; font-weight: bold;">/</span>packages<span style="color: #000000; font-weight: bold;">`</span></pre></div></div>

<p>After this process it is probably worth running the step from updatedb again to work out what is still missing.</p>
<p>For the record I lost 102 files and had to reinstall 97 packages.</p>
<p>Now back to real work!</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/09/15/rm-rf-usrlib/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Building a Private PPA on Ubuntu</title>
		<link>http://inodes.org/2009/09/14/building-a-private-ppa-on-ubuntu/</link>
		<comments>http://inodes.org/2009/09/14/building-a-private-ppa-on-ubuntu/#comments</comments>
		<pubDate>Mon, 14 Sep 2009 06:59:12 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[General]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[debian]]></category>
		<category><![CDATA[ppa]]></category>
		<category><![CDATA[rebuildd]]></category>
		<category><![CDATA[reprepro]]></category>
		<category><![CDATA[ubuntu]]></category>

		<guid isPermaLink="false">http://inodes.org/blog/?p=189</guid>
		<description><![CDATA[One of the things I love about the Ubuntu project and launchpad is the Personal Package Archive. PPAs make it so simple and easy to backport packages. The only problem with PPAs is that they are public. I had a need to be able to host some private internal packages as well as squid with [...]]]></description>
			<content:encoded><![CDATA[<p>One of the things I love about the Ubuntu project and launchpad is the Personal Package Archive. PPAs make it so simple and easy to backport packages. The only problem with PPAs is that they are public. I had a need to be able to host some private internal packages as well as squid with SSL support, which you can&#8217;t distribute in binary form due to licensing restrictions.</p>
<p>Basically I wanted to create the equivalent of an Ubuntu PPA service running on our own servers so we could place it behind our firewall. This post is basically the process I followed to integrate <a href="http://julien.danjou.info/rebuildd/">rebuilld</a> and <a href="http://mirrorer.alioth.debian.org/">reprepro</a> to replicate a PPA setup.</p>
<p>So first up install reprepro</p>
<pre>
aptitude install reprepro
</pre>
<p>next we need do create a reprepro repository</p>
<pre>
mkdir -p /srv/reprepro/{conf,incoming,incomingtmp}
</pre>
<p>Now we need to tell reprepro which distributions we care about. Create /srv/reprepro/conf/distributions with the following contents</p>
<pre>
Suite: hardy
Version: 8.04
Codename: hardy
Architectures: i386 amd64 source
Components: main
Description: Local Hardy
SignWith: repository@inodes.org
DebIndices: Packages Release . .gz .bz2
DscIndices: Sources Release .gz .bz2
Tracking: all includechanges keepsources
Log: logfile
  --changes /srv/reprepro/bin/build_sources

Suite: intrepid
Version: 8.10
Codename: intrepid
Architectures: i386 amd64 source
Components: main
Description: Local Intrepid
SignWith: repository@inodes.org
DebIndices: Packages Release . .gz .bz2
DscIndices: Sources Release .gz .bz2
Tracking: all includechanges keepsources
Log: logfile
  --changes /srv/reprepro/bin/build_sources

Suite: jaunty
Version: 9.04
Codename: jaunty
Architectures: i386 amd64 source
Components: main
Description: Local Jaunty
SignWith: repository@inodes.org
DebIndices: Packages Release . .gz .bz2
DscIndices: Sources Release .gz .bz2
Tracking: all includechanges keepsources
Log: logfile
  --changes /srv/reprepro/bin/build_sources
</pre>
<p>I also like to create reprepro options file to setup some defaults, edit /srv/reprepro/conf/options</p>
<pre>
verbose
verbose
verbose
verbose
verbose
</pre>
<p>Next we need to setup an incoming queue so that we can use dput to get the source packages into reprepro,<br />
vi /srv/reprepro/conf/incoming</p>
<pre>
Name: incoming
IncomingDir: incoming
Allow: hardy intrepid jaunty
Cleanup: on_deny on_error
Tempdir: incomingtmp
</pre>
<p>The repository is now ready to go. So now we can setup apache. Edit /etc/apache/sites-enabled/pppa</p>

<div class="wp_syntax"><div class="code"><pre class="apache" style="font-family:monospace;">&lt;<span style="color: #000000; font-weight:bold;">virtualhost</span> *:<span style="color: #ff0000;">80</span>&gt;
    <span style="color: #00007f;">ServerName</span> packages.inodes.org
    <span style="color: #00007f;">DocumentRoot</span> /srv/reprepro
&lt;/<span style="color: #000000; font-weight:bold;">virtualhost</span>&gt;</pre></div></div>

<p>and we should also configure our sources.list to use these repositories, edit /etc/apt/sources.list</p>
<pre>
# Sources for rebuildd
deb-src http://packages.inodes.org hardy main
deb-src http://packages.inodes.org intrepid main
deb-src http://packages.inodes.org jaunty main
</pre>
<p>Next we want to setup our dput.cf to make the magic happen to get the source packages into the archive, edit ~/.dput.cf</p>
<pre>
[DEFAULT]
default_host_main = notspecified

[local]
fqdn = localhost
method = local
incoming = /srv/reprepro/incoming
allow_unsigned_uploads = 0
run_dinstall = 0
post_upload_command = reprepro -V -b /srv/reprepro processincoming incoming
</pre>
<p>So now we can do the following</p>
<pre>
apt-get source squid3
cd squid3*
dch -i # increment version number
dpkg-buildpackage -sa -S
cd ..
dput local *changes
aptitude update
apt-get source squid3
</pre>
<p>So when you run dput, first it copies the source package files to /srv/reprepro/incoming and then it gets reprepro to process it&#8217;s incoming queue. This means that the source package is now sitting in the repository.<br />
So the second apt-get source should have downloaded the source package from our local repository which is exactly what rebuildd will do before it tries to build it.</p>
<p>Next step is to setup rebuildd so that it builds the binary packages and installs them into the repository.</p>
<pre>
aptitude install rebuildd
</pre>
<p>Setup so it runs out of init.d and the releases we care about, edit /etc/default/rebuildd</p>
<pre>
START_REBUILDD=1
START_REBUILDD_HTTPD=1
DISTS="hardy intrepid jaunty"
</pre>
<p>Now when a source package is uploaded into the repository we want to kick off rebuildd to build the package. We can do this through the reprepro log hooks. You&#8217;ll notice in the conf/distributions above the following lines.</p>
<pre>
Log: logfile
  --changes /srv/reprepro/bin/build_sources
</pre>
<p>This script will be run any time a .changes file is added to the repository. Create /srv/reprepro/bin/build_sources</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">action</span>=$<span style="color: #000000;">1</span>
<span style="color: #007800;">release</span>=$<span style="color: #000000;">2</span>
<span style="color: #007800;">package</span>=$<span style="color: #000000;">3</span>
<span style="color: #007800;">version</span>=$<span style="color: #000000;">4</span>
<span style="color: #007800;">changes_file</span>=$<span style="color: #000000;">5</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Only care about packages being added</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$action</span>&quot;</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #ff0000;">&quot;accepted&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Only care about source packages</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$changes_file</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-q</span> _source.changes
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #007800;">$?</span> = <span style="color: #000000;">1</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">0</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Kick off the job</span>
<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;<span style="color: #007800;">$package</span> <span style="color: #007800;">$version</span> 1 <span style="color: #007800;">$release</span>&quot;</span>  <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sudo</span> rebuildd-job add</pre></div></div>

<p>This script basically checks the right type of package is being added. Then it calls <strong>rebuildd-job</strong> to ask for that specific package and version to be built for that Ubuntu release.</p>
<p>Now the first thing that rebuildd does is download the source for the package. However we need to update the sources first since our server doesn&#8217;t know there are new files in the repository yet. So edit /etc/rebuildd/rebuilddrv an change</p>
<pre>
apt-get -q --download-only -t ${d} source ${p}=${v}
</pre>
<p>to</p>
<pre>
source_cmd = /srv/reprepro/bin/get_sources ${d} ${p} ${v}
</pre>
<p>and create /srv/reprepro/bin/get_sources with</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">d</span>=$<span style="color: #000000;">1</span>
<span style="color: #007800;">p</span>=$<span style="color: #000000;">2</span>
<span style="color: #007800;">v</span>=$<span style="color: #000000;">3</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">sudo</span> <span style="color: #c20cb9; font-weight: bold;">aptitude</span> update <span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null
<span style="color: #c20cb9; font-weight: bold;">apt-get</span> <span style="color: #660033;">-q</span> <span style="color: #660033;">--download-only</span> <span style="color: #660033;">-t</span> <span style="color: #800000;">${d}</span> <span style="color: #7a0874; font-weight: bold;">source</span> <span style="color: #800000;">${p}</span>=<span style="color: #800000;">${v}</span></pre></div></div>

<p>By this stage we have rebuildd building packages but we need to make sure they get re-injected back into the repository. We can do this with a post script. Edit /etc/rebuildd/rebuilddrc</p>
<pre>
post_build_cmd = /srv/reprepro/bin/upload_binaries ${d} ${p} ${v} ${a}
</pre>
<p>and create /srv/reprepro/bin/upload_binaries</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #007800;">d</span>=$<span style="color: #000000;">1</span>
<span style="color: #007800;">p</span>=$<span style="color: #000000;">2</span>
<span style="color: #007800;">v</span>=$<span style="color: #000000;">3</span>
<span style="color: #007800;">a</span>=$<span style="color: #000000;">4</span>
&nbsp;
<span style="color: #c20cb9; font-weight: bold;">su</span> <span style="color: #660033;">-l</span> <span style="color: #660033;">-c</span> <span style="color: #ff0000;">&quot;reprepro -V -b /srv/reprepro include <span style="color: #007800;">${d}</span> /var/cache/pbuilder/result/<span style="color: #007800;">${p}</span>_<span style="color: #007800;">${v}</span>_<span style="color: #007800;">${a}</span>.changes&quot;</span> johnf</pre></div></div>

<p>Now the su is in there because rebuildd needs to be able to access the GPG passphrase to sign the repository with. So rather than have a passphrase-less key we make sure that gpg-agent is running by adding the following to your .profile.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">test</span> <span style="color: #660033;">-f</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.gpg-agent-info <span style="color: #000000; font-weight: bold;">&amp;&amp;</span>    <span style="color: #c20cb9; font-weight: bold;">kill</span> <span style="color: #660033;">-0</span> <span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cut</span> -d: <span style="color: #660033;">-f</span> <span style="color: #000000;">2</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.gpg-agent-info<span style="color: #000000; font-weight: bold;">`</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null; <span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #007800;">GPG_AGENT_INFO</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">cat</span> <span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.gpg-agent-info<span style="color: #000000; font-weight: bold;">`</span>
	<span style="color: #7a0874; font-weight: bold;">export</span> GPG_AGENT_INFO
<span style="color: #000000; font-weight: bold;">else</span>
	<span style="color: #7a0874; font-weight: bold;">eval</span> <span style="color: #000000; font-weight: bold;">`</span>gpg-agent --daemon<span style="color: #000000; font-weight: bold;">`</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #007800;">$GPG_AGENT_INFO</span> <span style="color: #000000; font-weight: bold;">&gt;</span><span style="color: #007800;">$HOME</span><span style="color: #000000; font-weight: bold;">/</span>.gpg-agent-info
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #007800;">GPG_TTY</span>=<span style="color: #000000; font-weight: bold;">`</span>tty<span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #7a0874; font-weight: bold;">export</span> GPG_TTY</pre></div></div>

<p>So that&#8217;s it you now have your own personal PPA. Just in case you had fallen asleep. Here is a little script I wrote so you can auto build the source packages for each release you care about in one go.</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;">#!/bin/bash</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">set</span> <span style="color: #660033;">-e</span>
&nbsp;
<span style="color: #007800;">RELEASES</span>=<span style="color: #ff0000;">&quot;hardy intrepid jaunty&quot;</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">!</span> <span style="color: #660033;">-f</span> debian<span style="color: #000000; font-weight: bold;">/</span>changelog <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;This isn't a debian repo&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #666666; font-style: italic;"># Check for changes</span>
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #000000; font-weight: bold;">`</span>bzr st <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">wc</span> -l<span style="color: #000000; font-weight: bold;">`</span> <span style="color: #000000; font-weight: bold;">!</span>= <span style="color: #ff0000;">&quot;0&quot;</span> <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;You have uncommitted changes!&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">if</span> <span style="color: #7a0874; font-weight: bold;">&#91;</span> <span style="color: #660033;">-d</span> ..<span style="color: #000000; font-weight: bold;">/</span>tmpbuild <span style="color: #7a0874; font-weight: bold;">&#93;</span>
<span style="color: #000000; font-weight: bold;">then</span>
	<span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;The tmpbuild dir exists&quot;</span>
	<span style="color: #7a0874; font-weight: bold;">exit</span> <span style="color: #000000;">1</span>
<span style="color: #000000; font-weight: bold;">fi</span>
&nbsp;
bzr <span style="color: #7a0874; font-weight: bold;">export</span> ..<span style="color: #000000; font-weight: bold;">/</span>tmpbuild
<span style="color: #c20cb9; font-weight: bold;">cp</span> debian<span style="color: #000000; font-weight: bold;">/</span>changelog ..<span style="color: #000000; font-weight: bold;">/</span>tmpbuild.changelog
<span style="color: #7a0874; font-weight: bold;">cd</span> ..<span style="color: #000000; font-weight: bold;">/</span>tmpbuild
&nbsp;
<span style="color: #007800;">PACKAGE</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-1</span> debian<span style="color: #000000; font-weight: bold;">/</span>changelog <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $1}'</span><span style="color: #000000; font-weight: bold;">`</span>
<span style="color: #007800;">VERSION</span>=<span style="color: #000000; font-weight: bold;">`</span><span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-1</span> debian<span style="color: #000000; font-weight: bold;">/</span>changelog <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">awk</span> <span style="color: #ff0000;">'{print $2}'</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/^\(//;s/\)$//'</span><span style="color: #000000; font-weight: bold;">`</span>
&nbsp;
<span style="color: #000000; font-weight: bold;">for</span> release <span style="color: #000000; font-weight: bold;">in</span> <span style="color: #007800;">$RELEASES</span>
<span style="color: #000000; font-weight: bold;">do</span>
&nbsp;
	<span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-r</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">&quot;1s/\) [^;]+; /~<span style="color: #007800;">${release}</span>) <span style="color: #007800;">${release}</span>; /&quot;</span> ..<span style="color: #000000; font-weight: bold;">/</span>tmpbuild.changelog <span style="color: #000000; font-weight: bold;">&gt;</span> debian<span style="color: #000000; font-weight: bold;">/</span>changelog 
	<span style="color: #c20cb9; font-weight: bold;">head</span> <span style="color: #660033;">-1</span> debian<span style="color: #000000; font-weight: bold;">/</span>changelog
	dpkg-buildpackage <span style="color: #660033;">-S</span> <span style="color: #660033;">-sa</span>
	dput <span style="color: #7a0874; font-weight: bold;">local</span> ..<span style="color: #000000; font-weight: bold;">/</span><span style="color: #800000;">${PACKAGE}</span>_<span style="color: #800000;">${VERSION}</span>~<span style="color: #800000;">${release}</span>_source.changes
<span style="color: #000000; font-weight: bold;">done</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">cd</span> ..
<span style="color: #c20cb9; font-weight: bold;">rm</span> <span style="color: #660033;">-rf</span> tmpbuild</pre></div></div>

<p>So the above documentation is a bit of a brain dump on what I&#8217;ve been working on for the past 2 days and I&#8217;m sure I&#8217;ve left some bits out. So please give me any feedback you have in the comments.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/09/14/building-a-private-ppa-on-ubuntu/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Linux Australia SysAdmin Day Gift</title>
		<link>http://inodes.org/2009/08/01/linux-australia-sysadmin-day-gift/</link>
		<comments>http://inodes.org/2009/08/01/linux-australia-sysadmin-day-gift/#comments</comments>
		<pubDate>Sat, 01 Aug 2009 10:19:20 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[Sysadmin]]></category>
		<category><![CDATA[la]]></category>
		<category><![CDATA[linux australia]]></category>
		<category><![CDATA[sysadminday]]></category>
		<category><![CDATA[thinkgeek]]></category>

		<guid isPermaLink="false">http://inodes.org/blog/?p=153</guid>
		<description><![CDATA[I would like to send out a big thank you to the Linux Australia Council. As I&#8217;m sure you all know yesterday was System Administrator Appreciation Day. The Council decided to send me a ThinkGeek gift certificate in appreciation for my work as an LA Admin.
After hours of searching I finally decided on the USB [...]]]></description>
			<content:encoded><![CDATA[<p>I would like to send out a big thank you to the <a href="http://linux.org.au/About/Council">Linux Australia Council</a>. As I&#8217;m sure you all know yesterday was <a href="http://sysadminday.com">System Administrator Appreciation Day</a>. The Council decided to send me a <a href="http://thinkgeek.com">ThinkGeek</a> gift certificate in appreciation for my work as an LA Admin.</p>
<p>After hours of searching I finally decided on the <a href="http://www.thinkgeek.com/computing/usb-gadgets/a7ea/">USB SATA Drive Dock</a> <img src='http://inodes.org/wp-includes/images/smilies/icon_smile.gif' alt=':)' class='wp-smiley' /> .</p>
<p><img alt="" src="http://www.thinkgeek.com/images/products/front/a7ea_sata_dual_drive-dock.jpg" title="SATA Dual Drive Dock" class="alignnone" width="220" height="230" /></p>
<p>Again a big thank you to the LA council and to Steve Walsh for organising the gift certificate.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/08/01/linux-australia-sysadmin-day-gift/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Changing the type on a legacy table in ActiveRecord</title>
		<link>http://inodes.org/2009/07/14/changing-the-type-on-a-legacy-table-in-activerecord/</link>
		<comments>http://inodes.org/2009/07/14/changing-the-type-on-a-legacy-table-in-activerecord/#comments</comments>
		<pubDate>Tue, 14 Jul 2009 03:04:40 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[Programming]]></category>

		<guid isPermaLink="false">http://inodes.org/blog/?p=150</guid>
		<description><![CDATA[I&#8217;m doing some work for a client which involves extracting some data from a legacy database and displaying it in a web interface. One of the fields in the table is the number of megabytes included in the quota. For some crazy reason this is defined as follows:

CREATE TABLE quota &#40;
  bandwidth_in_included DECIMAL&#40;8,2&#41;
&#41;;

This means [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m doing some work for a client which involves extracting some data from a legacy database and displaying it in a web interface. One of the fields in the table is the number of megabytes included in the quota. For some crazy reason this is defined as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="mysql" style="font-family:monospace;"><span style="color: #990099; font-weight: bold;">CREATE</span> <span style="color: #990099; font-weight: bold;">TABLE</span> quota <span style="color: #FF00FF;">&#40;</span>
  bandwidth_in_included <span style="color: #999900; font-weight: bold;">DECIMAL</span><span style="color: #FF00FF;">&#40;</span><span style="color: #008080;">8</span><span style="color: #000033;">,</span><span style="color: #008080;">2</span><span style="color: #FF00FF;">&#41;</span>
<span style="color: #FF00FF;">&#41;</span><span style="color: #000033;">;</span></pre></div></div>

<p>This means that in the web interface I get <strong>10,000.0 MB</strong> instead of <strong>10,000 MB</strong>. Notice the decimal point. Also I wanted bytes rather than MB since the legacy app was a bit all over the place in this regard.</p>
<p>My first solution was to simple create a virtual attribute in the model to override the type.</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Quota <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># We need it as an int and in bytes</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> bandwidth_in_included
    attributes<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'bandwidth_in_included].to_i * 1000
  end
&nbsp;
end</span></pre></div></div>

<p>This worked great except that I&#8217;m actually rendering the data to XML to be accessed over a REST service so this was generating XML elements like</p>
</pre>

<div class="wp_syntax"><div class="code"><pre class="xml" style="font-family:monospace;"><span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;bandwidth_in_included</span> <span style="color: #000066;">type</span>=<span style="color: #ff0000;">&quot;BigDecimal&quot;</span><span style="color: #000000; font-weight: bold;">&gt;</span></span>10000<span style="color: #009900;"><span style="color: #000000; font-weight: bold;">&lt;/bandwidth_in_included<span style="color: #000000; font-weight: bold;">&gt;</span></span></span></pre></div></div>

<p>Eventually I discovered that you can tell ActiveRecord to override the type, so I ended up with</p>

<div class="wp_syntax"><div class="code"><pre class="rails" style="font-family:monospace;"><span style="color:#9966CC; font-weight:bold;">class</span> Quota <span style="color:#006600; font-weight:bold;">&lt;</span> <span style="color:#6666ff; font-weight:bold;">ActiveRecord::Base</span>
&nbsp;
  <span style="color:#008000; font-style:italic;"># We want to treat the bandwidth_included a an integer</span>
  <span style="color:#9966CC; font-weight:bold;">class</span> <span style="color:#006600; font-weight:bold;">&lt;&lt;</span> columns_hash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'bandwidth_in_included'</span><span style="color:#006600; font-weight:bold;">&#93;</span>
    <span style="color:#9966CC; font-weight:bold;">def</span> type
      <span style="color:#ff3333; font-weight:bold;">:integer</span>
    <span style="color:#9966CC; font-weight:bold;">end</span> 
  <span style="color:#9966CC; font-weight:bold;">end</span> 
&nbsp;
  <span style="color:#008000; font-style:italic;"># We need it as an int and in bytes</span>
  <span style="color:#9966CC; font-weight:bold;">def</span> bandwidth_in_included
    attributes<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'bandwidth_in_included].to_i * 1000
  end
&nbsp;
end</span></pre></div></div>

</pre>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/07/14/changing-the-type-on-a-legacy-table-in-activerecord/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>CruiseControl.rb and Bazaar</title>
		<link>http://inodes.org/2009/05/22/cruisecontrolrb-and-bazaar/</link>
		<comments>http://inodes.org/2009/05/22/cruisecontrolrb-and-bazaar/#comments</comments>
		<pubDate>Fri, 22 May 2009 12:05:30 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[bzr]]></category>
		<category><![CDATA[cruisecontrol]]></category>
		<category><![CDATA[patch]]></category>

		<guid isPermaLink="false">http://inodes.org/blog/?p=139</guid>
		<description><![CDATA[Today I was investigating Continuous Integration solutions for rails projects. In the end I ended up settling on CruiseControl.rb mainly because it&#8217;s a rails app and most of the others where Java based.
The only problem is that CruiseControl.rb doesn&#8217;t currently support Bazaar, in fact the released version only supports SVN while the development version supports [...]]]></description>
			<content:encoded><![CDATA[<p>Today I was investigating Continuous Integration solutions for rails projects. In the end I ended up settling on <a title="CruiseControl.rb homepage" href="http://cruisecontrolrb.thoughtworks.com/">CruiseControl.rb</a> mainly because it&#8217;s a rails app and most of the others where Java based.</p>
<p>The only problem is that CruiseControl.rb doesn&#8217;t currently support <a href="http://bazaar-vcs.org">Bazaar</a>, in fact the released version only supports SVN while the development version supports Git and Mercurual.</p>
<p>Anyway after a couple of hours of hacking I came up with the following <a href="http://inodes.org/blog/wp-content/uploads/2009/05/bazaar_scm.patch">patch</a> which I&#8217;ve filed as a <a href="https://cruisecontrolrb.lighthouseapp.com/projects/9150/tickets/236-add-bazaar-support#ticket-236-1">bug</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/05/22/cruisecontrolrb-and-bazaar/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Launchpad PPA builder status</title>
		<link>http://inodes.org/2009/04/16/launchpad-ppa-builder-status/</link>
		<comments>http://inodes.org/2009/04/16/launchpad-ppa-builder-status/#comments</comments>
		<pubDate>Thu, 16 Apr 2009 05:55:40 +0000</pubDate>
		<dc:creator>johnf</dc:creator>
				<category><![CDATA[FOSS]]></category>
		<category><![CDATA[build]]></category>
		<category><![CDATA[launchpad]]></category>
		<category><![CDATA[ppa]]></category>

		<guid isPermaLink="false">http://inodes.org/blog/?p=135</guid>
		<description><![CDATA[I uploaded some packages to my Launchpad PPA today. Normally they would build in not less than 20 minutes, however 2 hours later I was still waiting. All my googling for a build bot status page led to nothing useful. wgrant on #launchpad pointed me at https://launchpad.net/builders/ which I though I would note here to [...]]]></description>
			<content:encoded><![CDATA[<p>I uploaded some packages to my Launchpad PPA today. Normally they would build in not less than 20 minutes, however 2 hours later I was still waiting. All my googling for a build bot status page led to nothing useful. <em>wgrant</em> on #launchpad pointed me at <a href="https://launchpad.net/builders/">https://launchpad.net/builders/</a> which I though I would note here to help others.</p>
]]></content:encoded>
			<wfw:commentRss>http://inodes.org/2009/04/16/launchpad-ppa-builder-status/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>
