<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2titles.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemtitles.css"?><rss 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/" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Clever::Tagline::Pending</title>
	
	<link>http://www.practicalguile.com</link>
	<description />
	<lastBuildDate>Wed, 14 Jul 2010 00:00:00 PDT</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/practicalguile" /><feedburner:info uri="practicalguile" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><image><link>http://creativecommons.org/licenses/by-nd/2.0/</link><url>http://creativecommons.org/images/public/somerights20.gif</url><title>Some Rights Reserved</title></image><xhtml:meta xmlns:xhtml="http://www.w3.org/1999/xhtml" name="robots" content="noindex" /><feedburner:emailServiceId>practicalguile</feedburner:emailServiceId><feedburner:feedburnerHostname>http://feedburner.google.com</feedburner:feedburnerHostname><item><title>Links for 2010-07-13 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/vuejtQEwyaQ/bianster</link><pubDate>Wed, 14 Jul 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2010-07-13</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="https://www.wikinvest.com/"&gt;Wikinvest Logo - Investing wiki with research about companies, investment concepts, market share, competitors, and more...&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/vuejtQEwyaQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2010-07-13</feedburner:origLink></item><item><title>Links for 2010-06-23 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/axKaC1HT9rU/bianster</link><pubDate>Thu, 24 Jun 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2010-06-23</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.varlena.com/GeneralBits/Tidbits/annotated_conf_e.html"&gt;http://www.varlena.com/GeneralBits/Tidbits/annotated_conf_e.html&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.varlena.com/GeneralBits/Tidbits/perf.html"&gt;Tuning PostgreSQL for performance&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://archives.postgresql.org/pgsql-hackers/2008-11/msg00919.php"&gt;Re: Simple postgresql.conf wizard&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/axKaC1HT9rU" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2010-06-23</feedburner:origLink></item><item><title>Links for 2010-05-16 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/hyubIoYKtLQ/bianster</link><pubDate>Mon, 17 May 2010 00:00:00 PDT</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2010-05-16</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.adwhirl.com/home/dev"&gt;AdWhirl&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="https://developer.mobclix.com/auth/login"&gt;Mobclix&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/hyubIoYKtLQ" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2010-05-16</feedburner:origLink></item><item><title>Links for 2010-01-10 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/WuMj-t7FnJ8/bianster</link><pubDate>Mon, 11 Jan 2010 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2010-01-10</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://techielobang.com/blog/2010/01/10/official-google-nexus-one-solution-for-singapore-users/"&gt;Official Google Nexus One Solution for Singapore Users&amp;nbsp;|&amp;nbsp;TechieLobang &amp;ndash; News, Tips &amp;amp; Tricks&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/WuMj-t7FnJ8" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2010-01-10</feedburner:origLink></item><item><title>Links for 2009-12-25 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/0YfdmCABz_Y/bianster</link><pubDate>Sat, 26 Dec 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2009-12-25</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://developer.android.com/guide/index.html"&gt;The Developer's Guide | Android Developers&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/0YfdmCABz_Y" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2009-12-25</feedburner:origLink></item><item><title>Links for 2009-12-23 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/eHY-dcGZ_WY/bianster</link><pubDate>Thu, 24 Dec 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2009-12-23</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.cs.umd.edu/projects/PL/multithreadedtc/index.html"&gt;MultithreadedTC - for testing concurrent Java applications - Dept. of Computer Science, UMD&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/eHY-dcGZ_WY" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2009-12-23</feedburner:origLink></item><item><title>Links for 2009-11-10 [del.icio.us]</title><link>http://feedproxy.google.com/~r/practicalguile/~3/-LbnrYnJD2w/bianster</link><pubDate>Wed, 11 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/bianster#2009-11-10</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.gamingnewslink.com/2009/11/10/fixing-call-of-duty-modern-warfare-2-errors-freezes-crashes-and-install-problems/"&gt;Fixing Call of Duty Modern Warfare 2 errors, freezes, crashes and install problems | Gaming News Link&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/practicalguile/~4/-LbnrYnJD2w" height="1" width="1"/&gt;</description><feedburner:origLink>http://del.icio.us/bianster#2009-11-10</feedburner:origLink></item><item>
		<title>libxml2 for Nokogiri in JRuby</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/v8zOd9oVDd8/</link>
		<comments>http://www.practicalguile.com/2009/06/07/libxml2-for-nokogiri-in-jruby/#comments</comments>
		<pubDate>Sun, 07 Jun 2009 13:01:55 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[JRuby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/?p=88</guid>
		<description><![CDATA[I&#8217;ve been playing with Nokogiri on JRuby 1.3.0 and this message gets displayed when I require &#8216;nokogiri&#8217;:

macbookpro:~ douglas$ jirb
irb(main):001:0&#62; require 'rubygems'
=&#62; true
irb(main):002:0&#62; require 'nokogiri'
HI.  You're using libxml2 version 2.6.16 which is over 4 years old and has
plenty of bugs.  We suggest that for maximum HTML/XML parsing pleasure, you
upgrade your version of libxml2 and [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been playing with <a title="Nokogiri" href="http://nokogiri.rubyforge.org/">Nokogiri</a> on <a title="JRuby" href="http://jruby.codehaus.org/">JRuby 1.3.0</a> and this message gets displayed when I require &#8216;nokogiri&#8217;:</p>
<p><code><br />
macbookpro:~ douglas$ jirb<br />
irb(main):001:0&gt; require 'rubygems'<br />
=&gt; true<br />
irb(main):002:0&gt; require 'nokogiri'<br />
HI.  You're using libxml2 version 2.6.16 which is over 4 years old and has<br />
plenty of bugs.  We suggest that for maximum HTML/XML parsing pleasure, you<br />
upgrade your version of libxml2 and re-install nokogiri.  If you like using<br />
libxml2 version 2.6.16, but don't like this warning, please define the constant<br />
I_KNOW_I_AM_USING_AN_OLD_AND_BUGGY_VERSION_OF_LIBXML2 before requring nokogiri.<br />
=&gt; true<br />
</code></p>
<p>That can&#8217;t be, I&#8217;ve just upgraded libxml2 and libxslt in my MacPorts installation. Digging further, I don&#8217;t receive the message when doing the same thing on MRI. A quick look with lsof reveals that the shared libraries are being loaded from <strong>/usr/lib</strong> instead of <strong>/opt/local/lib</strong> (MacPorts is installed into <strong>/opt/local</strong>).</p>
<p><code><br />
<strong> lsof -c java</strong><br />
----omitted----<br />
java    390 douglas  txt    REG      14,2    290736    898139 /usr/lib/libexslt.0.dylib<br />
----omitted----</p>
<p><strong>lsof -c ruby</strong><br />
----omitted----<br />
ruby    865 douglas  txt    REG   14,2     72156   1871557 /opt/local/lib/libexslt.0.8.13.dylib<br />
ruby    865 douglas  txt    REG   14,2    218688   1871571 /opt/local/lib/libxslt.1.1.24.dylib<br />
ruby    865 douglas  txt    REG   14,2   1251948   1866501 /opt/local/lib/libxml2.2.7.3.dylib<br />
----omitted----<br />
</code></p>
<p>Nokogiri uses Ruby FFI to dynamically load native C code and FFI makes use of <strong>dlopen</strong> to do the actual loading of dynamic libraries. On OSX, dlopen searches for files specified by a couple of environment variables (<strong>LD_LIBRARY_PATH</strong>, <strong>DYLD_LIBRARY_PATH</strong>, <strong>DYLD_FALLBACK_LIBRARY_PATH</strong>), and the current working directory.</p>
<p>Setting <strong>LD_LIBRARY_PATH</strong> to <strong>/opt/local/lib</strong> worked for me. There may be differences in the environment variables used for <strong>dlopen</strong> on different platforms, so a look at the MAN pages would be a good idea if things don&#8217;t seem to work.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/nakw8VmCSoq3wsz5Dw4EDgpI6HY/0/da"><img src="http://feedads.g.doubleclick.net/~a/nakw8VmCSoq3wsz5Dw4EDgpI6HY/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/nakw8VmCSoq3wsz5Dw4EDgpI6HY/1/da"><img src="http://feedads.g.doubleclick.net/~a/nakw8VmCSoq3wsz5Dw4EDgpI6HY/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/practicalguile?a=v8zOd9oVDd8:PyhXlAEHc1o:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/practicalguile?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/practicalguile?a=v8zOd9oVDd8:PyhXlAEHc1o:dnMXMwOfBR0"><img src="http://feeds.feedburner.com/~ff/practicalguile?d=dnMXMwOfBR0" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/practicalguile?a=v8zOd9oVDd8:PyhXlAEHc1o:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/practicalguile?i=v8zOd9oVDd8:PyhXlAEHc1o:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/practicalguile?a=v8zOd9oVDd8:PyhXlAEHc1o:qj6IDK7rITs"><img src="http://feeds.feedburner.com/~ff/practicalguile?d=qj6IDK7rITs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/practicalguile?a=v8zOd9oVDd8:PyhXlAEHc1o:gIN9vFwOqvQ"><img src="http://feeds.feedburner.com/~ff/practicalguile?i=v8zOd9oVDd8:PyhXlAEHc1o:gIN9vFwOqvQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/practicalguile?a=v8zOd9oVDd8:PyhXlAEHc1o:TzevzKxY174"><img src="http://feeds.feedburner.com/~ff/practicalguile?d=TzevzKxY174" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/v8zOd9oVDd8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2009/06/07/libxml2-for-nokogiri-in-jruby/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2009/06/07/libxml2-for-nokogiri-in-jruby/</feedburner:origLink></item>
		<item>
		<title>Using soap4r with .NET web services authenticated with WSSE</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/6K4-BYAbxIQ/</link>
		<comments>http://www.practicalguile.com/2008/08/22/using-soap4r-with-net-web-services-authenticated-with-wsse/#comments</comments>
		<pubDate>Fri, 22 Aug 2008 03:52:03 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/?p=80</guid>
		<description><![CDATA[Recently I had to consume a .NET web service that uses WSSE based authentication.  Thanks to the intarweb, I was able to get started with soap4r and insert WSSE authentication headers into my SOAP requests.The samples available on the tracker are also quite comprehensive, other than being light on explanation.
I did encounter an error [...]]]></description>
			<content:encoded><![CDATA[<p>Recently I had to consume a .NET web service that uses WSSE based authentication.  Thanks to the intarweb, I was able to <a href="http://markthomas.org/2007/09/12/getting-started-with-soap4r/">get started with soap4r</a> and <a href="http://willcannings.wordpress.com/2008/07/06/wsse-authentication-in-ruby-soap4r/">insert WSSE authentication headers</a> into my SOAP requests.The <a href="http://dev.ctor.org/doc/soap4r/RELEASE_en.html#samples">samples</a> available on the <a href="http://dev.ctor.org/soap4r">tracker</a> are also quite comprehensive, other than being light on explanation.</p>
<p>I did encounter an error when using the automatically generated client application:<br />
<code><br />
ruby WSDLService_PortClient.rb<br />
./defaultMappingRegistry.rb:5: uninitialized constant SOAP::Mapping::EncodedRegistry (NameError) 	from ./defaultDriver.rb:2:in `require'<br />
from ./defaultDriver.rb:2<br />
from ./WSDLService_PortClient.rb:2:in `require'<br />
from ./WSDLService_PortClient</code>.rb:2</p>
<p>It appears that the soap library provided with Ruby 1.8.6 is being used instead of the soap4r gem. The version bundled with Ruby doesn&#8217;t have some classes referenced by the generated stubs (from wsdl2ruby) as well as a bunch of other functionality.</p>
<p>The solution is simple (after knowing what&#8217;s wrong of course): explicitly reference the gem so that Ruby knows which one to use.<br />
<code><br />
require 'rubygems'<br />
gem 'soap4r'<br />
</code><br />
Just insert this snippet before the code that references the missing classes and you&#8217;re good to go.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/HiSwBeS-FLYGkuc76N1gyl9VhRk/0/da"><img src="http://feedads.g.doubleclick.net/~a/HiSwBeS-FLYGkuc76N1gyl9VhRk/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/HiSwBeS-FLYGkuc76N1gyl9VhRk/1/da"><img src="http://feedads.g.doubleclick.net/~a/HiSwBeS-FLYGkuc76N1gyl9VhRk/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=PhCiNMh0"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=uNyQna2Y"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=UpSVwrzy"><img src="http://feeds.feedburner.com/~f/practicalguile?i=UpSVwrzy" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=mWVROnfj"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=fXvEqhBb"><img src="http://feeds.feedburner.com/~f/practicalguile?i=fXvEqhBb" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=pw7zt10e"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/6K4-BYAbxIQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2008/08/22/using-soap4r-with-net-web-services-authenticated-with-wsse/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2008/08/22/using-soap4r-with-net-web-services-authenticated-with-wsse/</feedburner:origLink></item>
		<item>
		<title>currency-convertor gem on github.com</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/VeXFKiRZ9HM/</link>
		<comments>http://www.practicalguile.com/2008/08/15/currency-convertor-gem-on-githubcom/#comments</comments>
		<pubDate>Fri, 15 Aug 2008 07:38:51 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/?p=79</guid>
		<description><![CDATA[I took a moment to extract some code that&#8217;s being used at work for getting exchange rates between 2 currencies into a simple gem called bianster-currency-convertor at github.com.
If you haven&#8217;t already added the gem repository at github.com, do take a look at the concise instructions before trying to install the gem.
Sample Usage

&#62;&#62; require 'currency_convertor'
=&#62; true
&#62;&#62; [...]]]></description>
			<content:encoded><![CDATA[<p>I took a moment to extract some code that&#8217;s being used at work for getting exchange rates between 2 currencies into a simple gem called <a href="https://github.com/bianster/currency-convertor/tree">bianster-currency-convertor</a> at <a title="Social Code Hosting" href="http://github.com">github.com</a>.</p>
<p>If you haven&#8217;t already added the gem repository at <a title="Social Code Hosting" href="http://github.com">github.com</a>, do take a look at the concise <a href="http://gems.github.com/list.html">instructions</a> before trying to install the gem.</p>
<p>Sample Usage<br />
<code><br />
&gt;&gt; require 'currency_convertor'<br />
=&gt; true<br />
&gt;&gt; CurrencyConvertor.lookup('USD', 'SGD')<br />
=&gt; 1.4165<br />
</code></p>

<p><a href="http://feedads.g.doubleclick.net/~a/3hgm5eMPtvyTPwXhEEDva0ejKUE/0/da"><img src="http://feedads.g.doubleclick.net/~a/3hgm5eMPtvyTPwXhEEDva0ejKUE/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/3hgm5eMPtvyTPwXhEEDva0ejKUE/1/da"><img src="http://feedads.g.doubleclick.net/~a/3hgm5eMPtvyTPwXhEEDva0ejKUE/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=wySc4Obz"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=f1ZIeJ2u"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=KpWpdTFX"><img src="http://feeds.feedburner.com/~f/practicalguile?i=KpWpdTFX" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=nYq1XPxn"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=yufpdRP0"><img src="http://feeds.feedburner.com/~f/practicalguile?i=yufpdRP0" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=WoVByrGK"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/VeXFKiRZ9HM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2008/08/15/currency-convertor-gem-on-githubcom/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2008/08/15/currency-convertor-gem-on-githubcom/</feedburner:origLink></item>
		<item>
		<title>Painless Rails Deployment</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/ez7cFhRY-oA/</link>
		<comments>http://www.practicalguile.com/2008/03/25/painless-rails-deployment/#comments</comments>
		<pubDate>Tue, 25 Mar 2008 14:31:57 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Rails]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/ruby/rails/painless-rails-deployment/</guid>
		<description><![CDATA[Remember all that joy coding with Rails when you were a wee lad? Things seemed so blissful then, metaprogramming voodoo and that complex object relational mapping stuff were all taken care of behind the scenes.
Alas, whence it doth time to unleash your brilliant social networking app onto the unsuspecting public, your Ruby/Rails world came crashing [...]]]></description>
			<content:encoded><![CDATA[<p>Remember all that joy coding with Rails when you were a wee lad? Things seemed so blissful then, metaprogramming voodoo and that complex object relational mapping stuff were all taken care of behind the scenes.</p>
<p>Alas, whence it doth time to unleash your brilliant social networking app onto the unsuspecting public, your Ruby/Rails world came crashing down faster than <a href="http://fakesteve.blogspot.com">FSJ</a> can order a chai latte.</p>
<blockquote><p>FastCGI, SCGI, Mongrel, Rack, Thin, Pound, Nginx, Apache.</p></blockquote>
<p>Doing a virgin Rails application deployment would have been a trial by fire where you&#8217;ll trawl the Ruby and Rails forums looking for advice on which webserver is best suited to serve your future web application superstar or pray to <a href="http://www.loudthinking.com">the One</a> and just deploy on faith.</p>
<p>You&#8217;ll settle for Mongrel or Rack if you were lucky enough to come across people who have been there before. Otherwise, be prepared to be regaled with war stories about how some web hosts *COUGH* Dreamhost *COUGH* arbitrarily shutdown your Rails processes for consuming a tad too much resources.</p>
<p>Wouldn&#8217;t it be nice if I could just do like what I did for PHP applications? Just upload the files onto the webserver and it just works(tm)?</p>
<p>Now you can! Well, technically only the people at <a href="http://www.phusion.nl/">Phusion</a> can at this moment. Lai Hongli <a href="http://izumi.plan99.net/blog/index.php/2008/03/20/rails-deployment-a-solved-problem-just-upload-it-works/">breaks the news</a> about <a href="http://modrails.com">modrails</a>, complete with requisite cool screencast.</p>
<p>I think this is a really cool development that makes life a whole lot simpler for people who just want to focus their energies on actual development rather than have to worry about how to configure the deployment environment properly. Even if this is Apache2 only now, it should be possible to port it over to other servers like Nginx, licence restrictions notwithholding.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/Sp5T7luM9eXBlkJA5fTxSDFfSOM/0/da"><img src="http://feedads.g.doubleclick.net/~a/Sp5T7luM9eXBlkJA5fTxSDFfSOM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/Sp5T7luM9eXBlkJA5fTxSDFfSOM/1/da"><img src="http://feedads.g.doubleclick.net/~a/Sp5T7luM9eXBlkJA5fTxSDFfSOM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=h6tiNZMU"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=l8fMikuT"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=M1OqJ5JT"><img src="http://feeds.feedburner.com/~f/practicalguile?i=M1OqJ5JT" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=LtyT6ese"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=OVdRuZRq"><img src="http://feeds.feedburner.com/~f/practicalguile?i=OVdRuZRq" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=JjOZb5dP"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/ez7cFhRY-oA" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2008/03/25/painless-rails-deployment/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2008/03/25/painless-rails-deployment/</feedburner:origLink></item>
		<item>
		<title>Specifying raising of errors in RSpec</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/jc9lCSHgdao/</link>
		<comments>http://www.practicalguile.com/2008/03/24/specifying-raising-of-errors-in-rspec/#comments</comments>
		<pubDate>Mon, 24 Mar 2008 04:20:08 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Behaviour Driven Development]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/ruby/specifying-raising-of-errors-in-rspec/</guid>
		<description><![CDATA[RSpec allows a developer to specify that an error is raised within a block with the raise_error method. It&#8217;s a nice expressive way of saying that your code should fail when it needs to.
But my tiny brain has often been confused with using it at times, more so when the error class requires parameters for [...]]]></description>
			<content:encoded><![CDATA[<p>RSpec allows a developer to specify that an error is raised within a block with the <code>raise_error</code> method. It&#8217;s a nice expressive way of saying that your code should fail when it needs to.</p>
<p>But my tiny brain has often been confused with using it at times, more so when the error class requires parameters for instantiation and when used in conjunction with the <code>and_raise</code> method on a stub or a mock</p>
<p>Consider the snippet below where my Widget depends on Thingamajig to do its funky thing in order to run. But Thingamajig is rigged to explode in a mass of funkyness and make Widget all useless.</p>
<p>[code]<br />
describe Widget do<br />
it "should re-raise errors as a Widget::UnrecoverableError" do<br />
# expectations<br />
thingamajig = stub(Thingamajig)<br />
thingamajig.should_receive(:do_funky_thing).and_raise(Thingamajig::FunkyExplosion.new('The funky thang exploded yo'))</p>
<p># our SUT<br />
widget = Widget.new(thingamajig)</p>
<p>#verification<br />
lambda { widget.run }.should raise_error(Widget::UnrecoverableError, 'The funky thang exploded yo')<br />
end<br />
end<br />
[/code]</p>
<p>Do you notice the inconsistency between the way errors are declared in the expectation and the actual verification?</p>
<p>[code]<br />
# expectations<br />
thingamajig.should_receive(:do_funky_thing).and_raise(Thingamajig::FunkyThingExplosion.new('The funky thang exploded yo'))</p>
<p>#verification<br />
lambda { widget.run }.should raise_error(Widget::UnrecoverableError, 'The funky thang exploded yo')<br />
[/code]</p>
<p>The expectation on the stub, &#8216;thingmajig&#8217; needs the exception instantiated first while verification requires the class name and parameters used to instantiate the error instance.</p>
<p>And no, doing it like this doesn&#8217;t work as expected:</p>
<p>[code]<br />
lambda { widget.run }.should raise_error(Widget::UnrecoverableError.new('The funky thang exploded yo'))<br />
[/code]</p>
<p>It&#8217;s an unfortunate impedance mismatch that might be caused due to the way Ruby handles the raising of errors.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/68u2A4_n6OPt7dcggWOOIIAB9zM/0/da"><img src="http://feedads.g.doubleclick.net/~a/68u2A4_n6OPt7dcggWOOIIAB9zM/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/68u2A4_n6OPt7dcggWOOIIAB9zM/1/da"><img src="http://feedads.g.doubleclick.net/~a/68u2A4_n6OPt7dcggWOOIIAB9zM/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=6NAVFLX4"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=w1cejhoj"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=wIbLqWoR"><img src="http://feeds.feedburner.com/~f/practicalguile?i=wIbLqWoR" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=wsD9eSX6"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=PdXL2nWD"><img src="http://feeds.feedburner.com/~f/practicalguile?i=PdXL2nWD" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=CBZIKLnD"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/jc9lCSHgdao" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2008/03/24/specifying-raising-of-errors-in-rspec/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2008/03/24/specifying-raising-of-errors-in-rspec/</feedburner:origLink></item>
		<item>
		<title>Using cruisecontrol.rb with repositories without anonymous access</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/TBYLKAYVnUs/</link>
		<comments>http://www.practicalguile.com/2008/02/02/using-cruisecontrolrb-with-repositories-without-anonymous-access/#comments</comments>
		<pubDate>Sat, 02 Feb 2008 05:09:46 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Agile]]></category>
		<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/ruby/using-cruisecontrolrb-with-repositories-without-anonymous-access/</guid>
		<description><![CDATA[I decided to use cruisecontrol.rb for continuous integration of an application that I&#8217;m working on at Bezurk. So I downloaded the 1.2.1 release from RubyForge and proceeded to add the project repository to the local installation of cruisecontrol.rb.

douglas@macbookpro:~$ ./cruise add MyProject --url http://path.to/repository --username 'douglas' --password 'guessable'
douglas@macbookpro:~$ ./cruise build MyProject
Builder for project 'MyProject' started
Logging to: [...]]]></description>
			<content:encoded><![CDATA[<p>I decided to use <a href="http://cruisecontrolrb.thoughtworks.com/" title="CruiseControl.rb">cruisecontrol.rb</a> for continuous integration of an application that I&#8217;m working on at <a href="http://bezurk.com">Bezurk</a>. So I downloaded the <a href="https://rubyforge.org/frs/?group_id=2918&amp;release_id=16096">1.2.1 release</a> from RubyForge and proceeded to add the project repository to the local installation of cruisecontrol.rb.</p>
<pre>
douglas@macbookpro:~$ ./cruise add MyProject --url http://path.to/repository --username 'douglas' --password 'guessable'
douglas@macbookpro:~$ ./cruise build MyProject
Builder for project 'MyProject' started
Logging to: /Users/douglas/Development/Ruby/cruisecontrolrb-1.2.1/log/MyProject_builder.log
Build loop failed
BuilderError: svn: PROPFIND request failed on '/svn/my_project/trunk'
./script/../config/../app/models/subversion.rb:98:in `execute_in_local_copy'
./script/../config/../lib/command_line.rb:86:in `call'
./script/../config/../lib/command_line.rb:86:in `e'
./script/../config/../lib/command_line.rb:84:in `popen'
./script/../config/../lib/command_line.rb:84:in `e'
./script/../config/../lib/command_line.rb:71:in `execute'
./script/../config/../lib/command_line.rb:70:in `chdir'
./script/../config/../lib/command_line.rb:70:in `execute'
./script/../config/../app/models/subversion.rb:89:in `execute_in_local_copy'
./script/../config/../app/models/subversion.rb:85:in `chdir'
./script/../config/../app/models/subversion.rb:85:in `execute_in_local_copy'
./script/../config/../app/models/subversion.rb:44:in `latest_revision'
./script/../config/../app/models/project.rb:228:in `new_revisions'
./script/../config/../app/models/change_in_source_control_trigger.rb:8:in `revisions_to_build'
./script/../config/../vendor/rails/actionpack/lib/../../activesupport/lib/active_support/core_ext/symbol.rb:10:in `__send__'
./script/../config/../vendor/rails/actionpack/lib/../../activesupport/lib/active_support/core_ext/symbol.rb:10:in `to_proc'
./script/../config/../app/models/project.rb:223:in `collect'
./script/../config/../app/models/project.rb:223:in `revisions_to_build'
./script/../config/../app/models/project.rb:202:in `build_if_necessary'
./script/../config/../app/models/polling_scheduler.rb:13:in `run'
./script/builder:79
./script/builder:78:in `catch'
./script/builder:78
./cruise:14:in `load'
./cruise:14:in `builder'
./cruise:68:in `send'
./cruise:68
/opt/local/lib/ruby/1.8/fileutils.rb:121:in `chdir'
/opt/local/lib/ruby/1.8/fileutils.rb:121:in `cd'
./cruise:67</pre>
<p>Hmm, what&#8217;s with the svn: PROPFIND error? Looking at the stracktrace doesn&#8217;t tell me alot about what&#8217;s going wrong here, let&#8217;s try logging errors to the console.</p>
<pre>
--SNIP--
douglas$ svn --non-interactive info --xml
douglas$ svn --non-interactive log --revision HEAD:20 --verbose --xml
svn: PROPFIND request failed on '/repository/trunk'
svn: PROPFIND of '/repository/trunk': authorization failed (http://svnhost.com)
--SNIP--</pre>
<p>It happens that my repository does not have anonymous access and requires a subversion user account to do anything useful. So it should be obvious that cruisecontrol.rb is trying to get log info from the repository but subversion is quitting with authentication errors because no user credentials are being supplied.</p>
<p>I need to have cruisecontrol.rb make use of the &#8211;username and &#8211;password options when making queries to the repository when I give it the credentials for access.</p>
<p>My first stop is the app/models/subversion.rb. Only the checkout method uses the username and password instance variables. Subversion should only include the &#8211;username and &#8211;password options when executing svn commands when both the username and password instance variables are present.</p>
<pre>[ruby]
test/unit/subversion_test.rb

def test_svn_command_uses_user_password_when_provided
	svn = Subversion.new(:username => 'jer', :password => "crap")

	svn.expects(:info).with(dummy_project).returns(Subversion::Info.new(10, 10))
	svn.expects(:execute).with(["svn", "--non-interactive", "log", "--revision", "HEAD:10", "--verbose", "--xml",
								"--username", "jer", "--password", "crap"],
								{:stderr => './svn.err'}).yields(StringIO.new(LOG_ENTRY))

	svn.latest_revision(dummy_project)
end

app/models/subversion.rb

def checkout(target_directory, revision = nil, stdout = $stdout)
	@url or raise 'URL not specified'

	options = [@url, target_directory]
	options < < "--revision" << revision_number(revision) if revision

	# need to read from command output, because otherwise tests break
	execute(svn('co', options)) do |io|
	begin
		while line = io.gets
			stdout.puts line
		end
		rescue EOFError
		end
	end
end

def svn(operation, *options)
	command = ["svn"]
	command << "--non-interactive" unless @interactive
	command << operation
	command += options.compact.flatten
	command += ['--username', @username, '--password', @password] if @username and @password
	command
end
[/ruby]</pre>
<p>The username and password would then be injected into the project's Subversion instance in the cruise_config.rb file for each project.
</pre>
<pre>[ruby]
Project.configure do |project|
    project.source_control.username = 'douglas'
    project.source_control.password = 'guessable'
end
[/ruby]</pre>
<p>I&#8217;ve submitted a <a href="http://jira.public.thoughtworks.org/browse/CCRB-170">ticket</a> along with a patch for this on cruisecontrol.rb&#8217;s tracker. Keep a lookout for it if you happen to encounter the same problem.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/WoEEq0qVNtVM9mFTAq-v9XFMdGQ/0/da"><img src="http://feedads.g.doubleclick.net/~a/WoEEq0qVNtVM9mFTAq-v9XFMdGQ/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/WoEEq0qVNtVM9mFTAq-v9XFMdGQ/1/da"><img src="http://feedads.g.doubleclick.net/~a/WoEEq0qVNtVM9mFTAq-v9XFMdGQ/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=UYQwvXlK"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=Cdm2zK0h"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=xsM0atuL"><img src="http://feeds.feedburner.com/~f/practicalguile?i=xsM0atuL" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=VBru9dnZ"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=LCMfMXV3"><img src="http://feeds.feedburner.com/~f/practicalguile?i=LCMfMXV3" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=N8BqAeNx"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/TBYLKAYVnUs" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2008/02/02/using-cruisecontrolrb-with-repositories-without-anonymous-access/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2008/02/02/using-cruisecontrolrb-with-repositories-without-anonymous-access/</feedburner:origLink></item>
		<item>
		<title>Serializing custom Ruby classes with YAML</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/xDhVTf4DPnU/</link>
		<comments>http://www.practicalguile.com/2008/01/02/serializing-custom-ruby-classes-with-yaml/#comments</comments>
		<pubDate>Wed, 02 Jan 2008 10:32:24 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/general/serializing-custom-ruby-classes-with-yaml/</guid>
		<description><![CDATA[I needed to be able to save an array of POROs (plain old Ruby objects) to the database on a Rails project that I&#8217;m currently working on. That should be easy, right?
This ought to do the job, yes?:
class MyModel &#60; ActiveRecord::Base
serialize attribute_name
end

However, this didn&#8217;t quite work as advertised, the objects being returned were typed as [...]]]></description>
			<content:encoded><![CDATA[<p>I needed to be able to save an array of POROs (plain old Ruby objects) to the database on a Rails project that I&#8217;m currently working on. That should be easy, right?</p>
<p>This ought to do the job, yes?:<code><br />
class MyModel &lt; ActiveRecord::Base<br />
serialize attribute_name<br />
end<br />
</code></p>
<p>However, this didn&#8217;t quite work as advertised, the objects being returned were typed as YAML::Object instead of the actual class being serialized. Turns out that YAML is unable to find the reference to the actual class and so its falling back to using YAML::Object as the generic class type for deserialised objects. The answer to this: Rails ticket <a href="http://dev.rubyonrails.org/ticket/7537">#7537</a>.</p>
<p>Take a look at the YAML <a href="http://yaml4r.sourceforge.net/doc/page/type_families.htm">documentation</a> for all the gory details.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/TjI-QTyGzDQHWLD-wkIN-elqY5Y/0/da"><img src="http://feedads.g.doubleclick.net/~a/TjI-QTyGzDQHWLD-wkIN-elqY5Y/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/TjI-QTyGzDQHWLD-wkIN-elqY5Y/1/da"><img src="http://feedads.g.doubleclick.net/~a/TjI-QTyGzDQHWLD-wkIN-elqY5Y/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=gEacOuK1"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=DSDF8QES"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=iMjoWJFR"><img src="http://feeds.feedburner.com/~f/practicalguile?i=iMjoWJFR" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=6GWmozv9"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=1YP9Pbbl"><img src="http://feeds.feedburner.com/~f/practicalguile?i=1YP9Pbbl" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=Epg1lBjQ"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/xDhVTf4DPnU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2008/01/02/serializing-custom-ruby-classes-with-yaml/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2008/01/02/serializing-custom-ruby-classes-with-yaml/</feedburner:origLink></item>
		<item>
		<title>Writing tests first is…?</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/eQPgn1BW_w8/</link>
		<comments>http://www.practicalguile.com/2007/12/27/writing-tests-first-is/#comments</comments>
		<pubDate>Thu, 27 Dec 2007 15:37:31 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Software Development]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/software-development/writing-tests-first-is/</guid>
		<description><![CDATA[What would you do if your co-developers say &#8220;Writing tests first is too hard/slows me down/waste of time&#8221;?

Evangelise test first development by surreptitiously providing publications on the topic
Practice it on projects and try to test infect other people.
Grow weary of going at it alone and move on.

]]></description>
			<content:encoded><![CDATA[<p>What would you do if your co-developers say &#8220;Writing tests first is too hard/slows me down/waste of time&#8221;?</p>
<ol>
<li>Evangelise test first development by surreptitiously providing publications on the topic</li>
<li>Practice it on projects and try to test infect other people.</li>
<li>Grow weary of going at it alone and <a href="http://thoughtworks.com">move</a> <a href="http://objectmentor.com/">on</a>.</li>
</ol>

<p><a href="http://feedads.g.doubleclick.net/~a/NppLsxxZjC-HImJd57W3vjnWDzw/0/da"><img src="http://feedads.g.doubleclick.net/~a/NppLsxxZjC-HImJd57W3vjnWDzw/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/NppLsxxZjC-HImJd57W3vjnWDzw/1/da"><img src="http://feedads.g.doubleclick.net/~a/NppLsxxZjC-HImJd57W3vjnWDzw/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=VdgjjZ4L"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=MZ1gUfvu"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=EWMT2Dkw"><img src="http://feeds.feedburner.com/~f/practicalguile?i=EWMT2Dkw" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=H9uczlpG"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=NbXwxHc7"><img src="http://feeds.feedburner.com/~f/practicalguile?i=NbXwxHc7" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=qeiirTv8"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/eQPgn1BW_w8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2007/12/27/writing-tests-first-is/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2007/12/27/writing-tests-first-is/</feedburner:origLink></item>
		<item>
		<title>Behaviour Driven Development != Testing</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/kJzToyXHDLE/</link>
		<comments>http://www.practicalguile.com/2007/12/23/behaviour-driven-development-testing/#comments</comments>
		<pubDate>Sun, 23 Dec 2007 04:59:00 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Behaviour Driven Development]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/software-development/behaviour-driven-development/behaviour-driven-development-testing/</guid>
		<description><![CDATA[Testing: Executing a program with the specific intent of uncovering errors.
Software Engineering: A Practitioner&#8217;s Approach &#8211; Roger S Pressman 

The definition of testing by Pressman states that the purpose of performing software testing is to detect errors in a program. This encompasses a wide range of techniques such as black box/white box testing, basis path [...]]]></description>
			<content:encoded><![CDATA[<blockquote><p>Testing: Executing a program with the specific intent of uncovering errors.</p>
<p><strong>Software Engineering: A Practitioner&#8217;s Approach &#8211; Roger S Pressman </strong></p></blockquote>
<blockquote></blockquote>
<p>The definition of testing by Pressman states that the purpose of performing software testing is to detect errors in a program. This encompasses a wide range of techniques such as black box/white box testing, basis path testing, fault based testing and at a more thorough level, control structure testing.</p>
<p>So where do the specifications in Behaviour Driven Development (BDD) fit into the picture?  In this respect, BDD isn&#8217;t about testing at all. We write specifications to say that the software exhibits a specific behaviour when its in a certain state. The specifications serve to reinforce the notion that the program is working as expected under <strong>known conditions</strong>.</p>
<p>Having 100% coverage for code certainly does not mean that a program is free of errors, there are still edge cases that may be too difficult or complex to replicate with an automated test suite. Traditional QA testing is still very much relevant to software projects with BDD employed religiously throughout development.</p>
<p>This has been <a href="http://www.agiledata.org/essays/tdd.html">discussed</a> at length before but it bears repeating: BDD is a design technique that gives you executable documentation of what functions the software is expected to provide.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/_Haey5vOriCt9sN_3TqGUmh8DVs/0/da"><img src="http://feedads.g.doubleclick.net/~a/_Haey5vOriCt9sN_3TqGUmh8DVs/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/_Haey5vOriCt9sN_3TqGUmh8DVs/1/da"><img src="http://feedads.g.doubleclick.net/~a/_Haey5vOriCt9sN_3TqGUmh8DVs/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=uIZPzxnB"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=xWwZhhzf"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=tt3snC7o"><img src="http://feeds.feedburner.com/~f/practicalguile?i=tt3snC7o" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=Hb7itrLZ"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=Bu0bc1IQ"><img src="http://feeds.feedburner.com/~f/practicalguile?i=Bu0bc1IQ" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=XezQD5Q5"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/kJzToyXHDLE" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2007/12/23/behaviour-driven-development-testing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2007/12/23/behaviour-driven-development-testing/</feedburner:origLink></item>
		<item>
		<title>Visualising Log Activity with Ruby and OpenGL with glTail</title>
		<link>http://feedproxy.google.com/~r/practicalguile/~3/WJae8_JoaTU/</link>
		<comments>http://www.practicalguile.com/2007/10/13/visualising-log-activity-with-ruby-and-opengl-with-gltail/#comments</comments>
		<pubDate>Sat, 13 Oct 2007 05:05:05 +0000</pubDate>
		<dc:creator>Doug</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://www.practicalguile.com/articles/ruby/visualising-log-activity-with-ruby-and-opengl-with-gltail/</guid>
		<description><![CDATA[Here&#8217;s an interesting combination of Ruby and OpenGL, glTail lets you visualise log activity in realtime. Check out the screencasts on the project page!
One thing to note at the time of writing, it assumes that the command for getting incoming log data, i.e &#8220;tail -f&#8221; is non blocking. So if you need to use &#8220;sudo [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s an interesting combination of Ruby and <a href="http://www.opengl.org/">OpenGL</a>, <a href="http://www.fudgie.org/">glTail</a> lets you visualise log activity in realtime. Check out the screencasts on the project page!</p>
<p>One thing to note at the time of writing, it assumes that the command for getting incoming log data, i.e &#8220;tail -f&#8221; is non blocking. So if you need to use &#8220;sudo tail -f&#8221;, the application won&#8217;t work properly for this situation. I might give it a shot at adding sudo support when I have some time to spare.</p>
<p>The quick spike I did for this suggests that I&#8217;ll need to use a shell to respond to password challenges. Incidentally, <a href="http://www.capify.org/">Capistrano</a> already has this figured out, so i&#8217;ll be a good place to look for clues.</p>

<p><a href="http://feedads.g.doubleclick.net/~a/pN4i7GLv1zHXjKPWtdi-rgZKBho/0/da"><img src="http://feedads.g.doubleclick.net/~a/pN4i7GLv1zHXjKPWtdi-rgZKBho/0/di" border="0" ismap="true"></img></a><br/>
<a href="http://feedads.g.doubleclick.net/~a/pN4i7GLv1zHXjKPWtdi-rgZKBho/1/da"><img src="http://feedads.g.doubleclick.net/~a/pN4i7GLv1zHXjKPWtdi-rgZKBho/1/di" border="0" ismap="true"></img></a></p><div class="feedflare">
<a href="http://feeds.feedburner.com/~f/practicalguile?a=xnU9i87d"><img src="http://feeds.feedburner.com/~f/practicalguile?d=41" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=fxnWGaiK"><img src="http://feeds.feedburner.com/~f/practicalguile?d=43" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=r4CPeb0n"><img src="http://feeds.feedburner.com/~f/practicalguile?i=r4CPeb0n" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=nsjfaMLl"><img src="http://feeds.feedburner.com/~f/practicalguile?d=52" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=HmYDbRAW"><img src="http://feeds.feedburner.com/~f/practicalguile?i=HmYDbRAW" border="0"></img></a> <a href="http://feeds.feedburner.com/~f/practicalguile?a=E3FrOfjp"><img src="http://feeds.feedburner.com/~f/practicalguile?d=129" border="0"></img></a>
</div><img src="http://feeds.feedburner.com/~r/practicalguile/~4/WJae8_JoaTU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://www.practicalguile.com/2007/10/13/visualising-log-activity-with-ruby-and-opengl-with-gltail/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nd/2.0/</creativeCommons:license><feedburner:origLink>http://www.practicalguile.com/2007/10/13/visualising-log-activity-with-ruby-and-opengl-with-gltail/</feedburner:origLink></item>
	</channel>
</rss>
