<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-20604647</id><updated>2011-12-14T17:13:11.107-10:00</updated><title type='text'>Programming in Paradise</title><subtitle type='html'>Anthony Eden's thoughts about software development from the middle of the Pacific.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>29</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-20604647.post-115138650534799539</id><published>2006-06-26T19:33:00.000-10:00</published><updated>2006-08-16T19:17:07.053-10:00</updated><title type='text'>Moving Back to anthonyeden.com</title><content type='html'>OK, I've got to stop moving around, but I'm not going to post here anymore. It's back to &lt;a href="http://anthonyeden.com/"&gt;anthonyeden.com&lt;/a&gt; for me. So change your feed when you have a chance.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-115138650534799539?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/115138650534799539/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=115138650534799539' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/115138650534799539'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/115138650534799539'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/06/moving-back-to-anthonyedencom.html' title='Moving Back to anthonyeden.com'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-115115678514840310</id><published>2006-06-24T03:37:00.000-10:00</published><updated>2006-06-24T03:46:25.163-10:00</updated><title type='text'>RailsConf 2006</title><content type='html'>I've been in Chicago since Wednesday geeking out with other Ruby on Rails developers at &lt;a href="http://www.railsconf.com/"&gt;RailsConf&lt;/a&gt;. This is the first RailsConf and there are more than 500 attendees. So far many good times have been had and we're only on day two of the conference. Why the Lucky Stiff and the Thirsty Cups performed last night...awesome show. Very eclectic. :-)&lt;br /&gt;&lt;br /&gt;Anyhow, so what's come out of it for me? Well first of all I launched &lt;a href="http://symphonio.us/"&gt;Symphonious&lt;/a&gt;, a contract management tool built on Rails, by giving a five minute demo for a room full of people. You can use Symphonious to track your contracts from Pre-RFP through the proposal stage until (hopefully) the win and on to completion. It's simple but I think it will be effective for those out there that need to manage the contract lifecycle. At the moment it's pretty basic, collecting information about the contract and providing a workflow system for moving through the contract lifecycle. It also has contact management and sharing. There is definitely more to come though.&lt;br /&gt;&lt;br /&gt;Also, after listening to Dave Thomas' call to action for 3 things he felt needed work in Ruby, I took to creating a simple extention to Capistrano which produces a Gem from your Rails app. I've requested to open a project on RubyForge, so as soon as that goes through I'll post the code there under an open source license.&lt;br /&gt;&lt;br /&gt;That's it for now. I'm off to breakfast and another day of talks.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-115115678514840310?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/115115678514840310/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=115115678514840310' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/115115678514840310'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/115115678514840310'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/06/railsconf-2006.html' title='RailsConf 2006'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114884027975433854</id><published>2006-05-28T08:14:00.000-10:00</published><updated>2006-05-28T08:17:59.763-10:00</updated><title type='text'>What Computer do Pro Surfers Use?</title><content type='html'>From a recent article on &lt;a href="http://www.surfline.com/"&gt;Surfline&lt;/a&gt;:&lt;br /&gt;&lt;br /&gt;"we are out here in the middle of the South Pacific with the best surfers in the world, and you may in fact be wondering how they deal with a flat spell...websites checked, emails sent (yeah, there's wireless on the deck of the restaurant, courtesy of Globe, and almost every pro is armed with some kind of &lt;span style="font-weight: bold;"&gt;Mac laptop&lt;/span&gt;)"&lt;br /&gt;&lt;br /&gt;That's right folks, surfers love Mac. ;-)&lt;br /&gt;&lt;br /&gt;I remember not more than 5 years ago I was wondering if I would ever be able to switch back to a Mac. Last Christmas I got my chance in the form of my current 17" G4 Powerbook. I love it and while I still use a Dell at the office, that is going to change when I get the opportunity to purchase an Intel G5 iMac. Yummy!&lt;br /&gt;&lt;br /&gt;(Posted from a 17" G4 from the Hawaiian islands)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114884027975433854?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114884027975433854/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114884027975433854' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114884027975433854'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114884027975433854'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/05/what-computer-do-pro-surfers-use.html' title='What Computer do Pro Surfers Use?'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114842767333912560</id><published>2006-05-23T13:39:00.000-10:00</published><updated>2006-05-23T13:41:13.346-10:00</updated><title type='text'>Annoyance of the day</title><content type='html'>Annoyance of the day:&lt;br /&gt;&lt;br /&gt;If you tell me you are going to call me, or send me an email, or whatever it may be you sure as heck better do it if you expect me to respect you. Say what you do and do what you say.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114842767333912560?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114842767333912560/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114842767333912560' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114842767333912560'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114842767333912560'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/05/annoyance-of-day.html' title='Annoyance of the day'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114772637542161664</id><published>2006-05-15T10:52:00.000-10:00</published><updated>2006-05-15T10:52:55.436-10:00</updated><title type='text'>Dispair Podcasts</title><content type='html'>I'm feeling &lt;a href="http://www.despair.com/spin.html"&gt;demotivated&lt;/a&gt; already. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114772637542161664?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114772637542161664/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114772637542161664' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114772637542161664'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114772637542161664'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/05/dispair-podcasts.html' title='Dispair Podcasts'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114716993463781541</id><published>2006-05-09T00:15:00.000-10:00</published><updated>2006-05-09T00:18:54.650-10:00</updated><title type='text'>Rails Presentation for HOUG</title><content type='html'>Along with &lt;a href="http://www.semergence.com/archives/2006/05/08/22/21/25/"&gt;Seth&lt;/a&gt;, I will be &lt;a href="http://www.redwingnet.com/hioug/Meetings/9-May-2006_Schedule.htm"&gt;presenting tomorrow&lt;/a&gt; before the &lt;a href="http://www.redwingnet.com/hioug/"&gt;Honolulu Oracle User's Group&lt;/a&gt;. While Seth will be presenting on the highly geeky topic of RDF and Oracle, I will be presenting the ultra-cool and hip Ruby on Rails framework to the Oracle peeps. Come on down and get ya some Rails and some pizza while you're at it.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114716993463781541?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114716993463781541/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114716993463781541' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114716993463781541'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114716993463781541'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/05/rails-presentation-for-houg.html' title='Rails Presentation for HOUG'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114629384424976690</id><published>2006-04-28T20:56:00.000-10:00</published><updated>2006-04-28T20:58:08.806-10:00</updated><title type='text'>Size of Directories</title><content type='html'>du -h --max-depth=1&lt;br /&gt;&lt;br /&gt;Quite useful for determining which directories in a Linux system are taking up lots of disk space. Now if I could just figure out *why* Lighttpd logs are getting up to 4 GB so quickly then I wouldn't have this problem.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114629384424976690?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114629384424976690/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114629384424976690' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114629384424976690'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114629384424976690'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/04/size-of-directories.html' title='Size of Directories'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114512858300442846</id><published>2006-04-15T09:11:00.000-10:00</published><updated>2006-04-15T09:16:23.016-10:00</updated><title type='text'>Ruby for ETL</title><content type='html'>&lt;a href="http://www.semergence.com/"&gt;Seth&lt;/a&gt; and I are throwing together a little ETL tool in Ruby. Stay tuned to see what comes of it. We've found that while DTS is ok for simple, clean source data that it starts to fall apart when you have a large number of source tables and where the source files tend to change with each new data dump. Granted, this could be solved largely with improved source data, that is often not possible to force. Seth has also been using &lt;a href="http://www.kettle.be/"&gt;Kettle&lt;/a&gt; a bit, but it lacks the performance and line-level error handling that we need. We're also looking at commercial packages, but they tend to be pricey. In the long run it may be worth it to purchase a fifty-thousand dollar ETL tool, but not at the moment. Ruby is well suited for simple Domain Specific Languages so we're using it as the bases for ETL and we'll see where it leads us. It's a nice diversion from loading data and building reports anyhow. :-)&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114512858300442846?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114512858300442846/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114512858300442846' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114512858300442846'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114512858300442846'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/04/ruby-for-etl.html' title='Ruby for ETL'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114362987508955224</id><published>2006-03-29T00:49:00.000-10:00</published><updated>2006-09-08T22:07:40.110-10:00</updated><title type='text'>Rails 1.1 Custom Types for respond_to</title><content type='html'>Here is a simple example of adding new MIME-types and response handlers in Rails 1.1. I placed the following in $APP/lib/mime_responds.rb although it probably should be packaged up as a Plugin, and the Mime registration should probably be put somewhere else, but this will do for now...&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;include Mime&lt;br /&gt;WML = Type.new("text/vnd.wap.wml", :wml, %w( text/vnd.wap.wml ))&lt;br /&gt;LOOKUP['text/vnd.wap.wml'] = WML&lt;br /&gt;&lt;br /&gt;module ActionController&lt;br /&gt;  module MimeResponds&lt;br /&gt;    class Responder&lt;br /&gt;      for mime_type in %w( wml )&lt;br /&gt;        eval &lt;&lt;-EOT&lt;br /&gt;          def #{mime_type}(&amp;block)&lt;br /&gt;            custom(#{mime_type.upcase}, &amp;block)&lt;br /&gt;          end&lt;br /&gt;        EOT&lt;br /&gt;      end&lt;br /&gt;    end&lt;br /&gt;  end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Add the following line to the end of the $APP/config/environment.rb file:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;require_dependency 'lib/mime_responds'&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Then in a controller:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;  respond_to do |wants|&lt;br /&gt;    wants.html&lt;br /&gt;    wants.wml { render :action =&gt; "#{action_name}.wml", :layout =&gt; 'application.wml'}&lt;br /&gt;  end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;That should do it. You can substitute alternate content types and do other funky stuff, but this is at least a starting point.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114362987508955224?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114362987508955224/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114362987508955224' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114362987508955224'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114362987508955224'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/03/rails-11-custom-types-for-respondto.html' title='Rails 1.1 Custom Types for respond_to'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-114050615236986719</id><published>2006-02-20T21:15:00.000-10:00</published><updated>2006-03-13T17:14:39.350-10:00</updated><title type='text'>Meat</title><content type='html'>Very funny...&lt;a href="http://www.terrybisson.com/meat.html"&gt;http://www.terrybisson.com/meat.html&lt;/a&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-114050615236986719?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/114050615236986719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=114050615236986719' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114050615236986719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/114050615236986719'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/02/meat.html' title='Meat'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113961056562069864</id><published>2006-02-10T12:26:00.000-10:00</published><updated>2006-02-10T12:29:25.620-10:00</updated><title type='text'>Let It Snow!</title><content type='html'>&lt;a onblur="try {parent.deselectBloggerImageGracefully();} catch(e) {}" href="http://photos1.blogger.com/blogger/7269/87/1600/snow.jpg"&gt;&lt;img style="float:left; margin:0 10px 10px 0;cursor:pointer; cursor:hand;" src="http://photos1.blogger.com/blogger/7269/87/320/snow.jpg" border="0" alt="" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;br /&gt;It's coming. Here I am, stuck in Washington, D.C. just as the most significant snow storm of the season is arriving. Yay! At least it's the weekend and I don't have to go anywhere in particular.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113961056562069864?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113961056562069864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113961056562069864' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113961056562069864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113961056562069864'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/02/let-it-snow.html' title='Let It Snow!'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113869753969582416</id><published>2006-01-30T22:42:00.000-10:00</published><updated>2006-03-21T20:21:41.706-10:00</updated><title type='text'>Rails Recipe #1 - Adding Items in a HABTM Relationship</title><content type='html'>First recipe in what may turn out to be an ongoing thing.&lt;br /&gt;&lt;br /&gt;If you have a HABTM relationship, say between people and their pets, and you want to assign multiple pets to a person in one shot, then your view would have something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;&lt;%= form_tag :action =&gt; 'add_pet', :id =&gt; @person.id %&gt;&lt;br /&gt;&lt;% @pets.each do |pet| -%&gt;&lt;br /&gt;  &amp;lt;div&amp;gt;&lt;%= check_box_tag 'pet[]', pet.id %&gt;&amp;lt;/div&amp;gt;&lt;br /&gt;&lt;% end -%&gt;&lt;br /&gt;&lt;%= end_form_tag %&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;Your controller would have something like this:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def add_pet&lt;br /&gt;  @person = Person.find(params[:id])&lt;br /&gt;  if request.post?&lt;br /&gt;    Pet.find(params[:pet]).each do |pet|&lt;br /&gt;      @person.pets &lt;&lt; pet&lt;br /&gt;    end&lt;br /&gt;    redirect_to(:action =&gt; 'list_pets', :id =&gt; @person.id)&lt;br /&gt;  end&lt;br /&gt;  @pets = Pet.find(:all).delete_if { |p| @person.pets.include?(p) }&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;When receiving a GET request the action loads the person and a list of pets not already assigned to the person. That last line basically goes through the array returned by Pet.find(:all) and deletes the array item if the expression in the block (@person.pets.include?(p)) returns true.&lt;br /&gt;&lt;br /&gt;When receiving a Post request the action finds all pets which match the supplied ids in the :pet array. That is accomplished by setting the check box name to pet[] which indicates that the HTTP param should be an array filled with all of the checked items from the view. Then it loops through those items and adds each one to @people.pets and finally redirects to some list of the person's pets.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113869753969582416?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113869753969582416/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113869753969582416' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113869753969582416'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113869753969582416'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/rails-recipe-1-adding-items-in-habtm.html' title='Rails Recipe #1 - Adding Items in a HABTM Relationship'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113869691579548110</id><published>2006-01-30T22:40:00.000-10:00</published><updated>2006-01-30T22:41:55.806-10:00</updated><title type='text'>Guy Kawasaki on the Art of Execution</title><content type='html'>If you aren't reading Guy Kawasaki's blog, start now. And if you have problems following through on your ideas, read his post on the &lt;a href="http://blog.guykawasaki.com/2006/01/remember_the_sc.html"&gt;Art of Execution&lt;/a&gt;. Yet another gem in a pile of gems.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113869691579548110?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113869691579548110/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113869691579548110' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113869691579548110'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113869691579548110'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/guy-kawasaki-on-art-of-execution.html' title='Guy Kawasaki on the Art of Execution'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113809252824620440</id><published>2006-01-23T22:22:00.000-10:00</published><updated>2006-12-28T07:14:51.383-10:00</updated><title type='text'>HABTM and Migrations Gotcha</title><content type='html'>If you are using migrations in your Rails apps (and you should) and you are also using has-and-belongs-to-many relationships then there is a gotcha to be aware of. The join tables in a HABTM relationship should *not* include an ID column, however migrations, by default, creates ID columns from all of your tables. Therefore, to avoid this problem, all join tables in HABTM relationships should include :id =&gt; false in the create_table invocation.&lt;br /&gt;&lt;br /&gt;Example:&lt;br /&gt;&lt;pre&gt;create_table :people_pets, :id =&gt; false do |t|&lt;br /&gt; t.column :person_id, :integer, :null =&gt; false&lt;br /&gt; t.column :pet_id, :integer, :null =&gt; false&lt;br /&gt;end&lt;/pre&gt;Good stuff to know.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113809252824620440?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113809252824620440/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113809252824620440' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113809252824620440'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113809252824620440'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/habtm-and-migrations-gotcha.html' title='HABTM and Migrations Gotcha'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113762737894909657</id><published>2006-01-18T13:21:00.000-10:00</published><updated>2006-01-18T13:36:18.960-10:00</updated><title type='text'>File Column for Rails File Uploads</title><content type='html'>There's a nifty little plugin called &lt;a href="http://www.kanthak.net/opensource/file_column/"&gt;File Column&lt;/a&gt; which provides file functionality above and beyond what is built into &lt;a href="http://www.rubyonrails.com/"&gt;Rails&lt;/a&gt;. Some of the features include the ability to store files temporarily to disk in a temp directory, long term storage of the file to disk in a customizable location, storage of the relative path in the DB, helpers for constructing the public URL for the file as well as support for getting absolute file system paths if necessary. It also integrates with ImageMagick through RMagick (although I didn't need this functionality).&lt;br /&gt;&lt;br /&gt;There are a few deficiencies. First of all the documentation is minimal. Figuring out how to do certain things takes looking at the source code. Additionally you cannot get an IO stream directly from the ActiveRecord object. Finally, FileColumn actually adds methods to your ActiveRecord class for accessing paths and such, and that could be a problem for some people (although it wasn't in my case).&lt;br /&gt;&lt;br /&gt;Anyhow, overall it's a good plugin and worth getting if you are doing file uploads in Rails.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113762737894909657?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113762737894909657/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113762737894909657' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113762737894909657'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113762737894909657'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/file-column-for-rails-file-uploads.html' title='File Column for Rails File Uploads'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113729479214456804</id><published>2006-01-14T17:11:00.000-10:00</published><updated>2006-01-14T17:13:12.150-10:00</updated><title type='text'>Article On Questions Posed By Rails Skeptics</title><content type='html'>&lt;a href="http://www.updrift.com/article/questions-ruby-on-rails-skeptics-ask"&gt;Fantastic article&lt;/a&gt; about the common questions posed by Rails skeptics and some basic answers to them. One of the things Rails definitely has is evangelists, but there's a fine reason for that: Rails helps you get the job done with less code and less work and everyone feels good when they get more for less.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113729479214456804?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113729479214456804/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113729479214456804' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113729479214456804'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113729479214456804'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/article-on-questions-posed-by-rails.html' title='Article On Questions Posed By Rails Skeptics'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113711599790527718</id><published>2006-01-12T15:29:00.000-10:00</published><updated>2006-01-13T14:22:45.230-10:00</updated><title type='text'>Constructing Ruby Class Instances from a String</title><content type='html'>OK, little bit of Rubyfoo here:&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;class Person&lt;br /&gt;def say_hello&lt;br /&gt; puts "hello"&lt;br /&gt;end&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;class_name = "Person"&lt;br /&gt;person_class = Object.const_get(class_name)&lt;br /&gt;person = person_class.new&lt;br /&gt;person.say_hello&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;I should spend some more time in the Pickaxe book to try to pick up some more things like this...&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113711599790527718?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113711599790527718/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113711599790527718' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113711599790527718'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113711599790527718'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/constructing-ruby-class-instances-from.html' title='Constructing Ruby Class Instances from a String'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113705067399574518</id><published>2006-01-11T21:16:00.000-10:00</published><updated>2006-01-13T14:22:59.743-10:00</updated><title type='text'>Pecuniarius Has a New Home</title><content type='html'>I moved &lt;a href="http://pecuniari.us/"&gt;Pecuniarius&lt;/a&gt; to a new server tonight and it is running much, much faster thanks to it. It took me about a day to get everything set up but the new server (a Virtual Private Server) has Ruby 1.8.4, Rails 1.0.0, Apache with proxy pass through to Lighttpd, as well as Subversion for hosting the source code. Switchtower deployment is working fine at the moment  but it still feels sketchy. Anyhow, I'm glad to be moved over there and I'm looking forward to improving the app now that it has a better home.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113705067399574518?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113705067399574518/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113705067399574518' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113705067399574518'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113705067399574518'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/pecuniarius-has-new-home.html' title='Pecuniarius Has a New Home'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113701980611122467</id><published>2006-01-11T12:39:00.000-10:00</published><updated>2006-01-13T14:23:59.446-10:00</updated><title type='text'>Switchtower Tidbits</title><content type='html'>Our setup is Apache 2.x on a Linux server. As per my previous post on Switchtower, there are some things which aren't built in. Here are two tasks which appear in my deploy recipes when deploying to the setup described above:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;desc "Restart the web server"&lt;br /&gt;task :restart, :roles =&gt; :app do&lt;br /&gt;sudo "apachectl graceful"&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;task :after_update_code, :roles =&gt; :app do&lt;br /&gt;sudo "chmod a+x #{release_path}/public/dispatch.*"&lt;br /&gt;sudo "chmod -Rf a+x #{release_path}/script/*"&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;The first one replaces the built in restart task with one for apache. The second one chmods the dispatch scripts as well as all of the scripts in the app's script directory. If you are running Lighttpd (either standalone or proxied through Apache) then you don't need the restart task.&lt;span style="font-weight: bold;"&gt;&lt;span style="font-weight: bold;"&gt;&lt;/span&gt;&lt;/span&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113701980611122467?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113701980611122467/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113701980611122467' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113701980611122467'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113701980611122467'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/switchtower-tidbits.html' title='Switchtower Tidbits'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113696258285556251</id><published>2006-01-10T20:32:00.000-10:00</published><updated>2006-01-13T14:26:37.886-10:00</updated><title type='text'>Cyberduck - Wow!</title><content type='html'>&lt;a href="http://cyberduck.ch/"&gt;Cyberduck&lt;/a&gt; is a great little app for OS X. It handles FTP, FTP over SSL and SFTP. The interface is simple and intuitive, it is nicely customizable, and the keychain integration is very cool. Best of all, it's free. I donated 5 EUR to the author.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113696258285556251?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113696258285556251/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113696258285556251' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113696258285556251'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113696258285556251'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/cyberduck-wow.html' title='Cyberduck - Wow!'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113696079300025921</id><published>2006-01-10T20:21:00.000-10:00</published><updated>2006-01-13T14:26:30.773-10:00</updated><title type='text'>Keychain Lovin</title><content type='html'>OK, I'm easily amused, but I really liked the fact that  &lt;a href="http://cyberduck.ch/"&gt;Cyberduck&lt;/a&gt; automatically inserted a password to an account which I had already configured in another application thanks to the fact that account information is stored in Apple's Keychain app. It's the little stuff that counts.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113696079300025921?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113696079300025921/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113696079300025921' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113696079300025921'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113696079300025921'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/keychain-lovin.html' title='Keychain Lovin'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113693664580487426</id><published>2006-01-10T12:21:00.000-10:00</published><updated>2006-01-13T14:28:36.260-10:00</updated><title type='text'>Switchtower Thoughts</title><content type='html'>I just created my first &lt;a href="http://manuals.rubyonrails.com/read/chapter/97"&gt;switchtower&lt;/a&gt; deployment which is actually working. Switchtower is a good idea but it definitely has some areas which need improvement. First of all the documentation is not that great. It's ok if you follow the existing recipe exactly, but as soon as things start to fall apart it is quite difficult to find information on how to do things the right way. Case in point: if you want to execute one of your tasks defined in deploy.rb you must use the following syntax:&lt;br /&gt;&lt;br /&gt;rake remote_exec ACTION=mytask&lt;br /&gt;&lt;br /&gt;Not exactly intuitive, and its not explicitly stated in the documentation on the wiki. Initially I tried the following:&lt;br /&gt;&lt;br /&gt;rake mytask&lt;br /&gt;&lt;br /&gt;But was told that Rake didn't know about mytask. To make matters worse, the Rake documentation site at http://docs.rubyrake.org/ comes up with a Rails Application Error message. Oops.&lt;br /&gt;&lt;br /&gt;Next concern is that you have to have your repository available from your deployment machine. In my company there are a lot of times where this is not possible. There needs to be some sort of solution which allows the Rails app to be packaged up on the local machine and then installed on the remote machine. Perhaps an actual install builder which would be able to execute the same tasks when on the deployment machine might be a good solution. This would also help with Windows deployment...which brings me to another issue: you can't use Switchtower to deploy to Windows.&lt;br /&gt;&lt;br /&gt;Ouch, no Windows deployment. This is a bummer and looks like it will be much more difficult to fix. The key here is to remove dependencies on POSIX commands (such as chmod) and instead use Ruby equivilents with graceful failure when those commands can't be executed (or don't need to be executed). This is what I did with &lt;a href="http://pyb.sf.net/"&gt;Pyb&lt;/a&gt; back in the days, and what &lt;a href="http://ant.apache.org/"&gt;Ant&lt;/a&gt; does, and its the only way to really deal with cross-platform builds.&lt;br /&gt;&lt;br /&gt;Another problem occurs when deploying &lt;span style="font-weight: bold;"&gt;from&lt;/span&gt; Windows to a *nix environment. Ruby paths are not the same on different platforms and basically things go bonkers when you take a Rails app authored in Windows and deploy it to a *nix system. This really should be easy to fix, perhaps by determining the platform and then having a task alter the scripts as needed. The same goes for chmodding the CGI and FCGI scripts - this should be done automatically as part of a build.&lt;br /&gt;&lt;br /&gt;Anyhow, like I said, the ideas behind Switchtower are good, and I'm glad to see thought being put into the problem of deployment, but there is clearly more work to be done.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113693664580487426?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113693664580487426/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113693664580487426' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113693664580487426'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113693664580487426'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/switchtower-thoughts.html' title='Switchtower Thoughts'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113687970970903223</id><published>2006-01-09T21:54:00.000-10:00</published><updated>2006-01-13T14:29:00.000-10:00</updated><title type='text'>Pecuniarius Update</title><content type='html'>New Pecuniarius code went up tonight! Yay! &lt;a href="http://pecuniari.us/"&gt;Go get ya some&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113687970970903223?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113687970970903223/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113687970970903223' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113687970970903223'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113687970970903223'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/pecuniarius-update.html' title='Pecuniarius Update'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113682521883717777</id><published>2006-01-09T06:38:00.000-10:00</published><updated>2006-01-13T14:29:09.183-10:00</updated><title type='text'>Ruby on OS X</title><content type='html'>I originally installed Ruby on OS X using Darwin ports. Unfortunately that installs Ruby 1.8.2 with OpenSSL 0.9.8 and this results in a broken net module. There is &lt;a href="http://hivelogic.com/articles/2005/12/01/ruby_rails_lighttpd_mysql_tiger"&gt;a good article&lt;/a&gt; from the Hivelogic Narrative which covers installing ruby, rails, lighttpd and mysql on OS X. I walked through that yesterday and it worked perfectly, so now I have ruby 1.84, openssl 0.9.8, rails 1.0 and lighttpd running on my OS X box.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113682521883717777?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113682521883717777/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113682521883717777' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113682521883717777'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113682521883717777'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/ruby-on-os-x.html' title='Ruby on OS X'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113678017308991768</id><published>2006-01-08T18:06:00.000-10:00</published><updated>2006-01-13T14:17:04.096-10:00</updated><title type='text'>Sanitizing Form Data</title><content type='html'>I love &lt;a href="http://jjinux.blogspot.com/"&gt;JJ&lt;/a&gt; because I give him something which works and he quickly pokes it so full of holes that it would sink if placed in water. The particular issue at hand is sanitizing incoming form data. Put simply, I wasn't doing it for Pecuniarius and now I am. The fix was actually quite simple. I created two methods in my application controller which handle the sanitizing:&lt;br /&gt;&lt;pre&gt;&lt;br /&gt;def sanitize_params&lt;br /&gt; sanitize_hash(@params)&lt;br /&gt;end&lt;br /&gt;&lt;br /&gt;def sanitize_hash(hash)&lt;br /&gt; hash.each do |key, value|&lt;br /&gt;   if value.kind_of? Hash&lt;br /&gt;     sanitize_hash(value)&lt;br /&gt;   elsif value.kind_of? Array&lt;br /&gt;     hash[key] = value.collect {|x| sanitize(x)}&lt;br /&gt;   else&lt;br /&gt;     logger.info("Sanitizing #{key}")&lt;br /&gt;     hash[key] = sanitize(value)&lt;br /&gt;     logger.info("After sanitize: #{hash[key]}")&lt;br /&gt;   end&lt;br /&gt; end&lt;br /&gt;end&lt;br /&gt;&lt;/pre&gt;Then in any controller which has user input I added the following filter:&lt;br /&gt;&lt;pre&gt;  before_filter :sanitize_params&lt;br /&gt;&lt;/pre&gt;Et, voila! The sanitize_params method calls the sanitize_hash method passing the paramters. The sanitize_hash method will then handle nested hashes, arrays or plain values. One minor addition which I might add in the future  is the ability to omit certain parameters from sanitizing, but at the moment that isn't a necessity. Feedback is always welcome. If you are doing this in a different fashion then I'd love to hear about it.&lt;br /&gt;&lt;br /&gt;P.S. Another good blog entry on handling form data this can be found in the &lt;a href="http://www.railsdiary.com/diary/validation_securing_form_input"&gt;Rails Diary&lt;/a&gt;.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113678017308991768?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113678017308991768/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113678017308991768' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113678017308991768'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113678017308991768'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/sanitizing-form-data.html' title='Sanitizing Form Data'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113658040937663517</id><published>2006-01-06T09:45:00.000-10:00</published><updated>2006-01-13T14:29:30.120-10:00</updated><title type='text'>Deploying Rails with Apache 2</title><content type='html'>James Duncan Davidson has published his &lt;a href="http://duncandavidson.com/essay/2006/01/railsonapache"&gt;4th article&lt;/a&gt; on real-world deployment issues with Rails. The first three articles have been very informative and I am looking forward to reading number 4 this evening.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113658040937663517?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113658040937663517/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113658040937663517' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113658040937663517'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113658040937663517'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/deploying-rails-with-apache-2.html' title='Deploying Rails with Apache 2'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113656832566234611</id><published>2006-01-06T07:15:00.000-10:00</published><updated>2006-01-13T14:30:11.476-10:00</updated><title type='text'>Rails Webapps for Review</title><content type='html'>Here a few webapps from the wiki list at &lt;a href="http://wiki.rubyonrails.com/"&gt;wiki.rubyonrails.com&lt;/a&gt; which look interesting:&lt;br /&gt;&lt;ul&gt;&lt;li&gt;&lt;a href="http://www.calendarhub.com/"&gt;CalendarHub&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://www.chainreading.com/"&gt;Chain Reading&lt;/a&gt;&lt;/li&gt;&lt;li&gt;&lt;a href="http://numsum.com/"&gt;NumSum&lt;/a&gt;&lt;/li&gt;&lt;/ul&gt;I've looked at NumSum in the past, but I suppose it's a good time to look again. Chain Reading may provide a good way to track the books I've read and get ideas for new ones (this is something I was talking about with my wife and parents and all of them were interested in having something like this). CalendarHub is something I looked at before as well, but calendering is becoming more and more important as I travel more.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113656832566234611?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113656832566234611/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113656832566234611' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113656832566234611'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113656832566234611'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/rails-webapps-for-review.html' title='Rails Webapps for Review'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113652715548237067</id><published>2006-01-05T19:42:00.000-10:00</published><updated>2006-01-13T14:30:37.550-10:00</updated><title type='text'>TPOSSCON 2006</title><content type='html'>&lt;a href="http://www.tposscon.org/"&gt;TPOSSCON&lt;/a&gt; 2006 starts on January 9th and runs to January 12th here in Hawaii at the Honolulu Convention Center. I went to this conference and while it was small it was still well organized and provided a good networking opportunity. This year a recent transplant, Scott Thompson has arranged to demo Ruby and Ruby on Rails in the "petting zoo" which should be interesting.  Jim Thompson (no relation to scott as far as I know) of NetGate (a maker of wireless chips) will also be speaking. Jim is a great guy and is very passionate about technology, so it should be a good presentation. I'll probably end up only going one day, but stop by the Rails demo and perhaps we will meet up.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113652715548237067?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113652715548237067/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113652715548237067' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113652715548237067'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113652715548237067'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/tposscon-2006.html' title='TPOSSCON 2006'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-20604647.post-113652478927433880</id><published>2006-01-05T19:14:00.000-10:00</published><updated>2006-01-13T14:30:48.183-10:00</updated><title type='text'>New Blog</title><content type='html'>Ah, it's that time again, time to start a new blog. I'm fed up with dealing with hosting my own blog, so this time around I'm going to just host at blogger. Topics of writing will revolve around software development, most likely with Ruby and Rails (since that is where my focus is at the moment.) From time to time I may even dip into Java (although it is soooo 2004). I'll also pimp my projects like &lt;a href="http://pecuniari.us/"&gt;Pecuniari.us&lt;/a&gt;,  personal finance manager. Let the good times roll.&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/20604647-113652478927433880?l=programming-in-paradise.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://programming-in-paradise.blogspot.com/feeds/113652478927433880/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=20604647&amp;postID=113652478927433880' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113652478927433880'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/20604647/posts/default/113652478927433880'/><link rel='alternate' type='text/html' href='http://programming-in-paradise.blogspot.com/2006/01/new-blog.html' title='New Blog'/><author><name>Anthony</name><uri>http://www.blogger.com/profile/15509319178481467493</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='16' height='16' src='http://img2.blogblog.com/img/b16-rounded.gif'/></author><thr:total>0</thr:total></entry></feed>
