<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/">
  <channel>
    <title>Phil Burrows, Ruby on Rails Web Developer</title>
    <link>http://blog.philburrows.com/rss/</link>
    <language>en-us</language>
    <ttl>40</ttl>
    <description>Blog feed for blog.philburrows.com, written by Phil Burrows, Ruby on Rails Web Developer</description>
    
    
        <item>
          <title>Designing and Printing the Burrows + Gaskill Letterpress Invitations</title>
          <description>
             &lt;p&gt;I&amp;#8217;ve had a letterpress for a couple years now; I absolutely love the thing, but rarely do I get the opportunity to put it to good use. Luckily, I&amp;#8217;ve got four siblings, and [thusfar] they&amp;#8217;ve all asked me to (or I&amp;#8217;ve convinced them to let me) design and print their wedding invitations.&lt;/p&gt;
             &lt;div id=&quot;outer_wrapper&quot;&gt;
	&lt;h1 id=&quot;headline&quot;&gt;Designing the Burrows + Gaskill Letterpress Invitations&lt;/h1&gt;
	&lt;div class=&quot;article&quot;&gt;

		&lt;div class=&quot;section&quot; id=&quot;intro&quot;&gt; 
			&lt;p class=&quot;first&quot;&gt;
				I've had a letterpress for a couple years now; I absolutely love the thing, but rarely do I get the opportunity to put it to good use.
				Luckily, I've got four siblings, and [thusfar] they've all asked me to (or I've convinced them to let me) design and print their wedding invitations.
			&lt;/p&gt;
			&lt;p&gt;
				The process of designing something for the most important day of someones life is a bit daunting in and of itself, but that task becomes
				even more so when that &quot;someone&quot; just happens to be a member of your family. In such situations, a part of me thinks: &lt;q class=&quot;pull&quot;&gt;Gosh, if these don't look good or
				I screw this up, I'm gonna hear about it for the rest of my life.&lt;/q&gt;
			&lt;/p&gt;
			&lt;p&gt;
				Maybe I'm being a bit dramatic, but I take this stuff kind of seriously.
				And there's always (no matter what the project) a little part of me that wonders if I can produce something I'll actually be proud of &amp;mdash;
				something that I &lt;em&gt;know&lt;/em&gt; others will think is as good as I think it is. That kind of worry occasionally weighs heavy on my mind,
				and I think it might have been a bit of a hindrance in the early stages of this process. Let me explain&amp;hellip;
			&lt;/p&gt;
		&lt;/div&gt;
		&lt;div class=&quot;section&quot; id=&quot;beginning&quot;&gt;
			&lt;h2&gt;Frustrating Beginnings&lt;/h2&gt;
			&lt;p&gt;
				When the time came to begin work on my sister's invitations, I was eager but a bit hesitant; it took me a while to get fully motivated to begin,
				because nothing spectacular was coming to mind &amp;mdash; everything I created in Illustrator or Photoshop looked awful, and no amount of pixel-pushing
				seemed to help. Normally, when a design doesn't seem to be working, brute force over a period of time &amp;mdash; trying every different thing I can think of &amp;mdash;
				eventually seems to get it to a point I'm satisfied with, but that just wasn't happening this time.
			&lt;/p&gt;
			&lt;p&gt;
				I went through half-a-dozen different mockups, and each new one was just as bad as the ones before. I wasted countless hours (days, really) on things that I hated.
				I'm pretty opinionated about design &amp;mdash; either I love it or I hate it &amp;mdash; and, I &lt;em&gt;hated&lt;/em&gt; everything I produced.
			&lt;/p&gt;
			&lt;p&gt;
				Running out of time, I finally decided to begin work on something completely different than anything I had mocked-up to that point:
				a hand-drawn, flowery design. Things started out promisingly, but after finishing it up, I decided I hated it.
				It was unoriginal, rough and not very &quot;wedding-y&quot; for lack of a better word.
				Another two days wasted. This was, by far, the most frustrating design process I had been through in a long time (of course,
				the fact that I don't design nearly as often as I used to (or would like to) probably contributed to this).
			&lt;/p&gt;
			&lt;p&gt;
				After days of tedious failures, something finally clicked, and I had an idea.
			&lt;/p&gt;
		&lt;/div&gt;
		&lt;div class=&quot;section&quot; id=&quot;ah-ha&quot;&gt;
			&lt;h2&gt;A Breakthrough &lt;small&gt;(&amp;nbsp;&lt;acronym title=&quot;Also Known As&quot;&gt;AKA&lt;/acronym&gt;: Freaking-A, Finally! &lt;small&gt;~or~&lt;/small&gt; It's About Time&amp;nbsp;)&lt;/small&gt;&lt;/h2&gt;
			&lt;p&gt;
				The lightbulb finally came on around 11:30pm, two days before I needed to have the design completed. Knowing it could be awesome if done right,
				but horrible if not perfected, I needed to get approval from the sis before I moved forward. I quickly sketched something up and showed it to her.
				This was the initial sketch that she said &quot;yes&quot; to:
			&lt;/p&gt;
			&lt;img class=&quot;full&quot; src=&quot;/page_attachments/0000/0029/sketch.jpg&quot; title=&quot;the rough sketch that my sister approved&quot;&gt;&lt;/img&gt;
			&lt;p&gt;
				Looking back on that sketch, I have absolutely no idea why she said yes. I must have talked her into it (I did my best to convince her it would look much better
				when completed), but that sketch is awful. If the final invitations would have turned out looking like that, I would have been a little embarrassed.
				Luckily, Emily trusted me, and I began moving forward with new motivation and exuberance.
			&lt;/p&gt;
		&lt;/div&gt;
		&lt;div class=&quot;section rant&quot;&gt;
			&lt;h2&gt;Long Hours&lt;/h2&gt;
			&lt;p&gt;
				I've always believed that, if given enough time, I can do anything &amp;mdash; I can perfect anything. I think to be brilliant at something, you &lt;em&gt;have to&lt;/em&gt; have that kind of confidence.
				Confidence not just in your abilities, but confidence in your work-ethic and perseverance &lt;span class=&quot;amp&quot;&gt;&amp;amp;&lt;/span&gt; persistence.
				You have to be willing to out work everyone else; you have to understand that perfection and greatness in something come with absolute hard work, and nothing less.
				Call it cockiness, call it whatever you want, but I think it's absolutely necessary if you're going to achieve great things.
			&lt;div class=&quot;aside&quot;&gt;
				&lt;p&gt;
					&lt;em&gt;A bit of an aside:&lt;/em&gt; John Nunemaker (of &lt;a href=&quot;http://railstips.org&quot;&gt;RailsTips&lt;/a&gt; &lt;span class=&quot;amp&quot;&gt;&amp;amp;&lt;/span&gt; &lt;a href=&quot;http://mongomapper.com&quot;&gt;MongoMapper&lt;/a&gt; fame) has a
					&lt;a href=&quot;http://railstips.org/blog/archives/2010/01/12/i-have-no-talent/&quot; title=&quot;I have no talent&quot;&gt;great article&lt;/a&gt; (and a &lt;a href=&quot;http://railstips.org/blog/archives/2010/04/18/i-have-no-talent-redux/&quot; title=&quot;I have no talent (redux)&quot;&gt;follow-up&lt;/a&gt;) that talks about
					the importance of hard work and how &quot;talent&quot; doesn't really matter if you have perseverance.
					When you're finished reading my article, you may want to head over there for a more complete thought on this side-topic.
				&lt;/p&gt;
			&lt;/div&gt;
			&lt;p&gt;
				The problem I had with these invitations was that I wasn't sure I had &quot;enough time&quot; to perfect them. Getting things right was going to take quite a while,
				and I was just going to have to make time &amp;mdash; so that's what I did. I went to work immediately, and two &lt;em&gt;long&lt;/em&gt; nights later, this is what I had:
			&lt;/p&gt;
			&lt;img src=&quot;/page_attachments/0000/0011/artwork.png&quot; alt=&quot;Emily + Jarred&quot;&gt;&lt;/img&gt;
			&lt;p&gt;
				Something I could be proud of. I was proud of both the effort I put into it and the final outcome. But my favorite part about it is something most people probably
				won't even notice: the peacocks. See, Emily's wedding colors are &quot;peacock colors&quot; (genius, really), and most everything she's done for the wedding has had some sort
				of peacock connection. I was able to pull four peacocks into the design. Check it out:
			&lt;/p&gt;
			&lt;img src=&quot;/page_attachments/0000/0009/artwork_highlighted.jpg&quot; alt=&quot;Emily + Jarred with peacocks&quot;&gt;&lt;/img&gt;
			&lt;p&gt;
				And the artwork for the RSVPs was more of the same (notice the more obvious peacock on the top of the &quot;R&quot;):
			&lt;/p&gt;
			&lt;img src=&quot;/page_attachments/0000/0023/rsvp_artwork.png&quot; alt=&quot;RSVP&quot;&gt;&lt;/img&gt;
		&lt;/div&gt;
		
		&lt;div class=&quot;section&quot;&gt;
			&lt;h2&gt;The Payoff&lt;/h2&gt;
			&lt;p&gt;Finally, it was printing time. And rather than continue to rant about this thing, I'm just going to show you in pictures how they turned out. Letterpressed with love. Enjoy.&lt;/p&gt;
			&lt;img src=&quot;/page_attachments/0000/0021/invite.jpg&quot;&gt;&lt;/img&gt;
			&lt;img src=&quot;/page_attachments/0000/0019/invite_inside.jpg&quot;&gt;&lt;/img&gt;
			&lt;img src=&quot;/page_attachments/0000/0027/rsvp.jpg&quot;&gt;&lt;/img&gt;
			&lt;img src=&quot;/page_attachments/0000/0017/invite_close.jpg&quot;&gt;&lt;/img&gt;
			&lt;img src=&quot;/page_attachments/0000/0025/rsvp_close.jpg&quot;&gt;&lt;/img&gt;
			&lt;img src=&quot;/page_attachments/0000/0007/all.jpg&quot;&gt;&lt;/img&gt;
     &lt;p&gt;If you want to see more pictures of the invitations and RSVPs, there's a Flickr set up &lt;a href=&quot;http://www.flickr.com/photos/peburrows/sets/72157623738301305/&quot; title=&quot;Flickr set of Emily + Jarred invitations&quot;&gt;here&lt;/a&gt;.&lt;/p&gt;
		&lt;/div&gt;

		&lt;div class=&quot;section&quot; id=&quot;contact_me&quot;&gt;
			&lt;h2&gt;Need Invitations?&lt;/h2&gt;
			&lt;p&gt;
				If you're looking for custom wedding invitations, save-the-dates, baby announcements or &lt;em&gt;anything&lt;/em&gt; else, I'm currently available for hire;
				you name it, I'd be happy to help. Send me an email at &lt;a href=&quot;mailto:design@philburrows.com&quot;&gt;design@philburrows.com&lt;/a&gt;,
				and we can discuss the details of your project.
			&lt;/p&gt;
		&lt;/div&gt;
		
		&lt;div class=&quot;aside&quot;&gt;
			&lt;p class=&quot;byline&quot;&gt;
				Posted by &lt;a href=&quot;http://blog.philburrows.com&quot;&gt;Phil Burrows&lt;/a&gt; on April 29th, 2010.
			&lt;/p&gt;
		&lt;/div&gt;
	&lt;/div&gt; &lt;!-- .article --&gt;
	&lt;div id=&quot;comments_wrapper&quot;&gt;
&lt;div id=&quot;comment_wrapper&quot;&gt;

  &lt;h3 class=&quot;comment_heading&quot;&gt;Comments&lt;/h3&gt;
  &lt;ol id=&quot;comments&quot;&gt;
    
      
  &lt;li class=&quot;comment clear&quot; id=&quot;comment-3860&quot;&gt;
    &lt;div class=&quot;meta&quot;&gt;
      &lt;span class=&quot;author&quot;&gt;Robert&lt;/span&gt;
      &lt;small class=&quot;date&quot;&gt;Monday, May 03, 2010&lt;/small&gt;
    &lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
      &lt;p&gt;VERY Cool Phil...&lt;/p&gt;
    &lt;/div&gt;
    
  &lt;/li&gt;

    
      
  &lt;li class=&quot;comment clear&quot; id=&quot;comment-3876&quot;&gt;
    &lt;div class=&quot;meta&quot;&gt;
      &lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;http://ge.la.to&quot; title=&quot;Visit Steve Odom's website&quot; class=&quot;author_url&quot;&gt;Steve Odom&lt;/a&gt;&lt;/span&gt;
      &lt;small class=&quot;date&quot;&gt;Wednesday, May 05, 2010&lt;/small&gt;
    &lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
      &lt;p&gt;Wow, these are really good looking.&lt;/p&gt;
    &lt;/div&gt;
    
  &lt;/li&gt;

    
      
  &lt;li class=&quot;comment clear&quot; id=&quot;comment-4367&quot;&gt;
    &lt;div class=&quot;meta&quot;&gt;
      &lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;http://patdryburgh.com&quot; title=&quot;Visit Pat's website&quot; class=&quot;author_url&quot;&gt;Pat&lt;/a&gt;&lt;/span&gt;
      &lt;small class=&quot;date&quot;&gt;Thursday, May 27, 2010&lt;/small&gt;
    &lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
      &lt;p&gt;Found this on Dribbble, and wow… what you came up with is breathtaking. Great work! I bet they look even better in person.&lt;/p&gt;
    &lt;/div&gt;
    
  &lt;/li&gt;

    
      
  &lt;li class=&quot;comment clear&quot; id=&quot;comment-15166&quot;&gt;
    &lt;div class=&quot;meta&quot;&gt;
      &lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;http://www.mjritsolutions.com &quot; title=&quot;Visit  Cary IT Consulting	's website&quot; class=&quot;author_url&quot;&gt; Cary IT Consulting	&lt;/a&gt;&lt;/span&gt;
      &lt;small class=&quot;date&quot;&gt;Tuesday, May 17, 2011&lt;/small&gt;
    &lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
      &lt;p&gt;Wow this is great! Its like you just made some scribbles and out comes a work of art. Where do you artists, designers get your ideas from? Or, is it just pure natural talent.&lt;/p&gt;
    &lt;/div&gt;
    
  &lt;/li&gt;

    
      
  &lt;li class=&quot;comment clear&quot; id=&quot;comment-24606&quot;&gt;
    &lt;div class=&quot;meta&quot;&gt;
      &lt;span class=&quot;author&quot;&gt;&lt;a href=&quot;http://www.tomlojohnson.com&quot; title=&quot;Visit Thomas &quot;Tom&quot; Johnson's website&quot; class=&quot;author_url&quot;&gt;Thomas &quot;Tom&quot; Johnson&lt;/a&gt;&lt;/span&gt;
      &lt;small class=&quot;date&quot;&gt;Wednesday, October 05, 2011&lt;/small&gt;
    &lt;/div&gt;
    &lt;div class=&quot;content&quot;&gt;
      &lt;p&gt;Nice one Phil, nice one.&lt;/p&gt;
    &lt;/div&gt;
    
  &lt;/li&gt;

    
  &lt;/ol&gt;



  


&lt;/div&gt;
	&lt;/div&gt;
&lt;/div&gt;
          </description>
          <pubDate>Thu, 29 Apr 2010 16:59:57 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2010/04/29/designing-and-printing-the-burrows-gaskill-letterpress-invitations/</guid>
          <link>http://blog.philburrows.com/articles/2010/04/29/designing-and-printing-the-burrows-gaskill-letterpress-invitations/</link>
        </item>
    
        <item>
          <title>my charity: water campaign</title>
          <description>
             &lt;p&gt;Please go to &lt;a href=&quot;http://mycharitywater.org/phil26&quot;&gt;http://mycharitywater.org/phil26&lt;/a&gt; and help raise money for people who are suffering without clean water.&lt;/p&gt;
             &lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;EDIT&lt;/span&gt;:&lt;/strong&gt;&lt;br /&gt;
I&amp;#8217;ve just made a decision about my commitment to this campaign. And it goes a little something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
Donations.all.each do |d|
  @phil.donations.create(:amount =&amp;gt; d.amount) if @campaign.total &amp;lt; @campaign.goal
end

# translation: **I'll match all donations**
# until we reach the $1000 campaign goal
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;On March 12, 2010 I&amp;#8217;m turning 26.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s be honest: most of you reading this wouldn&amp;#8217;t normally buy me a birthday present (and I wouldn&amp;#8217;t expect you to). But this year, I&amp;#8217;m trying something different for my birthday, and I&amp;#8217;m hoping maybe you will try something different as well.&lt;/p&gt;
&lt;p&gt;A billion people in the world are living without clean water. Millions contract deadly diseases from contaminated water. 45,000 people will die this week alone. The lucky ones won&amp;#8217;t, but still walk hours each day to get dirty water to give to their families.&lt;/p&gt;
&lt;p&gt;So, this year, instead of asking for gifts for myself &amp;#8211; things I don&amp;#8217;t need, things I won&amp;#8217;t use, things that won&amp;#8217;t help anyone &amp;#8211; I&amp;#8217;ve decided to give up my birthday to help people who actually &lt;span class=&quot;caps&quot;&gt;NEED&lt;/span&gt; it. I&amp;#8217;m asking for $26 or more from everyone I know, and people I don&amp;#8217;t know. It&amp;#8217;s not going to me, though. &lt;strong&gt;&lt;em&gt;All&lt;/em&gt;&lt;/strong&gt; of it is going to build freshwater wells for people in developing nations.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve donated and plan on continuing to donate throughout the year. Please join me by visiting &lt;a href=&quot;http://mycharitywater.org/phil26&quot;&gt;my birthday campaign page&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Thank you in advance for &lt;strong&gt;&lt;em&gt;any&lt;/em&gt;&lt;/strong&gt; amount you can donate to give clean and safe drinking water to some of the billion living without it.&lt;/p&gt;
&lt;p&gt;&lt;small&gt;please note: Because of charity: water&amp;#8217;s unique model, 100% of all donations go directly to direct water projects costs, and each donation is &amp;#8220;proved&amp;#8221; and tracked to the village it helped when projects are complete.&lt;/small&gt;&lt;/p&gt;
          </description>
          <pubDate>Fri, 26 Feb 2010 12:47:49 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2010/02/26/my-charity-water-campaign/</guid>
          <link>http://blog.philburrows.com/articles/2010/02/26/my-charity-water-campaign/</link>
        </item>
    
        <item>
          <title>New Christmas EP from The Merry Gentlemen's Club</title>
          <description>
             
             &lt;p&gt;I now present you with the &lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;NEW&lt;/span&gt;&lt;/strong&gt; Christmas EP (&lt;a href=&quot;http://themerrygentlemensclub.bandcamp.com&quot;&gt; here&lt;/a&gt;) from my holiday band, &lt;a href=&quot;http://themerrygentlemensclub.bandcamp.com&quot;&gt;The Merry Gentlemen&amp;#8217;s Club&lt;/a&gt;!! Enjoy!&lt;/p&gt;
&lt;p&gt;&lt;object classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; width=&quot;400&quot; height=&quot;100&quot; &gt;&lt;param name=&quot;movie&quot; value=&quot;http://bandcamp.com/EmbeddedPlayer.swf/album=1256032924/size=venti/bgcol=FFFFFF/linkcol=a280ac/&quot; /&gt;&lt;param name=&quot;quality&quot; value=&quot;high&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;never&quot; /&gt;&lt;param name=&quot;allowNetworking&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#FFFFFF&quot; /&gt;&amp;lt;embed src=&amp;#8220;http://bandcamp.com/EmbeddedPlayer.swf/album=1256032924/size=venti/bgcol=&lt;span class=&quot;caps&quot;&gt;FFFFFF&lt;/span&gt;/linkcol=a280ac/&amp;#8221; width=&amp;#8220;400&amp;#8221; height=&amp;#8220;100&amp;#8221; type=&amp;#8220;application/x-shockwave-flash&amp;#8221; pluginspage=&amp;#8220;http://www.macromedia.com/go/getflashplayer&amp;#8221; quality=high allowScriptAccess=never allowNetworking=always bgcolor=#&lt;span class=&quot;caps&quot;&gt;FFFFFF&lt;/span&gt; &amp;gt;&lt;/embed&gt;&lt;noembed&gt;&lt;a href=&quot;http://themerrygentlemensclub.bandcamp.com/album/untitled&quot;&gt;Carol of the Banjos by The Merry Gentlemen&amp;#8217;s Club&lt;/a&gt;&lt;/noembed&gt;&lt;/object&gt;&lt;/p&gt;
          </description>
          <pubDate>Wed, 16 Dec 2009 19:37:10 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/12/16/new-christmas-ep-from-the-merry-gentlemens-club/</guid>
          <link>http://blog.philburrows.com/articles/2009/12/16/new-christmas-ep-from-the-merry-gentlemens-club/</link>
        </item>
    
        <item>
          <title>The Merry Gentlemen's Club - New Song (Lover's Choral)</title>
          <description>
             
             &lt;p&gt;Uhm, it&amp;#8217;s Christmas time, which means new music from &lt;a href=&quot;http://themerrygentlemensclub.bandcamp.com/&quot; title=&quot;The Merry Gentlemen's Club on bandcamp.com&quot;&gt;The Merry Gentlemen&amp;#8217;s Club&lt;/a&gt; (me and Josh Hollis). Enjoy the first song from the upcoming EP:&lt;/p&gt;
&lt;p&gt;&lt;object classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot; width=&quot;400&quot; height=&quot;100&quot; &gt;&lt;param name=&quot;movie&quot; value=&quot;http://bandcamp.com/EmbeddedPlayer.swf/track=2055048043/size=venti/bgcol=ffffff/linkcol=787878/&quot; /&gt;&lt;param name=&quot;quality&quot; value=&quot;high&quot; /&gt;&lt;param name=&quot;allowScriptAccess&quot; value=&quot;never&quot; /&gt;&lt;param name=&quot;allowNetworking&quot; value=&quot;always&quot; /&gt;&lt;param name=&quot;bgcolor&quot; value=&quot;#ffffff&quot; /&gt;&amp;lt;embed src=&amp;#8220;http://bandcamp.com/EmbeddedPlayer.swf/track=2055048043/size=venti/bgcol=ffffff/linkcol=787878/&amp;#8221; width=&amp;#8220;400&amp;#8221; height=&amp;#8220;100&amp;#8221; type=&amp;#8220;application/x-shockwave-flash&amp;#8221; pluginspage=&amp;#8220;http://www.macromedia.com/go/getflashplayer&amp;#8221; quality=high allowScriptAccess=never allowNetworking=always bgcolor=#ffffff &amp;gt;&lt;/embed&gt;&lt;noembed&gt;&lt;a href=&quot;http://themerrygentlemensclub.bandcamp.com/track/lovers-choral-feat-sam-cheatham&quot;&gt;Lover&amp;#8217;s Choral (feat. Sam Cheatham) by The Merry Gentlemen&amp;#8217;s Club&lt;/a&gt;&lt;/noembed&gt;&lt;/object&gt;&lt;/p&gt;
          </description>
          <pubDate>Fri, 11 Dec 2009 14:50:50 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/12/11/the-merry-gentlemens-club---new-song-lovers-choral/</guid>
          <link>http://blog.philburrows.com/articles/2009/12/11/the-merry-gentlemens-club---new-song-lovers-choral/</link>
        </item>
    
        <item>
          <title>Daily Design - Explosions In The Sky</title>
          <description>
             
             &lt;p&gt;As promised, my latest daily design foray into motion graphics: all with &lt;a href=&quot;http://webkit.org/blog/138/css-animation/&quot;&gt;Webkit &lt;acronym title=&quot;Cascading Stylesheets&quot;&gt;&lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;&lt;/acronym&gt; Transitions&lt;/a&gt;.&lt;/p&gt;
&lt;div class=&quot;img_wrapper&quot;&gt;
&lt;p&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; width=&quot;400&quot; height=&quot;240&quot; data=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot;&gt; &lt;param name=&quot;flashvars&quot; value=&quot;intl_lang=en-us&amp;photo_secret=a98896f749&amp;photo_id=3966334407&quot;&gt;&lt;/param&gt; &lt;param name=&quot;movie&quot; value=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot;&gt;&lt;/param&gt; &lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot;&gt;&lt;/param&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot; bgcolor=&quot;#000000&quot; allowfullscreen=&quot;true&quot; flashvars=&quot;intl_lang=en-us&amp;photo_secret=a98896f749&amp;photo_id=3966334407&quot; height=&quot;240&quot; width=&quot;400&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caption&quot;&gt;&lt;strong&gt;28 September 2009&lt;/strong&gt; &amp;#8211; &amp;#8220;Explosions In The Sky&amp;#8221; by peburrows, on Flickr&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
          </description>
          <pubDate>Tue, 29 Sep 2009 15:18:52 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/09/29/daily-design-explosions-in-the-sky/</guid>
          <link>http://blog.philburrows.com/articles/2009/09/29/daily-design-explosions-in-the-sky/</link>
        </item>
    
        <item>
          <title>Rails Logging With MongoDB</title>
          <description>
             I've been playing with MongoDB a bit lately, and have been pretty impressed both with its simplicity and usefulness. There seem to be quite a few uses for a document-oriented &lt;acronym title=&quot;database&quot;&gt;DB&lt;/acronym&gt;, and, as the MongoDB team &lt;a href=&quot;http://blog.mongodb.org/post/172254834/mongodb-is-fantastic-for-logging&quot;&gt;mentioned on their blog&lt;/a&gt;, logging is one of those things that MongoDB is perfectly suited for.
             &lt;p&gt;&lt;small&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;EDIT&lt;/span&gt;:&lt;/strong&gt; 9/28/2009 I&amp;#8217;ve fixed the Github repo link&lt;/small&gt;&lt;/p&gt;
&lt;p&gt;Log files can be kind of a pain to peruse in the first place, but things become especially annoying when you&amp;#8217;ve got multiple servers on which your app is running, and you have to tail / grep multiple Rails logs just to find a single request. Not only that, but there&amp;#8217;s no concept of a &amp;#8220;request record&amp;#8221; in a flat text file, it&amp;#8217;s just a stream of log messages, one after the other. &lt;span class=&quot;caps&quot;&gt;AND&lt;/span&gt;, if (in the case of Rails) you&amp;#8217;re running multiple mongrels (which you probably are), all of which are logging to that single log file, then things become even more frustrating as request messages can potentially be intertwined with each other. I can tell you from experience, grep-ing a bunch of &lt;span class=&quot;caps&quot;&gt;HUGE&lt;/span&gt; log files in an attempt to find a single request can be a bit of a nightmare.&lt;/p&gt;
&lt;p&gt;Enter MongoDB.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not going to spend too much time in this post going into the details of Mongo &amp;#8211; that&amp;#8217;s what &lt;a href=&quot;http://mongodb.org&quot;&gt;their website&lt;/a&gt; is for. And, there are also &lt;a href=&quot;http://www.engineyard.com/blog/2009/mongodb-a-light-in-the-darkness-key-value-stores-part-5/&quot; title=&quot;Engine Yard blog post: MongoDB, A Light In The Darkness Of Key-Value Stores&quot;&gt;plenty&lt;/a&gt; of introductory &lt;a href=&quot;http://www.rubyinside.com/getting-started-mongodb-ruby-1875.html&quot; title=&quot;Ruby Inside: Getting Started With MongoDB and Ruby&quot;&gt;articles&lt;/a&gt; and &lt;a href=&quot;http://prezi.com/vdulzxiww0xa/&quot; title=&quot;a great, in-depth presentation about using MongoDB with Ruby&quot;&gt;presentations&lt;/a&gt; outlining the basics of MongoDB / Ruby interaction.&lt;/p&gt;
&lt;p&gt;Now that we&amp;#8217;ve gotten that out of the way, let&amp;#8217;s move on to how MongoDB can cure all your Rails log-perusing headaches.&lt;/p&gt;
&lt;p&gt;I just finished up a Rails plugin to allow apps to log to a centralized MongoDB. To start, the code&amp;#8217;s here on Github: &lt;a href=&quot;http://github.com/peburrows/mongo_db_logger&quot;&gt;http://github.com/peburrows/mongo_db_logger&lt;/a&gt;. Usage is pretty simple &amp;#8211; once you&amp;#8217;ve installed the plugin (&lt;small&gt;&lt;code&gt;script/plugin install git://github.com/peburrows/mongo_db_logger.git&lt;/code&gt;&lt;/small&gt;), the first thing to do is put the following line in your &lt;code class=&quot;ruby&quot;&gt;ApplicationController&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
include MongoDBLogging
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;And then, to actually use it in your different environments, add the following line to your app&amp;#8217;s &lt;small&gt;&lt;code class=&quot;ruby&quot;&gt;&quot;config/#{environment}.rb&quot;&lt;/code&gt;&lt;/small&gt; file so Rails knows to use the &lt;code class=&quot;ruby&quot;&gt;MongoLogger&lt;/code&gt;:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
config.logger = MongoLogger.new
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Finally, in your &lt;code&gt;config/database.yml&lt;/code&gt; file, you&amp;#8217;ll need to add mongo settings for each environment in which you want to use MongoDB for logging, like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
development:
  adapter: mysql
  database: my_app_development
  user: root
  mongo:
    database: my_app
    capsize: &amp;lt;%= 10.megabytes %&amp;gt;
    host: localhost
    port: 27017
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The only required setting is &lt;code&gt;database&lt;/code&gt; (probably just the name of the app) &amp;#8211; everything else will just choose a sensible default if not specified. &lt;code&gt;capsize&lt;/code&gt; determines the size of the &lt;a href=&quot;http://www.mongodb.org/display/DOCS/Capped+Collections&quot; title=&quot;overview of capped collections in MongoDB&quot;&gt;capped collection&lt;/a&gt; (think of a capped collection as a db table that has a max size and auto-flushes old records as necessary to make room for new records) and defaults to &lt;code class=&quot;ruby&quot;&gt;250.megabytes&lt;/code&gt; in production and &lt;code class=&quot;ruby&quot;&gt;100.megabytes&lt;/code&gt; in all other environments (if you&amp;#8217;re testing locally, there&amp;#8217;s probably no need for it to be &lt;code class=&quot;ruby&quot;&gt;100.megabytes&lt;/code&gt;, so you can change that in your &lt;code&gt;config/database.yml&lt;/code&gt; file as shown above).&lt;/p&gt;
&lt;p&gt;And that&amp;#8217;s all. With that in place, a new MongoDB document (record) will be created for each request and, by default will record the following information: &lt;code&gt;Runtime, IP Address, Request Time, Controller, Action, Params and All messages sent to the logger&lt;/code&gt;. The structure of the Mongo document looks something like this:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
{
  'controller'    : controller_name,
  'action'        : action_name,
  'ip'            : ip_address,
  'runtime'       : runtime,
  'request_time'  : time_of_request,
  'params'        : { }
  'messages'      : {
                      'info'  : [ ],
                      'debug' : [ ],
                      'error' : [ ],
                      'warn'  : [ ],
                      'fatal' : [ ]
                    }
}
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Beyond that, if you want to add extra information to the base of the document (let&amp;#8217;s say something like user_guid on every request that it&amp;#8217;s available), you can just call the &lt;code class=&quot;ruby&quot;&gt;Rails.logger.add_metadata&lt;/code&gt; method on your logger like so:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
# make sure we're using the MongoLogger in this environment
if Rails.logger.respond_to?(:add_metadata)
  Rails.logger.add_metadata(:user_guid =&amp;gt; @user_guid)
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;The benefit of using MongoDB for logging (especially when adding extra, custom data like &lt;code class=&quot;ruby&quot;&gt;@user_guid&lt;/code&gt; to documents) is pretty significant:&lt;br /&gt;
&lt;ol&gt;&lt;br /&gt;
&lt;li&gt;you have a centralized logging system for all application servers, so you&amp;#8217;re no longer required to look in multiple places for log messages&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;that centralized log DB can be indexed and searched using MongoDB&amp;#8217;s [simplistic but pretty powerful] query language.&lt;/li&gt;&lt;br /&gt;
&lt;li&gt;each request is a single record, so &lt;span class=&quot;caps&quot;&gt;ALL&lt;/span&gt; the information about the request in contained in that one &amp;#8220;document&amp;#8221;&lt;/li&gt;&lt;/p&gt;
&lt;/ol&gt;
&lt;p&gt;And now, for a couple quick examples on getting ahold of this log data&amp;#8230;&lt;/p&gt;
&lt;p&gt;First, here&amp;#8217;s how to get a handle on the MongoDB from within a Rails console:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
&amp;gt;&amp;gt; db = MongoLogger.mongo_connection
=&amp;gt; #&amp;lt;Mongo::DB:0x102f19ac0 @slave_ok=nil, @name=&quot;my_app&quot; ... &amp;gt;

&amp;gt;&amp;gt; collection = db[MongoLogger.mongo_collection_name]
=&amp;gt; #&amp;lt;Mongo::Collection:0x1031b3ee8 @name=&quot;development_log&quot; ... &amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Once you&amp;#8217;ve got the collection, you can&amp;#8230;&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;
&lt;p&gt;Find all requests for a specific user (with guid):&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
&amp;gt;&amp;gt; cursor = collection.find(:user_guid =&amp;gt; '12355')
=&amp;gt; #&amp;lt;Mongo::Cursor:0x1031a3e30 ... &amp;gt;
&amp;gt;&amp;gt; cursor.count
=&amp;gt; 5

&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Then, you can just iterate over the records returned by the query like any other collection.&lt;/p&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find all requests that took more that one second to complete:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
&amp;gt;&amp;gt; collection.find({:runtime =&amp;gt; {'$gt' =&amp;gt; 1000}}).count
=&amp;gt; 3
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Find all requests that passed a parameter with a certain value:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
&amp;gt;&amp;gt; collection.find({'params.currency' =&amp;gt; 'USD'}).count
=&amp;gt; 22
&lt;/code&gt;&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;p&gt;Perform any other query on the data that you like.&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Feel free to play around with it and let me know if you have any questions / suggestions. Also, the &lt;a href=&quot;http://mongodb.org/&quot;&gt;mongoDB site&lt;/a&gt; has some good resources and the documentation (although slightly lacking in some places) is pretty straightforward as well.&lt;/p&gt;
&lt;p&gt;One other thing that I should mention: currently, this does &lt;span class=&quot;caps&quot;&gt;NOT&lt;/span&gt; replace the normal Rails logging that happens in &lt;small&gt;&lt;code class=&quot;ruby&quot;&gt;&quot;log/#{environment}.log&quot;&lt;/code&gt;&lt;/small&gt;, but is just a supplemental addition. There&amp;#8217;s no real reason not to replace the file-based logging, except that with MongoDB capped collections, it will only store a certain number of requests &amp;#8211; a flat file doesn&amp;#8217;t really have a limit on the number of requests it will store. Sure, it&amp;#8217;ll get &lt;span class=&quot;caps&quot;&gt;HUGE&lt;/span&gt; if you don&amp;#8217;t roll it / truncate it occasionally, but it could [potentially] keep a record of every request ever if that&amp;#8217;s what you want.&lt;/p&gt;
          </description>
          <pubDate>Mon, 28 Sep 2009 12:20:43 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/09/28/rails-logging-with-mongodb/</guid>
          <link>http://blog.philburrows.com/articles/2009/09/28/rails-logging-with-mongodb/</link>
        </item>
    
        <item>
          <title>Daily Design - City And Colour</title>
          <description>
             
             &lt;p&gt;Nothing much here, just my daily design for Sunday, September 13, 2009.&lt;/p&gt;
&lt;div class=&quot;img_wrapper&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/peburrows/3926254287/&quot; title=&quot;City And Colour - 9.15.09 by peburrows, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3478/3926254287_df8254977a.jpg&quot; width=&quot;500&quot; height=&quot;225&quot; alt=&quot;City And Colour - 9.15.09&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;caption&quot;&gt;&lt;strong&gt;13 September 2009&lt;/strong&gt; &amp;#8211; &amp;#8220;City And Colour&amp;#8221; by Phil Burrows (peburrows), on Flickr&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
          </description>
          <pubDate>Wed, 16 Sep 2009 18:19:10 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/09/16/daily-design-city-and-colour/</guid>
          <link>http://blog.philburrows.com/articles/2009/09/16/daily-design-city-and-colour/</link>
        </item>
    
        <item>
          <title>Daily Design Update</title>
          <description>
             &lt;p&gt;After a &lt;em&gt;very&lt;/em&gt; long [unplanned] hiatus, I finally started doing a bit of daily design again (see &lt;a href=&quot;/articles/2008/05/29/daily-design&quot;&gt;this post&lt;/a&gt; for a bit of background).&lt;/p&gt;
&lt;p&gt;It&amp;#8217;s been good to get back into it a bit, so I thought I would share some of my latest creations. In case you can&amp;#8217;t tell, I&amp;#8217;ve been going with a band / music theme. As with the first time around, this forced creativity has been easy at times, and horribly difficult at others. What follows are the past three days in this experiment.&lt;/p&gt;
             &lt;div class=&quot;img_wrapper&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/peburrows/3837486774/&quot; target=&quot;_blank&quot; title=&quot;Bon Iver - For Emma, Forever Ago by peburrows, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3504/3837486774_c89db91c9d.jpg&quot; width=&quot;500&quot; height=&quot;191&quot; alt=&quot;Bon Iver - For Emma, Forever Ago&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;caption&quot;&gt;&lt;strong&gt;18 August 2009&lt;/strong&gt; &amp;#8211; &amp;#8220;Bon Iver &amp;#8211; For Emma, Forever Ago&amp;#8221; by peburrows, on Flickr &lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;div class=&quot;img_wrapper&quot;&gt;
&lt;p&gt;&lt;a href=&quot;http://www.flickr.com/photos/peburrows/3838008118/&quot; target=&quot;_blank&quot; title=&quot;The Anniversary - Designing A Nervous Breakdown by peburrows, on Flickr&quot;&gt;&lt;img src=&quot;http://farm4.static.flickr.com/3468/3838008118_163d0c62bd.jpg&quot; width=&quot;500&quot; height=&quot;386&quot; alt=&quot;The Anniversary - Designing A Nervous Breakdown&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;span class=&quot;caption&quot;&gt;&lt;strong&gt;19 August 2009&lt;/strong&gt; &amp;#8211; &amp;#8220;The Anniversary&amp;#8221; by peburrows, on Flickr&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&lt;strong&gt;Some javascript animation:&lt;/strong&gt; This next one showcases some animation I built with javascript. Unfortunately, I think the design suffered a little bit (it doesn&amp;#8217;t look exactly like I wanted it to), but I thought the waves animation turned out really well. I think I&amp;#8217;m gonna do the next animation piece using only &lt;acronym title=&quot;Cascading Stylesheets&quot;&gt;&lt;code&gt;CSS&lt;/code&gt;&lt;/acronym&gt; transitions.&lt;/p&gt;
&lt;div class=&quot;img_wrapper&quot;&gt;
&lt;p&gt;&lt;object type=&quot;application/x-shockwave-flash&quot; width=&quot;400&quot; height=&quot;239&quot; data=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot; classid=&quot;clsid:D27CDB6E-AE6D-11cf-96B8-444553540000&quot;&gt; &lt;param name=&quot;flashvars&quot; value=&quot;intl_lang=en-us&amp;photo_secret=9e7086d56a&amp;photo_id=3842062716&quot;&gt;&lt;/param&gt; &lt;param name=&quot;movie&quot; value=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot;&gt;&lt;/param&gt; &lt;param name=&quot;bgcolor&quot; value=&quot;#000000&quot;&gt;&lt;/param&gt; &lt;param name=&quot;allowFullScreen&quot; value=&quot;true&quot;&gt;&lt;/param&gt;&lt;embed type=&quot;application/x-shockwave-flash&quot; src=&quot;http://www.flickr.com/apps/video/stewart.swf?v=71377&quot; bgcolor=&quot;#000000&quot; allowfullscreen=&quot;true&quot; flashvars=&quot;intl_lang=en-us&amp;photo_secret=9e7086d56a&amp;photo_id=3842062716&quot; height=&quot;239&quot; width=&quot;400&quot;&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;&lt;span class=&quot;caption&quot;&gt;&lt;strong&gt;20 August 2009&lt;/strong&gt; &amp;#8211; &amp;#8220;Right Away, Great Captain&amp;#8221; by peburrows, on Flickr&lt;/span&gt;&lt;/p&gt;
&lt;/div&gt;
          </description>
          <pubDate>Fri, 21 Aug 2009 00:55:48 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/08/21/daily-design-update/</guid>
          <link>http://blog.philburrows.com/articles/2009/08/21/daily-design-update/</link>
        </item>
    
        <item>
          <title>Goodbye OtherInbox, hello Gmail IMAP via Ruby</title>
          <description>
             &lt;p&gt;For a while now, I&amp;#8217;ve used (and, for the most part, loved) &lt;a href=&quot;http://otherinbox.com&quot;&gt;OtherInbox&lt;/a&gt;. It&amp;#8217;s a really handy service &amp;#8211; just create a new email address for each site instead of giving out your main address for those sites to sell and then spam. But I&amp;#8217;ve been using it since the beta, and have been increasingly annoyed by certain features that have been removed or withheld from the free account. For example, &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt; access is only available to pay accounts, as is the ability to read any message you received more than 30 days ago.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not faulting OtherInbox for this &amp;#8211; I get it, they need to make a profit. Heck, I would probably take the same approach they have. But, I finally decided there was a better solution for me. So goodbye OtherInbox, hello to the exact same functionality (&lt;strong&gt;and then some&lt;/strong&gt;) via Gmail. Let me explain&amp;hellip;&lt;/p&gt;
             &lt;p&gt;&lt;strong&gt;&lt;span class=&quot;caps&quot;&gt;EDITS&lt;/span&gt;: 18 July 2009 &amp;#8211; I&amp;#8217;ve made some changes to the script to cover some edge case errors.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, I thought about my approach for a few minutes and decided that I ought to be able to do the same thing OtherInbox does by using Google Apps for my domain and a simple &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt; poller. The first step was simple: just signup for Google Apps (which I had already done some time ago) and setup a catch-all email address (see &lt;a href=&quot;http://www.google.com/support/a/bin/answer.py?hl=en&amp;answer=33962&quot;&gt;this page&lt;/a&gt; for details). So, with that done, it was on to some scripting.&lt;/p&gt;
&lt;p&gt;I have to be honest: I thought this was going to be harder than it was. But, as it turns out, Ruby already offers a really simple way to interact with an &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt; server (&lt;code class=&quot;ruby&quot;&gt;Net::IMAP&lt;/code&gt;). After a little digging through the &lt;a href=&quot;http://www.ruby-doc.org/stdlib/libdoc/net/imap/rdoc/index.html&quot;&gt;&lt;code class=&quot;ruby&quot;&gt;Net::IMAP&lt;/code&gt; documentation&lt;/a&gt;, I was off and running.&lt;/p&gt;
&lt;p&gt;All I needed to do was write a script that would poll the &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt; server every so often checking for new messages. When the script noticed that there were new messages, it then just needed to move each of those messages to the proper mailbox (i.e. apply the proper label in Gmail).&lt;/p&gt;
&lt;p&gt;And here&amp;#8217;s the end result:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
#!/usr/bin/env ruby

require 'rubygems'
require 'net/imap'

CONFIG = {
  :host     =&amp;gt; 'imap.gmail.com',
  :username =&amp;gt; 'catch.all@domain.com',
  :password =&amp;gt; 'my-pa55word',
  :port     =&amp;gt; 993,
  :ssl      =&amp;gt; true
}

$imap = Net::IMAP.new( CONFIG[:host], CONFIG[:port], CONFIG[:ssl] )
$imap.login( CONFIG[:username], CONFIG[:password] )

# select the INBOX as the mailbox to work on
$imap.select('INBOX')

messages_to_archive = []

# retrieve all messages in the INBOX that
# are not marked as DELETED (archived in Gmail-speak)
$imap.search([&quot;NOT&quot;, &quot;DELETED&quot;]).each do |message_id|
  # the mailbox the message was sent to
  # addresses take the form of {mailbox}@{host}
  mailbox = $imap.fetch(message_id, 'ENVELOPE')[0].attr['ENVELOPE'].to[0].mailbox

  # give us a prettier mailbox name -
  # this is the label we'll apply to the message
  mailbox = mailbox.gsub(/([_\-\.])+/, ' ').downcase
  mailbox.gsub!(/\b([a-z])/) { $1.capitalize }
  
  begin
    # create the mailbox, unless it already exists
    $imap.create(mailbox) unless $imap.list('', mailbox)
  rescue Net::IMAP::NoResponseError =&amp;gt; error
  end
  
  # copy the message to the proper mailbox/label
  $imap.copy(message_id, mailbox)

  messages_to_archive &amp;lt;&amp;lt; message_id
end

# archive the original messages
$imap.store(messages_to_archive, &quot;+FLAGS&quot;, [:Deleted]) unless messages_to_archive.empty?

$imap.logout
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;After setting this up as a simple cron task to poll the server and cleanup my inbox periodically, I can get the exact same functionality as OtherInbox. Plus, I can access the account via &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt; through something like Mail.app, &lt;em&gt;and&lt;/em&gt; I can read all my messages regardless of how old they are. Not only that, but I can use the great Gmail web UI (which is much better than the one offered by OtherInbox).&lt;/p&gt;
&lt;p&gt;With that script setup to poll the gmail &lt;span class=&quot;caps&quot;&gt;IMAP&lt;/span&gt; server, there was only one obstacle left: responding to email from each of the different addresses. Fortunately, Gmail makes this super easy as well. While logged in to Gmail, just go to &amp;#8220;Settings&amp;#8221;&amp;nbsp;&amp;gt;&amp;nbsp;&amp;#8220;Accounts&amp;#8221;&amp;nbsp;&amp;gt;&amp;nbsp;&amp;#8220;Add another email address you own&amp;#8221; &amp;mdash; it couldn&amp;#8217;t be easier.&lt;/p&gt;
          </description>
          <pubDate>Fri, 17 Jul 2009 01:12:37 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/07/17/goodbye-otherinbox-hello-gmail-imap-via-ruby/</guid>
          <link>http://blog.philburrows.com/articles/2009/07/17/goodbye-otherinbox-hello-gmail-imap-via-ruby/</link>
        </item>
    
        <item>
          <title>Never change your hashing algorithm. Please.</title>
          <description>
             I'm not the first to say this (&lt;a href=&quot;http://www.cubik.org/mirrors/taligent/Docs/books/WM/WM_144.html&quot; title=&quot;a more in depth look at things&quot;&gt;http://www.cubik.org/mirrors/taligent/Docs/books/WM/WM_144.html&lt;/a&gt;), but it needs to be said again: Please, &lt;strong&gt;never&lt;/strong&gt; change your hashing algorithm. I'm looking at you memcache-client ruby gem...
             &lt;p&gt;We have a certain setup (the details of which I will not fully delve into) that shares data across a couple different apps via Memcache. It&amp;#8217;s a handy (although, maybe not ideal) setup that provides speed and scalability. Basically, it does a good job of solving the problem we wanted to solve. However, we ran into an issue the other day with one app not being able to reliably retrieve info the other app had set in Memcache. A bunch of debugging later, we realized it came down to the fact that one app was using &lt;code&gt;memcache-client-1.5.0&lt;/code&gt;, and one was using &lt;code&gt;memcache-client-1.7.2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;Ideally, we would keep both apps on the same version of gems that are used for communicating information between apps, but, a simple memcache &lt;code&gt;get / set&lt;/code&gt; should not break because of minor version differences.&lt;/p&gt;
&lt;p&gt;Specifically, our issue came down to this: these two snippets of code &lt;strong&gt;are not the same&lt;/strong&gt;, and that&amp;#8217;s not good at all&amp;#8230;&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
# in get_server_for_key method, memcache client 1.5.0
20.times do |try|
  server = @buckets[hkey % @buckets.nitems]
  return server if server.alive?
  hkey += hash_for &quot;#{try}#{key}&quot;
end
&lt;/code&gt;&lt;/pre&gt;

&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
# in get_server_for_key method, memcache-client 1.7.2
20.times do |try|
  entryidx = Continuum.binary_search(@continuum, hkey)
  server = @continuum[entryidx].server
  return server if server.alive?
  break unless failover
  hkey = hash_for &quot;#{try}#{key}&quot;
end
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;Please, seriously, don&amp;#8217;t change your hashing algorithm.&lt;/p&gt;
          </description>
          <pubDate>Mon, 18 May 2009 12:45:02 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/05/18/never-change-your-hashing-algorithm-please-/</guid>
          <link>http://blog.philburrows.com/articles/2009/05/18/never-change-your-hashing-algorithm-please-/</link>
        </item>
    
        <item>
          <title>Comment Away</title>
          <description>
             After over a year of promising it, I finally sat down last night to enable comments on this &quot;blog&quot; of mine. Turns out, the process was actually pretty easy and painless, and there was really no reason I shouldn't have done it earlier (except for the fact that I doubt anyone will actually care about commenting on this thing).
             &lt;p&gt;If you&amp;#8217;re interested, I&amp;#8217;m using the alno branch of the &lt;a href=&quot;http://github.com/alno/radiant-comments-extension/tree/master&quot;&gt;Radiant Comments Extension&lt;/a&gt; &amp;#8211; it seemed to be the one with the most active development, and appeared to be the most up-to-date. Installation is pretty straight forward (like any other radiant extension), so just follow the instructions in the &lt;span class=&quot;caps&quot;&gt;README&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, while I was messing around with things, I decided to upgrade to &lt;a href=&quot;http://github.com/radiant/radiant&quot; title=&quot;Radiant Github repository&quot;&gt;Radiant 0.7.1&lt;/a&gt; and also move from mongrel to &lt;a href=&quot;http://www.modrails.com&quot;&gt;passenger&lt;/a&gt;. I hardly ever re-deploy this thing, but when I do, I&amp;#8217;d like the restart process to be as painless as possible, and what&amp;#8217;s easier than &lt;code&gt;touch tmp/restart.txt&lt;/code&gt;?&lt;/p&gt;
&lt;p&gt;The whole process was pretty painless, and I actually did most of the work last night, long after I should have been asleep (but that proves how mindlessly simple it was). For those interested, upgrading radiant was as easy as installing the latest version of the gem (and also, I unpacked it into vendor/radiant with &lt;code&gt;rake radiant:freeze:gems&lt;/code&gt;), and then:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;
rake radiant:update
rake production db:migrate
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;For those of you planning to do this yourself, I should probably advise you to back up your database before you do anything drastic like upgrading your blogging engine, blah, blah, blah. Meh, consider yourself warned. I didn&amp;#8217;t have any issues (and I didn&amp;#8217;t bother backing up my db before-hand), but &lt;acronym title=&quot;your mileage may vary&quot;&gt;&lt;span class=&quot;caps&quot;&gt;YMMV&lt;/span&gt;&lt;/acronym&gt;.&lt;/p&gt;
&lt;p&gt;So go ahead, comment away &amp;#8211; put all my &lt;del&gt;hard&lt;/del&gt; work to good use.&lt;/p&gt;
          </description>
          <pubDate>Tue, 31 Mar 2009 19:29:30 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/03/31/comment-away/</guid>
          <link>http://blog.philburrows.com/articles/2009/03/31/comment-away/</link>
        </item>
    
        <item>
          <title>Go Buy Macheist 3 </title>
          <description>
             The &lt;a href=&quot;http://www.macheist.com/bundle/u/28498/&quot;&gt;Macheist 3&lt;/a&gt; bundle is now available. 12 Mac apps (a combined value of over $550) for only $39! How can you pass that up? Plus, 25% of every sale goes to charity. So go ahead, &lt;a href=&quot;http://www.macheist.com/bundle/u/28498/&quot;&gt;purchase the bundle&lt;/a&gt;, there are some great apps in there.

             
          </description>
          <pubDate>Wed, 25 Mar 2009 10:10:35 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/03/25/go-buy-macheist-3/</guid>
          <link>http://blog.philburrows.com/articles/2009/03/25/go-buy-macheist-3/</link>
        </item>
    
        <item>
          <title>It's time...for a redesign</title>
          <description>
             &lt;p&gt;I&amp;#8217;ve had this ugly, default theme for far too long; unfortunately, laziness has gotten the better of me over the past year when it came to redesigning this blog. But, this past weekend, I decided to bite the bullet and do what I&amp;#8217;ve been avoiding for a while. So, I&amp;#8217;ve redesigned (to be more accurate, I&amp;#8217;ve really just &amp;#8220;un-designed&amp;#8221;) my blog.&lt;/p&gt;
             &lt;p&gt;It&amp;#8217;s a work in progress, but a few hours Saturday afternoon proved to be rather productive. I&amp;#8217;m using &lt;a href=&quot;http://github.com/sorccu/cufon/tree/master&quot; title=&quot;Cufón github repo&quot;&gt;Cufón&lt;/a&gt; for text replacement, and have been really happy with how easy it&amp;#8217;s been to set up. That being said, I am seeing a few strange things happening with it. If you&amp;#8217;ll notice, some article headlines have strange word-spacing. Letter-spacing within words seems to be just fine, but the space between words occasionally gets devoured. From what I&amp;#8217;ve seen, it may be an issue with the font I&amp;#8217;m using (Fontin Sans SC), because the issue does not seem to affect the site title which is Calgary Script. Still looking for a solution though.&lt;/p&gt;
&lt;p&gt;Anyway, like I said, the redesign still needs quite a bit of polish. Some things, like the footer, are just plain ugly, and I&amp;#8217;ll be working on those as time permits.&lt;/p&gt;
          </description>
          <pubDate>Mon, 23 Mar 2009 14:32:38 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/03/23/its-time-for-a-redesign/</guid>
          <link>http://blog.philburrows.com/articles/2009/03/23/its-time-for-a-redesign/</link>
        </item>
    
        <item>
          <title>CSS Variables With Rack Middleware</title>
          <description>
             I know I'm not the only one that has, for years, longed for variables in &lt;acronym title=&quot;Cascading Stylesheets&quot;&gt;CSS&lt;/acronym&gt;. It's been a much discussed and debated topic; in fact, someone has even gone to the trouble to write up a &lt;a href=&quot;http://disruptive-innovations.com/zoo/cssvariables/&quot;&gt;proposed spec&lt;/a&gt;. There have been &lt;a href=&quot;http://sperling.com/examples/pcss/&quot;&gt;plenty&lt;/a&gt; &lt;a href=&quot;http://www.shauninman.com/archive/css_ssc&quot;&gt;of&lt;/a&gt; &lt;a href=&quot;http://www.chrisjdavis.org/php-in-css&quot;&gt;solutions&lt;/a&gt;, but, as a Rails developer, Rack Middleware seemed like the perfect place to hack together a quick solution for CSS variables.
             &lt;p&gt;Before I continue, I should mention that this problem has [in one sense] already been solved. &lt;a href=&quot;http://haml.hamptoncatlin.com/docs/rdoc/classes/Sass.html&quot;&gt;&lt;span class=&quot;caps&quot;&gt;SASS&lt;/span&gt;&lt;/a&gt;, which is a completely different way of writing &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; (based on &lt;a href=&quot;http://haml.hamptoncatlin.com/&quot;&gt;&lt;span class=&quot;caps&quot;&gt;HAML&lt;/span&gt;&lt;/a&gt;), gives us as Rails developers, the ability to have the much-desired variables in our &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;. And, &lt;span class=&quot;caps&quot;&gt;SASS&lt;/span&gt; definitely has its benefits: variables, nesting, etc. But, it all just seems like a bit of overkill; I don&amp;#8217;t want to change the way I write &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;, I just want to add variables. Plus, I really don&amp;#8217;t like the fact that it&amp;#8217;s whitespace-sensitive and that I can&amp;#8217;t mix in regular &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt;.&lt;/p&gt;
&lt;p&gt;Enter &lt;a href=&quot;http://github.com/peburrows/rack-contrib/blob/master/lib/rack/contrib/cssvariables.rb&quot;&gt;CSSVariables middleware&lt;/a&gt;. It&amp;#8217;s pretty basic and, as I mentioned, pretty quickly put together (at the time of this post, I still need to add tests), but it does what you think: it allows you to use variables in your &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; files. Basically, it just parses your &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; &amp;#8220;templates&amp;#8221; with &lt;span class=&quot;caps&quot;&gt;ERB&lt;/span&gt;. Eventually, I&amp;#8217;ll do a better job of adding support for other parsers, but right now, I can only guarantee that &lt;span class=&quot;caps&quot;&gt;ERB&lt;/span&gt; will work.&lt;/p&gt;
&lt;p&gt;In development, the middleware will re-render your &lt;span class=&quot;caps&quot;&gt;CSS&lt;/span&gt; file on every request. In production, it will render and write to disk the first time the file is requested, so the &lt;em&gt;very minor&lt;/em&gt; performance hit of rendering the template will only be felt the first time the file is requested.&lt;/p&gt;
&lt;p&gt;Using the middleware is pretty straight forward:&lt;/p&gt;
&lt;pre&gt;&lt;code class=&quot;ruby&quot;&gt;
config.middleware.use 'CSSVariables', :templates =&amp;gt; &quot;#{RAILS_ROOT}/app/views/css&quot;
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;There are other configuration options, but the &lt;code&gt;:templates&lt;/code&gt; setting is the only required one and simply specifies the directory your templates reside in (check out the source for more options). Within your templates directory, you can also create a &lt;code&gt;variables.rb&lt;/code&gt; file that will be loaded, and will give your templates access to any methods defined in the variables.rb file.&lt;/p&gt;
&lt;p&gt;That&amp;#8217;s about it. There&amp;#8217;s some possibility that this would work better within a Rails project as Rails Metal (which is basically just fancy middleware) instead of just adding it to the middleware stack, but there are certain things that would need to be modified before it would work properly as metal (i.e. returning a 404 when the file isn&amp;#8217;t found, instead of just sending the request up the middleware stack with &lt;code&gt;@app.call&lt;/code&gt;).&lt;/p&gt;
&lt;p&gt;I don&amp;#8217;t currently have comments on this blog, so just &lt;a href=&quot;mailto:blog@philburrows.com&quot;&gt;drop me a line&lt;/a&gt; if you find a bug / have a suggestion / hate this idea. Or, you can find me on &lt;a href=&quot;http://twitter.com/peburrows&quot;&gt;Twitter&lt;/a&gt;.&lt;/p&gt;
          </description>
          <pubDate>Wed, 18 Mar 2009 14:09:28 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/03/18/css-variables-with-rack-middleware/</guid>
          <link>http://blog.philburrows.com/articles/2009/03/18/css-variables-with-rack-middleware/</link>
        </item>
    
        <item>
          <title>Passenger 2.0.6 is not compatible with Rails 2.3.1</title>
          <description>
             
             &lt;p&gt;&lt;a href=&quot;http://ryanschwartz.net/&quot;&gt;Ryan Schwartz&lt;/a&gt; thinks I should actually use this blog of mine once in a while. Well, that makes one of us ;)&lt;/p&gt;
&lt;p&gt;However, consider this a public service announcement for all those people who might have run into the problem I did with Rails and Passenger (modrails) compatibility.&lt;/p&gt;
&lt;p&gt;An introduction before we begin: 99% of the time I use mongrel in development, because that&amp;#8217;s what I use in production and that&amp;#8217;s what has become my habit. However, for a new project I&amp;#8217;m working on, we&amp;#8217;ve discussed trying Passenger in production. So, more recently, I&amp;#8217;ve been using passenger &lt;em&gt;some&lt;/em&gt; in development for that project (I still, out of habit spin up &lt;code&gt;script/server&lt;/code&gt; when starting work in the project).&lt;/p&gt;
&lt;p&gt;As of a few days ago, this new project was running Rails 2.2.2 with Passenger 2.0.6 (when I remembered to got to http://go.local instead of http://localhost:3000). However, always wanting the apps I&amp;#8217;m developing to stay up to date with the current version of Rails, I upgraded one to the latest, greatest Rails 2.3.1RC. A few Rails compatibility / deprecation issues, but everything was still working just fine &amp;#8212; or so i thought. I didn&amp;#8217;t notice anything strange because I was still developing with mongrel; I would still spin up script/server and hit http://localhost:3000. Late last night though, I remembered to use my passenger virtual host, and the following error pops up:&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://img.skitch.com/20090312-c7j6ehjqidugi9mi9k2m383gk5.jpg&quot; rel=&quot;facebox&quot;&gt;&lt;img src=&quot;http://img.skitch.com/20090312-xk3xg3xhbpexpheps611akjji6.jpg&quot; title=&quot;Passenger error message&quot; alt=&quot;Ruby on Rails framework version 2.3.1 seems to be corrupted. Please reinstall it &quot; /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Ruby on Rails framework version 2.3.1 seems to be corrupted?! Please reinstall it?! Wha??&lt;/p&gt;
&lt;p&gt;Anyway, it was a little frustrating as I tried a number of things to fix it, but the ultimate solution was simple: upgrade to &lt;a href=&quot;http://blog.phusion.nl/2009/03/01/phusion-passenger-211-beta-released-thanks-sponsors/&quot;&gt;Passenger 2.1.1&lt;/a&gt;, and voilá! Everything&amp;#8217;s fixed.&lt;/p&gt;
&lt;p&gt;The end.&lt;/p&gt;
          </description>
          <pubDate>Thu, 12 Mar 2009 17:40:25 GMT</pubDate>
          <guid>http://blog.philburrows.com/articles/2009/03/12/passenger-2-0-6-is-not-compatible-with-rails-2-3-1/</guid>
          <link>http://blog.philburrows.com/articles/2009/03/12/passenger-2-0-6-is-not-compatible-with-rails-2-3-1/</link>
        </item>
    
    
  </channel>
</rss>


