<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:wfw="http://wellformedweb.org/CommentAPI/" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:sy="http://purl.org/rss/1.0/modules/syndication/" xmlns:slash="http://purl.org/rss/1.0/modules/slash/" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">

<channel>
	<title>Jason Seifer</title>
	
	<link>http://jasonseifer.com</link>
	<description />
	<lastBuildDate>Fri, 27 Aug 2010 23:11:09 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.0.1</generator>
		<atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/jasonseifer" /><feedburner:info uri="jasonseifer" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
		<title>Rails 3.0 rc2 Notes</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/9OaDan9peWw/rails-3-rc2</link>
		<comments>http://jasonseifer.com/2010/08/24/rails-3-rc2#comments</comments>
		<pubDate>Tue, 24 Aug 2010 04:00:07 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[rc]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=518</guid>
		<description><![CDATA[With the recent release of Rails 3.0 Release Candidate 2, DHH posted on the official Rails blog to check out the sweet GitHub compare view between the two RCs for detailed information. This list is by no means complete but I made some notes from the commit view, with links where possible, about the bigger [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>
With the recent release of <a href="http://weblog.rubyonrails.org/2010/8/24/rails-3-0-release-candidate-2">Rails 3.0 Release Candidate 2</a>, DHH posted on the official Rails blog to check out the sweet <a href="http://github.com/rails/rails/compare/v3.0.0_RC...v3.0.0_RC2">GitHub compare view</a> between the two RCs for detailed information. This list is by no means complete but I made some notes from the commit view, with links where possible, about the bigger changes:
</p>
<ul>
<li>Add a header that tells Internet Explorer (all versions) to use the best available standards support. [Yehuda Katz]</li>
<li>Rename <code>_snowman</code> to <code>_e</code>. <strong>Update:</strong> This was later updated to <code>utf8</code> as Kieran and Santiago point out in the comments.</li>
<li>Mysql2 is now the default mysql adapter.</li>
<li><code>render :file</code> is deprecated in favor of <code>render :template</code> except for absolute paths.</li>
<li>Apps upgrading from version 2.3 get defaulted to utf-8.</li>
<li><a href="http://github.com/rails/rails/commit/06af2913466acb88d46fc18b60c13f5c071395b1">Update documentation on <code>autosave</code></a>.</li>
<li>Several performance <a href="http://github.com/rails/rails/commit/fb6edb1769229fff66bf23a7c2e9d52cf26359c8">improvements</a> <a href="http://github.com/rails/rails/commit/dac2b37b037587053b53cb6ed3c67a1fd4339778">mostly</a> <a href="http://github.com/rails/rails/commit/ff760dd6ceee4414e54afdb346c322dee6280edc">by</a> <a href="http://github.com/rails/rails/commit/c8509d5303db0fd0930d09357b059bb4a6b19f9f">tenderlove</a>.</li>
<li>Tons of deprecations.</li>
<li><a href="http://github.com/rails/rails/commit/82eff0ffe977674ccf49bf192dacabd04b195995">Require rdoc version 2.5.10</a></li>
<li><a href="http://github.com/rails/rails/commit/6edae4553ee0f95d3a9a9de278db12c3ce880ef9">Require rack-mount 0.6.12</a></li>
<p></u></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Rails+3.0+rc2+Notes+http://bit.ly/bUXRBX" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;title=Rails+3.0+rc2+Notes" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;title=Rails+3.0+rc2+Notes" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;title=Rails+3.0+rc2+Notes" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;title=Rails+3.0+rc2+Notes" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;t=Rails+3.0+rc2+Notes" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;t=Rails+3.0+rc2+Notes" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;title=Rails+3.0+rc2+Notes" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/08/24/rails-3-rc2&amp;title=Rails+3.0+rc2+Notes" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/9OaDan9peWw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/08/24/rails-3-rc2/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/08/24/rails-3-rc2</feedburner:origLink></item>
		<item>
		<title>Genius Pool Supports Twitter Integration</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/TiAksLV1sRU/geniuspool-twitter-integration</link>
		<comments>http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration#comments</comments>
		<pubDate>Tue, 20 Jul 2010 20:11:20 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[features]]></category>
		<category><![CDATA[geniuspool]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=509</guid>
		<description><![CDATA[This has been around for a little while now, but Genius Pool now has Twitter integration when a new job is posted. Check it out and post a job. Delicious Digg This Post Facebook Reddit This Post Related posts:Developer Job Board I&#8217;m pleased to announce the Genius Pool job board. This...


Related posts:<ol><li><a href='http://jasonseifer.com/2010/03/29/developer-job-board' rel='bookmark' title='Permanent Link: Developer Job Board'>Developer Job Board</a> <small>I&#8217;m pleased to announce the Genius Pool job board. This...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geniuspool.com"><img style="display:block; margin-left:auto; margin-right:auto;" src="http://jasonseifer.com/assets/geniuspooltwitter.jpg" alt="Genius Pool on Twitter" border="0" width="512" height="152" /></a></p>
<p>This has been around for a little while now, but <a href="http://geniuspool.com">Genius Pool</a> now has Twitter integration when a new job is posted. <a href="http://geniuspool.com">Check it out</a> and post a job.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Genius+Pool+Supports+Twitter+Integration+http://bit.ly/bp4AEC" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;title=Genius+Pool+Supports+Twitter+Integration" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;title=Genius+Pool+Supports+Twitter+Integration" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;title=Genius+Pool+Supports+Twitter+Integration" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;title=Genius+Pool+Supports+Twitter+Integration" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;t=Genius+Pool+Supports+Twitter+Integration" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;t=Genius+Pool+Supports+Twitter+Integration" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;title=Genius+Pool+Supports+Twitter+Integration" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration&amp;title=Genius+Pool+Supports+Twitter+Integration" title="Post to Reddit">Reddit This Post</a></p>

<p>Related posts:<ol><li><a href='http://jasonseifer.com/2010/03/29/developer-job-board' rel='bookmark' title='Permanent Link: Developer Job Board'>Developer Job Board</a> <small>I&#8217;m pleased to announce the Genius Pool job board. This...</small></li>
</ol></p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/TiAksLV1sRU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration</feedburner:origLink></item>
		<item>
		<title>Mac OS X Post Install Guide, May 2010</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/75pcWAyxWcM/osx-post-install-guide-4</link>
		<comments>http://jasonseifer.com/2010/05/05/osx-post-install-guide-4#comments</comments>
		<pubDate>Wed, 05 May 2010 16:37:23 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[snow leopard]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=478</guid>
		<description><![CDATA[I have to reformat and reinstall every so often. Most recently I upgraded the hard drive in my MacBook and this time I decided to post a bit about my reinstall process and what apps I use.


No related posts.]]></description>
			<content:encoded><![CDATA[<h4>Part 1: Update Software</h4>
<p>This takes a while. Go get some coffee and install the developer tools.</p>
<h3>System Settings</h3>
<h4>Appearance</h4>
<p><img src="http://jasonseifer.com/assets/scroll_arrows.jpg" alt="Scroll Arrows at top and bottom" border="0" width="200" height="39" class="alignright" /></p>
<p>Place scroll arrows at top and bottom. This is a left over windows preference I just can&#8217;t get used to.</p>
<h4>Finder</h4>
<p><img src="http://jasonseifer.com/assets/finderinfo.jpg" class="alignright" alt="Finder Buttons" border="0" width="200" height="37" /></p>
<p>
Add delete and get info to toolbar. I&#8217;m of the opinion that this should be the default.
</p>
<h4>Keyboard</h4>
<p><a href="http://jasonseifer.com/assets/modifierkeys.jpg" rel="lb"><img src="http://jasonseifer.com/assets/modifierkeys-220x104.jpg" alt="Modifier Keys" class="alignright" /></a><br />
<a href="http://jasonseifer.com/assets/keyboardaccess.jpg" rel="lb"><img src="http://jasonseifer.com/assets/keyboardaccess-50x50.jpg" alt="Full Keyboard Access" class="alignright" /></a></p>
<p>The Keyboard is a pretty big deal for developers. Here are my settings:</p>
<p>Get some Emacs keybindings in all of cocoa:<br />
<a href="http://www.gnufoo.org/macosx/">http://www.gnufoo.org/macosx/</a>. I&#8217;m a vim guy but they&#8217;re useful.</p>
<p>
Modifier keys, set caps lock to control. Allow Full keyboard access also.
</p>
<p>
<a href="http://jasonseifer.com/assets/NewImage.jpg" rel="lb"><img src="http://jasonseifer.com/assets/NewImage.jpg" alt="keyboard settings" border="0" width="200" class="alignright" /></a><br />
Uncheck &quot;Illuminate keyboard in low light conditions&quot; for better battery life.</p>
<h2>Apps</h2>
<ul>
<li><a href="http://blog.boastr.net">BetterTouchTool</a>
<p>Adds a bunch of configuration options for the Magic Mouse. I set a 3 finger tap for spaces. It&#8217;s handy.
</p>
</li>
<li><a href="https://www.dropbox.com/referrals/NTExNTA0OQ">Dropbox</a>
<p>
Effortlessly sync files across computers. If you use the link above I get some free space. <a href="http://dropbox.com">Use this one</a> for a referral free link if you prefer.</p>
</li>
<li><a href="http://skitch.com">Skitch</a>
<p>Capture screenshots, share images. This has become so ingrained in my day to day use I don&#8217;t know what I&#8217;d do without it.</p>
</li>
<li><a href="http://www.evernote.com">Evernote</a>
<p>Enhanced syncable notepad. I use this for everything from code snippets to projects notes, recipes, and everything in between.</p>
</li>
<li><a href="http://www.google.com/chrome?platform=mac">Google Chrome Beta</a>
<p>I couldn&#8217;t do without it. <a href="http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers">Spice it up</a> with some developer extensions and you&#8217;re good to go.</p>
</li>
<li><a href="http://mailplaneapp.com">Mailplane</a>
<p> Gmail on the desktop. I&#8217;ve tried almost every os x mail solution and couldn&#8217;t get more productive than Gmail. However, I still keep Mail.app configured in case I need to refer to old mail offline.</p>
</li>
<li><a href="http://macromates.com/">Textmate</a>
<p>This is practically a necessity. The best text editor on OS X.</p>
</li>
<li><a href="http://macvim.org">MacVIM</a>
<p>It&#8217;s no emacs but it&#8217;s good to have around.</p>
</li>
<li>
<p><a href="http://www.islayer.com/apps/istatmenus/">iStat Menus</a></p>
<p><img src="http://jasonseifer.com/assets/NewImage1.jpg" alt="istat menus" class="alignright" width="219" height="495" /> Find out useful information about what&#8217;s going on in your system. I mainly use this for the calendar widget in the menu bar. Why this isn&#8217;t an option in OS X by default I&#8217;m not sure. It recently became a paid app and I upgraded immediately.</p>
</li>
<li><a href="http://getconcentrating.com/">Concentrate</a>
<p>Eliminate distractions. I&#8217;ve written about this one before in my <a href="http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro">Using concentrate for the Pomodoro Technique</a> post.</p>
</li>
<li><a href="http://adiumx.com">Adium</a>
<p>Multi protocol IM client. I use it when not forced to use iChat by others.</p>
</li>
<li>
  <a href="http://skype.com">Skype</a>
<p>Needed for work and for recording podcasts.</p>
</li>
<li>
  <a href="http://www.busymac.com">BusyCal</a>
<p>Think of it as iCal pro. I like this better for syncing with Google Calendar.</p>
</li>
<li>
  <a href="http://culturedcode.com/things/">Things</a>
<p>The best to do list app on OS X.</p>
</li>
<li>
  <a href="http://www.obdev.at/products/launchbar/index.html">LaunchBar 5</a>
<p>LaunchBar is an app launcher and more. Although, to be fair, I&#8217;m giving <a href="http://www.alfredapp.com/">Alfred</a> a shot right now, too.
</li>
<li>
  <a href="http://www.shirt-pocket.com/SuperDuper/SuperDuperDescription.html">SuperDuper!</a>
<p>I don&#8217;t even use Time Machine because of SuperDuper! It&#8217;s a great backup program, though the target is a bit different than Time Machine. It&#8217;s well worth the money because of the smart backup feature.</p>
</li>
<li><a rel="lb" href="http://jasonseifer.com/assets/Choosy.png"><img src="http://jasonseifer.com/assets/Choosy-220x92.png" alt="Choosy" class="alignright" /></a>
<p>  <a href="http://www.choosyosx.com">Choosy</a>
<p>    Choosy is a &#8220;better default browser&#8221; for os x. It lets you choose which browser you want to open a link in. It&#8217;s really invaluable when you get used to it.
  </p>
</li>
<li>
  <a href="http://www.truecrypt.org/">TrueCrypt</a>
<p>Described on the web site as &#8220;Free open-source disk encryption software for Windows 7/Vista/XP, Mac OS X, and Linux.&#8221; I use it for an encrypted disk image where I hold my financial information. This image is kept in my Dropbox and synced when ever it&#8217;s unmounted automatically.</p>
</li>
<li>
  <a href="http://www.atebits.com/tweetie-mac/">Tweetie</a>
<p>My favorite OS X Twitter client so far.</p>
</li>
<li>
  <a href="http://www.apple.com/downloads/macosx/internet_utilities/rssmenu.html">RSS Menu</a>
<p>RSS Menu lets you track rss feeds in your menu bar. I don&#8217;t have all my feeds in here but a few select ones, like twitter searches that I want to pay attention to.
  </p>
</li>
<h2>Developer Stuff</h2>
<ul id="dev">
<li>
Git branch in Bash Prompt. This goes in ~/.bash_profile:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">parse_git_branch<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span> <span style="color: #7a0874; font-weight: bold;">&#123;</span>
  git branch <span style="color: #660033;">--no-color</span> <span style="color: #000000;">2</span><span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #000000; font-weight: bold;">/</span>dev<span style="color: #000000; font-weight: bold;">/</span>null <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">sed</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'/^[^*]/d'</span> <span style="color: #660033;">-e</span> <span style="color: #ff0000;">'s/* \(.*\)/\ →\ \1/'</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
&nbsp;
<span style="color: #7a0874; font-weight: bold;">export</span> <span style="color: #007800;">PS1</span>=<span style="color: #ff0000;">'\[\e[1;37m\][\[\e[1;35m\]\u\[\e[1;37m\]@\[\e[1;32m\]\h\[\e[1;37m\]:\[\e[1;36m\]\w\[\e[1;33m\]$(parse_git_branch)\[\e[1;37m\]]$ \[\e[0m\]'</span></pre></div></div>

<p>This will make your prompt look like this:<br />
<img src="http://jasonseifer.com/assets/gitbranch.png" alt="gitbranch.png" border="0" width="486" height="27" /></p>
</li>
<li>
Git config (~/.gitconfig:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #7a0874; font-weight: bold;">&#91;</span><span style="color: #7a0874; font-weight: bold;">alias</span><span style="color: #7a0874; font-weight: bold;">&#93;</span>
	st = status
	<span style="color: #c20cb9; font-weight: bold;">co</span> = checkout
	br = branch
	ui = update-index
	lg = log <span style="color: #660033;">--graph</span> <span style="color: #660033;">--pretty</span>=format:<span style="color: #ff0000;">'%Cred%h%Creset -%C(yellow)%d%Creset %f %Cgreen(%cr)%Creset'</span> <span style="color: #660033;">--abbrev-commit</span> <span style="color: #660033;">--date</span>=relative</pre></div></div>

</li>
<li>
Domain checking obsession. Put this in <code>~/.bash_profile</code>, courtesy of <a href="http://ozmm.org">Chris Wanstrath</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">function</span> isreg <span style="color: #7a0874; font-weight: bold;">&#123;</span>
	whois $<span style="color: #000000;">1</span> <span style="color: #000000; font-weight: bold;">|</span> <span style="color: #c20cb9; font-weight: bold;">grep</span> <span style="color: #660033;">-q</span> <span style="color: #ff0000;">'No match'</span> <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;No&quot;</span> <span style="color: #000000; font-weight: bold;">||</span> <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">&quot;Yes&quot;</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span></pre></div></div>

<p>Use as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">$ isreg jasonseifer.com
Yes</pre></div></div>

</li>
<li>
<p>Put the following in ~/.inputrc. Create it if it doesn&#8217;t exist. Paste in the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #000000; font-weight: bold;">set</span> show-all-if-ambiguous On
<span style="color: #000000; font-weight: bold;">set</span> completion-ignore-case on
<span style="color: #ff0000;">&quot;\ep&quot;</span>: history-search-backward
<span style="color: #ff0000;">&quot;\e[A&quot;</span>: history-search-backward
<span style="color: #ff0000;">&quot;\e[B&quot;</span>: history-search-forward</pre></div></div>

<p>Now you can use tab to auto complete ignoring case and also suggest more options. The history search stuff lets you use the up arrow to search backwards through your history by typing in the first few letters of a command you&#8217;ve typed before and going back through. It&#8217;s like ctrl+r but easier.</p>
</p>
<li>
<p>Install <a href="http://github.com/mxcl/homebrew">Homebrew</a>. Then: </p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  brew <span style="color: #c20cb9; font-weight: bold;">install</span> <span style="color: #c20cb9; font-weight: bold;">wget</span>
  brew <span style="color: #c20cb9; font-weight: bold;">install</span> git
  brew <span style="color: #c20cb9; font-weight: bold;">install</span> mysql</pre></div></div>

</li>
<li>
<p><strong>Ruby:</strong></p>
<p>First thing&#8217;s first. The version of rubygems that comes with Snow Leopard is a bit outdated. Update it:</p>
<p><code>sudo gem update --system</code></p>
<p><a href="http://rvm.beginrescueend.com/">RVM</a> is the Ruby Version Manager. It lets you have multiple versions of Ruby installed on you system. But it&#8217;s much more than that. You can also have gemsets which are preconfigured sets of gems. I&#8217;ve been using one gemset per project.
</p>
<p>
Local rack apps can easily be hosted with <a href="http://github.com/alloy/passengerpane">Passenger Pane</a>. Then you can also <a href="http://jasonseifer.com/2009/02/22/offline-gem-server-rdocs">set up your rdocs for local viewing</a> without using <code>gem server</code>. The instructions in the article still work, you just need to keep an old version or rdoc installed.
</p>
<p><strong><a href="http://effectif.com/articles/opening-ruby-gems-in-textmate">mategem</a></strong> command to edit a gem in Textmate with completion:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">_mategem<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
<span style="color: #7a0874; font-weight: bold;">&#123;</span>
    <span style="color: #7a0874; font-weight: bold;">local</span> curw
    <span style="color: #007800;">COMPREPLY</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>
    <span style="color: #007800;">curw</span>=<span style="color: #800000;">${COMP_WORDS[COMP_CWORD]}</span>
    <span style="color: #7a0874; font-weight: bold;">local</span> <span style="color: #007800;">gems</span>=<span style="color: #ff0000;">&quot;<span style="color: #007800;">$(gem environment gemdir)</span>/gems&quot;</span>
    <span style="color: #007800;">COMPREPLY</span>=<span style="color: #7a0874; font-weight: bold;">&#40;</span>$<span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #7a0874; font-weight: bold;">compgen</span> <span style="color: #660033;">-W</span> <span style="color: #ff0000;">'$(ls $gems)'</span> <span style="color: #660033;">--</span> <span style="color: #007800;">$curw</span><span style="color: #7a0874; font-weight: bold;">&#41;</span><span style="color: #7a0874; font-weight: bold;">&#41;</span>;
    <span style="color: #7a0874; font-weight: bold;">return</span> <span style="color: #000000;">0</span>
<span style="color: #7a0874; font-weight: bold;">&#125;</span>
<span style="color: #7a0874; font-weight: bold;">complete</span> <span style="color: #660033;">-F</span> _mategem <span style="color: #660033;">-o</span> dirnames mategem</pre></div></div>

</li>
<li>
<a href="http://peepcode.com/products/peepopen">PeepOpen</a> is a new application from PeepCode that gives you a smarter fuzzy file search (like in TextMate) and also works in MacVim and Emacs. It really helps out in MacVim and is much easier to configure than the fuzzy file finder plugin.
</li>
</ul>
<h3>Wrapping Up</h3>
<p>This isn&#8217;t <em>everything</em> I use but It&#8217;s a pretty good start. If you have any must have apps or dev environment shortcuts, please post in the comments.</p>
<style type="text/css">
h4 { margin-bottom: 0 }
li a p { margin-top: 0 }
ul#dev { margin:0; padding:0; text-indent: 0}
</style>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Mac+OS+X+Post+Install+Guide%2C+May+2010+http://bit.ly/dzeMDa" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;title=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;title=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;title=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;title=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;t=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;t=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;title=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/05/05/osx-post-install-guide-4&amp;title=Mac+OS+X+Post+Install+Guide%2C+May+2010" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/75pcWAyxWcM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/05/05/osx-post-install-guide-4/feed</wfw:commentRss>
		<slash:comments>4</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/05/05/osx-post-install-guide-4</feedburner:origLink></item>
		<item>
		<title>Friends Around Me</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/GElYSwlIvto/friends-around-me</link>
		<comments>http://jasonseifer.com/2010/04/09/friends-around-me#comments</comments>
		<pubDate>Fri, 09 Apr 2010 19:55:40 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[launch]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=449</guid>
		<description><![CDATA[I&#8217;d like to congratulate Friends Around Me with their official launch today. I was involved with doing some back-end development for this project. It&#8217;s mainly an iPhone (and iPad!) app with a Rails back-end. It&#8217;s a great idea from a very talented group of people whom I was lucky to work with. Check out the [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://friendsaround.me"><img class="alignright" src="http://img.skitch.com/20100409-cx27891pygu9y2kq88ekr1bjb4.png" alt="Friends Around Me" /></a></p>
<p>I&#8217;d like to congratulate <a href="http://www.friendsaround.me/">Friends Around Me</a> with their official launch today. I was involved with doing some back-end development for this project. It&#8217;s mainly an iPhone (and iPad!) app with a Rails back-end. It&#8217;s a great idea from a very talented group of people whom I was lucky to work with. Check out <a href="http://www.friendsaround.me/">the site</a> or <a href="http://itunes.apple.com/WebObjects/MZStore.woa/wa/viewSoftware?id=342291920&#038;mt=8">grab the app from iTunes</a>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Friends+Around+Me+http://bit.ly/dft0HI" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/04/09/friends-around-me&amp;title=Friends+Around+Me" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/04/09/friends-around-me&amp;title=Friends+Around+Me" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/04/09/friends-around-me&amp;title=Friends+Around+Me" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/04/09/friends-around-me&amp;title=Friends+Around+Me" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/04/09/friends-around-me&amp;t=Friends+Around+Me" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/04/09/friends-around-me&amp;t=Friends+Around+Me" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/04/09/friends-around-me&amp;title=Friends+Around+Me" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/04/09/friends-around-me&amp;title=Friends+Around+Me" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/GElYSwlIvto" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/04/09/friends-around-me/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/04/09/friends-around-me</feedburner:origLink></item>
		<item>
		<title>Rails Envy</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/o-aQE8lXLk8/rails-envy</link>
		<comments>http://jasonseifer.com/2010/04/08/rails-envy#comments</comments>
		<pubDate>Thu, 08 Apr 2010 23:06:40 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[rails-envy]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=436</guid>
		<description><![CDATA[Many have asked what happened to Rails Envy. I thought I&#8217;d tell a personal story to complement Gregg&#8217;s recent post. Fair warning: this gets a bit personal at times. A Brief Bit About Me I went to school for Psychology where I got a Bachelor of Science at the University of Central Florida. I took [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>Many have asked what happened to Rails Envy. I thought I&#8217;d tell a personal story to complement <a rel="nofollow" href="http://blog.envylabs.com/2010/04/rails-envy/">Gregg&#8217;s recent post</a>. Fair warning: this gets a bit personal at times.</p>
<h3>A Brief Bit About Me</h3>
<p>
  I went to school for Psychology where I got a Bachelor of Science at the University of Central Florida. I took some programming classes but was always a &quot;closet geek.&quot;  I&#8217;ve been programming since I was 6 years old and Ruby and Rails just felt right when I found it.  Even more so after coming from PHP, Perl, C, and (shudder) some MS Access coding. Right around when I was finishing college I started attending ORUG meetings and some hackfests. This is where I met Gregg Pollack. We got along great, especially with coding.
</p>
<h3>Where Rails Envy Came From</h3>
<p><img class="alignright" src="http://jasonseifer.com/assets/2010/04/D487E895-248A-4542-A811-11C152B9DA46.jpg" /></p>
<p>
  I think I attended all but the first Orlando Ruby Users Group and occasionally gave presentations. On the <a href="http://orug.org/articles/2006/11/07/next-meeting-tuesday-november-14th">Tuesday, November 14th</a> meeting I gave a presentation on using RJS in Rails. I actually thought it was a good idea to use the term &quot;AJAXified&quot; in a presentation description, but I digress. That night I was joking around with someone and we decided a local  developer had &quot;Rails Envy.&quot; At the time, I thought it would make a pretty funny Rails focused blog name so I registered the domain. Then I sat on it for a while.
</p>
<p>
  At some point in all this, Gregg, who has his <a href="http://www.patchedsoftware.com/">Patched Software</a> consultancy at the time, asked me to come work for him on a contract basis because he needed help on a project. This actually terrified me at the time. What would I do when the contract ran out? How would I find other work? I was pretty fresh out of college and hadn&#8217;t considered going contract. After talking it over with a lot of people, I quit my job.
</p>
<h3>Full Time to Contract</h3>
<div class="alignright" style="width:190px; text-align: center">
<a href="http://www.flickr.com/photos/jseifer/520857903/in/set-72157600287909611/"><img src="http://farm1.static.flickr.com/213/520857903_fb5452cd70_m.jpg" alt="Me and Gregg" /></a><br />
<span class="image_caption">This picture has nothing to do with the paragraph, but it&#8217;s from that time period.</span>
</div>
<p>
  Coming from the full time employment world, working on a contract basis was a wonderful experience. I was <em>working</em> while wearing a <em>t-shirt and shorts</em>! Plus, the work was fascinating to me. I remember working with Gregg to solve some very interesting Ruby and Rails problems of the time. There were always people blogging but not as many as today and a lot of the time you had to dive deep in to Rails rather than googling solutions. It&#8217;s inspiring to see how far Rails has come.
</p>
<p>After I working with Gregg for a little while I convinced him that we needed a blog. Gregg wasn&#8217;t convinced we were qualified enough to write a blog. I remember saying that we didn&#8217;t have to be because we had <em>something</em> to offer people based on our experience developing Rails full time. This was a different time &#8212; not many people were doing full time Rails work.  We used railsenvy.com, set up <a href="http://mephistoblog.com/">Mephisto</a>, and we were rolling.
</p>
<p>We weren&#8217;t expecting the amount of feedback we got. It was great.</p>
<h3>We Make Some Videos</h3>
<p>
  I remember leaving ORUG one night and saying to Gregg &quot;Wouldn&#8217;t it be funny if we parodied the Mac vs PC ads only using Ruby on Rails and other web development frameworks?&quot; I was just joking but Gregg convinced me it would be a good idea to actually shoot these. I remember writing some script on a notepad during ORUG about a guy running in a track suit. I&#8217;m really glad that one didn&#8217;t make it in. Anyway, Gregg set up a <a href="http://123.writeboard.com/7e19607f41c8f8290/v/show/2294579">writeboard</a> (password: railsenvy), we bounced some ideas back and forth, got in touch with a friend of mine who did video work, and actually shot the videos.
</p>
<p>
Shooting the videos turned out to take a lot longer than I expected. It also was much more fun than I expected. I think the original set of four took nearly two full days including rehearsals. I still love the bear in a jar for hibernate. The videos went viral and that was awesome. I think I have a screenshot somewhere of 3 of the videos being in various spots on the front page of digg at the same time.
</p>
<p>Gregg managed to get in contact with Chad Fowler and have the videos played at the first Railsconf. That was a truly exciting experience. I wasn&#8217;t expecting it at all and was flattered that they even considered playing them.  After Railsconf we made some more.  To this day I&#8217;m still embarrassed by the <a href="http://www.youtube.com/watch?v=kU-4D51FY98">myspace</a> one.</p>
<h3>Hey, Let&#8217;s Start a Podcast!</h3>
<p><a href="http://www.flickr.com/photos/jseifer/1525646639/in/set-72157602340863629/"><img class="alignright" src="http://farm3.static.flickr.com/2233/1525646639_447cf2eb55_m.jpg" alt="Rails Envy" /></a></p>
<p>
  I wasn&#8217;t much of a podcast listener. Gregg turned me on to the amazing <a href="http://radiolab.org">Radio Lab</a> and <a href="http://www.thisamericanlife.org/">This American Life</a> podcasts. I had noticed at the time that there weren&#8217;t any Ruby or Rails news podcasts. I remember it took some convincing of Gregg to get one started. My original pitch was something like &quot;Just a five minute thing where we read what&#8217;s new. We&#8217;re reading all of the RSS feeds anyway&quot; &quot;Why would people listen to us when they could just read RSS feeds?&quot; &quot;Some people like listening to podcasts. And we&#8217;re funny.&quot; After doing some research on how to set up a successful podcast (Thanks <a href="http://coderpath.com/">Miles</a> and <a href="http://ryanpricemedia.com/">Ryan!</a>) we were up and running.
</p>
<p>
  I learned a ton about editing podcasts. <a href="http://hivelogic.com">Dan</a> taught me why I should use compression rather than normalization under certain circumstances. For the longest time, I used Soundtrack Pro to edit the podcasts. I think I did the first 40 episodes in Soundtrack before learning Pro Tools. Gregg and I would record each <em>story</em> separately and assemble them later. It usually took three takes if we messed up. Which was often. Looking back, I can&#8217;t believe I edited over 90 of them. Every week. It was a lot of work but I loved doing it.
</p>
<h3>Rails Can&#8217;t Scale</h3>
<p><a href="http://skitch.com/jseifer/n7923/rails-can-t-scale-google-search"><img src="http://img.skitch.com/20100408-ng348jrrshk17mpttqf3e9jixc.png" width="225" alt="Can Rails Scale?" class="alignright" /></a></p>
<p>
  I think a lot of people were wondering why a Rails developer would be saying that Rails <a href="http://railscantscale.com">can&#8217;t</a> <a href="http://canrailsscale.com">scale</a>, very often at least once a week. When I started this meme there were a lot of blog posts and questions about the time about Rails and scalability. People were citing Twitter as an example of Rails not being able to scale during their fail whale days. Java people were saying Ruby is slow. TechCrunch was <a href="http://techcrunch.com/2008/05/22/twitter-at-scale-will-it-work/">all over it</a>.</p>
<p>My idea was to make the expression &quot;Rails can&#8217;t scale&quot; so tired out that people would get sick of hearing it. When people commented asking me to stop, I knew I was doing a good job. Sorry everyone. But it was for a good cause. There&#8217;s a lot less sentiment these days about Rails not being able to scale. I&#8217;d like to think I played a small part in that.</p>
<h3>Working for The Man!</h3>
<p><img class="alignright" src="http://img.skitch.com/20100408-ekyp3e21h71g1jsx82h56km8rj.png" alt="Halogen Guides" /></p>
<p>
  Gregg and I were approached by <a href="http://hivelogic.com">Dan Benjamin</a> about working for a startup called Helium Report (now <a href='http://halogenguides.com'>Halogen Guides</a>). We accepted. I got the opportunity to work with a kick ass team.  I have nothing but praise and respect for everyone I worked with. We had our challenges but I think we handled them well. I wrote some pretty good code, if I do say so myself.<br />
However, for reasons I&#8217;m about to outline, I wasn&#8217;t able to keep the job.</p>
<h3>Tragedy Strikes</h3>
<p> This part is difficult for me to write. Gregg mentioned in his post that I moved to Ft. Lauderdale for a year but didn&#8217;t say why. On May 1st, 2008, my mother woke up to find my father missing from the house. She was very worried and under a lot of stress at the time. My sister and I eventually found my dad, though my mother suffered her second heart attack while we were looking for him. She passed away a few days later.
</p>
<p> Words can&#8217;t convey how deeply I miss her. I think about her every day. She was an amazing human being and I&#8217;m proud to be her son. I owe her a lot and I&#8217;m largely the person I am today because of her.</p>
<p>I&#8217;m not sure people ever really &quot;get over&quot; these kinds of things; rather, you find a new normal. I got a lot of supportive emails when Gregg announced this at the end of the podcast. I&#8217;m sorry if you emailed and I never got back to you.</p>
<p>I wasn&#8217;t able to keep a job while all of this was going on. However, everyone at Halogen Guides was ridiculously, above and beyond, supportive. For that I&#8217;m extremely grateful. I wish everyone nothing but the best.</p>
<h3>Some Good Comes out of it</h3>
<p><img class="alignright" src="http://lh4.ggpht.com/_aJ8TVhEgOQU/SDBjny0Ej2I/AAAAAAAAC6I/RgpXSiAkqvE/s288/IMG_1672.png"></p>
<p>My girlfriend Candace and I moved to South Florida to help take care of my father.  She selflessly changed jobs and moved in with my father and I. This sealed the deal in my mind and I proposed. She said yes. She&#8217;s a wonderful person and we&#8217;re getting married September 25th, this year. I couldn&#8217;t be happier, even though I&#8217;m a bit difficult at times. I probably wouldn&#8217;t have been able to get through everything without her support and the support from some very good friends. You know who you are. I thank you all deeply.
</p>
<h3>Wrapping Up</h3>
<p>
  With me living in South Florida and Gregg in Orlando, each working on different projects, it started to become more difficult to do the podcast which was still going strong. We did our best but it started making more sense to split off in to our own companies. I started <a href="http://twistedmind.com">Twistedmind Inc.</a> where, among other things, I offer consulting services scaling Rails. <a href="http://hivelogic.com">Dan Benjamin</a> took over the reigns as co-host of the podcast, which we eventually moved over to <a href="http://5by5.tv">5by5</a>. We also started <a href="http://5by5.tv/devshow">The Dev Show</a> to do a big longer discussion on general programming topics.
</p>
<h3>Moving On</h3>
<p>
  Though we have mutually decided to take the Rails Envy web site down, I feel that Rails Envy, and what Gregg and I accomplished together, should be celebrated. I&#8217;m proud of the work we did and what we accomplished as a team. I&#8217;m proud of the videos, podcasts, talks, and client work we did.  I&#8217;m grateful for the opportunities to have met and worked with so many people. It was a great experience. I hope to continue to set the bar high doing client work through my new company, <a href="http://twistedmind.com">Twistedmind</a> (Hire me!), being a part of podcasts like <a href="http://5by5.tv/rubyshow">The Ruby Show</a> and <a href="http://5by5.tv/devshow">The Dev Show</a>, and launching projects like <a href="http://geniuspool.com">Genius Pool</a>.  I wish everyone the best. See you soon.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Rails+Envy+http://bit.ly/b6UWpd" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/04/08/rails-envy&amp;title=Rails+Envy" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/04/08/rails-envy&amp;title=Rails+Envy" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/04/08/rails-envy&amp;title=Rails+Envy" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/04/08/rails-envy&amp;title=Rails+Envy" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/04/08/rails-envy&amp;t=Rails+Envy" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/04/08/rails-envy&amp;t=Rails+Envy" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/04/08/rails-envy&amp;title=Rails+Envy" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/04/08/rails-envy&amp;title=Rails+Envy" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/o-aQE8lXLk8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/04/08/rails-envy/feed</wfw:commentRss>
		<slash:comments>14</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/04/08/rails-envy</feedburner:origLink></item>
		<item>
		<title>Rake Tutorial</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/e5Qoz404RGU/rake-tutorial</link>
		<comments>http://jasonseifer.com/2010/04/06/rake-tutorial#comments</comments>
		<pubDate>Tue, 06 Apr 2010 08:25:09 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rake]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=388</guid>
		<description><![CDATA[If you&#8217;re developing with Rails you&#8217;ve probably encountered rake once or twice. This blog post aims to walk you through where rake came from and an introduction on how to use it effectively in your Rails apps. A Little Bit of History Rake is the project of Jim Weirich. It&#8217;s a build tool. For a [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><img class="alignright" src="http://farm4.static.flickr.com/3531/3183114977_da7c827934_m.jpg" /></p>
<p>If you&#8217;re developing with Rails you&#8217;ve probably encountered rake once or twice. This blog post aims to walk you through where rake came from and an introduction on how to use it effectively in your Rails apps.</p>
<h3>A Little Bit of History</h3>
<p>
  Rake is the project of <a href="http://onestepback.org">Jim Weirich</a>. It&#8217;s a build tool. For a good laugh and an even more in depth history check out the &quot;<a href="http://rake.rubyforge.org/files/doc/rational_rdoc.html">rational.rdoc</a>&quot; from the Rake documentation.  Essentially, rake started as an idea for using Ruby inside of a Makefile. Though Jim doesn&#8217;t sound convinced from the tone in that document, it <em>is</em> a good idea.
</p>
<p>What&#8217;s the need for an automated build system at all? As usual, <a href="http://en.wikipedia.org/wiki/Build_tool">Wikipedia</a> has the answer:</p>
<blockquote><p>
  Historically, developers used build automation to call compilers and linkers from inside a build script versus attempting to make the compiler calls from the command line. It is simple to use the command line to pass a single source module to a compiler and then to a linker to create the final deployable object. However, when attempting to compile and link many source code modules, in a particular order, using the command line process is not a reasonable solution. [sic]<br />
  As the build process grew more complex, developers began adding pre and post actions around the calls to the compilers such as a check-out from version control to the copying of deployable objects to a test location. The term &#8220;build automation&#8221; now includes managing the pre and post compile and link activities as well as the compile and link activities.
  </p></blockquote>
<h3>It&#8217;s about Dependencies</h3>
<p>
  This may be a bit of a stretch to say but build tools are about dependencies. One file or set of files depends on another set to get compiled, linked, or other fun things before the next set can be processed. The same idea exists in rake with tasks and task dependencies. Let&#8217;s look at a simple rake task. Save the following as &#8220;Rakefile&#8221; in any directory:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  directory <span style="color:#996600;">&quot;tmp&quot;</span>
&nbsp;
  file <span style="color:#996600;">&quot;hello.tmp&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;tmp&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    sh <span style="color:#996600;">&quot;echo 'Hello' &gt;&gt; 'tmp/hello.tmp'&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>What we&#8217;re saying here is that the file named &#8220;hello.tmp&#8221; depends on the directory &quot;tmp&quot;. When rake runs across this, it&#8217;s going to create the directory &quot;tmp&quot; first before running the &quot;hello.tmp&quot; task. When you run it, you&#8217;ll see something like the following:
</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake hello.tmp
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Hello'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">'tmp/hello.tmp'</span></pre></div></div>

<p>If you were to look at the &quot;hello.tmp&quot; file you would see the phrase &quot;Hello&quot;. What happens if you run it again? You&#8217;ll see the same output again. What&#8217;s going on? Rake is generating the file again. It&#8217;s doing this because it can&#8217;t actually find the file tmp/hello.tmp from that definition. Let&#8217;s redefine the task:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  directory <span style="color:#996600;">&quot;tmp&quot;</span>
&nbsp;
  file <span style="color:#996600;">&quot;tmp/hello.tmp&quot;</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;tmp&quot;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    sh <span style="color:#996600;">&quot;echo 'Hello' &gt; 'tmp/hello.tmp'&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Now if you were to run it twice you would see something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake <span style="color: #ff0000;">&quot;tmp/hello.tmp&quot;</span>
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  <span style="color: #c20cb9; font-weight: bold;">mkdir</span> <span style="color: #660033;">-p</span> tmp
  <span style="color: #7a0874; font-weight: bold;">echo</span> <span style="color: #ff0000;">'Hello'</span> <span style="color: #000000; font-weight: bold;">&gt;</span> <span style="color: #ff0000;">'tmp/hello.tmp'</span>
  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake <span style="color: #ff0000;">&quot;tmp/hello.tmp&quot;</span>
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span></pre></div></div>

<p>Rake now knows that the file task has been run.</p>
<h3>Running Other Tasks</h3>
<p>
  Rake tasks can take the form of having prerequisites and can <em>depend on</em> another task. Let&#8217;s say I wanted to get ready in the morning. My process would be something like this:</p>
<ol>
<li>Turn off alarm clock.</li>
<li>Groom myself.</li>
<li>Make coffee.</li>
<li>Walk dog.</li>
</ol>
<p>
  Let&#8217;s further assume that I have OCD and have to do all of these in order. In rake I might express my morning as follows:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  task <span style="color:#ff3333; font-weight:bold;">:turn_off_alarm</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Turned off alarm. Would have liked 5 more minutes, though.&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  task <span style="color:#ff3333; font-weight:bold;">:groom_myself</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Brushed teeth.&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Showered.&quot;</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Shaved.&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  task <span style="color:#ff3333; font-weight:bold;">:make_coffee</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    cups = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;COFFEE_CUPS&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#006666;">2</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Made #{cups} cups of coffee. Shakes are gone.&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  task <span style="color:#ff3333; font-weight:bold;">:walk_dog</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Dog walked.&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  task <span style="color:#ff3333; font-weight:bold;">:ready_for_the_day</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:turn_off_alarm</span>, <span style="color:#ff3333; font-weight:bold;">:groom_myself</span>, <span style="color:#ff3333; font-weight:bold;">:make_coffee</span>, <span style="color:#ff3333; font-weight:bold;">:walk_dog</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Ready for the day!&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>If I were to run this as is I would type <code>rake ready_for_the_day</code> and I&#8217;d see the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake ready_for_the_day
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Turned off alarm. Would have liked <span style="color: #000000;">5</span> <span style="color: #c20cb9; font-weight: bold;">more</span> minutes, though.
  Brushed teeth.
  Showered.
  Shaved.
  Made <span style="color: #000000;">5</span> cups of coffee. Shakes are gone.
  Dog walked.
  Ready <span style="color: #000000; font-weight: bold;">for</span> the day<span style="color: #000000; font-weight: bold;">!</span></pre></div></div>

<p>By running the <code>ready_for_the_day</code> task it notices that the <code>turn_off_alarm, groom_myself, make_coffee, and walk_dog</code> tasks are all prerequisites of the <code>ready_for_the_day</code> task. Then it runs them all in the appropriate order. You&#8217;ll notice that we can pass something in to the <code>make_coffee</code> task. If we were having a really tough day we could pass in a value to the COFFEE_CUPS environment variable and be more prepared:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake <span style="color: #007800;">COFFEE_CUPS</span>=<span style="color: #000000;">5</span> make_coffee
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Made <span style="color: #000000;">5</span> cups of coffee. Shakes are gone.</pre></div></div>

</p>
<h3>Namespaces</h3>
<p>
  Rake supports the concept of namespaces which essentially lets you group together similar tasks inside of one namespace. You&#8217;d then specify the namespace when you call a task inside it.  It keeps things tidy while still being quite effective.  In Rails, you might notice the <code><strong>db</strong>:migrate</code> task. In that example, <code><strong>db</strong></code> is the namespace and migrate is the task. Using the above example, we might put everything in to the <code>morning</code> namespace:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  namespace <span style="color:#ff3333; font-weight:bold;">:morning</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    task <span style="color:#ff3333; font-weight:bold;">:turn_of_alarm</span>
    ....
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Now if you were to run <code>rake COFFEE_CUPS=3 morning:ready_for_the_day</code> you would have the same output as above, only it only took 3 cups of coffee today. Score!</p>
<h3>The Default Task</h3>
<p>
  Rake has the concept of a <em>default</em> task. This is essentially the task that will be run if you type rake without any arguments. If we wanted our default task to be turning off the alarm from the example above, we&#8217;d do this:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  task <span style="color:#ff3333; font-weight:bold;">:default</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'morning:turn_off_alarm'</span></pre></div></div>

<p>Running <code>rake</code> now produces the following:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Turned off alarm. Would have liked <span style="color: #000000;">5</span> <span style="color: #c20cb9; font-weight: bold;">more</span> minutes, though.</pre></div></div>

<h3>Describing Your Tasks</h3>
<p>You can use the <code>desc</code> method to describe your tasks. This is done on the line right above the task definition. It&#8217;s also what gives you that nice output when you run <coee>rake -T</coee> to get a list of tasks.  Tasks are displayed in alphabetical order. We&#8217;ll define some descriptions in our Rakefile (abbreviated for brevity):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  ...
  <span style="color:#9900CC;">desc</span> <span style="color:#996600;">&quot;Make coffee&quot;</span>
  task <span style="color:#ff3333; font-weight:bold;">:make_coffee</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    cups = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;COFFEE_CUPS&quot;</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span> <span style="color:#006666;">2</span>
    <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Made #{cups} cups of coffee. Shakes are gone.&quot;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
  ...</pre></div></div>

<p>Now when we run <coee>rake -T</coee> for our list of tasks we get the following output:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake <span style="color: #660033;">-T</span>
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  rake afternoon:make_coffee      <span style="color: #666666; font-style: italic;"># Make afternoon coffee</span>
  rake morning:groom_myself       <span style="color: #666666; font-style: italic;"># Take care of normal hygeine tasks.</span>
  rake morning:make_coffee        <span style="color: #666666; font-style: italic;"># Make coffee</span>
  rake morning:ready_for_the_day  <span style="color: #666666; font-style: italic;"># Get ready for the day</span>
  rake morning:turn_off_alarm     <span style="color: #666666; font-style: italic;"># Turn off alarm.</span>
  rake morning:walk_dog           <span style="color: #666666; font-style: italic;"># Walk the dog</span></pre></div></div>

<p>You can add in a string to get tasks matching that displayed. Running <code>rake -T af</code> would show just the afternoon task.</p>
<h3>Redefining Tasks</h3>
<p>Let&#8217;s say you want to add on to an existing task. Perhaps you have another item in your grooming routine like styling your hair.  You could write another task and slip it in as a dependency for <code>groom_myself</code> but you could also redefine <code>groom_myself</code> later on (shortened for brevity but you get the idea):</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  namespace <span style="color:#ff3333; font-weight:bold;">:morning</span> <span style="color:#9966CC; font-weight:bold;">do</span>
	....
	<span style="color:#9900CC;">task</span> <span style="color:#ff3333; font-weight:bold;">:groom_myself</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Brushed teeth.&quot;</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Showered.&quot;</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Shaved.&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
    ....
  <span style="color:#9966CC; font-weight:bold;">end</span>
  ...
  <span style="color:#9900CC;">namespace</span> <span style="color:#ff3333; font-weight:bold;">:morning</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    task <span style="color:#ff3333; font-weight:bold;">:groom_myself</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Styled hair.&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>


<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake morning:groom_myself
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Brushed teeth.
  Showered.
  Shaved.
  Styled hair.</pre></div></div>

<p><img class="alignright" src="http://farm1.static.flickr.com/133/337248947_f1eadc7cc0_m.jpg" /></p>
<h3>Invoking Tasks</h3>
<p>
  You may at some point want to invoke a task from inside another task.  Let&#8217;s say, for example, you wanted to make coffee in the afternoon, too. If you need an extra upper after lunch you could do that the following way:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  namespace <span style="color:#ff3333; font-weight:bold;">:afternoon</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    task <span style="color:#ff3333; font-weight:bold;">:make_coffee</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      <span style="color:#6666ff; font-weight:bold;">Rake::Task</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'morning:make_coffee'</span><span style="color:#006600; font-weight:bold;">&#93;</span>.<span style="color:#9900CC;">invoke</span>
      <span style="color:#CC0066; font-weight:bold;">puts</span> <span style="color:#996600;">&quot;Ready for the rest of the day!&quot;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Which outputs:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #7a0874; font-weight: bold;">&#91;</span>jason<span style="color: #000000; font-weight: bold;">@</span>brick:~<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#93;</span>$ rake afternoon:make_coffee <span style="color: #007800;">COFFEE_CUPS</span>=<span style="color: #000000;">1</span>
  <span style="color: #7a0874; font-weight: bold;">&#40;</span><span style="color: #000000; font-weight: bold;">in</span> <span style="color: #000000; font-weight: bold;">/</span>Users<span style="color: #000000; font-weight: bold;">/</span>jason<span style="color: #000000; font-weight: bold;">/</span>src<span style="color: #7a0874; font-weight: bold;">&#41;</span>
  Made <span style="color: #000000;">1</span> cups of coffee. Shakes are gone.
  Ready <span style="color: #000000; font-weight: bold;">for</span> the rest of the day<span style="color: #000000; font-weight: bold;">!</span></pre></div></div>

<p>A real world example of this is the <code>rcov:all</code> task. I use this in <a href="http://geniuspool.com">Genius Pool</a> for aggregate rcov data. It&#8217;s shamelessly stolen from <a href="http://www.claytonlz.com/index.php/2009/04/how-to-setup-rspec-cucumber-webrat-rcov-and-autotest-on-leopard/">Clayton Lengel-Zigich</a>. Go check out that post for a good example of invoking other tasks from rake.</p>
<h3>Refactoring</h3>
<p>
  You&#8217;ll notice in the example above we&#8217;re delegating most of the work to already defined methods and tasks in the RSpec and Cucumber classes. As a general rule, try to keep your methods already defined other places and call them from rake with your specific options and use cases.  Let&#8217;s say I had a Rails application that e-mailed all accounts in the system that their account was expiring in a certain number of days. Here&#8217;s one way to write it:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  namespace <span style="color:#ff3333; font-weight:bold;">:accounts</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    desc <span style="color:#996600;">&quot;Email expiring accounts to let them know&quot;</span>
    task <span style="color:#ff3333; font-weight:bold;">:email_expiring</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      date = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'from'</span><span style="color:#006600; font-weight:bold;">&#93;</span> ? <span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'from'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> : <span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">today</span>
      accounts = Account.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:all</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">&quot;expiration_date = ?&quot;</span>, date<span style="color:#006600; font-weight:bold;">&#93;</span>
      accounts.<span style="color:#9900CC;">each</span> <span style="color:#9966CC; font-weight:bold;">do</span> <span style="color:#006600; font-weight:bold;">|</span>account<span style="color:#006600; font-weight:bold;">|</span>
        Notifier.<span style="color:#9900CC;">deliver_account_expiration</span><span style="color:#006600; font-weight:bold;">&#40;</span>account<span style="color:#006600; font-weight:bold;">&#41;</span>
      <span style="color:#9966CC; font-weight:bold;">end</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>A better way, that would let you test it more thoroughly would be to do the following:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  namespace <span style="color:#ff3333; font-weight:bold;">:accounts</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    desc <span style="color:#996600;">&quot;Email expiring accounts to let them know&quot;</span>
    task <span style="color:#ff3333; font-weight:bold;">:email_expiring</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:environment</span> <span style="color:#9966CC; font-weight:bold;">do</span>
      date = ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'from'</span><span style="color:#006600; font-weight:bold;">&#93;</span> ? <span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'from'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span> : <span style="color:#CC00FF; font-weight:bold;">Date</span>.<span style="color:#9900CC;">today</span>
      Account.<span style="color:#9900CC;">notify_expiring</span><span style="color:#006600; font-weight:bold;">&#40;</span>date<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>This lets you unit test your <code>notify_expiring</code> method on the account class and make sure that it&#8217;s doing what it&#8217;s supposed to do. This is a small, made up example, but you get the idea. Here&#8217;s an example from <a href="http://github.com/defunkt/resque/blob/master/tasks/redis.rake">Resque</a>:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  desc <span style="color:#996600;">'Restart redis'</span>
  task <span style="color:#ff3333; font-weight:bold;">:restart</span> <span style="color:#9966CC; font-weight:bold;">do</span>
    RedisRunner.<span style="color:#9900CC;">stop</span>
    RedisRunner.<span style="color:#9900CC;">start</span>
  <span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>Notice the delegation to the RedisRunner class methods? This is a great rake task</p>
<h3>Rails</h3>
<p>
  You can get access to your models, and in fact, your whole environment by making tasks dependent on the <code>environment</code> task. This lets you do things like run <code>rake RAILS_ENV=staging db:migrate</code>. Rails will <strong>autmatically pick up tasks in lib/tasks</strong>.  Any files named with the <code>.rake</code> extension will get picked up when you do <code>rake -T</code>.
</p>
<h3>Scheduling Rake Tasks</h3>
<p>
  You can use <a href="http://en.wikipedia.org/wiki/Cron">cron</a> to schedule rake tasks.  Let&#8217;s say you wanted to run the account email expiration task every night at 12:15 on your production server, you might have something like this:
</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">  <span style="color: #000000;">15</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #000000; font-weight: bold;">*</span> <span style="color: #7a0874; font-weight: bold;">cd</span> <span style="color: #000000; font-weight: bold;">/</span>data<span style="color: #000000; font-weight: bold;">/</span>my_app<span style="color: #000000; font-weight: bold;">/</span>current <span style="color: #000000; font-weight: bold;">&amp;&amp;</span> <span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>rake <span style="color: #007800;">RAILS_ENV</span>=production accounts:email_expiring</pre></div></div>

<h3>Misc</h3>
<p>
  <code>Rake.original_dir</code> gives you the directory that the original rake task was run from.
</p>
<p></p>
<h3>Derivatives</h3>
<ul>
<li><a href="http://github.com/wycats/thor/">Thor</a> is a more class based approach to solving some of the things rake does as far as actual tasks go. </li>
<li><a href="http://capify.org">Capistrano</a> is the de facto standard for deploying rails apps. Its syntax is inspired pretty heavily by Rake, but it is definitely <em>not</em> rake.</li>
</ul>
<h3>Further Reading</h3>
<ul>
<li><a href="http://blog.jayfields.com/2006/11/ruby-testing-rake-tasks.html">&quot;Testing Rake Tasks&quot;</a> by Jay Fields</li>
<li><a href="http://www.jbarnette.com/2009/08/27/on-rake.html">&quot;On Rake&quot; by John Barnette</a></li>
<li><a href="http://www.claytonlz.com/index.php/2009/04/how-to-setup-rspec-cucumber-webrat-rcov-and-autotest-on-leopard/">How To: Setup RSpec, Cucumber, Webrat, RCov and Autotest on Leopard | Clayton Lengel-Zigich</a></li>
<li><a href="http://railscasts.com/episodes/66-custom-rake-tasks">Custom Rake Tasks</a> Railscast</li>
</ul>
<h3>Useful Rake Examples</h3>
<ul>
<li><a href="http://gist.github.com/359401">Sample Rakefile</a> from this article.</li>
<li><a href="http://github.com/defunkt/resque/blob/master/tasks/redis.rake">redis.rake</a> from Resque.</li>
</ul>
<p>If you have any more useful rake examples, please let me know and I&#8217;ll add them here.</p>
<p></p>
<p><strong>Photo Credits:</strong><br />
<strong><a href="http://www.flickr.com/photos/34094515@N00/3183114977/">Shaker rake</a></strong> by <a href="http://www.flickr.com/photos/34094515@N00/">dicktay2000</a> on Flickr.<br />
<strong><a href="http://www.flickr.com/photos/altemark/337248947/">Toy sampling megaphone</a></strong> by <a href="http://www.flickr.com/photos/altemark/">altemark</a> on Flickr.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Rake+Tutorial+http://bit.ly/b4Ed5O" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;title=Rake+Tutorial" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;title=Rake+Tutorial" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;title=Rake+Tutorial" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;title=Rake+Tutorial" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;t=Rake+Tutorial" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;t=Rake+Tutorial" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;title=Rake+Tutorial" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/04/06/rake-tutorial&amp;title=Rake+Tutorial" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/e5Qoz404RGU" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/04/06/rake-tutorial/feed</wfw:commentRss>
		<slash:comments>18</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/04/06/rake-tutorial</feedburner:origLink></item>
		<item>
		<title>Developer Job Board</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/yI0200eeupo/developer-job-board</link>
		<comments>http://jasonseifer.com/2010/03/29/developer-job-board#comments</comments>
		<pubDate>Mon, 29 Mar 2010 18:51:07 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Business]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=391</guid>
		<description><![CDATA[I&#8217;m pleased to announce the Genius Pool job board. This is a new job board for connecting companies to job seekers. With the connection to the 5by5 podcast network, making sure your job opportunity is in the ears of qualified applicants has never been easier. Why&#8217;s that? If you&#8217;re looking for a Ruby or Rails [...]


Related posts:<ol><li><a href='http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration' rel='bookmark' title='Permanent Link: Genius Pool Supports Twitter Integration'>Genius Pool Supports Twitter Integration</a> <small>This has been around for a little while now, but...</small></li>
</ol>]]></description>
			<content:encoded><![CDATA[<p><a href="http://geniuspool.com/?s=jsbl"><img class="alignright" src="http://jasonseifer.com/assets/2010/03/logo.png" alt="Genius Pool" border="0" width="243" height="64" /></a>I&#8217;m pleased to announce the <a href="http://geniuspool.com/?s=jsb">Genius Pool</a> job board. This is a new job board for connecting companies to job seekers. With the connection to the <a href="http://5by5.tv">5by5 podcast network</a>, making sure your job opportunity is in the ears of qualified applicants has never been easier. Why&#8217;s that? If you&#8217;re looking for a Ruby or Rails developer, what better spot is there than <a href="http://5by5.tv/rubyshow">The Ruby Show</a>? The same applies to <a href="http://5by5.tv/devshow">The Dev Show</a>. You can also be assured that whomever is applying has an <em>impeccable</em> sense of humor and taste. </p>
<p>So <a href="http://geniuspool.com/?s=jsb">check it out</a> if you get a moment or <a href="http://twitter.com/geniuspool">follow Genius Pool on Twitter</a> for new job postings as they get posted. I&#8217;ll be doing some blog posts in the coming weeks about the process of launching your own project as well.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Developer+Job+Board+http://bit.ly/bpJ60Z" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/29/developer-job-board&amp;title=Developer+Job+Board" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/29/developer-job-board&amp;title=Developer+Job+Board" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/29/developer-job-board&amp;title=Developer+Job+Board" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/29/developer-job-board&amp;title=Developer+Job+Board" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/29/developer-job-board&amp;t=Developer+Job+Board" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/29/developer-job-board&amp;t=Developer+Job+Board" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/29/developer-job-board&amp;title=Developer+Job+Board" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/29/developer-job-board&amp;title=Developer+Job+Board" title="Post to Reddit">Reddit This Post</a></p>

<p>Related posts:<ol><li><a href='http://jasonseifer.com/2010/07/20/geniuspool-twitter-integration' rel='bookmark' title='Permanent Link: Genius Pool Supports Twitter Integration'>Genius Pool Supports Twitter Integration</a> <small>This has been around for a little while now, but...</small></li>
</ol></p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/yI0200eeupo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/03/29/developer-job-board/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/03/29/developer-job-board</feedburner:origLink></item>
		<item>
		<title>80s Me</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/SX1trDGA0HY/80s-me</link>
		<comments>http://jasonseifer.com/2010/03/26/80s-me#comments</comments>
		<pubDate>Fri, 26 Mar 2010 19:34:11 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Humor]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=384</guid>
		<description><![CDATA[This fantastic image courtesy of Peter Cooper. Delicious Digg This Post Facebook Reddit This Post No related posts.


No related posts.]]></description>
			<content:encoded><![CDATA[<div style="text-align:center;"><a href="http://skitch.com/petercooper/n551p/seifer-80s"><img src="http://jasonseifer.com/assets/2010/03/20100326-qu2ym5us1yxacd3j78a7ggs4ex.jpg" alt="20100326-qu2ym5us1yxacd3j78a7ggs4ex.jpg" border="0" width="419" height="527" /></a></div>
<p></p>
<p>This fantastic image courtesy of <a href="http://skitch.com/petercooper/n551p/seifer-80s">Peter Cooper</a>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=80s+Me+http://bit.ly/dvXjsK" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/26/80s-me&amp;title=80s+Me" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/26/80s-me&amp;title=80s+Me" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/26/80s-me&amp;title=80s+Me" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/26/80s-me&amp;title=80s+Me" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/26/80s-me&amp;t=80s+Me" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/26/80s-me&amp;t=80s+Me" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/26/80s-me&amp;title=80s+Me" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/26/80s-me&amp;title=80s+Me" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/SX1trDGA0HY" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/03/26/80s-me/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/03/26/80s-me</feedburner:origLink></item>
		<item>
		<title>On Passwords</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/oHhcIi4CGUI/on-passwords</link>
		<comments>http://jasonseifer.com/2010/03/21/on-passwords#comments</comments>
		<pubDate>Sun, 21 Mar 2010 10:00:11 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Programming]]></category>
		<category><![CDATA[passwords]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=355</guid>
		<description><![CDATA[On a recent episode of The Dev Show Dan and I talked about passwords. In particular, the topic of password hashing came up. I&#8217;d like to say up front that I&#8217;m not a security guy and most definitely not a cryptographer. However, I don&#8217;t have to be because there are much smarter people who have [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>On a recent episode of <a href="http://5by5.tv/devshow/4">The Dev Show</a> Dan and I talked about passwords. In particular, the topic of password hashing came up. I&#8217;d like to say up front that I&#8217;m not a security guy and most definitely not a cryptographer. However, I don&#8217;t <em>have</em> to be because there are much smarter people who have already done a lot of work on encryption schemes and have done it much better than I ever could.</p>
<div class="image_caption"><img src="http://jasonseifer.com/assets/2010/03/9EB3D76B-FB9C-43A5-B23D-CB6EB6EB28F9.jpg" alt="Spaceballs" border="0" width="360" height="240" /><br />
Above: discussion of best practices in passwords.
</div>
<p></p>
<p>This should go without saying: you shouldn&#8217;t be storing your passwords in plain text in your database. Unless you need to be able to retrieve the password later, it should be stored in the database in a hashed format. Thomas Ptacek, a very highly respected security professional, explains all you need to know about passwords in <a href="http://chargen.matasano.com/chargen/2007/9/7/enough-with-the-rainbow-tables-what-you-need-to-know-about-s.html">this blog post</a>. I&#8217;ll save you the trouble of reading the whole thing: just use <a href="http://en.wikipedia.org/wiki/Bcrypt">bcrypt</a> as your encryption scheme. It&#8217;s the slowest to generate the encrypted hash. By virtue of being slow to generate, it would also take a <em>very</em> long time to perform a successful lookup using <a href="http://en.wikipedia.org/wiki/Rainbow_tables">rainbow tables</a>. See that blog post linked for much more information and a thorough explanation.</p>
<p>Just how much longer does it take to generate? The following is a quick ruby program I whipped up to benchmark. It uses each encryption scheme to generate a password 50 times.  The following was how long it took to run on my macbook using ruby 1.9.1-p378.  You can grab the script <a href="http://gist.github.com/339346">here</a> if you&#8217;d like to run it locally. It contains absolutely no tests which makes my inner <a href="http://www.coreyhaines.com/">Corey Haines</a> frown:</p>
<pre>
  Password to hash: password
                    user     system      total        real
  MD5           0.000000   0.000000   0.000000 (  0.001443)
  SHA1          0.000000   0.000000   0.000000 (  0.001679)
  SHA256        0.000000   0.000000   0.000000 (  0.001308)
  bcrypt (3)    0.080000   0.000000   0.080000 (  0.086532)
  bcrypt (10)   4.550000   0.010000   4.560000 (  4.601996)
</pre>
<p>The differences between the (3) and (10) are the &quot;cost&quot; of generating the password. The documentation for the bcrypt gem summarizes that very well:</p>
<blockquote><p>
    Takes an optional :cost option, which is a logarithmic variable which determines how computational expensive the hash is to calculate (a :cost of 4 is twice as much work as a :cost of 3). The higher the :cost the harder it becomes for attackers to try to guess passwords (even if a copy of your database is stolen), but the slower it is to check users’ passwords.
  </p></blockquote>
<p>But I&#8217;m getting off topic. The reason I wanted to write this post was to create a list of popular open source software and see what kind of passwords hashing schemes are in use.  Here&#8217;s the list I&#8217;ve compiled so far:</p>
<ul>
<li>
<p><strong><a href="http://www.djangoproject.com/">Django</a></strong><br />
    <strong>Encryption Scheme: </strong>SHA1, MD5, or crypt<br />
    <strong>Notes: </strong>Previous Django versions, such as 0.90, used simple MD5 hashes without password salts. For backwards compatibility, those are still supported; they&#8217;ll be converted automatically to the new style the first time check_password() works correctly for a given user. More info:<br />
    <a href="http://docs.djangoproject.com/en/dev/topics/auth/">http://docs.djangoproject.com/en/dev/topics/auth/</a><br />
    <a href="http://docs.python.org/library/crypt.html">http://docs.python.org/library/crypt.html</a></td>
</p>
</li>
<li>
<p>
    <strong><a href="http://dev.mysql.com/">MySQL</a></strong><br />
    <strong>Encryption Scheme: </strong>Double SHA1
   </p>
</li>
<li>
<p>
        <strong><a href="http://wordpress.org">WordPress</a></strong><br />
        <strong>Encryption Scheme: <a href="http://www.openwall.com/phpass/">PHPass</a></strong><br />
        <strong>Notes</strong> The awkwardly named PHPass library defaults to bcrypt (awesome) and falls back to DES or MD5 based salted hashes depending on the php version and supported features.
      </p>
</li>
<li>
<p>
        <strong><a href="http://expressionengine.com/">Expression Engine</a></strong><br />
        <strong>Encryption Scheme: </strong> SHA1</p>
</li>
<li>
<p>
      <strong><a href="http://www.joomla.org/">Joomla</a></strong><br />
      <strong>Encryption Scheme: </strong> MD5
    </p>
</li>
<li>
<p>
      <strong><a href="http://phpbb.com">phpBB</a></strong><br />
      <strong>Encryption Scheme: </strong> Proprietary hash method using /dev/urandom and md5
    </p>
</li>
<li>
<p>
      <strong>ASP.Net Authentication</strong><br />
      <strong>Encryption Scheme: </strong> Uses a concept of &quot;<a href="http://msdn.microsoft.com/en-us/library/eeyk640h.aspx">providers</a>&quot;.<br />
      <strong>Notes: </strong> There&#8217;s a <a href="http://derekslager.com/blog/posts/2007/10/bcrypt-dotnet-strong-password-hashing-for-dotnet-and-mono.ashx">BCrypt</a> open source option available.</p>
</li>
<li>
<p>
      <strong>Rails: <a href="http://github.com/technoweenie/restful-authentication">restful-authentication</a></strong><br />
      <strong>Encryption Scheme: </strong> SHA1<br />
      <strong>Notes: </strong> This was the defacto standard for a long time in the Rails world as far as authentication goes. Changing the encryption scheme in an application would be a <em>relatively</em> painless process.
    </p>
</li>
<li>
<p>
      <strong>Rails: <a href="http://github.com/binarylogic/authlogic">Authlogic</a></strong><br />
      <strong>Encryption Scheme: </strong> bcrypt, aes256, md5, sha1, sha256, sha512<br />
      <strong>Notes: </strong> This is configurable to any of the listed options. Default is SHA512. The author doesn&#8217;t recommend using MD5 or SHA1 in the README but provides the options for migration and compaitiblity. How awesome is that?
    </p>
</li>
<li>
<p>
          <strong><a href="http://drupal.org/">Drupal</a></strong><br />
          <strong>Encryption Scheme: </strong> MD5 by default<br />
          <strong>Notes:</strong> Christefano points out in the comments that MD5 is used by default but PHPass and AES are available via third party modules.
       </p>
</li>
</ul>
<p>If you don&#8217;t see your favorite software here, either leave it in the comments or <a href="http://jasonseifer.com/contact">contact me</a> and I&#8217;ll add it to the list. These are in no particular order, so I&#8217;m not trying to favor anything in particular (though we all know I&#8217;m mostly a Ruby developer).</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=On+Passwords+http://bit.ly/awXjlj" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/21/on-passwords&amp;title=On+Passwords" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/21/on-passwords&amp;title=On+Passwords" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/21/on-passwords&amp;title=On+Passwords" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/21/on-passwords&amp;title=On+Passwords" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/21/on-passwords&amp;t=On+Passwords" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/21/on-passwords&amp;t=On+Passwords" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/21/on-passwords&amp;title=On+Passwords" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/21/on-passwords&amp;title=On+Passwords" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/oHhcIi4CGUI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/03/21/on-passwords/feed</wfw:commentRss>
		<slash:comments>10</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/03/21/on-passwords</feedburner:origLink></item>
		<item>
		<title>Rails Reminder: DATE_FORMATS</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/UhVDJK20I30/rails-date-formats</link>
		<comments>http://jasonseifer.com/2010/03/10/rails-date-formats#comments</comments>
		<pubDate>Wed, 10 Mar 2010 14:49:39 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=340</guid>
		<description><![CDATA[A friend of mine recently asked me about adding time formats to Rails apps. It&#8217;s not completely intuitive on how to add new &#34;default&#34; symbols for date and time formats or to get a list of the built in ones. The API has the built-in lists of constants under DATE_FORMATS but it&#8217;s a bit difficult [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>A friend of mine recently asked me about adding time formats to Rails apps.  It&#8217;s not completely intuitive on how to add new &quot;default&quot; symbols for date and time formats or to get a list of the built in ones.  The <a href="http://api.rubyonrails.org/classes/ActiveSupport/CoreExtensions/Time/Conversions.html">API</a> has the built-in lists of constants under DATE_FORMATS but it&#8217;s a bit difficult to read on that page. Here&#8217;s a link to the current stable version of the Rails time formats: <a href="http://github.com/rails/rails/blob/2-3-stable/activesupport/lib/active_support/core_ext/time/conversions.rb">rails/activesupport/lib/active_support/core_ext/time/conversions.rb</a>.  In order to add new ones you use the ruby <a href="http://cheat.errtheblog.com/s/strftime/">strftime</a> function. </p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#6666ff; font-weight:bold;">ActiveSupport::CoreExtensions::<span style="color:#CC00FF; font-weight:bold;">Date</span>::Conversions::DATE_FORMATS</span>.<span style="color:#9900CC;">merge</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:quick</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;%m %d, %Y at %I:%M %p&quot;</span>,
  <span style="color:#ff3333; font-weight:bold;">:end_date</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;%B %d, %Y&quot;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#6666ff; font-weight:bold;">ActiveSupport::CoreExtensions::<span style="color:#CC00FF; font-weight:bold;">Time</span>::Conversions::DATE_FORMATS</span>.<span style="color:#9900CC;">merge</span>!<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:job_list</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">&quot;%B %d, %Y&quot;</span>
<span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>This lets you do something like <code><%= model.created_at.to_s(:quick) %></code> in your code.</p>
<p>And here&#8217;s the <code>strftime</code> options from the cheat page as a refresher:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">  <span style="color:#006600; font-weight:bold;">%</span>a <span style="color:#006600; font-weight:bold;">-</span> The abbreviated weekday name <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span>Sun<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>A <span style="color:#006600; font-weight:bold;">-</span> The  full  weekday  name <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span>Sunday<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>b <span style="color:#006600; font-weight:bold;">-</span> The abbreviated month name <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span>Jan<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>B <span style="color:#006600; font-weight:bold;">-</span> The  full  month  name <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span>January<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>c <span style="color:#006600; font-weight:bold;">-</span> The preferred local date <span style="color:#9966CC; font-weight:bold;">and</span> time representation
  <span style="color:#006600; font-weight:bold;">%</span>d <span style="color:#006600; font-weight:bold;">-</span> Day of the month <span style="color:#006600; font-weight:bold;">&#40;</span>01..31<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>e <span style="color:#006600; font-weight:bold;">-</span> Day of the month without leading zeroes <span style="color:#006600; font-weight:bold;">&#40;</span>1..31<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>H <span style="color:#006600; font-weight:bold;">-</span> Hour of the day, <span style="color:#006666;">24</span><span style="color:#006600; font-weight:bold;">-</span>hour clock <span style="color:#006600; font-weight:bold;">&#40;</span>00..23<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>I <span style="color:#006600; font-weight:bold;">-</span> Hour of the day, <span style="color:#006666;">12</span><span style="color:#006600; font-weight:bold;">-</span>hour clock <span style="color:#006600; font-weight:bold;">&#40;</span>01..12<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>j <span style="color:#006600; font-weight:bold;">-</span> Day of the year <span style="color:#006600; font-weight:bold;">&#40;</span>001..366<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>k <span style="color:#006600; font-weight:bold;">-</span> Hour of the day, <span style="color:#006666;">24</span><span style="color:#006600; font-weight:bold;">-</span>hour clock w<span style="color:#006600; font-weight:bold;">/</span>o leading zeroes <span style="color:#006600; font-weight:bold;">&#40;</span> 0..23<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>l <span style="color:#006600; font-weight:bold;">-</span> Hour of the day, <span style="color:#006666;">12</span><span style="color:#006600; font-weight:bold;">-</span>hour clock w<span style="color:#006600; font-weight:bold;">/</span>o leading zeroes <span style="color:#006600; font-weight:bold;">&#40;</span> 1..12<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>m <span style="color:#006600; font-weight:bold;">-</span> Month of the year <span style="color:#006600; font-weight:bold;">&#40;</span>01..12<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>M <span style="color:#006600; font-weight:bold;">-</span> Minute of the hour <span style="color:#006600; font-weight:bold;">&#40;</span>00..59<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span><span style="color:#CC0066; font-weight:bold;">p</span> <span style="color:#006600; font-weight:bold;">-</span> Meridian indicator <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span>AM<span style="color:#996600;">''</span>  <span style="color:#9966CC; font-weight:bold;">or</span>  <span style="color:#996600;">``</span>PM<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span><span style="color:#CC0066; font-weight:bold;">P</span> <span style="color:#006600; font-weight:bold;">-</span> Meridian indicator <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span>am<span style="color:#996600;">''</span>  <span style="color:#9966CC; font-weight:bold;">or</span>  <span style="color:#996600;">``</span>pm<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>S <span style="color:#006600; font-weight:bold;">-</span> Second of the minute <span style="color:#006600; font-weight:bold;">&#40;</span>00..60<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>U <span style="color:#006600; font-weight:bold;">-</span> Week  number  of the current year,
          starting with the first Sunday as the first
          day of the first week <span style="color:#006600; font-weight:bold;">&#40;</span>00..53<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>W <span style="color:#006600; font-weight:bold;">-</span> Week  number  of the current year,
          starting with the first Monday as the first
          day of the first week <span style="color:#006600; font-weight:bold;">&#40;</span>00..53<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>w <span style="color:#006600; font-weight:bold;">-</span> Day of the week <span style="color:#006600; font-weight:bold;">&#40;</span>Sunday is <span style="color:#006666;">0</span>, 0..6<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>x <span style="color:#006600; font-weight:bold;">-</span> Preferred representation <span style="color:#9966CC; font-weight:bold;">for</span> the date alone, no time
  <span style="color:#006600; font-weight:bold;">%</span>X <span style="color:#006600; font-weight:bold;">-</span> Preferred representation <span style="color:#9966CC; font-weight:bold;">for</span> the time alone, no date
  <span style="color:#006600; font-weight:bold;">%</span>y <span style="color:#006600; font-weight:bold;">-</span> Year without a century <span style="color:#006600; font-weight:bold;">&#40;</span>00..99<span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%</span>Y <span style="color:#006600; font-weight:bold;">-</span> Year with century
  <span style="color:#006600; font-weight:bold;">%</span>Z <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC00FF; font-weight:bold;">Time</span> zone name
  <span style="color:#006600; font-weight:bold;">%</span>z <span style="color:#006600; font-weight:bold;">-</span> <span style="color:#CC00FF; font-weight:bold;">Time</span> zone expressed as a UTC offset <span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">``</span><span style="color:#006600; font-weight:bold;">-</span>04:00<span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#006600; font-weight:bold;">%%</span> <span style="color:#006600; font-weight:bold;">-</span> Literal <span style="color:#996600;">``</span><span style="color:#006600; font-weight:bold;">%</span><span style="color:#996600;">''</span> character
&nbsp;
   t = <span style="color:#CC00FF; font-weight:bold;">Time</span>.<span style="color:#9900CC;">now</span>
   t.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Printed on %m/%d/%Y&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>   <span style="color:#008000; font-style:italic;">#=&gt; &quot;Printed on 04/09/2003&quot;</span>
   t.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;at %I:%M%p&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>            <span style="color:#008000; font-style:italic;">#=&gt; &quot;at 08:56AM&quot;</span>
   t.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;%e %B, %Y&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>	       <span style="color:#008000; font-style:italic;">#=&gt; &quot;9 April, 2003&quot;</span>
   t.<span style="color:#9900CC;">strftime</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;%Y-%m-%dT%H:%M:%S&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>     <span style="color:#008000; font-style:italic;">#=&gt; &quot;2003-04-09T08:56:07&quot; (EN 28601)</span></pre></div></div>

<p>The preferred method for doing this is to add these in an initializer in your app. Something along the lines of <code>config/initializers/my_time_formats.rb</code>.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Rails+Reminder%3A+DATE_FORMATS+http://bit.ly/8X3Vrn" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;title=Rails+Reminder%3A+DATE_FORMATS" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;title=Rails+Reminder%3A+DATE_FORMATS" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;title=Rails+Reminder%3A+DATE_FORMATS" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;title=Rails+Reminder%3A+DATE_FORMATS" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;t=Rails+Reminder%3A+DATE_FORMATS" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;t=Rails+Reminder%3A+DATE_FORMATS" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;title=Rails+Reminder%3A+DATE_FORMATS" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/03/10/rails-date-formats&amp;title=Rails+Reminder%3A+DATE_FORMATS" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/UhVDJK20I30" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/03/10/rails-date-formats/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/03/10/rails-date-formats</feedburner:origLink></item>
		<item>
		<title>Stand Up While You Read This!</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/wJ6AZ_wmIdk/stand-up-while-you-read-this</link>
		<comments>http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this#comments</comments>
		<pubDate>Thu, 25 Feb 2010 17:15:36 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Health]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=337</guid>
		<description><![CDATA[The New York Times has an article up on standing while you work. People who sit all day without moving around much are at higher risk for medical problems typically associated with obesity. This includes doctors who even do the same job but just walk more during the day: Just to underscore the point that [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>The New York Times has an article up on standing while you work. People who sit all day without moving around much are at higher risk for medical problems typically associated with obesity.  This includes doctors who even do the same job but just walk more during the day:</p>
<blockquote>
<p>Just to underscore the point that you do have a choice: a study of junior doctors doing the same job, the same week, on identical wards found that some individuals walked four times farther than others at work each day. (No one in the study was overweight; but the “long-distance” doctors were thinner than the “short-distance” doctors.)</p>
<p>So part of the problem with sitting a lot is that you don’t use as much energy as those who spend more time on their feet. This makes it easier to gain weight, and makes you more prone to the health problems that fatness often brings.</p>
</blockquote>
<p>Obviously it&#8217;s not the best idea to take medical advice from an opinion writer but I can personally attest to the benefits of sitting on an exercise ball throughout the day for work. In addition to building core muscles, for some reason it helps me focus more on coding.</p>
<p>Here are a couple of quick tips on choosing an exercise ball:</p>
<ul>
<li> If you plan on working out with one, get a high quality one so you don&#8217;t have to fear having it burst. <a href="http://www.duraball.com/">Duraball</a> and <a href="http://www.amazon.com/TOGU-ABS-Redo-Gymnastic-Ball/dp/B000OONQ4E">TOGU Powerball Premium</a> are high quality ones for that.  <a href="http://shop1.mailordercentral.com/thechekinstitute/prodinfo.asp?number=9101D">The Chek Institute</a> has a good DVD for a home workout as well.</li>
<li>If you plan on sitting on one while working, get one that&#8217;s the next size up from the recommended size for your height.</li>
</ul>
<p><a href="http://opinionator.blogs.nytimes.com/2010/02/23/stand-up-while-you-read-this/?em">Link</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Stand+Up+While+You+Read+This%21+http://bit.ly/asJFNb" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;title=Stand+Up+While+You+Read+This%21" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;title=Stand+Up+While+You+Read+This%21" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;title=Stand+Up+While+You+Read+This%21" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;title=Stand+Up+While+You+Read+This%21" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;t=Stand+Up+While+You+Read+This%21" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;t=Stand+Up+While+You+Read+This%21" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;title=Stand+Up+While+You+Read+This%21" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this&amp;title=Stand+Up+While+You+Read+This%21" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/wJ6AZ_wmIdk" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this/feed</wfw:commentRss>
		<slash:comments>1</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/02/25/stand-up-while-you-read-this</feedburner:origLink></item>
		<item>
		<title>Using Concentrate for the Pomodoro Technique on OS X</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/InFEAlUUkWQ/using-concentrate-for-pomodoro</link>
		<comments>http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro#comments</comments>
		<pubDate>Mon, 08 Feb 2010 20:21:28 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Apple]]></category>
		<category><![CDATA[Programming]]></category>
		<category><![CDATA[pomodoro]]></category>
		<category><![CDATA[technique]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=322</guid>
		<description><![CDATA[Concentrate is a Mac only app. It lets you do a number of things like block web sites, launch apps, play sounds, etc. Combinations of these things can be configured to go on for varying amounts of time. I use it for the Pomodoro Technique when programming. Corey Haines introduced me to Tomatoist when I [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://getconcentrating.com/"><img src="http://jasonseifer.com/assets/2010/02/concentrate.png" alt="concentrate.png" border="0" width="325" height="158" class="alignright" /></a></p>
<p><a href="http://getconcentrating.com/">Concentrate</a> is a Mac only app. It lets you do a number of things like block web sites, launch apps, play sounds, etc. Combinations of these things can be configured to go on for varying amounts of time. I use it for the <a href="http://www.pomodorotechnique.com/">Pomodoro Technique</a> when programming. <a href="http://coreyhaines.com/">Corey Haines</a> introduced me to <a href="http://tomatoi.st">Tomatoist</a> when I paired with him during one of his journeyman tours. While that site is awesome, I prefer using the Mac app to force eliminate distractions.</p>
<h3>The Pomodoro Technique</h3>
<p>The root of the idea is that you program for 25 minutes straight and then break for 5 minutes. This seems like a pretty simple idea but when you&#8217;re working by yourself things can happen. For example, maybe you want to send a quick email to someone but want to refer to something in their Facebook account you can&#8217;t quite remember. So then you look it up. While looking it up you notice something else interesting by another one of your friends and the distractions start. By the end of the distractions you&#8217;ve ordered enough parts for a fully functional robot suit off eBay. If you only had 5 minutes to do this stuff, maybe that wouldn&#8217;t have happened.</p>
<h3>Setting Up Concentrate</h3>
<p><a href="http://jasonseifer.com/assets/2010/02/concentrate-newtask.png"><img  class="alignright" src="http://jasonseifer.com/assets/2010/02/concentrate-newtask-300x291.png" alt="Concentrate New Task" border="0" width="300" height="291" /></a></p>
<p>Concentrate is actually a very simple application to use. Click on the &#8220;New Activity Button&#8221; and set your options. I called mine &quot;Program Pomodoro.&quot; It&#8217;s set to block any site that could potentially distract me, Growl a message, and play a sound on completion. The typical Pomodoro technique lasts 25 minutes so drag the location slider over until you see 25 minutes. Boom, good to go. Now you can&#8217;t look at anyone&#8217;s Facebook account or respond to any threads on <a href="http://news.ycombinator.com">hacker news</a> for a good 25 minutes.  You&#8217;ll get to that during your break.
</p>
<p><a href="ttp://jasonseifer.com/assets/2010/02/concentrate-activities.png"><img class="alignright" src="http://jasonseifer.com/assets/2010/02/concentrate-activities-300x236.png" alt="Concentrate Activities" border="0" width="300" height="236" /></a></p>
<p>The next task you&#8217;ll want to set up is the break. This is the most rewarding task. I just have this one Growl a message (&quot;Get back to work!&quot;) and play a sound when it&#8217;s done. The duration slider should be set to 5 minutes.
</p>
<h3>Get To It!</h3>
<p>That&#8217;s about it. It&#8217;s simple software and well worth the $30 to eliminate distractions. I use it only for those two techniques listed above and have been very happy. Special thanks to <a href="http://coreyhaines.com">Corey Haines</a> for introducing me to the Pomodoro technique.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X+http://bit.ly/cvI9b8" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;title=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;title=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;title=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;title=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;t=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;t=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;title=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro&amp;title=Using+Concentrate+for+the+Pomodoro+Technique+on+OS+X" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/InFEAlUUkWQ" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro/feed</wfw:commentRss>
		<slash:comments>6</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/02/08/using-concentrate-for-pomodoro</feedburner:origLink></item>
		<item>
		<title>8 Chrome Extensions For Web Developers (Mac too!)</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/_R5k2E_Hqo4/8-chrome-extensions-for-web-developers</link>
		<comments>http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers#comments</comments>
		<pubDate>Mon, 01 Feb 2010 16:12:18 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Internet]]></category>
		<category><![CDATA[chrome]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=267</guid>
		<description><![CDATA[I&#8217;ve been using Google Chrome as my default browser ever since 1Password came out with an extension for Chrome. The state of web browsing on the Mac still, unfortunately, leaves something to be desired. However, after using this full time for a little while I can say that I&#8217;m really liking it. As a web [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been using Google Chrome as my default browser ever since <a href="http://agilewebsolutions.com/products/1Password">1Password</a> came out with an extension for Chrome. The state of web browsing on the Mac still, unfortunately, leaves something to be desired. However, after using this full time for a little while I can say that I&#8217;m really liking it. As a web developer I have a need for good developer tools in a browser. For that, Firefox and Firebug will always be king of the hill. Daily browsing and light development in  Chrome has been suiting my needs just fine.</p>
<p>The ability to have extensions is what really makes Chrome shine. It&#8217;s fast and nimble in OS X and I was able to recreate nearly everything I did in Firefox via extensions. The down side is that extensions don&#8217;t work on the latest stable build of Chrome. To use extensions you&#8217;ll need to get a beta or dev channel. In order to do that you can go  <a href="http://dev.chromium.org/getting-involved/dev-channel">here</a>.</p>
<p><a href="https://chrome.google.com/extensions/detail/hmdcmlfkchdmnmnmheododdhjedfccka"><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/87D5D600-79D9-412D-9E6F-021CBA958E54-300x268.jpg" alt="Eye Dropper" border="0" align="right" style="clear:right" /></a><strong><a href="https://chrome.google.com/extensions/detail/hmdcmlfkchdmnmnmheododdhjedfccka">Eye Dropper</a></strong><br />
The Eye Dropper lets you click your mouse on an element to get the color of it in HSB, RGB, or Hex. This differs slightly from the Firefox extension in that there is a pop-up involved and you have to do one more click to get the dorrect color.</p>
<p><strong><a href="https://chrome.google.com/extensions/detail/bnbbfjbeaefgipfjpdabmpadaacmafkj">Firebug Lite</a></strong> <br />
Firebug Lite is a not-as-fully-featured version of the very popular firebug extension. It&#8217;s fine for doing basic inspection of elements, though, and the built in console takes care of script running needs for basic experimentation.</p>
<p><strong><a href="https://chrome.google.com/extensions/detail/cdngiadmnkhgemkimkhiilgffbjijcie">FlashBlock</a></strong><br />
While Flash may be fine on PCs it makes the fan on my laptop spin like crazy. This is the equivalent of the FireFox extension and lets you whitelist sites as well. Browsing the web without flash is really a much more pleasant experience the majority of the time and the Flash files are only a click away if you want to load them.</p>
<p><strong><a href="https://chrome.google.com/extensions/detail/aonjhmdcgbgikgjapjckfkefpphjpgma"><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/measureit.jpg" alt="measureit.jpg" border="0" width="303" height="70" align="right" /></a><a href="https://chrome.google.com/extensions/detail/aonjhmdcgbgikgjapjckfkefpphjpgma">MeasureIt!</a></strong><br />
MeasureIt! is a port of the same FireFox extension. It gives you a ruler that lets you draw a box around a portion of a page to get its width and height in pixels. It comes in pretty handy.</p>
<p><a href="https://chrome.google.com/extensions/detail/bcennaiejdjpomgmmohhpgnjlmpcjmbg"><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/Google-Chrome-300x65.jpg" alt="Google Chrome.jpg" border="0" width="300" height="65" align="right" /></a><strong><a href="https://chrome.google.com/extensions/detail/bcennaiejdjpomgmmohhpgnjlmpcjmbg">Sexy Undo Close Tab</a></strong><br />
This extension lets you re-open recently closed tabs. There&#8217;s another version called &#8220;Undo Closed Tab&#8221; but this one is obviously the sexier of the two which is why I use it. I mean, given the choice between sexy and non-sexy I think it&#8217;s a no-brainer.</p>
<p><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/tabmenu.jpg" alt="tabmenu.jpg" border="0" width="292" height="141" align="right" /><br />
<strong><a href="https://chrome.google.com/extensions/detail/galfofdpepkcahkfobimileafiobdplb">Tab Menu</a></strong> <br />
Tab Menu is a simple extension that gives you a drop down list of all currently open tabs. This is useful if you have a lot of tabs open and can&#8217;t see the titles. On one hand I wonder why this wasn&#8217;t included in the browser by default in some form. On the other hand I can completely understand their desire to not clutter the browser and I don&#8217;t imagine that the vast majority of people have that many tabs open.</p>
<p><a href="https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd"><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/googlerss-300x272.jpg" alt="RSS Subscription Extension" border="0" width="300" height="272" align="right" /></a><br />
<strong><a href="https://chrome.google.com/extensions/detail/nlbjncdgjeocebhnmkbbbdekmmmcbfjd">RSS Subscription Extension</a></strong><br />
The RSS Subscription Extension automagically recognizes the RSS auto discovery links and pops open a new tab to subscribe. I included this for developers because you&#8217;ll want to make sure those RSS auto discovery tags are working. You could also make sure that it correctly subscribe in Google Reader and maybe take a few minutes off while you&#8217;re at it to read some feeds. Just saying.
</p>
<p><a href="https://chrome.google.com/extensions/detail/akdgnmcogleenhbclghghlkkdndkjdjc"><img src="http://jasonseifer.com/assets/2010/02/sequake-300x150.jpg" alt="SeoQuake" border="0" width="300" height="150" align="right" class="alignright" /></a><strong><a href="https://chrome.google.com/extensions/detail/akdgnmcogleenhbclghghlkkdndkjdjc">SeoQuake</a></strong><br />
SeoQuake is also a port of the Firefox extension. It allows you to see a ton of info about a site including Google PageRank, Index, Delicious index, and more. I keep this disabled most of the time unless I really need it or want to see some information about a site.</p>
<p><br class="clear" /></p>
<h3>Bonus Extensions</h3>
<p><a href="https://chrome.google.com/extensions/detail/jhjeaonknehkebginocakiakmiogeblg"><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/chromelicious.jpg" alt="chromelicious.jpg" border="0" style="clear:right" align="right" /></a><strong><a href="https://chrome.google.com/extensions/detail/jhjeaonknehkebginocakiakmiogeblg">Chromelicious</a></strong><br />
Chromelicious is the best Chrome extension I&#8217;ve found for Delicioius integration. The reason is that view your bookmarks in an unobtrusive way from a dropdown menu and actually search your bookmarks and filter down via tabs. It&#8217;s prety handy..</p>
<p>
<strong><a href="https://chrome.google.com/extensions/detail/hcjdanpjacpeeppdjkppebobilhaglfo?hl=en-US">GooglePreview</a></strong><br />
The Google Preview extension inserts thumbnail images of Google searches in your search results. This is totally gratuitous for any real work but it makes search results look cleaner.</p>
<p>
<a href="https://chrome.google.com/extensions/detail/gighmmpiobklfepjocnamgkkbiglidom"><img class="alignright"  src="http://jasonseifer.com/assets/2010/02/AdBlock-300x105.jpg" alt="AdBlock for Chrome" border="0" width="300" height="105" align="right" /></a><br />
<strong><a href="https://chrome.google.com/extensions/detail/gighmmpiobklfepjocnamgkkbiglidom">AdBlock</a></strong><br />
This is the equivalent of AdBlock Plus for FireFox. It&#8217;s not necessarily for development but it is much more pleasant to browse the web with.</p>
<p>
<a href="https://chrome.google.com/extensions/detail/pfminakhmgplohaiaclohnofbanpdgam"><img src="http://jasonseifer.com/assets/2010/02/FacebookFixer.jpg" alt="Better FacebookFixer" border="0" width="206" height="146" align="right" /></a><br />
<strong><a href="https://chrome.google.com/extensions/detail/pfminakhmgplohaiaclohnofbanpdgam">Better Facebook Fixer</a></strong><br />
Facebook Fixer is actually a user script packaged up as an extension. You can do this at the <a href="http://script2chrome.net/">Script2Chrome</a> web site if you have any you want to convert. This extension makes the Facebook experience a bit more pleasant with options like hiding information from the right column, hiding 3rd party apps, and much more. This is a version of the Facebook Fixer extension with the javascript loaded locally instead of another server.</p>
<p></p>
<h3>Mouse Gestures</h3>
<p>Something I didn&#8217;t really touch on was mouse gestures. I use them heavily. For that I use a program called <a href="http://alum.hampshire.edu/~bjk02/xGestures/">xGestures</a> which will work in any application on OS X. I find that to also be an indespensable tool. As a bonus it supports rocker gestures. I use that to go to next and previous tabs in all applications. A rocker gesture means you hold down the right mouse button and click the left. If you bind this to the keystroke <strong>command + {</strong> as a global gesture it works in almost every app in Leopard. The other bracket <strong>(command + })</strong> works as well.  This is not a free program but it is well worth the price of admission!</p>
<p>Wrapping up, Chrome has come a long way, especially on the Mac. The developer version, for me at least, has been extremely stable and works well enough to be my daily browser. Check it out if you haven&#8217;t yet.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29+http://bit.ly/aqdqTr" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;title=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;title=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;title=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;title=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;t=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;t=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;title=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers&amp;title=8+Chrome+Extensions+For+Web+Developers+%28Mac+too%21%29" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/_R5k2E_Hqo4" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers/feed</wfw:commentRss>
		<slash:comments>5</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/02/01/8-chrome-extensions-for-web-developers</feedburner:origLink></item>
		<item>
		<title>The Dev Show Episode 1</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/BK6lTp_OSDI/the-dev-show-episode-1</link>
		<comments>http://jasonseifer.com/2010/01/26/the-dev-show-episode-1#comments</comments>
		<pubDate>Tue, 26 Jan 2010 19:07:23 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Internet]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=257</guid>
		<description><![CDATA[Dan Benjamin and I have launched a new podcast called The Dev Show. We aim to talk about new things in the programming community and point out things that may be of interest to developers. The first episode focuses on domain names, mongo db, javascript and a couple of other topics. Check it out! Delicious [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://hivelogic.com">Dan Benjamin</a> and I have launched a new podcast called <a href="http://5by5.tv/devshow">The Dev Show</a>. We aim to talk about new things in the programming community and point out things that may be of interest to developers. The first episode focuses on domain names, mongo db, javascript and a couple of other topics. <a href="http://5by5.tv/devshow">Check it out!</a></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=The+Dev+Show+Episode+1+http://bit.ly/992smf" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;title=The+Dev+Show+Episode+1" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;title=The+Dev+Show+Episode+1" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;title=The+Dev+Show+Episode+1" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;title=The+Dev+Show+Episode+1" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;t=The+Dev+Show+Episode+1" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;t=The+Dev+Show+Episode+1" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;title=The+Dev+Show+Episode+1" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2010/01/26/the-dev-show-episode-1&amp;title=The+Dev+Show+Episode+1" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/BK6lTp_OSDI" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2010/01/26/the-dev-show-episode-1/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2010/01/26/the-dev-show-episode-1</feedburner:origLink></item>
		<item>
		<title>Live blogging BizConf Day 2</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/CRqub3DGnTo/live-blogging-bizconf-day-2</link>
		<comments>http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2#comments</comments>
		<pubDate>Fri, 21 Aug 2009 16:40:54 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Business]]></category>
		<category><![CDATA[conference]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=239</guid>
		<description><![CDATA[Day 1 of BizConf was phenomenal and I&#8217;m going to try and keep up the live blogging for day 2. I missed the lightning talks last night but heard great things from everyone who went. I&#8217;ve got my camera charged up today so I&#8217;ll try and get some pictures of the presenters as well. Fair [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<div class="img_right">
<a href="http://www.flickr.com/photos/jseifer/3842436229/" title="Obie Fernandez and Roy Singham by jseifer, on Flickr"><img src="http://farm4.static.flickr.com/3506/3842436229_002e50b6ec_m.jpg" width="240" height="160" alt="Obie Fernandez and Roy Singham" /></a>
</div>
<p>
Day 1 of BizConf was phenomenal and I&#8217;m going to try and keep up the live blogging for day 2.  I missed the lightning talks last night but heard great things from everyone who went.  I&#8217;ve got my camera charged up today so I&#8217;ll try and get some pictures of the presenters as well.  Fair warning: I&#8217;m really not that great of a photographer.
</p>
<ul>
<li><a href="#keynote">Roy Singham&#8217;s keynote</a></li>
<li><a href="#agilefail">Corey Haines: How Agile Will Probably Fail You</a></li>
<li><a href="#manage_agile">Bruno Miranda: Successfully Managing Local and Remote Teams</a></li>
<li><a href="#thecloud">Agile, Rails, and the Cloud</a></li>
<li><a href="#legalities">Legalities</a></li>
</ul>
<p></p>
<hr />
</p>
<div id="keynote"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_173">Roy Singham</a></h3>
<h4>Keynote</h4>
<div class="img_right">
<a href="http://www.flickr.com/photos/jseifer/3842436379/" title="Roy Singham by jseifer, on Flickr"><img src="http://farm4.static.flickr.com/3514/3842436379_187af55221_m.jpg" width="233" height="240" alt="Roy Singham" /></a>
</div>
<p>Roy talks quick! I had some trouble keeping up with the wealth of information coming from this talk.</p>
<p>Randomness is a much greater predictor of success than skill.  <a href="http://en.wikipedia.org/wiki/Decoy_effect">Decoy pricing</a> is probably used a lot by consulting firms.  It&#8217;s easy to compare a distorted version of something to the non-distorted version than to something else.
</p>
<p>Think about your leadership.  Write down your top 10 mistakes. Put them in to categories. People mistakes and investing in the wrong person. How you handle yourself in a crisis. When confronted with a huge number of decisions, how do you handle it?  Are you confident?</p>
<p>A mistake is something you made in hindsight, not in foresight.  The sign of really great leaders is to protect people who have different skills.  You have to have people who offset  your own weaknesses.  Not trusting his gut about a certain person in his organization cost the company a lot of money.  Even though he had a gut feeling about this person he forged ahead.  Always trust your gut.</p>
<p>There&#8217;s no bonuses at Thoughtworks but leaders still focus on money.  Even though we would like to believe that sales are driven by supply and demand, we&#8217;re closer to ducks.  Take the iPhone as an example, and Starbucks coffee.  Starbucks is not worth $5/coffee but we&#8217;ve been convinced it is.  That&#8217;s how a lot of consulting companies charge exorbitant amounts.</p>
<ul>
<li>Are they good at their job?</li>
<li>Does their boss recognize it?</li>
<li>Do they have friends at work?</li>
</ul>
<p>The average 23 year old expects to have 12 jobs by the time they are 30.  That&#8217;s almost a job a year.</p>
<p>Roy&#8217;s ideas for surviving a recession:</p>
<ul>
<li>No matter how smart you think you are, you will still make mistakes.</li>
<li>Massively increase sales force.</li>
<li>Double intimacy with customers. Get closer to them.  Understand your customer&#8217;s customer. If you can understand that, you will create more value for customers.</li>
</ul>
<p>Take the biggest risk you can possibly think of to create new business strategies.  Learn quickly, make it something you can live with. Thoughtworks is engaging five simultaneous new offerings.</p>
<p>A huge limitation of why we fail at software consulting is that people in the software industry aren&#8217;t generally aware of how their clients are feeling emotionally.</p>
<p>Think about what you want to be known for when you get older. Make a difference you will be proud of.  Success should not be about how big your company is.  It should be about how you change peoples lives.</p>
<p></p>
<hr />
</p>
<div id="agilefail"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_182">Why Agile Will Probably Fail You</a></h3>
<h4>Corey Haines of coreyhaines.com</h4>
<div class="img_right">
<a href="http://www.flickr.com/photos/jseifer/3842437223/" title="Corey Haines by jseifer, on Flickr"><img src="http://farm3.static.flickr.com/2472/3842437223_5aa4469906_m.jpg" width="220" height="240" alt="Corey Haines" /></a>
</div>
<p>If you&#8217;re not familiar with <a href="http://coreyhaines.com">Corey Haines</a>, he&#8217;s a &quot;software journeyman.&quot; He travels around and pair programs with people all over the country.  I&#8217;ve had the opportunity to pair with him for a day and it was quite an experience.</p>
<p>Life rule #1: Any time you get to go to the scientist only section, you say yes.</p>
<p><strong>Why do we write bad code?</strong><br />
This is not the question. No one likes to write bad code. The question becomes the following:
</p>
<p><strong>When do we write bad code?</strong><br />
When we&#8217;re under pressure and have to get it done.  The deadline is coming and you&#8217;re only 80% done. There&#8217;s only so much time left so we start hacking away.  &quot;Get it done&quote; vs &quot;Do It Right&quot;.  There&#8217;s a perception that when you have to get it done the only way to do it is to hack away.
</p>
<p><strong>Constant Pressure</strong><br />
Here&#8217;s an idea: if we have developers feel like they&#8217;re under pressure at the end of the project, let&#8217;s change the deadlines to every month. It would be great if we could let everyone figure out their own process. When people think of agile this is what they think of. Yet the issue of &quot;Get It Done&quote; vs &quot;Do It Right&#038;quot is still an issue. Most young people, in terms of a development perspective, only think about today.  Scrum assumes that developers self oganize and are responsible.
</p>
<div class="img_right">
<a href="http://www.flickr.com/photos/jseifer/3842436737/" title="Corey Haines laptop by jseifer, on Flickr"><img src="http://farm3.static.flickr.com/2531/3842436737_17f95794b4_m.jpg" width="240" height="159" alt="Corey Haines laptop" /></a>
</div>
<p><strong>Features and Quality</strong><br />
Let&#8217;s talk about features.  Add a feature to your app.  Change a feature in your app.  Then time passes. As you work with crap code it takes more time to add features.  This brings us to a definition of software quality: having a nominal cost of adding new features. It doesn&#8217;t mean there will be no bugs.</p>
<p>Software can be similar to gardening.  Gardening isn&#8217;t about growing plants.  It&#8217;s about changing the environment to let it flourish.  Add a feature then clean it up. Change a feature then clean it up. Make sure your code base stays clean and boring to add new features.</p>
<p><strong>&quot;If I&#8217;m adding a new feature I don&#8217;t want excitement&quot;</strong></p>
<p><strong>Why doesn&#8217;t everyone do the XP techniques?</strong><br />
We don&#8217;t know how. They&#8217;re hard to learn.  While learning to do TDD a friend of Corey&#8217;s took a 70% hit in productivity.  So how do you learn to do XP?  Most small businesses can&#8217;t take that hit in productivity.  Work is not practice.
</p>
<div class="img_right">
<a href="http://www.flickr.com/photos/jseifer/3843226684/" title="Corey Haines laptop by jseifer, on Flickr"><img src="http://farm4.static.flickr.com/3509/3843226684_6607c72bca_m.jpg" width="240" height="159" alt="Corey Haines laptop" /></a>
</div>
<p>Becoming a better software developer is about practice.  How good would a band be if they only practiced while they were on stage?  What kind of quality would a play have if the actors were only given the script an hour before the show?  Enter the software craftsmanship manifesto.</p>
<p><strong>Practice Techniques</strong></p>
<ul>
<li>Code Kata</li>
<li>Coding Dojo</li>
<li>Code Retreat</li>
<li>Acceptance Test-based</li>
</ul>
<p>In the end I think it boils down to this: developing quality software is about taking pride in your work.  The software craftsmanship manifesto gives you guidelines.  The practices outlined above get you better at it.  Take pride in your work and write quality code.</p>
<p>During this talk Jerry got in to a bit of a debate with Corey on practices. While the debate was lively and interesting, this probably could have waited until his talk was over rather than taking time away from Corey&#8217;s talk. There was about 25 minutes worth of content Corey didn&#8217;t get to.  I&#8217;m going to be forced to find out about the rest of the content of this talk over scotch later.  The horror.  I&#8217;ll update this post later.</p>
<p></p>
<hr />
</p>
<div id="manage_agile"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_203">Successfully Managing Local and Remote Web 2.0 Teams</a></h3>
<h4>Bruno Miranda of Hoodiny Entertainment</h4>
<div class="img_right">
<a href="http://www.flickr.com/photos/jseifer/3843227152/" title="Bruno Miranda by jseifer, on Flickr"><img src="http://farm3.static.flickr.com/2669/3843227152_c953e6c39f_m.jpg" width="233" height="240" alt="Bruno Miranda" /></a>
</div>
<p>
Cyloop is a music site.  The first version of the site was in Java. It couldn&#8217;t scale.  The CEO of the company decided to switch to Rails and hired Hashrocket.  They did the 3-2-1 launch.  Hashrocket taught the developers, who were all Java, .Net, and PHP developers, about TDD and Rails.  Hashrocket&#8217;s time lasted about a month.  The app was re-launched in about 3 months total.
</p>
<p>
Having a local team is important. You have a lot of bandwidth to talk and communicate.  It can also be distracting. The team uses headphones a lot to reduce distractions.  It&#8217;s good to have the stakeholders in the same spot as developers. There&#8217;s five people in the Miami office, one in Orlando, and remote developers in Brazil.  The team tends to type rather than talk, even in person.  Typing tends to keep conversations more succinct.
</p>
<p>
Why go distributed? Bruno wrote a post on his blog about limiting yourself.  The Ruby community is small and there&#8217;s not a ton Ruby talent in Miami.  They would rather not limit themselves to just local talent, they want the best developers.  Do video chats to hire people over-seas.  Use other resources to find about people.  Look at their <a href="http://github.com">GitHub</a> accounts.  It&#8217;s all about finding the right people and staying transparent.
</p>
<p>
Working with local and remote teams is about transparency. If you don&#8217;t know what someone is doing then how do you know they&#8217;re doing anything at all?  If you don&#8217;t have a lot of throughput to talk to people face to face you wind up getting a lot of phone calls and meeting requests.  Skype and AIM are &#8220;silo&#8221; based and talking one on one is probably going to be beneficial so move it to <a href="http://campfirenow.com">Campfire</a>.  Mac folks, check out <a href="http://propaneapp.com">Propane</a> so you can get your name growled.
</p>
<p>
<strong>Communication</strong><br />
In another company, Bruno tried daily standups via phone and Skype but you always waste time getting the mic set up.  Daily standups are done in camp fire.  Standups are a one paragraph conversation with the rest of the screen.  There&#8217;s a script that calls for the daily stand-up every day in the Campfire room. Don&#8217;t let your standup become a book. <a href="http://newrelic.com">NewRelic</a> notifications and incidents get automatically posted in to the campfire team room as well.  There&#8217;s mainly one product with this company and you may want to move individual projects in to their own room.
</p>
<p>They don&#8217;t pair all the time. They pair over iChat and Skype. Skype has better sound so disable the mic in iChat.</p>
<p>Projects are managed in <a href="http://pivotaltracker.com">Pivotal Tracker</a> and meetings are done with the person who makes the decision. The whole local and remote teams are not included because there&#8217;s too many people. There&#8217;s a lot of streamlining of the communication process in this company. Your company has to be able to accept change to pull this sort of strategy off.</p>
<p>
<strong>Conclusions</strong><br />
There&#8217;s a strong misconception that you can&#8217;t manage a local and remote team.  It can be done and it can be done successfully, your organization just has to be willing to accept change.  It makes business and financial sense and as long as you get the right people you get quality code.  Bruno did a great job with this presentation and made some great points.
</p>
<p></p>
<hr />
</p>
<div id="thecloud"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_190">Agile, Rails, and the Cloud</a></h3>
<h4>Ian McFarland of Pivotal Labs</h4>
<div class="img_right">
  <a href="http://www.flickr.com/photos/jseifer/3843180313/" title="BizConf 2009 by jseifer, on Flickr"><img src="http://farm4.static.flickr.com/3458/3843180313_be68ddeee5_m.jpg" width="240" height="159" alt="BizConf 2009" /></a>
</div>
<p>As developers, we build software because it&#8217;s cool, fun, exciting, and we love the challenge.  Also it beats a lot of other jobs.  Companies build software for different reasons. They do it to save money, manage risk, and satisfy business and government requirements.  We&#8217;re in the middle of a revolution.  This revolution in software is about one thing: building better value for businesses for lest money.</p>
<p>Software is expensive.  The following are the most expensive with developing software: developers, defects, deployment, maintenance, and change.  In the current economy budgets are smaller, the stakes are higher, departments have to do more with less, and failure is more catastrophic.</p>
<p><strong>Agile</strong><br />
  Agile is business driven: requirements come from business stakeholders.  </p>
<p>  <strong>The customer:</strong></p>
<ul>
<li>The customer is empowered to make decisions and priorities are set by that customer.</li>
<li>The customer can change priorities on anything unstarted.</li>
<li>The customer accepts the work in fine-grained increments.</li>
<li>The customer is intimately aware of progress and projected feedback dates.</li>
<li>Closing the feedback loop is critical.</li>
</ul>
<p>TDD and BDD factors in to this. Good tests tell us when we&#8217;ve met the customer&#8217;s needs, what&#8217;s broken, and lets us refactor.  TDD helps keeps you focused: you&#8217;re not building features if you don&#8217;t need them.</p>
<p>A big part of agile is iterative development. These days, iterations are getting shorter.  Because the customer is seeing the work on a daily basis, the feedback cycle is short.  This keeps the cost of change low by preventing unnecessary work.</p>
<p>
  <strong>Continuous Integration and Continuous Releasability</strong><br />
  There is a bit of a misconception about continuous release.  Just because you <em>can</em> release continuously doesn&#8217;t mean you <em>have</em> to release continuously.
</p>
<p>
  <strong>Pair Programming</strong><br />
  You have to pair if you want to be as efficient as you possibly can.  As long as there&#8217;s more than one developer you&#8217;re already pairing.  Doing it all the time means you get better at it.  Pairing is effective because you stay focused.  Developers can get distracted.  It&#8217;s hard to stay focused all day.  At Pivotal developers are exhausted at the end of the day their first week on the job. This is because they&#8217;re really not used to coding non stop for 8 hours a day.
</p>
<div class="img_right">
  <a href="http://www.flickr.com/photos/jseifer/3843968458/" title="BizConf 2009 by jseifer, on Flickr"><img src="http://farm4.static.flickr.com/3438/3843968458_d10b2d1000_m.jpg" width="240" height="159" alt="BizConf 2009" /></a>
</div>
<p>
  Pairing helps because you don&#8217;t get stuck so you spend more time on the more interesting part of your code. Developers get more well-rounded as they pair. You learn from your pair &#8212; design and testing techniques, new development techniques, etc. As a business owner you&#8217;re investing a lot in your developers this way. If you&#8217;re not pairing you&#8217;re throwing that away.  New team members can be brought up to speed in an hour when pairing rather than taking a week to figure out their way around.  Another benefit to pairing is that you distribute knowledge more. Your bus factor (the number of people who need to get hit by a bus for the project to stop) goes up.
</p>
<p>
  You need to make a productive workspace in a pair environment.  Have consistent pairing stations.  Pivotal will have breakfast available before the morning stand-up.  The reason is that some developers wouldn&#8217;t eat breakfast before work and some would.  This would result in some developers wanting to stop earlier for lunch than others.
</p>
<p>
  Developer happiness is important to the business.  Having a happy developer is important because developer happiness is directly correlated to developer productivity.  Productive developers tend to be happier.  When you&#8217;re doing grunt work as a developer things don&#8217;t seem as bad.  Happy workers are more focused.
</p>
<p>
  <strong>Rails</strong><br />
  Rails is powerful. Rails goes very well with agile &#8212; it&#8217;s practically baked in to the culture.  Anecodtally, Pivotal has seen a lot of improvements in efficiency with Rails.
</p>
<p>
  <strong>The Cloud</strong><br />
  You don&#8217;t have to worry about buying hardware anymore.  You don&#8217;t have to be in the infrastructure business.  You can scale on demand if you architect for it.  You can stay focused on development.  This is a big change in the industry.
</p>
<p>
  The enterprise is not quite cloud ready yet.  Lots of CIOs really want everything running on ahrdware they already bought. There are sometimes legislative restrictions about having things in the cloud.  But it&#8217;s getting better. People run HR, CRM, and financials in the cloud now. The cloud is getting closer to being enterprise ready. There are market pressures being addressed every day by cloud offerings. These are all problems we&#8217;ve heard before.
</p>
<p>
  In the end, it&#8217;s not about the technology.  Businesses don&#8217;t care about technology. Technology is the means to an end. Think about the technology like a business.  Think about getting it done cheaply, quickly, and well.  This is why Rails, agile, and the cloud make business sense.
</p>
<p></p>
<hr />
</p>
<div id="legalities"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_196">Legalities</a></h3>
<h4>Jose Gonzalez of Hoodiny Entertainment</h4>
<div class="img_right">
  <a href="http://www.flickr.com/photos/jseifer/3843968302/" title="BizConf 2009 by jseifer, on Flickr"><img src="http://farm4.static.flickr.com/3528/3843968302_d2e440a8e9_m.jpg" width="240" height="159" alt="BizConf 2009" /></a>
</div>
<p>
  Other than what you&#8217;re going to provide, when you&#8217;re going to provide it, and how much it&#8217;s going to be fore, everything is going to be specific for your business.  Don&#8217;t accept sloppy code and don&#8217;t accept ambiguity in the business.  If you and your client don&#8217;t understand what it means then a judge won&#8217;t understand what it means.
</p>
<p>
  <strong>Trade Secrets</strong><br />
  Under the law trade secrets are protected as long as they are secret.  If you come up with something that is a trade secret the very nature of its protection is associated with its confidentiality.  On the other end of this is patents which require you say as much as possible in order to obtain protection.  To mark it as a trade secret it must be marked confidential. Do not let anyone see it who doesn&#8217;t need to see it. If a client has given you something that is a trade secret <em>it should be market as confidential</em>.</p>
<p>
  Some companies will put <em>everything</em> as confidential. Some judges will toss that out as a matter of course.  As a consultant, everything you learn while in the client&#8217;s office should be treated as confidential.  That&#8217;s just good practice.
</p>
<p>
  <strong>Copyright</strong><br />
  If you write the same ten word essay as someone else, both people retain the same copyright. Copyright is the right to stop somebody of copying your work. If you have created something independently from another person then you are not copying.
</p>
<p><strong>Trademark isn&#8217;t there for you. You need to fight to keep it.</strong></p>
<p><strong>If you&#8217;re going to do business, do safe business.  Get business insurance.</strong>  </p>
<p>
  <strong>Merger Clause</strong><br />
  It&#8217;s a little thing at the bottom of the clause. Anything that anybody said prior to executing this contract in oral communications, written, etc, is gone.  If it&#8217;s not in the contract it doesn&#8217;t exist. Basically, if you want something.  Particularly for consultants if there were conversations you had with clients prior to the deal, <em>put them in the contract</em> or they don&#8217;t apply.
</p>
<p>
  <strong>Understand the Client&#8217;s Organization</strong><br />
  If someone is the CIO and they hire you, you generally don&#8217;t have to worry about hiring issues with them.  A CIO would have &quot;apparent authority.&quot; You need to make sure that the person who is signing the contract with you is authorized to sign the contract.  He jokes that in a bank everybody is the vice president.  Don&#8217;t negotiate with someone who is seven levels down in a company.  You may have already given someone your best deal who has no power to execute on it. Understand the layout of the company before you make a decision otherwise you will be spending a lot of time and energy that might not even apply.
</p>
<ul>
<li>
  If you&#8217;re going to make a statement of work they should only have statements specific to the business and scope of the work.  There may be times when you come up with a situation where you have an agreement where you have to change something with a specific deliverable.
</li>
<li>
  SLAs are nothing more than a way of limiting liability in a specific circumstance. Be careful with them. If the SLA doesn&#8217;t meet what you&#8217;re looking for it overrides liability.  Make sure you understand SLAs.
</li>
<li>
  If you need something from the client in order to make something happen put it in the contract.  Outline the client&#8217;s responsibilities.
</li>
<li>It all comes down to this: protect yourself.  See a lawyer and get a contract made.</li>
</ul>
<p>Overall this was one of the most useful talks so far of BizConf.  Jose <em>thoroughly</em> knows his stuff.</p>
<style type="text/css">
.img_right { 
float:right;margin:3px;border: 1px solid #eee;
}
</style>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Live+blogging+BizConf+Day+2+http://bit.ly/L0Ydq" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;title=Live+blogging+BizConf+Day+2" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;title=Live+blogging+BizConf+Day+2" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;title=Live+blogging+BizConf+Day+2" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;title=Live+blogging+BizConf+Day+2" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;t=Live+blogging+BizConf+Day+2" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;t=Live+blogging+BizConf+Day+2" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;title=Live+blogging+BizConf+Day+2" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2&amp;title=Live+blogging+BizConf+Day+2" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/CRqub3DGnTo" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2009/08/21/live-blogging-bizconf-day-2</feedburner:origLink></item>
		<item>
		<title>Liveblogging Bizconf</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/hBqlOmykWyw/liveblogging-bizconf</link>
		<comments>http://jasonseifer.com/2009/08/20/liveblogging-bizconf#comments</comments>
		<pubDate>Thu, 20 Aug 2009 19:03:10 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Misc]]></category>
		<category><![CDATA[Business]]></category>
		<category><![CDATA[conference]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=218</guid>
		<description><![CDATA[<p>
<img src="http://jasonseifer.com/assets/2009/08/bizconf.jpg" alt="BizConf Logo" border="0" width="225" height="119" align="right" />
I'm lucky to attend <a href="http://bizconf.org">BizConf</a> so I thought I'd blog about my experience here.  I can't promise to get every presentation here but I'll try my best. This post will be updated as things happen.
</p>


No related posts.]]></description>
			<content:encoded><![CDATA[<p><a href="http://bizconf.org"><img src="http://jasonseifer.com/assets/2009/08/bizconf.jpg" alt="BizConf Logo" border="0" width="225" height="119" align="right" /></a></p>
<p>
I&#8217;m lucky to attend <a href="http://bizconf.org">BizConf</a> so I thought I&#8217;d blog about my experience here.  I can&#8217;t promise to get every presentation here but I&#8217;ll try my best. This post will be updated as things happen.
</p>
<p>Impressions so far: amazing conference.  I&#8217;ve never been to a conference where so many people are having difficulty choosing talks because they all look so interesting and useful.</p>
<ul>
<li><a href="#opening">Opening Keynote</a></li>
<li><a href="#sellvalue">Selling Value For Fun and Profit</a></li>
<li><a href="#no">Learning to say &quot;No&quot;.</a></li>
<li><a href="#bootstrap">Bootstrap Like a Missionary</a></li>
</ul>
<div id="opening"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_170">Welcome Address and Keynote</a></h3>
<h4>Obie Fernandez, Hashrocket</h4>
<p>Be controversial. But if you&#8217;re going to be controversial be prepared to take the abuse.  In that respect, be confident in yourself but not to the point that you seem desperate.  &#8220;He who cares the least wins.&#8221;  This can be a fine tuned art or skill that some have innately and some have to really work on.  Referrals are your lifeblood &#8212; try and get the most values out of referrals as possible.  Obie shows a video where a client talks about what they&#8217;re doing and .  As tech people we&#8217;re used to email and instant messages. But don&#8217;t do that.  If there&#8217;s a phone number in an email, call the person!  Keep a notebook to keeping notes and to-dos.</p>
<p>Lawyers cost a lot of money.  If you run in to a situation where things can be difficult then make sure to negotiate at a time that&#8217;s good for you, and not when you&#8217;re under pressure.  This goes back to not seeming desperate.  Don&#8217;t do fixed bid contracts.  Agile doesn&#8217;t work with fixed bid contracts.  Charge what you are worth.  Budget for both nonpaying clients and internal products.  Use pivotal tracker.</p>
<p>Regarding agile, do it by the book first and don&#8217;t defend it.  Be consistently excellent because perception is reality.  Make sure you make it easy to see.  If the client doesn&#8217;t recognize it then you&#8217;re not doing an excellent job.  This reminds me of a quote by Richard Bandler &#8211; &quot;The meaning of your communication is the response that you get.&quot;</p>
<p>He closes by saying don&#8217;t lose your sense of fun.  Great keynote.  I&#8217;m not sure Obie realized it but he demonstrated nearly everything he spoke on <em>during his actual talk</em>.  This was a very inspiring start to the conference.</p>
<p></p>
<div id="sellvalue"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_189">Selling Value For Fun and Profit</a></h3>
<h4>Randall Thomas, Engineyard</h4>
<p>
I came in a bit late on this.  Adding features to a product actually changes the product. Example: BMW i-drive.
</p>
<p><strong>Simplify the complicated</strong><br />
Simplification is really important and it adds value. 37Signals is a great example here.  Consumers actually face anxiety when they face choices no a product.  Amazon is an example of things that are easy, like Amazon prime.  Randall went from buying 3 or 4 things a year on Amazon to 3 or 4 a month</p>
<p><strong>Educate an audience</strong><br />
As geeks, we like to educate.  A good example of this is having APIs for your apps.  Writing an API educates your audience about your app.
</p>
<p><strong>Preserve existing value</strong><br />
Once you&#8217;ve invested in something you have to preserve the value of it.  He asks how many people have expensive electroincs.  Lots of hands go up.  How many have an alarm?  Not nearly as many hands go up.  Software is similar to this.
</p>
<p><strong>Selling Value</strong><br />
Value is the only thing that&#8217;s ever sold and bought.
</p>
<p><strong>Communicate Value</strong> <br />
If you solved an awesome problem, make sure your clients know about this.  If you solve a problem in 3 hours but don&#8217;t communicate how awesome that is compared to the guy who takes 300 and keeps in constant contact with the client, the client will see more value in the longer one.   We have lots of ways to do this: email, sms IM, skype, etc.  You&#8217;re not delivering value if your client doesn&#8217;t understand it.
</p>
<p><strong>Understanding Value</strong><br />
Your clients need to understand the value you provide.  If they don&#8217;t you&#8217;re not providing that value.
</p>
<p><strong>Getting Paid</strong><br />
Do what&#8217;s valuable for a client.  If you don&#8217;t understand what is valuable for a client you can&#8217;t charge correctly and get paid.  Some people are more interested in how nice you were at a party vs how great of a programmer you are.  This affects how you will get paid.
</p>
<p><strong>Open with Value</strong><br />
Before you start talking about how you are getting paid and what you&#8217;re getting paid, explain the value.  Money is easy to communicate but value is not.  Start with the value.  A great example is <a href="http://newrelic.com">NewRelic</a>.  Engine Yard lets people try it and they often upgrade.
</p>
<p><strong>Show Don&#8217;t Tell</strong><br />
Make value tangible. Agile plays in to this because of collaboration and communication.  Example: saying a bomb can level a city vs showing footage of Nagasaki. When you demonstrate value consistently you preserve your value and get more referrals.
</p>
<p><strong>Price at Value</strong><br />
Not at cost. The value of something is relative.  Focus and price at value. If you&#8217;ve done your homework, you know what the value is.  Make all efforts to preserve that value because if you don&#8217;t it starts a bad precedent.  &quot;Protect the integrity of your fee.&quot;
</p>
<p>Selling on value is based on trust and honesty.  If you can&#8217;t deliver on a promise or slip on a promise this needs to be communicated.  If not your value goes down. When you sell and get paid based on quality, you start focusing on craftsmanship, quality, and the art of it.</p>
<p>This was an great presentation and full of useful information that is applicable to almost everyone.</p>
<p></p>
<h3><a href="http://www.bizconf.org/schedule#talk_178">Fifty Simple Things that Can Improve Your Business</a></h3>
<h4>Jerry Weinberg of geraldmweinberg.com</h4>
<p>
<strong>Three things to look for when developing software:</strong></p>
<p><strong>Motivation</strong></p>
<p>You can teach all you want. If you see an organization with no enthusiasm for what they&#8217;re doing they probably don&#8217;t have enthusiasm for what you&#8217;re offering.</p>
<p><strong>Organization</strong></p>
<p>Learn whether or not people are organized. If an organization doesn&#8217;t care enough to organize, nothing is going to happen.</p>
<p><strong>Information</strong><br />
Information is not really enough.  Strive to find out what&#8217;s really going on and what the real problem is. Example: &quot;We have this software project that has been mishandled. It needs to be done in three weeks or the company goes under.&quot;  In this instance you&#8217;re a scapegoat not an architect.</p>
<p><strong>Figure out the real situation and act in accordance.</strong></p>
<p><strong>Jiggling</strong><br />
Like physical things, organizations can get stuck in a loop.  You give them a jiggle and it helps them get back on track.  At one campus a fire destroyed everything including data.  One year later they were more efficient.  A lot of times when you come in as a consultant you need to jiggle the company.  It may cost you your job but it will be worth it to the company.  If you do it nicely you may get repeat business.  Agile is the opposite of stuck.  A lot of problems aren&#8217;t the model but the organization being stuck in what they&#8217;re doing.</p>
<p><strong>Audience Question: </strong>How can you get stuck in an agile process?<br />
If you think you&#8217;re doing agile and not really, you can get stuck.  If you&#8217;ve spent time and budget not giving someone what they want you run in to problems.  If you have a client that doesn&#8217;t have an idea where they&#8217;re going to end up they may be surprised.  You can deliver a lot of product without delivering value.  You can be agile at the process level but not be agile at all.</p>
<p></p>
<div id="no"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_176"> Learning to Say &#8220;No&#8221;</a></h3>
<h4>Jerry Weinberg of geraldmweinberg.com </h4>
<p>Jerry opens this talk by asking if someone had something they should have said no to but didn&#8217;t. Then the whole audience goes through and analyzes the situation with Jerry as the leader.  He breaks down what was done well and what could have been done better.  By using an actual example and getting the audience involved, we all got value out of this.</p>
<p>Here&#8217;s some things I got out of this presentation:</p>
<ul>
<li>Your bottom line applies to everything.  If you wouldn&#8217;t build something for free it doesn&#8217;t matter what else is offered.</li>
<li>Make the NO clear.  There should be no ambiguities.</li>
<li>Do good business. If you can&#8217;t accommodate something, say no. It will be better than doing it poorly.</li>
<li>Word spreads around. As with the previous point, if you&#8217;re not doing good business people will know.</li>
</ul>
<p>I would have liked to have better notes for this one but it was more of a participatory thing.  Jerry did a thorough job getting his points across in this way.</p>
<p></p>
<div id="bootstrap"></div>
<h3><a href="http://www.bizconf.org/schedule#talk_201">Bootstrap Like a Missionary</a></h3>
<h4>Andrew Warner of Mixergy.com</h4>
<p>Find ways in the door when you&#8217;re not supposed to be in the door.  Find ways to get your message in the door. He gives an example of an ad company who he wanted to sell his ads.  He was too small a company for them but didn&#8217;t give up.  He called every day and they declined.  Every day.  Finally he drove down with a check for $2,000.  They took a chance on him.</p>
<p><strong>Start with garbage as your first product</strong><br />
Build your product in stages. He asked Christian Carter how he builds a product.  The answer was &quot;When I have an idea for a product, I buy an ad on Google and see the click rates.&quot;  We then get a ton of examples from Andrew and the audience and the moral is the same for all of them: I wish I would have launched earlier.  Your audience will shape your product more than you can imagine.  You will have a better product for it.
</p>
<p><strong>Build an audience for yourself.</strong><br />
Some people build their audience by a blog.  Some build their audience by message boards.  Some do it by meetings.  Do what works for you.  We get some more audience participation for this one. <a href="http://alexdc.org">Alex De Carvalho</a> gets up and tells us about Refresh Miami and how he built the community.  As in the case of Threadless, Magento, etc, you generally can&#8217;t buy the great press you get from involving the community and building your audience.
</p>
<p><strong>Get your members to recruit for you.</strong><br />
Viral marketing doesn&#8217;t work anymore.  Hotmail was the originator of this by adding on to everyone&#8217;s email message.  Viral marketing can it <em>or it can&#8217;t</em>.  Some youtube videos get millions of views.  For Andrew, this isn&#8217;t enough to build a business off of.  You don&#8217;t want to build your business on hoping people spread your word.
</p>
<p><strong>Must Marketing</strong><br />
Andrew&#8217;s dad got Skype installed.  His dad wanted a friend to use it so he installed it for his friend.  Some popular restaurants don&#8217;t have tables for one.  You have to get friends to go with you.
</p>
<blockquote>
<p><strong>Rules for Must Marketing</strong></p>
<p><strong>It doesn&#8217;t work alone</strong><br />
You can&#8217;t have must marketing if you can do something alone.  The big risk is that it could fail completely.  That&#8217;s why you put out garbage first and iterate.
</p>
<p><strong>There should be accountability</strong><br />
People should be able to see whether or not you did something.  An example is a Twitter post voting site.  People could see who tweeted to vote for things and who didn&#8217;t.  Then they would ask for people to vote.
</p>
<p><strong>The Recipient Needs To Be Able To Reciporicate</strong><br />
In the virtual gift example, a guy can send his girlfriend virtual flowers.  When she gets them she can send some back.  By converting the recipient in to the sender the loop continues.
</p>
</blockquote>
<p>Andrew has a ton of energy and really gets people involved in his presentation. It&#8217;s no wonder he&#8217;s a successful entrepreneur.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Liveblogging+Bizconf+http://bit.ly/m2rw" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;title=Liveblogging+Bizconf" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;title=Liveblogging+Bizconf" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;title=Liveblogging+Bizconf" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;title=Liveblogging+Bizconf" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;t=Liveblogging+Bizconf" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;t=Liveblogging+Bizconf" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;title=Liveblogging+Bizconf" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/20/liveblogging-bizconf&amp;title=Liveblogging+Bizconf" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/hBqlOmykWyw" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2009/08/20/liveblogging-bizconf/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2009/08/20/liveblogging-bizconf</feedburner:origLink></item>
		<item>
		<title>Using the Rails logger outside of models and controllers</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/QyTe-YBAE24/using-the-rails-logger-outside-of-models-and-controllers</link>
		<comments>http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers#comments</comments>
		<pubDate>Mon, 10 Aug 2009 16:39:43 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=210</guid>
		<description><![CDATA[You can use the Rails logger outside of Rails models in at least version 2.3.X and up of Rails. You might be used to doing the following in your models or controllers: logger.info &#34;Some debugging info I want to see in my development log.&#34; If you make a regular model that doesn&#8217;t inherit from ActiveRecord, [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p>
  You can use the Rails logger outside of Rails models in at least version 2.3.X and up of Rails.  You might be used to doing the following in your models or controllers:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">logger.<span style="color:#9900CC;">info</span> <span style="color:#996600;">&quot;Some debugging info I want to see in my development log.&quot;</span></pre></div></div>

<p>If you make a regular model that doesn&#8217;t inherit from ActiveRecord, though, you may see the following error:</p>
<pre>undefined local variable or method `logger' for #&lt;Class:0x42fd77c&gt;</pre>
</p>
<p>The solution is to call <strong>Rails</strong>.logger.info (or debug, or warn) as follows:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;">Rails.<span style="color:#9900CC;">logger</span>.<span style="color:#9900CC;">info</span> <span style="color:#996600;">&quot;Some debugging info I want to see in my development log.&quot;</span></pre></div></div>

<p>I hope that helps someone.</p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Using+the+Rails+logger+outside+of+models+and+controllers+http://bit.ly/dNmok" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;title=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;title=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;title=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;title=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;t=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;t=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;title=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers&amp;title=Using+the+Rails+logger+outside+of+models+and+controllers" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/QyTe-YBAE24" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2009/08/10/using-the-rails-logger-outside-of-models-and-controllers</feedburner:origLink></item>
		<item>
		<title>Getting RSpec and TextMate to play nice</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/5y1hgFCGrq8/getting-rspec-and-textmate-to-play-nice</link>
		<comments>http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice#comments</comments>
		<pubDate>Thu, 06 Aug 2009 04:17:08 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[rails]]></category>
		<category><![CDATA[testing]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=206</guid>
		<description><![CDATA[Elijah Miller has a great blog post on getting TextMate and RSpec to play nicely together. This is pretty useful for just running specific spec files. Also, did you know you can get TextMate to automatically recognize spec files by naming them with the .spec extension and RSpec will recognize it? Link Delicious Digg This [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><span class="outgoing_link_image" style="float:right"><a href="http://jqr.github.com/2009/02/06/textmate-rspec-and-dot-spec-party.html"><img src="http://jasonseifer.com/assets/2009/08/beer_labelsTextMate-Rspec-and-Dot-Spec-Party-__-Elijah-Miller-Build-20090805031252.jpg" alt="TextMate, Rspec and Dot Spec Party __ Elijah Miller - (Build 20090805031252).jpg" border="0" width="355" height="308" align="right" /><br />
</a></span></p>
<p>Elijah Miller has a great blog post on getting TextMate and RSpec to play nicely together.  This is pretty useful for just running specific spec files.  Also, did you know you can get TextMate to automatically recognize spec files by naming them with the .spec extension and RSpec will recognize it?<br />
<br />
<span class="outgoing_link"><a href="http://jqr.github.com/2009/02/06/textmate-rspec-and-dot-spec-party.html">Link</a></span></p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Getting+RSpec+and+TextMate+to+play+nice+http://bit.ly/30duUc" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;title=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;title=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;title=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;title=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;t=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;t=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;title=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice&amp;title=Getting+RSpec+and+TextMate+to+play+nice" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/5y1hgFCGrq8" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2009/08/05/getting-rspec-and-textmate-to-play-nice</feedburner:origLink></item>
		<item>
		<title>Microsoft deems Ruby on Rails a competitor</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/y5tc128_21c/microsoft-deems-ruby-on-rails-a-competitor</link>
		<comments>http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor#comments</comments>
		<pubDate>Wed, 05 Aug 2009 21:47:17 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor</guid>
		<description><![CDATA[Numerous commercial software vendors offer competing software applications for connectivity (both Internet and intranet), security, hosting, and e-business servers. System Center competes with server management and server virtualization platform providers, such as BMC, CA, Inc., Hewlett-Packard, IBM, and VMWare in the management of information technology infrastructures. Forefront security products compete with McAfee, Symantec, and Trend [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<div class="posterous_bookmarklet_entry">
<blockquote class="posterous_long_quote">
<p align="justify" style="margin-top: 0px; margin-bottom: 0px; text-indent: 2%;">Numerous commercial  software vendors offer competing software applications for connectivity (both Internet and intranet), security, hosting, and e-business servers. System Center competes with server management and server virtualization platform providers, such as BMC,  CA, Inc., Hewlett-Packard, IBM, and VMWare in the management of information technology infrastructures. Forefront security products compete with McAfee, Symantec, and Trend Micro in protecting both client and server applications. Our products for  software developers compete against offerings from Adobe, Borland, IBM, Oracle, Sun Microsystems, other companies, and open-source projects. Open source projects include Eclipse (sponsored by CA, IBM, Oracle, and SAP), PHP, and <strong>Ruby on Rails</strong>, among  others. We believe that our server products provide customers with advantages in innovation, performance, total costs of ownership, and productivity by delivering superior applications, development tools, and compatibility with a broad base of  hardware and software applications, security, and manageability. </p>
<p align="justify" style="margin-top: 12px; margin-bottom: 0px;">
</blockquote>
<div class="posterous_quote_citation">via <a href="http://www.sec.gov/Archives/edgar/data/789019/000119312509158735/d10k.htm">sec.gov</a></div>
<p>Emphasis mine.</p>
</div>
<p style="font-size: 10px;">  <a href="http://posterous.com">Posted via web</a>   from <a href="http://jasonseifer.posterous.com/microsoft-deems-ruby-on-rails-a-competitor">Jason&#8217;s posterous</a>  </p>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Microsoft+deems+Ruby+on+Rails+a+competitor+http://bit.ly/PtRvj" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;title=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;title=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;title=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;title=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;t=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;t=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;title=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor&amp;title=Microsoft+deems+Ruby+on+Rails+a+competitor" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/y5tc128_21c" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor/feed</wfw:commentRss>
		<slash:comments>0</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2009/08/05/microsoft-deems-ruby-on-rails-a-competitor</feedburner:origLink></item>
		<item>
		<title>Receiving Email with Rails</title>
		<link>http://feedproxy.google.com/~r/jasonseifer/~3/nzTeygGC9CM/receving-email-with-rails</link>
		<comments>http://jasonseifer.com/2009/04/24/receving-email-with-rails#comments</comments>
		<pubDate>Fri, 24 Apr 2009 04:58:28 +0000</pubDate>
		<dc:creator>Jason</dc:creator>
				<category><![CDATA[Ruby]]></category>
		<category><![CDATA[email]]></category>
		<category><![CDATA[rails]]></category>

		<guid isPermaLink="false">http://jasonseifer.com/?p=186</guid>
		<description><![CDATA[This article originally appeared in the first issue of Rails Magazine. It is reproduced here not quite verbatim with a couple of corrections and additions. Photo from esparta on Flickr. Introduction Receiving email is a great way to add functionality to your application. This is one area, though, that is not very well documented with [...]


No related posts.]]></description>
			<content:encoded><![CDATA[<p><em>This article originally appeared in the first issue of <a href="http://railsmagazine.com">Rails Magazine</a>.  It is reproduced here not quite verbatim with a couple of corrections and additions.</em></p>
<div style="float:right; text-align:center; margin: 8px; padding: 3px; border: 1px solid #aaa"><img src="http://jasonseifer.com/assets/2009/04/423aefd3-8e36-43a1-b054-c16f860cf0fe.jpg" alt="423AEFD3-8E36-43A1-B054-C16F860CF0FE.jpg" border="0" width="240" height="160" align="right" /></p>
<p class="small">Photo from <a href="http://www.flickr.com/photos/esparta/1609874001/">esparta</a> on Flickr.</p>
</div>
<h2>Introduction</h2>
<p>Receiving email is a great way to add functionality to your application.  This is one area, though, that is not very well documented with Rails.  Sure, we have ActionMailer documentation, but how does something like this actually work in a production environment and what are the concerns?  I had to tackle this problem recently and no solution that was &#8220;in the wild&#8221; would work with the requirements I had for this application.  In this article, we will take a look at a couple of options and go in to detail with one method that has not recieved much coverage.</p>
<p>John Nunemaker, on the Rails Tips blog, posted a solution to this problem using GMail with IMAP to Receive Email in Rails<sup><a href="#railstips">(1)</a></sup>.  He uses a script to connect to an IMAP server every minute or so and polls for new e-mails.  The Rails environment is loaded and if there are new messages waiting, this is processed using an ActiveRecord model.  He uses the &#8216;Daemons&#8217; library to keep the script running and give it start/stop commands and keep a pidfile.</p>
<p>This is a perfectly valid and functional way to process e-mail.  The application I was working on, though, had to be able to handle and process e-mail in as little time as possible. People would likely be e-mailing things from their mobile phones and might want to check on them soon after an upload.  At that point, polling every X number of minutes wasn&#8217;t a viable solution, so I had to come up with something else.</p>
<p>It&#8217;s also worth noting that polling for email should take in to account your user base and size.  Let&#8217;s say that we have an app with 10,000 active users.  Let&#8217;s also say that during peak times, they <em>all</em> decide to email our application.  Finally, we&#8217;ll say that they are sending an average 5 emails apiece.  With these hypothetical numbers, this works out to about 833 emails per minute.  If your IMAP server is being polled every three minutes, that&#8217;s going to leave you about 3,332 e-mails to download and process each time.</p>
<h2>Configuring Your Email Server</h2>
<p>Email itself is a problem that has been largely solved.  There are a wealth of email servers available but  this article will take a look at Postfix.  Postfix is most easily installed using the package manager of your distribution and may already be installed if you have a VPS.  I prefer Ubuntu server side so this article will focus on that flavor. Just be aware that certain configuration file locations may vary depending on your distribution.  So let&#8217;s get started.</p>
<p>First we need to add or change some DNS records.  The instructions for how to do this will vary depending on how you have your DNS hosted. I personally use DNS Made Easy and recommend it to my clients as well, should they need DNS hosting. DNS Made Easy has very reasonable rates and quotas.  Regardless of your host you need to create the following records:</p>
<p><img src="http://jasonseifer.com/assets/2009/04/mxrecord.jpg" alt="mxrecord.t.jpg" border="0" width="636" height="332" align="right" /></p>
<ul>
<li>An &#8220;A&#8221; record that has your domain name only.</li>
<li>An &#8220;A&#8221; record that is just <code>"mail"</code>.</li>
<li>An &#8220;MX&#8221; record that is set to level 10 and points to &#8220;mail&#8221;</li>
<li>Optional: An SPF Record</li>
</ul>
<p>OK, I was lying.  The SPF record isn&#8217;t really optional. This is going to be a TXT Record and should read something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;">	<span style="color: #007800;">v</span>=spf1 mx <span style="color: #660033;">-all</span></pre></div></div>

<p>There are several different variations you can use with SPF records but going through them would be beyond the scope of this article.  Do some research and pick the combination that&#8217;s right for your setup.</p>
<p>Now, the first thing that you&#8217;re going to need to do is figure out what address you want to receive mail as. This is going to be your catch-all address.  In this case we&#8217;re going to choose &quot;killerrobot&quot; because that just might keep spammers at bay<sup><a href="#spammers">(2)</a></sup>. I mean, who&#8217;s going to spam a killer robot? </p>
<p>Reading tutorials around the web or even looking in some books will tell you that you can tell postfix to forward mail simply by piping it in /etc/aliases.  You might be tempted to do something like pipe everything to a ruby script:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/aliases</span>
...
killerrobot: <span style="color: #ff0000;">&quot;|/usr/bin/ruby /var/www/apps/myapp/current/lib/mail_receiver.rb&quot;</span>
<span style="color: #000000; font-weight: bold;">*</span>: killerrobot</pre></div></div>

<p>This, unfortunately, won&#8217;t work.  If you do it this way, all of your scripts are going to run as root.  This is not what you want and can be a security concern.  The proper way to do this is with a postmap filter.  Open up /etc/postfix/master.cf.  The first line after all of the comments should look like this:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/postfix/master.cf</span>
smtp      inet  n       -       -       -       -       smtpd</pre></div></div>

<p>Add a line right below that to tell postfix that you&#8217;re using a filter:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/postfix/master.cf</span>
smtp      inet  n       -       -       -       -       smtpd
 <span style="color: #660033;">-o</span> <span style="color: #007800;">content_filter</span>=myapp_filter:</pre></div></div>

<p>Then go all the way down to the bottom of the file and add your filter:</p>

<div class="wp_syntax"><div class="code"><pre class="bash" style="font-family:monospace;"><span style="color: #666666; font-style: italic;"># /etc/postfix/master.cf </span>
smtp      inet  n       -       -       -       -       smtpd
 <span style="color: #660033;">-o</span> <span style="color: #007800;">content_filter</span>=myapp_filter:
...
myapp_filter unix -     n       n       -       -       pipe
 <span style="color: #007800;">flags</span>=Xhq <span style="color: #007800;">user</span>=deploy <span style="color: #007800;">argv</span>=<span style="color: #000000; font-weight: bold;">/</span>usr<span style="color: #000000; font-weight: bold;">/</span>bin<span style="color: #000000; font-weight: bold;">/</span>ruby <span style="color: #000000; font-weight: bold;">/</span>var<span style="color: #000000; font-weight: bold;">/</span>www<span style="color: #000000; font-weight: bold;">/</span>apps<span style="color: #000000; font-weight: bold;">/</span>myapp<span style="color: #000000; font-weight: bold;">/</span>current<span style="color: #000000; font-weight: bold;">/</span>lib<span style="color: #000000; font-weight: bold;">/</span>mail_receiver.rb</pre></div></div>

<p>The &#8220;X&#8221; parameter in &#8220;flags=Xhq&#8221; tells postfix that an external command performs final delivery.  This is going to change the message status from &#8220;relayed&#8221; to &#8220;delivered&#8221;.  The &#8220;h&#8221; flag sets the recipients and domains to lowercase, and the &#8220;q&#8221; flag quotes whitespace and other special characters.  Now, reload postfix by doing <code>sudo postfix reload</code>. At this point, you should have a very basic mail server configured to receive email and put it in to a <code>mail_receiver.rb</code> script.</p>
<h2>Handling The Email</h2>
<p>	We&#8217;re going to be putting all of our mail that comes in to a message queue and parsing it with the &#8216;mms2r&#8217; gem.  In this article I&#8217;m going to use beanstalkd<sup><a href="#beanstalkd">(3)</a></sup> but you could substitute your favorite message queue for this part of the architecture.  I&#8217;m going to assume that a message queue is already installed and running and that you have both the &#8216;tmail&#8217; and &#8216;mms2r&#8217; gems installed.</p>
<p>	We want our <code>mail_receiver</code> script to be super lean.  It&#8217;s only going to serve one function: put the incoming mail in to a queue.  We&#8217;ll process the queue later but for now we just want to get it in there and handle any attachments.  We want it to be super lean because if we&#8217;re receiving a lot of mail we don&#8217;t want this script to be memory intensive or take a long time to start up or run.  It will look something like this:
</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'tmail'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mms2r'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'beanstalk-client'</span>
&nbsp;
message = <span style="color:#ff6633; font-weight:bold;">$stdin</span>.<span style="color:#9900CC;">read</span>
mail = <span style="color:#6666ff; font-weight:bold;">TMail::Mail</span>.<span style="color:#9900CC;">parse</span><span style="color:#006600; font-weight:bold;">&#40;</span>message<span style="color:#006600; font-weight:bold;">&#41;</span>
mms = <span style="color:#6666ff; font-weight:bold;">MMS2R::Media</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>mail<span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">if</span> !mail.<span style="color:#9900CC;">to</span>.<span style="color:#0000FF; font-weight:bold;">nil</span>?
  BEANSTALK = <span style="color:#6666ff; font-weight:bold;">Beanstalk::Pool</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'127.0.0.1:11300'</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  BEANSTALK.<span style="color:#9900CC;">yput</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">&#123;</span>:type <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'received_email'</span>, 
    <span style="color:#ff3333; font-weight:bold;">:to</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> mail.<span style="color:#9900CC;">to</span>.<span style="color:#9900CC;">flatten</span>.<span style="color:#9900CC;">first</span>.<span style="color:#CC0066; font-weight:bold;">gsub</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">'@mydomain.com'</span>, <span style="color:#996600;">''</span><span style="color:#006600; font-weight:bold;">&#41;</span>, 
    <span style="color:#ff3333; font-weight:bold;">:tags</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> mail.<span style="color:#9900CC;">subject</span>, 
    <span style="color:#ff3333; font-weight:bold;">:attachment</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> mms.<span style="color:#9900CC;">default_media</span>.<span style="color:#9900CC;">path</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>What we&#8217;re doing here is taking the email message from standard input and parsing it by putting it in to a TMail object.  TMail is a great library that takes care of most of the formatting for us.  It lets us do things like refer to mail messages as objects and use <code>mail.to</code>, <code>mail.from</code>, etc.  If we have attachments, they&#8217;re going along as well.</p>
<p>MMS2R is an amazing piece of software.  It works for both emails and, as the name implies, MMS messages as well.  What makes it so amazing?  There are dozens of different formats that an attachment can come in from both email and MMS.  Different phone carriers each have their own way of doing MMS attachments, each of them slightly different.  MMS2R alleviates the problem of trying to parse all of these different formats and does it all for you.  In this way we can call <code>MMS2R::Media.new(mail)</code> and be done with it.</p>
<p>For the purposes of our example application, the user can tag the photos they upload by putting the different tags in the subject. We send that in as another option in the job hash for beanstalkd.  Each user is assigned a unique identifier in their account that lets them send email to the application, for example &#8220;aslkdf32@myapp.com&#8221;.  We grab the first recipient (mail.to) because that will come in as an array.  We take the domain out and send that in as the &#8220;to&#8221; field.  Finally, the temporary media location on disk that we parsed using MMS2R is thrown in to the queue as the :attachment option.  Our mail is in the queue.</p>
<h2>Processing the Queue</h2>
<p>Now that we have our email in the queue, we need to get it out. For this part, we&#8217;re actually going to load the Rails environment.  I have this in the <code>lib</code> directory.  The code would look something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#008000; font-style:italic;">#!/usr/bin/env ruby</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">'..'</span>, <span style="color:#996600;">'config'</span>, <span style="color:#996600;">'environment'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'beanstalk-client'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'yaml'</span>
beanstalk_config = <span style="color:#CC00FF; font-weight:bold;">YAML</span>::<span style="color:#CC0066; font-weight:bold;">load</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#CC0066; font-weight:bold;">open</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{RAILS_ROOT}/config/beanstalk.yml&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#0066ff; font-weight:bold;">@logger</span> = <span style="color:#CC00FF; font-weight:bold;">Logger</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;#{RAILS_ROOT}/log/queue.#{Rails.env}.log&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
<span style="color:#0066ff; font-weight:bold;">@logger</span>.<span style="color:#9900CC;">level</span> = <span style="color:#6666ff; font-weight:bold;">Logger::INFO</span>
&nbsp;
BEANSTALK = <span style="color:#6666ff; font-weight:bold;">Beanstalk::Pool</span>.<span style="color:#9900CC;">new</span><span style="color:#006600; font-weight:bold;">&#40;</span>beanstalk_config<span style="color:#006600; font-weight:bold;">&#91;</span>Rails.<span style="color:#9900CC;">env</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
<span style="color:#CC0066; font-weight:bold;">loop</span> <span style="color:#9966CC; font-weight:bold;">do</span>
  job = BEANSTALK.<span style="color:#9900CC;">reserve</span>
  job_hash = job.<span style="color:#9900CC;">ybody</span>
  <span style="color:#9966CC; font-weight:bold;">case</span> job_hash<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:type</span><span style="color:#006600; font-weight:bold;">&#93;</span>
  <span style="color:#9966CC; font-weight:bold;">when</span> <span style="color:#996600;">'received_email'</span>
    <span style="color:#0066ff; font-weight:bold;">@logger</span>.<span style="color:#9900CC;">info</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Got email: #{job_hash.inspect}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#9966CC; font-weight:bold;">if</span> EmailProcessor.<span style="color:#9900CC;">process</span><span style="color:#006600; font-weight:bold;">&#40;</span>job_hash<span style="color:#006600; font-weight:bold;">&#41;</span>
      job.<span style="color:#9900CC;">delete</span>
    <span style="color:#9966CC; font-weight:bold;">else</span>
      <span style="color:#0066ff; font-weight:bold;">@logger</span>.<span style="color:#9900CC;">warn</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Did not process email: #{job_hash.inspect}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
      job.<span style="color:#9900CC;">bury</span>
    <span style="color:#9966CC; font-weight:bold;">end</span>
  <span style="color:#9966CC; font-weight:bold;">else</span>
    <span style="color:#0066ff; font-weight:bold;">@logger</span>.<span style="color:#9900CC;">warn</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#996600;">&quot;Don't know how to process #{job_hash.inspect}&quot;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>The first line loads the Rails environment so we have access to all of our ActiveRecord models.  We want to keep our code DRY and use only one method of processing an attachment, routing messages, or the like.  If we were using attachment_fu or paperclip, we would keep this code in the model.  You might even want to make a seprate class, such a presenter, for your logic.  In this case the EmailProcessor class finds the user based on the reception_email attribute and then executes the &#8220;do_stuff&#8221; method to process the message.  It would look something like this:</p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'local_file'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'tmail'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'mms2r'</span>
&nbsp;
<span style="color:#9966CC; font-weight:bold;">class</span> EmailProcessor
  attr_accessor <span style="color:#ff3333; font-weight:bold;">:user</span>, <span style="color:#ff3333; font-weight:bold;">:options</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> <span style="color:#0000FF; font-weight:bold;">self</span>.<span style="color:#9900CC;">process</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
    email_processor = new<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
    email_processor.<span style="color:#9900CC;">do_stuff</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> find_user
    <span style="color:#0066ff; font-weight:bold;">@user</span> = User.<span style="color:#9900CC;">find</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#ff3333; font-weight:bold;">:first</span>, <span style="color:#ff3333; font-weight:bold;">:conditions</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#006600; font-weight:bold;">&#123;</span>:reception_email <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0066ff; font-weight:bold;">@options</span><span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#ff3333; font-weight:bold;">:to</span><span style="color:#006600; font-weight:bold;">&#93;</span><span style="color:#006600; font-weight:bold;">&#125;</span><span style="color:#006600; font-weight:bold;">&#41;</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> do_stuff
		<span style="color:#008000; font-style:italic;"># Your actual logic would go here...</span>
  <span style="color:#9966CC; font-weight:bold;">end</span>
&nbsp;
  <span style="color:#9966CC; font-weight:bold;">def</span> initialize<span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#006600; font-weight:bold;">*</span>args<span style="color:#006600; font-weight:bold;">&#41;</span>
    <span style="color:#0066ff; font-weight:bold;">@options</span> = args.<span style="color:#9900CC;">extract_options</span>!
    find_user
  <span style="color:#9966CC; font-weight:bold;">end</span>
<span style="color:#9966CC; font-weight:bold;">end</span></pre></div></div>

<p>This uses the LocalFile class from Ben Rubenstein<sup><a href="#localfile">(4)</a></sup></p>
<p>We&#8217;re not quite done yet.  We need to make the <code>mail_processor</code> run as a daemon instead of just running &#8220;ruby mail_processor.rb&#8221; when we want to launch it.  We&#8217;ll use the &#8216;daemons&#8217; library for that.  This will take care of setting up PID files and lets us do <code>ruby mail_processor_control.rb start</code> and <code>ruby mail_processor_control.rb stop</code>.  We&#8217;re also using the &#8220;daemons_extension&#8221; file from Rapleaf that actually gives feedback on stopping of the daemon.  The script itself is extremely simple and goes in the <code>lib</code> directory with your <code>mail_processor.rb</code> script: </p>

<div class="wp_syntax"><div class="code"><pre class="ruby" style="font-family:monospace;"><span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'rubygems'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#996600;">'daemons'</span>
<span style="color:#CC0066; font-weight:bold;">require</span> <span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">'daemons_extension'</span><span style="color:#006600; font-weight:bold;">&#41;</span>
&nbsp;
ENV<span style="color:#006600; font-weight:bold;">&#91;</span><span style="color:#996600;">'RAILS_ENV'</span><span style="color:#006600; font-weight:bold;">&#93;</span> <span style="color:#006600; font-weight:bold;">||</span>= <span style="color:#996600;">'development'</span>
&nbsp;
options = <span style="color:#006600; font-weight:bold;">&#123;</span>
  <span style="color:#ff3333; font-weight:bold;">:app_name</span>  <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'processor'</span>,
  <span style="color:#ff3333; font-weight:bold;">:dir_mode</span>  <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:script</span>,
  <span style="color:#ff3333; font-weight:bold;">:dir</span>       <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#996600;">'../log'</span>,
  <span style="color:#ff3333; font-weight:bold;">:backtrace</span> <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>,
  <span style="color:#ff3333; font-weight:bold;">:mode</span>      <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#ff3333; font-weight:bold;">:load</span>,
  <span style="color:#ff3333; font-weight:bold;">:monitor</span>   <span style="color:#006600; font-weight:bold;">=&gt;</span> <span style="color:#0000FF; font-weight:bold;">true</span>
<span style="color:#006600; font-weight:bold;">&#125;</span>
&nbsp;
Daemons.<span style="color:#9900CC;">run</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">join</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#CC00FF; font-weight:bold;">File</span>.<span style="color:#9900CC;">dirname</span><span style="color:#006600; font-weight:bold;">&#40;</span><span style="color:#0000FF; font-weight:bold;">__FILE__</span><span style="color:#006600; font-weight:bold;">&#41;</span>, <span style="color:#996600;">'processor.rb'</span><span style="color:#006600; font-weight:bold;">&#41;</span>, options<span style="color:#006600; font-weight:bold;">&#41;</span></pre></div></div>

<p>Now just start it by doing &#8220;<code>ruby mail_processor_control.rb start" </code>and your daemon will be up and running. That&#8217;s it! You&#8217;re receiving e-mail to your Rails app.  It is very important that you load the rails environment in your worker and not the daemon controller.  The controller only manages the worker, therefore it won&#8217;t have access to the Rails environment and will error out.</p>
<h2>Considerations</h2>
<p>Depending on your configuration, you may want to use a different message queue than beanstalkd.  I&#8217;ve personally  found beanstalkd to be reliable but your architecture might call for something else.  For example, you may want to put your message queue on another server.  If you did this then you wouldn&#8217;t have access to the temporary storage that MMS2R defaults to for saving the attachments.  In that case you could use a queue and put the attachments directly in the queue, on s3, etc.</p>
<p>Some people have reported problems using the daemons library and having their daemon just halt and stop responding.  I&#8217;ve never encountered that and I&#8217;ve had this similar setup running for months. You will also want to put your <code>mail_processor_control</code> under some sort of process supervision, such as by monit or god.</p>
<p>You may be asking yourself why we didn&#8217;t use ActionMailer to handle the incoming emails since it does that?  The answer is that if you do it the way it&#8217;s described, for example, on the Rails wiki, it will spin up a new Rails process for <em>each</em> email that&#8217;s received.  Under any significant load, this will fail<sup><a href="#railscantscale">(5)</a></sup>.  Another drawback to that approach is that if there is a failure, you lose the email.  With this type of architecture, it remains in the queue and you can just process it later.</p>
<h2>Conclusion</h2>
<p>This is a good start to handling email in your application.  Being able to process email is a great way to enhance your app and give your users mobile access. With email-capable phones becoming ubiquitous, they no longer need to be tied to a computer to use your app. Remember, an app that can be used anywhere is an app that will be used anywhere.</p>
<h3>Citations</h3>
<ol>
<li id="railstips"><a href="http://railstips.org/2008/10/27/using-gmail-with-imap-to-receive-email-in-rails">http://railstips.org/2008/10/27/using-gmail-with-imap-to-receive-email-in-rails</a></li>
<li id="stopspammers">No it won&#8217;t.</li>
<li id="beanstalkd"><a href="http://xph.us/software/beanstalkd/">http://xph.us/software/beanstalkd/</a></li>
<li id="localfile"><a href="http://www.benr75.com/articles/2008/01/04/attachment_fu-now-with-local-file-fu">http://www.benr75.com/articles/2008/01/04/attachment_fu-now-with-local-file-fu</a></li>
<li id="railscantscale">Because rails can&#8217;t scale.  See <a href="http://canrailsscale.com">http://canrailsscale.com</a> for more information.</li>
</ol>
<p align="left"><a class="tt" href="http://twitter.com/home/?status=Receiving+Email+with+Rails+http://bit.ly/nFC0N" title="Post to Twitter"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-twitter-micro1.png" alt="Post to Twitter" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;title=Receiving+Email+with+Rails" title="Post to Delicious"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-delicious.png" alt="Post to Delicious" /></a> <a class="tt" href="http://delicious.com/post?url=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;title=Receiving+Email+with+Rails" title="Post to Delicious">Delicious</a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;title=Receiving+Email+with+Rails" title="Post to Digg"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-digg.png" alt="Post to Digg" /></a> <a class="tt" href="http://digg.com/submit?url=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;title=Receiving+Email+with+Rails" title="Post to Digg">Digg This Post</a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;t=Receiving+Email+with+Rails" title="Post to Facebook"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-facebook.png" alt="Post to Facebook" /></a> <a class="tt" href="http://www.facebook.com/share.php?u=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;t=Receiving+Email+with+Rails" title="Post to Facebook">Facebook</a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;title=Receiving+Email+with+Rails" title="Post to Reddit"><img class="nothumb" src="http://jasonseifer.com/wp-content/plugins/tweet-this/icons/tt-reddit.png" alt="Post to Reddit" /></a> <a class="tt" href="http://reddit.com/submit?url=http://jasonseifer.com/2009/04/24/receving-email-with-rails&amp;title=Receiving+Email+with+Rails" title="Post to Reddit">Reddit This Post</a></p>

<p>No related posts.</p><img src="http://feeds.feedburner.com/~r/jasonseifer/~4/nzTeygGC9CM" height="1" width="1"/>]]></content:encoded>
			<wfw:commentRss>http://jasonseifer.com/2009/04/24/receving-email-with-rails/feed</wfw:commentRss>
		<slash:comments>11</slash:comments>
		<feedburner:origLink>http://jasonseifer.com/2009/04/24/receving-email-with-rails</feedburner:origLink></item>
	</channel>
</rss><!-- Dynamic page generated in 2.864 seconds. --><!-- Cached page generated by WP-Super-Cache on 2010-09-06 22:59:20 --><!-- Compression = gzip -->
