<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:creativeCommons="http://backend.userland.com/creativeCommonsRssModule" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Fiat Developmentum</title>
	
	<link>http://fiatdev.com</link>
	<description>Let There Be Software!</description>
	<lastBuildDate>Wed, 30 Dec 2009 00:00:00 PST</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.1</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/fiatdev" /><feedburner:info uri="fiatdev" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><geo:lat>29.601776</geo:lat><geo:long>-95.117345</geo:long><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site.</feedburner:browserFriendly><item><title>Links for 2009-12-29 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/PAA_79RQUI8/toland</link><pubDate>Wed, 30 Dec 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-12-29</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://zsh.sourceforge.net/Intro/intro_toc.html"&gt;An Introduction to the Z Shell - Table of Contents&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zsh.sourceforge.net/Guide/zshguide.html"&gt;A User's Guide to the Z-Shell&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zsh.sourceforge.net/Doc/Release/zsh.html#SEC_Top"&gt;zsh: The Z Shell Manual&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://grml.org/zsh/zsh-lovers.html"&gt;ZSH-LOVERS(1)&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://zsh.sourceforge.net/FAQ/"&gt;Z-Shell Frequently-Asked Questions&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-12-29</feedburner:origLink></item><item><title>Links for 2009-12-20 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/WDHHFwXlFDk/toland</link><pubDate>Mon, 21 Dec 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-12-20</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://friendlyorm.com/"&gt;NoSQL with MySQL in Ruby - Friendly&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-12-20</feedburner:origLink></item><item><title>Links for 2009-12-08 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/336GmQgJ1Yo/toland</link><pubDate>Wed, 09 Dec 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-12-08</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://blog.scoutapp.com/articles/2009/12/08/production-rails-tuning-with-passenger-passengermaxprocesses"&gt;Production Rails Tuning with Passenger: PassengerMaxProcesses&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-12-08</feedburner:origLink></item><item><title>Links for 2009-11-14 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/Cl0KD08CGtM/toland</link><pubDate>Sun, 15 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-11-14</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://code.google.com/p/synergy-plus/"&gt;synergy-plus -  Project Hosting on Google Code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-11-14</feedburner:origLink></item><item><title>Links for 2009-11-13 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/ZNDAyr0M544/toland</link><pubDate>Sat, 14 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-11-13</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.reviewboard.org/"&gt;Review Board | Take the pain out of reviewing code&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-11-13</feedburner:origLink></item><item><title>Links for 2009-11-12 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/XmLltRGKQgo/toland</link><pubDate>Fri, 13 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-11-12</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://golang.org/"&gt;The Go Programming Language&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-11-12</feedburner:origLink></item><item><title>Links for 2009-11-09 [del.icio.us]</title><link>http://feedproxy.google.com/~r/fiatdev/~3/P1quGMTMH0I/toland</link><pubDate>Tue, 10 Nov 2009 00:00:00 PST</pubDate><guid isPermaLink="false">http://del.icio.us/toland#2009-11-09</guid><description>&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.obsidianportal.com/"&gt;Obsidian Portal&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://diveintohtml5.org/"&gt;Dive Into HTML5&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</description><feedburner:origLink>http://del.icio.us/toland#2009-11-09</feedburner:origLink></item><item>
		<title>Extracting data from iPhone backups</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/nVSAoScFF54/extracting-data-from-iphone-backups</link>
		<comments>http://fiatdev.com/2009/09/26/extracting-data-from-iphone-backups#comments</comments>
		<pubDate>Sun, 27 Sep 2009 01:03:25 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[.mac]]></category>
		<category><![CDATA[iphone]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=258</guid>
		<description><![CDATA[I recently reset my iPhone in an attempt to clear up some weird issues I was having. It wasn&#8217;t until afterwards that I realized that I had forgotten to pull my photos off of the phone first. After doing some searching I discovered that the iPhone backup files are located at:

/Users/&#60;user&#62;/Library/Application Support/MobileSync/Backup


I then found the [...]]]></description>
			<content:encoded><![CDATA[<p>I recently reset my iPhone in an attempt to clear up some weird issues I was having. It wasn&#8217;t until afterwards that I realized that I had forgotten to pull my photos off of the phone first. After doing some searching I discovered that the iPhone backup files are located at:</p>

<pre><code>/Users/&lt;user&gt;/Library/Application Support/MobileSync/Backup
</code></pre>

<p>I then found the <a href="http://iphonewebdev.googlegroups.com/web/bkupextract.pl">bkupextract.pl script</a> that attempts to extract all of the sqlite3 databases from the backup files. I modified the script to also extract the plist, JPEG and PNG files and posted it to <a href="http://gist.github.com/194530">a gist</a>. My Perl-Fu is weak, so no complaining about the quality of the code, but it found my photos.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=nVSAoScFF54:43uhThoAI80:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=nVSAoScFF54:43uhThoAI80:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=nVSAoScFF54:43uhThoAI80:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=nVSAoScFF54:43uhThoAI80:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=nVSAoScFF54:43uhThoAI80:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=nVSAoScFF54:43uhThoAI80:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/09/26/extracting-data-from-iphone-backups/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/09/26/extracting-data-from-iphone-backups</feedburner:origLink></item>
		<item>
		<title>Patron 0.4</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/TRdCdknrLBo/patron-0-4</link>
		<comments>http://fiatdev.com/2009/07/22/patron-0-4#comments</comments>
		<pubDate>Wed, 22 Jul 2009 17:35:32 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=255</guid>
		<description><![CDATA[The 0.4 version of Patron has been released. This version addresses feedback from the initial public release and fixes a few minor bugs:


Fixed a bug in the Patron.version method
Added HTTP proxy support
Enabled SSL and Win32 support
Added ability to download data to a file with GET
Fixed a bug where header values were prefixed with a space
Made [...]]]></description>
			<content:encoded><![CDATA[<p>The 0.4 version of Patron has been released. This version addresses feedback from the initial public release and fixes a few minor bugs:</p>

<ul>
<li>Fixed a bug in the Patron.version method</li>
<li>Added HTTP proxy support</li>
<li>Enabled SSL and Win32 support</li>
<li>Added ability to download data to a file with GET</li>
<li>Fixed a bug where header values were prefixed with a space</li>
<li>Made the Session#request method public</li>
<li>Added support for the WebDAV COPY method</li>
<li>Added support for uploading files with POST and PUT</li>
</ul>

<p>In addition to all of this, Patron has a new home page at <a href="http://toland.github.com/patron/">http://toland.github.com/patron/</a>.</p>

<p>So, what&#8217;s next for Patron? Well, I would like to put out a 0.5 release in the next few weeks with some refactoring and API tuning. Also, I would like to implement the rest of the WebDAV methods. I am toying with the idea of creating a net/http compatible interface so that Patron can be used as a drop-in replacement. Not sure if that is going to go anywhere, though.</p>

<p>Once I am happy with the API and documentation I will release 1.0. Other than that, I try to respond to bug reports and feature requests in a timely manner. I originally wrote Patron to scratch my own itch, and that itch has been scratched. At this point I am looking to make Patron as broadly useful as I can, and your feedback helps with that.</p>

<p>Patches and contributed documentation are always welcome. In particular, if anyone feels like trying to get this working on Windows, I will be happy to integrate the resulting patches and publish a binary gem.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=TRdCdknrLBo:GTt6x_U6Rmg:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=TRdCdknrLBo:GTt6x_U6Rmg:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=TRdCdknrLBo:GTt6x_U6Rmg:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=TRdCdknrLBo:GTt6x_U6Rmg:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=TRdCdknrLBo:GTt6x_U6Rmg:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=TRdCdknrLBo:GTt6x_U6Rmg:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/07/22/patron-0-4/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/07/22/patron-0-4</feedburner:origLink></item>
		<item>
		<title>Using DTL templates with Nitrogen</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/hY5ZMYQVJUw/using-dtl-templates-with-nitrogen</link>
		<comments>http://fiatdev.com/2009/07/13/using-dtl-templates-with-nitrogen#comments</comments>
		<pubDate>Mon, 13 Jul 2009 20:24:35 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[dtl]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[erlydtl]]></category>
		<category><![CDATA[nitrogen]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=249</guid>
		<description><![CDATA[One thing that I did not like about working with the Nitrogen web framework is the way that view rendering is handled. Nitrogen calls the function main/0 in your web modules which, by convention, returns an instance of the template record. This record points to a template file that has HTML code with a little [...]]]></description>
			<content:encoded><![CDATA[<p>One thing that I did not like about working with the <a href="http://nitrogenproject.com/">Nitrogen</a> web framework is the way that view rendering is handled. Nitrogen calls the function <code>main/0</code> in your web modules which, by convention, returns an instance of the <code>template</code> record. This record points to a template file that has HTML code with a little Erlang mixed in. Essentially, you can call functions in your web module and whatever content those functions return is interpolated into your template.</p>

<p>This all makes it sound a little more complicated than it really is. Here is a little &#8220;hello world&#8221; sample to illustrate how it works. First, the <code>web_page</code> Erlang module defines the <code>main/0</code> function and a couple of callouts:</p>

<pre><code>-module(web_page).
-include("wf.inc").
-compile(export_all).

main() -&gt; #template { file="./wwwroot/template.html" }.
title() -&gt; "Hello, World!".
content() -&gt; #h1 { text="Hello, World!" }.
</code></pre>

<p>This will cause Nitrogen to render the template.html file.</p>

<pre><code>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;[[[page:title()]]]&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
[[[page:content()]]]
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>The callouts in the template will call the respective functions in the <code>web_page</code> module and we end up with a page that displays a bold &#8220;Hello, World!&#8221;. The template file is really analogous to a Rails layout and the content that Rails puts into a view template is returned from the callouts using a markup DSL based on the Erlang record syntax.</p>

<p>This template mechanism is simple, but it becomes very limiting when working on a non-trivial application. Nitrogen mixes controller functionality with presentation in a way that is reminiscent of PHP or JSP. Also, you cannot compose templates and the markup DSL doesn&#8217;t cover all of the HTML elements and attributes.</p>

<p>I ran into this problem while working on a Nitrogen powered site and decided that I just couldn&#8217;t live with the default template system. After a little digging around I discovered <a href="http://code.google.com/p/erlydtl/">ErlyDTL</a> which implements a substantial subset of the <a href="http://www.djangoproject.com/documentation/templates/">Django Template Language</a> in Erlang. It turns out that using ErlyDTL in a Nitrogen site is quite simple.</p>

<p>The first thing I needed was a utility function to render ErlyDTL templates. Nitrogen includes implicit elements for the notification flash and Javascript code for all of that AJAX goodnes which I needed to replicate in my render function.</p>

<pre><code>-module(my_util).
-compile(export_all).

template_path(Template) -&gt;
    filename:join([code:priv_dir(my_app), templates, Template]).

render_template(Name, Variables) -&gt;
    Template = template_path(Name ++ ".html"),
    Mod = list_to_atom(Name ++ "_template"),
    ok = erlydtl:compile(Template, Mod),
    {ok, Body} = Mod:render([{flash, element_flash:render()},
                             {script, wf_script:get_script()}
                             | Variables]),
    Body.
</code></pre>

<p>Now, I can replace the simple module from earlier with this new one:</p>

<pre><code>-module(web_page).
-include("wf.inc").
-compile(export_all).

main() -&gt;
    my_util:render_template("template", [
          {title, "Hello, World!"},
          {content, content()}]).

content() -&gt; "Hello, World!".       
</code></pre>

<p>My template file is now equally simple:</p>

<pre><code>&lt;html&gt;
&lt;head&gt;
&lt;title&gt;{{ title }}&lt;/title&gt;
&lt;/head&gt;
&lt;body&gt;
&lt;h1&gt;{{ content }}&lt;/h1&gt;    
&lt;/body&gt;
&lt;/html&gt;
</code></pre>

<p>All of the markup is now in the template file, and the module is concerned only with getting the content from somewhere and making it available to the view. This also allows us to use the full power of ErlyDTL: we can compose templates and perform simple operations on the content to be displayed. Here is an example from the ErlyDTL home page:</p>

<pre><code>Welcome back, {{ name }}!

You have {{ friends|length }} friends: {{ friends|join:", " }}

Have some primes:
{# this is exciting #}
{% for i in primes %}
    {{ i }}
{% endfor %}
</code></pre>

<p>There is one drawback to this approach. The Nitrogen DSL includes helpers for generating links that work with its event system. When using ErlyDTL we have to create those links manually, but it isn&#8217;t hard. The key thing to remember is that the link id is the event name that will be passed to your module. Here are a couple of examples:</p>

<pre><code>&lt;a id="do_it" href="javascript:"&gt;Do It!&lt;/a&gt;
&lt;button id="do_it" class="button submit"&gt;Do It!&lt;/button&gt;
</code></pre>

<p>The extra flexibility of DTL is certainly worth the small amount of extra work.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=hY5ZMYQVJUw:NILlUuKc9No:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=hY5ZMYQVJUw:NILlUuKc9No:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=hY5ZMYQVJUw:NILlUuKc9No:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=hY5ZMYQVJUw:NILlUuKc9No:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=hY5ZMYQVJUw:NILlUuKc9No:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=hY5ZMYQVJUw:NILlUuKc9No:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/07/13/using-dtl-templates-with-nitrogen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/07/13/using-dtl-templates-with-nitrogen</feedburner:origLink></item>
		<item>
		<title>Announcing Patron: a Ruby HTTP client library</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/BLquHEBHtE0/announcing-patron-a-ruby-http-client-library</link>
		<comments>http://fiatdev.com/2009/07/03/announcing-patron-a-ruby-http-client-library#comments</comments>
		<pubDate>Fri, 03 Jul 2009 20:02:50 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[client]]></category>
		<category><![CDATA[http]]></category>
		<category><![CDATA[library]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=244</guid>
		<description><![CDATA[I was recently given the opportunity to release several of the projects I was working on at The Hive as open source. These projects are libraries that we built to address specific problems we ran into but were not core to our business. Most of these were always destined to be released, it just took [...]]]></description>
			<content:encoded><![CDATA[<p>I was recently given the opportunity to release several of the projects I was working on at The Hive as open source. These projects are libraries that we built to address specific problems we ran into but were not core to our business. Most of these were always destined to be released, it just took a while before we got around to it. Everything is currently on my <a href="http://github.com/toland">GitHub page</a>, but I wanted to do a little cleanup on each project and announce them individually.</p>

<p>Today I am announcing the first of these projects: Patron. Patron is an HTTP client library for Ruby that features a usable API and good performance. As for the name Patron, I searched through the thesaurus looking for synonyms for the word &#8220;client&#8221;.</p>

<p>The performance problems with the built-in Ruby HTTP client are well documented <a href="http://apocryph.org/2008/10/04/analysis_ruby_18x_http_client_performance/">elsewhere</a>, so I won&#8217;t go into that here. The other alternative is the Curb gem which is based on <a href="http://curl.haxx.se/libcurl/">libcurl</a> and offers great performance. Unfortunately, curb is unfinished and doesn&#8217;t appear to have an official maintainer. Also, the API leaves much to be desired. These issues are compounded by the fact that curb is primarily implemented in C and is difficult to modify.</p>

<p>I tried to patch curb to get all of the features we wanted, but subtle bugs kept creeping in. Eventually I gave in and wrote Patron. The goal was to have a Ruby HTTP client built on libcurl with a reasonable API. By implementing as much as possible in Ruby I think that Patron is much more maintainable than curb.</p>

<p>I have not made an attempt to support every feature of libcurl. Libcurl is huge and trying to support every feature would lead to bloat and make it harder to maintain. Instead, I built a small API that did what we needed it to do. It has been in use at The Hive for some time now and seems pretty stable.</p>

<p>The documentation for Patron is <a href="http://patron.rubyforge.org/">on Rubyforge</a> and the source code is available <a href="http://github.com/toland/patron/tree/master">on GitHub</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=BLquHEBHtE0:xGkcTwJJ0RY:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=BLquHEBHtE0:xGkcTwJJ0RY:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=BLquHEBHtE0:xGkcTwJJ0RY:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=BLquHEBHtE0:xGkcTwJJ0RY:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=BLquHEBHtE0:xGkcTwJJ0RY:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=BLquHEBHtE0:xGkcTwJJ0RY:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/07/03/announcing-patron-a-ruby-http-client-library/feed</wfw:commentRss>
		<slash:comments>19</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/07/03/announcing-patron-a-ruby-http-client-library</feedburner:origLink></item>
		<item>
		<title>Thoughts on NetBeans 6.7</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/_oivWcTN9oY/thoughts-on-netbeans-6-7</link>
		<comments>http://fiatdev.com/2009/07/02/thoughts-on-netbeans-6-7#comments</comments>
		<pubDate>Thu, 02 Jul 2009 19:56:17 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[ide]]></category>
		<category><![CDATA[netbeans]]></category>
		<category><![CDATA[osx]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[ruby]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=240</guid>
		<description><![CDATA[I used NetBeans back when it was called Forte for Java and have kept an eye on it ever since. Every few releases I would download it and try it out again. Since Eclipse came onto the scene, NetBeans was just &#8220;that other Java IDE.&#8221; I no longer work with Java, nor do I use [...]]]></description>
			<content:encoded><![CDATA[<p>I used NetBeans back when it was called Forte for Java and have kept an eye on it ever since. Every few releases I would download it and try it out again. Since Eclipse came onto the scene, NetBeans was just &#8220;that other Java IDE.&#8221; I no longer work with Java, nor do I use an IDE, but I still download NetBeans every once in a while to see how far it has come. When Rails began to gain traction, the NetBeans team began to work in Ruby support. The Ruby support in NetBeans has always demoed well, but always seemed a bit too clunky for me. And it looked like crap on OS X.</p>

<p><a href="http://www.netbeans.org/servlets/NewsItemView?newsItemID=1399">NetBeans 6.7</a> was released on Monday and I dutifully downloaded it and played with it for a couple of days. The first thing that stuck me is that it looks good on OS X.</p>

<div style="text-align:center;">
    <a href="http://fiatdev.com/wp-content/uploads/nb67.png">
        <img src="http://fiatdev.com/wp-content/uploads/nb67-2.png"
            alt="nb67-2.png" border="0" width="506" height="425" />
    </a>
</div>

<p>This is the best looking Swing application I have ever seen, and yet there are little inconsistencies that can become annoying. For example, you can drag a Cocoa window by clicking anywhere on the integrated toolbar, but in NetBeans you have to click on the title bar. This is a big issue since the toolbar in NetBeans looks like an integrated Cocoa toolbar, but it isn&#8217;t. Also, clicking on a file in the explorer on the left shows the file&#8217;s members in the Navigator, but does not open the file. You have to double click to actually open a file.</p>

<p>All of this would be forgivable if NetBeans offered better functionality than my current toolset. The whole idea behind IDEs is that it is more convenient to have all of the functionality you need bundled into one application than to use several separate apps. However, getting to some of the functionality in NetBeans requires digging around in the UI, and some stuff is just broken compared to the non-IDE equivalent. For example, when running Ruby tests or the Rails server via script/server from within NetBeans, the ASCII color codes are not properly interpreted making the output unreadable.</p>

<p>So far, I have found NetBeans less convenient than the combination of <a href="http://macromates.com/">TextMate</a>, <a href="http://gitx.frim.nl/">GitX</a>, Terminal and <a href="http://www.sequelpro.com/">Sequel Pro</a>. Part of this is due to the fact that I have a lot of time invested in my current development stack. The latest version of NetBeans shows enough promise, and I am enough of a tools geek, that I am going to tough it out a few more days. That having been said, I am having a hard time seeing the value in an IDE when the components of a non-integrated development tool stack are of such high quality.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=_oivWcTN9oY:EUrGxos81XA:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=_oivWcTN9oY:EUrGxos81XA:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=_oivWcTN9oY:EUrGxos81XA:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=_oivWcTN9oY:EUrGxos81XA:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=_oivWcTN9oY:EUrGxos81XA:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=_oivWcTN9oY:EUrGxos81XA:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/07/02/thoughts-on-netbeans-6-7/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/07/02/thoughts-on-netbeans-6-7</feedburner:origLink></item>
		<item>
		<title>My Erlang setup</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/QrSVbhr-ekk/my-erlang-setup</link>
		<comments>http://fiatdev.com/2009/07/01/my-erlang-setup#comments</comments>
		<pubDate>Wed, 01 Jul 2009 23:45:33 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=235</guid>
		<description><![CDATA[When setting up Erlang under OS X I have run into two issues. First, how do I keep multiple versions installed at once? I sometimes have a need to evaluate a new version of the Erlang VM while keeping the old version around &#8220;just in case.&#8221; In a  few instances I had two applications [...]]]></description>
			<content:encoded><![CDATA[<p>When setting up Erlang under OS X I have run into two issues. First, how do I keep multiple versions installed at once? I sometimes have a need to evaluate a new version of the Erlang VM while keeping the old version around &#8220;just in case.&#8221; In a  few instances I had two applications which needed different versions of the VM. Second, where do I install all of the 3rd party Erlang libraries? Unlike with Ruby or Python there is no blessed &#8220;site&#8221; directory for 3rd party Erlang libraries.</p>

<p>After a little experimentation I was able to set things up in a way that solves both of these issues. Some of the details are a bit specific to Mac OS X, but this method could easily be adapted to any UNIX-like environment. The method involves symlinks so Windows users are probably out of luck.</p>

<p>I decided to install all Erlang related stuff under <code>~/Library/Erlang</code> to generally conform to OS X conventions. While I chose to install under my home directory, you could also put it in <code>/Library</code> with minimal changes to the process. In the <code>Erlang</code> directory I have two subdirectories: <code>Releases</code> and <code>Site</code>. The general idea is that each Erlang release will live in a subdirectory of <code>Releases</code> named after the Erlang release (i.e., &#8220;R13B01&#8221;) while 3rd party code goes in <code>Site</code>. Finally, I create a symlink named <code>Current</code> in the Erlang directory and link it to the release that I am currently using.</p>

<p>The final setup looks like this:</p>

<pre><code>Erlang
  |-- Current -&gt; Releases/R13B01
  |-- Releases
  |     |-- R12B5
  |     `-- R13B01
  |-- Site
  |     |-- erlydtl-0.5.2.2
  |     |-- mochiweb-0.97.1
  |     |-- nitrogen-0.2.0
  |     `-- webmachine-1.3
  `-- setup.sh
</code></pre>

<p>The <code>setup.sh</code> file is sourced in my <code>.bash_profile</code> and it sets up the shell environment:</p>

<pre><code>export ERL_ROOT=$HOME/Library/Erlang/Current
export ERL_LIBS=$HOME/Library/Erlang/Site
export MANPATH=$ERL_ROOT/man:$MANPATH
export PATH=$ERL_ROOT/bin:$PATH
</code></pre>

<p>With this setup, all of the libraries in <code>Site</code> are in the Erlang code path and the current Erlang VM is in the shell&#8217;s path. I can switch Erlang VMs by changing the symlink to point to a different distribution, but everything else remains the same.</p>

<p>Building Erlang from source is simple. After extracting the source distribution:</p>

<pre><code>$ ./configure --prefix=$HOME/Library/Erlang/Releases/R13B01
$ make
$ make install
</code></pre>

<p>You will want to replace the &#8216;R13B01&#8217; with the name of the distribution you are building.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=QrSVbhr-ekk:wBA5q6aR2fw:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=QrSVbhr-ekk:wBA5q6aR2fw:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=QrSVbhr-ekk:wBA5q6aR2fw:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=QrSVbhr-ekk:wBA5q6aR2fw:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=QrSVbhr-ekk:wBA5q6aR2fw:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=QrSVbhr-ekk:wBA5q6aR2fw:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/07/01/my-erlang-setup/feed</wfw:commentRss>
		<slash:comments>2</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/07/01/my-erlang-setup</feedburner:origLink></item>
		<item>
		<title>QLMarkdown 1.1</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/OCsew0Sb0Io/qlmarkdown-11</link>
		<comments>http://fiatdev.com/2009/02/11/qlmarkdown-11#comments</comments>
		<pubDate>Thu, 12 Feb 2009 03:19:31 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[.mac]]></category>
		<category><![CDATA[markdown]]></category>
		<category><![CDATA[quicklook]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=136</guid>
		<description><![CDATA[There is a new version of the  generator available. I didn&#8217;t have anything to do with the new release other than zipping up the final product. Michael Dominic K. added some nice new features. You can download the goodies here or grab the source from GitHub.
]]></description>
			<content:encoded><![CDATA[<p>There is a new version of the <a href="#">QLMarkdown</a> generator available. I didn&#8217;t have anything to do with the new release other than zipping up the final product. Michael Dominic K. added some <a href="http://www.mdk.org.pl/2009/2/10/quicklook-for-markdown">nice new features</a>. You can download the goodies <a href="http://fiatdev.com/downloads/QLMarkdown-1.1.zip">here</a> or grab <a href="http://github.com/toland/qlmarkdown">the source</a> from GitHub.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=OCsew0Sb0Io:YtsEj-Cifrs:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=OCsew0Sb0Io:YtsEj-Cifrs:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=OCsew0Sb0Io:YtsEj-Cifrs:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=OCsew0Sb0Io:YtsEj-Cifrs:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=OCsew0Sb0Io:YtsEj-Cifrs:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=OCsew0Sb0Io:YtsEj-Cifrs:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/02/11/qlmarkdown-11/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/02/11/qlmarkdown-11</feedburner:origLink></item>
		<item>
		<title>Keeping track of little things</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/J_aYOsQ6uNA/keeping-track-of-little-things</link>
		<comments>http://fiatdev.com/2009/01/26/keeping-track-of-little-things#comments</comments>
		<pubDate>Mon, 26 Jan 2009 17:43:45 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Tools]]></category>
		<category><![CDATA[gtd]]></category>
		<category><![CDATA[productivity]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=130</guid>
		<description><![CDATA[I have been using GTD for a while now (1 year? 2? Has it really been that long?). By now I have mostly passed the &#8220;tinkering&#8221; phase and my system has become integrated with my daily routine. Having said that, I am still finding small ways to improve and optimize the whole process.

This morning I [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using <a href="http://en.wikipedia.org/wiki/Getting_Things_Done">GTD</a> for a while now (1 year? 2? Has it really been that long?). By now I have mostly passed the &#8220;tinkering&#8221; phase and my system has become integrated with my daily routine. Having said that, I am still finding small ways to improve and optimize the whole process.</p>

<p>This morning I was looking over my Today list in <a href="http://culturedcode.com/things/">Things</a> and I realized that there were two tasks on my mind but not in the system. Safari bookmarks aren&#8217;t synching to my laptop properly and I have a memory upgrade for my daughter&#8217;s iMac that needs to be installed. I initially resisted adding those tasks to Things with the justification that they are little things and I would take care of them this evening. Of course, I have had the memory upgrade for over a week now and it has yet to be installed.</p>

<p>These &#8220;little things&#8221; were becoming a source of stress because every time I would walk past the iMac or log onto the laptop I would think: &#8220;Oh, yeah. I need to do something about this&#8230;but not right now.&#8221; And yet, I resisted adding them to my list in Things. Once I became aware of this I thought of several tasks that I had been holding in my head. Getting those tasks into things relieved some of the stress and gave me more confidence that they would eventually be done.</p>

<p>Now all I have to do is become more disciplined about doing the things on my list as opposed to just moving things around.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=J_aYOsQ6uNA:R5u2Gi8U3us:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=J_aYOsQ6uNA:R5u2Gi8U3us:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=J_aYOsQ6uNA:R5u2Gi8U3us:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=J_aYOsQ6uNA:R5u2Gi8U3us:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=J_aYOsQ6uNA:R5u2Gi8U3us:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=J_aYOsQ6uNA:R5u2Gi8U3us:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2009/01/26/keeping-track-of-little-things/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2009/01/26/keeping-track-of-little-things</feedburner:origLink></item>
		<item>
		<title>Nitrogen</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/gUAphIM52WE/nitrogen</link>
		<comments>http://fiatdev.com/2008/12/06/nitrogen#comments</comments>
		<pubDate>Sat, 06 Dec 2008 17:10:35 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[erlang]]></category>
		<category><![CDATA[framework]]></category>
		<category><![CDATA[web]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=123</guid>
		<description><![CDATA[I have been using Erlang extensively for the last 6 months or so and it is a very nice language. While I have enjoyed working with the language, I wasn&#8217;t really impressed with the existing Erlang web frameworks. Mochiweb is nice enough, and I use it to power an application with an HTTP based ReSTful [...]]]></description>
			<content:encoded><![CDATA[<p>I have been using Erlang extensively for the last 6 months or so and it is a very nice language. While I have enjoyed working with the language, I wasn&#8217;t really impressed with the existing Erlang web frameworks. <a href="http://code.google.com/p/mochiweb/">Mochiweb</a> is nice enough, and I use it to power an application with an HTTP based ReSTful API, but it is too bare bones to use for building a full-featured site.</p>

<p>Then I ran across <a href="http://nitrogen-erlang.tumblr.com/">Nitrogen</a>. The first thing that struck me about Nitrogen is how it (ab)uses the Erlang record syntax to create a passable DSL for HTML generation. Check out this snippet from the included sample application:</p>

<pre><code>main() -&gt;
  Title = "Postbacks",
  Body = #template { file=onecolumn, title=Title,
                     headline=Title, section1=[

    #button { text="Press Me", postback=button_pressed },
    #p{},

    #link { text="Click Me", postback=link_clicked },
    #p{},

    #label { text="Press enter in the textbox." },
    #textbox { text="This is a message...", 
               postback=textbox_enterkey },
    #p{},

    #checkbox { text="Toggle Me", postback=checkbox_clicked },
    #p{},

    #dropdown { postback=dropdown_changed, options=[
      #option { text="Option 1" },
      #option { text="Option 2" },
      #option { text="Option 3" }
    ]},
    #p{},

    #span { text="Mouse Over Me", 
            actions=#event { type=mouseover, 
                             postback=span_mousedover } },
    #p{}

  ]},
  wf:render(Body).
</code></pre>

<p>The second thing that caught my attention is the event model. The <code>postback</code> attribute on the elements in the above snippet cause the Erlang term that is assigned to it (in this case symbols) to be posted back to the server using AJAX. This example simply shows an alert box with the posted symbol. The code is  very concise:</p>

<pre><code>event(EventInfo) -&gt;
  wf:wire(#alert { text=wf:f("~p", [EventInfo]) }),
  ok.
</code></pre>

<p>The nice thing about this model is that you can use Erlang&#8217;s pattern matching to catch events from different elements. If you have elements that look like this:</p>

<pre><code>#button { text="Next", postback=next },
#button { text="Previous", postback=previous },
</code></pre>

<p>then you can handle the events using pattern matching:</p>

<pre><code>event(next) -&gt;
  %% Go to the next item...
  ok;
event(previous) -&gt;
  %% Go to the previous item...
  ok.
</code></pre>

<p>This is clean and easy to understand.</p>

<p>I have not spent as much time as I would like with Nitrogen, but it certainly has my attention. It currently addresses two of the gripes I have had with other frameworks, but there are other issues that have not yet been addressed. For example, how easy is it to deploy or update a site built with Nitrogen? What does the performance and efficiency look like? Using Erlang gives Nitrogen a head start in both of these areas, so I am optimistic.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=gUAphIM52WE:Z1fuodx5v5Q:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=gUAphIM52WE:Z1fuodx5v5Q:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=gUAphIM52WE:Z1fuodx5v5Q:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=gUAphIM52WE:Z1fuodx5v5Q:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=gUAphIM52WE:Z1fuodx5v5Q:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=gUAphIM52WE:Z1fuodx5v5Q:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2008/12/06/nitrogen/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2008/12/06/nitrogen</feedburner:origLink></item>
		<item>
		<title>app_version Updated</title>
		<link>http://feedproxy.google.com/~r/fiatdev/~3/lCYUY8Yw-l8/app_version-updated</link>
		<comments>http://fiatdev.com/2008/08/10/app_version-updated#comments</comments>
		<pubDate>Sun, 10 Aug 2008 23:47:23 +0000</pubDate>
		<dc:creator>phil</dc:creator>
				<category><![CDATA[Code]]></category>
		<category><![CDATA[git]]></category>
		<category><![CDATA[plugins]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://fiatdev.com/?p=109</guid>
		<description><![CDATA[I have updated my app_version Rails plugin to support getting build numbers from Git. This is of necessity a little kludgy. The plugin allows you to specify either &#8216;git-revcount&#8217; or &#8216;git-hash&#8217; as the build. &#8216;git-revcount&#8217; will set the build number to the number of commits on the current Git branch and &#8216;git-hash&#8217; will set the [...]]]></description>
			<content:encoded><![CDATA[<p>I have updated my app_version Rails plugin to support getting build numbers from Git. This is of necessity a little kludgy. The plugin allows you to specify either &#8216;git-revcount&#8217; or &#8216;git-hash&#8217; as the build. &#8216;git-revcount&#8217; will set the build number to the number of commits on the current Git branch and &#8216;git-hash&#8217; will set the build number to the first six digits of the Git HEAD hash. Neither method is really equivalent to the Subversion revision number, but either might be useful in certain contexts.</p>

<p>The source code for the plugin is available at <a href="http://github.com/toland/app_version">http://github.com/toland/app_version</a>.</p>
<div class="feedflare">
<a href="http://feeds.feedburner.com/~ff/fiatdev?a=lCYUY8Yw-l8:es-JlLMh-jU:yIl2AUoC8zA"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=yIl2AUoC8zA" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=lCYUY8Yw-l8:es-JlLMh-jU:D7DqB2pKExk"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=lCYUY8Yw-l8:es-JlLMh-jU:D7DqB2pKExk" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=lCYUY8Yw-l8:es-JlLMh-jU:YwkR-u9nhCs"><img src="http://feeds.feedburner.com/~ff/fiatdev?d=YwkR-u9nhCs" border="0"></img></a> <a href="http://feeds.feedburner.com/~ff/fiatdev?a=lCYUY8Yw-l8:es-JlLMh-jU:F7zBnMyn0Lo"><img src="http://feeds.feedburner.com/~ff/fiatdev?i=lCYUY8Yw-l8:es-JlLMh-jU:F7zBnMyn0Lo" border="0"></img></a>
</div>]]></content:encoded>
			<wfw:commentRss>http://fiatdev.com/2008/08/10/app_version-updated/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<creativeCommons:license>http://creativecommons.org/licenses/by-nc-sa/3.0/</creativeCommons:license><feedburner:origLink>http://fiatdev.com/2008/08/10/app_version-updated</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic Page Served (once) in 0.400 seconds --><!-- Cached page served by WP-Cache -->
