<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Litany Against Fear</title>
 
 <link href="http://litanyagainstfear.com/" />
 <updated>2013-06-11T11:12:00-07:00</updated>
 <id>http://litanyagainstfear.com/</id>
 <author>
   <name>Nick Quaranto</name>
   <email>nick@quaran.to</email>
 </author>

 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/LitanyAgainstFear" /><feedburner:info uri="litanyagainstfear" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><entry>
   <title>Intention revealing methods</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/jSXcQtAORiE/intention-revealing-methods" />
   <updated>2013-06-11T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/06/11/intention-revealing-methods</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/jSXcQtAORiE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/06/11/intention-revealing-methods</feedburner:origLink></entry>
 
 <entry>
   <title>Current status</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/REevHoic9fI/current-status" />
   <updated>2013-04-26T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/04/26/current-status</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/REevHoic9fI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/04/26/current-status</feedburner:origLink></entry>
 
 <entry>
   <title>What was your first job?</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/YDXiF6NDuyk/what-was-your-first-job" />
   <updated>2013-03-25T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/03/25/what-was-your-first-job</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/YDXiF6NDuyk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/03/25/what-was-your-first-job</feedburner:origLink></entry>
 
 <entry>
   <title>It's not a meetup</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/hxcpD2IUosM/its-not-a-meetup" />
   <updated>2013-03-05T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/03/05/its-not-a-meetup</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/hxcpD2IUosM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/03/05/its-not-a-meetup</feedburner:origLink></entry>
 
 <entry>
   <title>Drawing the native/web line in Basecamp for iPhone</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/_9AdUxSP5aQ/drawing-the-nativeweb-line-in-basecamp-for-iphone" />
   <updated>2013-02-15T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/02/15/drawing-the-nativeweb-line-in-basecamp-for-iphone</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/_9AdUxSP5aQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/02/15/drawing-the-nativeweb-line-in-basecamp-for-iphone</feedburner:origLink></entry>
 
 <entry>
   <title>Why I loved building Basecamp for iPhone in RubyMotion</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/wR2euXgAHLc/why-i-loved-building-basecamp-for-iphone-in-rubymotion" />
   <updated>2013-02-13T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/02/13/why-i-loved-building-basecamp-for-iphone-in-rubymotion</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/wR2euXgAHLc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/02/13/why-i-loved-building-basecamp-for-iphone-in-rubymotion</feedburner:origLink></entry>
 
 <entry>
   <title>Use Jekyll, SCSS, and CoffeeScript without plugins</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/DMO1_d1j1Wo/use-jekyll-scss-coffeescript-without-plugins" />
   <updated>2013-01-09T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2013/01/09/use-jekyll-scss-coffeescript-without-plugins</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve been using Jekyll for &lt;a href='https://github.com/mojombo/jekyll/commit/23031152359e2f963fbef5908c470dda05493d00'&gt;almost 4 years now&lt;/a&gt;, which is long before SCSS and CoffeeScript existed. Since then, there have been a slew of plugins that build on top of Jekyll that provide everything from new &amp;#8220;models&amp;#8221; to an asset pipeline like Rails. I have a simple rule with how I use Jekyll:&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;If I need more than what Jekyll provides by default, I don&amp;#8217;t use Jekyll.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&amp;#8217;m super happy that people can build on top of Jekyll&amp;#8217;s &amp;#8220;core&amp;#8221;. Projects like &lt;a href='http://octopress.org/'&gt;Octopress&lt;/a&gt; and stories like &lt;a href='http://kylerush.net/blog/meet-the-obama-campaigns-250-million-fundraising-platform/'&gt;Obama raising $250M&lt;/a&gt; with Jekyll are awesome for the community. However, if I need something more complex than simply &amp;#8220;posts&amp;#8221; and &amp;#8220;pages&amp;#8221; for a static site, I&amp;#8217;m not going to try to shoehorn Jekyll into a solution.&lt;/p&gt;

&lt;p&gt;If you want to use CoffeeScript or SCSS with Jekyll, you don&amp;#8217;t need to modify Jekyll to get this done. You can just use gems, and rake. My sites use an &amp;#8220;assets&amp;#8221; directory, which contain all of the .scss and .coffee files, and then some simple Ruby process spawning generates the assets. Here&amp;#8217;s a gist so you can use it too:&lt;/p&gt;
&lt;script src='https://gist.github.com/4496420.js'&gt;
&lt;/script&gt;
&lt;p&gt;I&amp;#8217;ve written 3 fully fledged Jekyll sites using this method to generate assets, and here&amp;#8217;s the source to them for you to check out:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href='http://github.com/openhack/openhack.github.com'&gt;OpenHack&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://github.com/coworkbuffalo/coworkbuffalo.github.com'&gt;CoworkBuffalo&lt;/a&gt;&lt;/li&gt;

&lt;li&gt;&lt;a href='http://github.com/qrush/qrush.github.com'&gt;Litany Against Fear&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;There&amp;#8217;s a few downsides to this method that I&amp;#8217;d like to put out there before you go ahead and remove your plugins:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;Errors aren&amp;#8217;t reported too well&lt;/li&gt;

&lt;li&gt;Killing the rake process with ^C leaves some gross error messages&lt;/li&gt;

&lt;li&gt;This doesn&amp;#8217;t combine multiple assets into one file&lt;/li&gt;

&lt;li&gt;Heavy caching means that CSS refreshes are hard sometimes&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;If you can live with the above problems, I hope this code helps you out. Let me know if it does!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/DMO1_d1j1Wo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2013/01/09/use-jekyll-scss-coffeescript-without-plugins</feedburner:origLink></entry>
 
 <entry>
   <title>Thanks, 2012</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/Jq562t2e7Tk/2012" />
   <updated>2012-12-31T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/thanks-2012</id>
   <content type="html">&lt;p&gt;Thanks to my wife, Amanda, for being awesome, learning &lt;a href='https://github.com/aquaranto'&gt;how to program&lt;/a&gt;, and standing up &lt;a href='http://magic-ruby.com/'&gt;to speak&lt;/a&gt;. We&amp;#8217;ve been through a lot this year and you&amp;#8217;ve made it all worth it. I love you.&lt;/p&gt;

&lt;p&gt;Thanks to my parents and grandparents, who now we can live close enough to see again on a regular basis. Yes, I&amp;#8217;ll try to clean out my old room in 2013. Thanks to my brother for letting me win at least one Super Smash Bros game this year.&lt;/p&gt;

&lt;p&gt;Thanks to my mother-in-law, and my brother and sisters-in-law for putting up with years of me being tangled to my computer and for always being welcoming into your family.&lt;/p&gt;

&lt;h2 id='__'&gt;— — —&lt;/h2&gt;

&lt;p&gt;Thanks to our friends here in Buffalo, especially Mark &amp;amp; Becca: Through &lt;a href='http://www.flickr.com/photos/qrush/8299296520/in/photostream/'&gt;board games&lt;/a&gt;, movies, sports games, &lt;a href='http://www.flickr.com/photos/qrush/8298244513/in/photostream'&gt;BBQs&lt;/a&gt;, porch hangouts, and more, you&amp;#8217;ve made us feel at home. Sorry about &lt;a href='http://www.flickr.com/photos/qrush/8298253709/in/photostream'&gt;the dog hair&lt;/a&gt; on your clothes.&lt;/p&gt;

&lt;p&gt;Thanks to my partners at &lt;a href='http://coworkbuffalo.com'&gt;CoworkBuffalo&lt;/a&gt;, Kevin, Dan, and Brian, and our customers. You all have proven our little community of freelancers and remote workers is more productive and happy when we&amp;#8217;re together.&lt;/p&gt;

&lt;p&gt;Thanks to the tech community here in Buffalo, from &lt;a href='http://groups.google.com/group/buffalo-opencoffee-club'&gt;meeting for coffee&lt;/a&gt;, to helping me start &lt;a href='http://openhack.github.com'&gt;OpenHack nights&lt;/a&gt;, to organizing talks at &lt;a href='http://meetup.com/Western-New-York-Ruby/'&gt;the Ruby group&lt;/a&gt;: you&amp;#8217;ve shown me that no matter how small the city, the passion is just as big.&lt;/p&gt;

&lt;h2 id='__'&gt;— — —&lt;/h2&gt;

&lt;p&gt;Thanks to Jason, David, and all of my coworkers at 37signals. I&amp;#8217;ve learned an immense amount in the past year from everyone about how to make products that we are proud of. Thanks for answering my questions, being patient, and taking time out of your day to help me out.&lt;/p&gt;

&lt;p&gt;Thanks to those who toil away at open source thanklessly and tirelessly. Your work does not go unnoticed. Thanks to those who work hard behind the scenes to make the impossible possible for thousands of open source consumers. There needs to be more of you.&lt;/p&gt;

&lt;p&gt;Thanks to my fellow RubyGems maintainers and overseers: Evan, Eric, Erik, Chris, Terence - it&amp;#8217;s crazy to think of where Ruby as a whole would be without your efforts. Please keep it up&amp;#8230;more than we can ever imagine are depending on us.&lt;/p&gt;

&lt;h2 id='__'&gt;— — —&lt;/h2&gt;

&lt;p&gt;Thanks to Ben, for being my friend for many years, and I hope we can be friends for many more.&lt;/p&gt;

&lt;p&gt;Thanks to my friends and former coworkers in Boston. We miss you, and you need to come visit Buffalo. We&amp;#8217;ll try to make it out there again soon.&lt;/p&gt;

&lt;p&gt;Thanks to anyone who took time to come see me speak this year. I hope the GIFs were entertaining, and you learned something.&lt;/p&gt;

&lt;h2 id='__'&gt;— — —&lt;/h2&gt;

&lt;p&gt;To those I missed: Thank you. Happy 2013.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/Jq562t2e7Tk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/2012</feedburner:origLink></entry>
 
 <entry>
   <title>Open Source Guilt &amp; Passion</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/HA8yxkcq1No/open-source-guilt-passion" />
   <updated>2012-12-03T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/12/03/open-source-guilt-passion</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/HA8yxkcq1No" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/12/03/open-source-guilt-passion</feedburner:origLink></entry>
 
 <entry>
   <title>Automating with convention: Introducing sub</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/kHAzCqOt2TA/automating-with-convention-introducing-sub" />
   <updated>2012-09-28T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/09/28/automating-with-convention-introducing-sub</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/kHAzCqOt2TA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/09/28/automating-with-convention-introducing-sub</feedburner:origLink></entry>
 
 <entry>
   <title>Three quick Rails console tips</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/KJdAoxYTXxY/three-quick-rails-console-tips" />
   <updated>2012-05-17T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/05/17/three-quick-rails-console-tips</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/KJdAoxYTXxY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/05/17/three-quick-rails-console-tips</feedburner:origLink></entry>
 
 <entry>
   <title>Code Spelunking in the all new Basecamp</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/eEb4lGTjNDw/code-spelunking-in-the-all-new-basecamp" />
   <updated>2012-04-27T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/04/27/code-spelunking-in-the-all-new-basecamp</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/eEb4lGTjNDw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/04/27/code-spelunking-in-the-all-new-basecamp</feedburner:origLink></entry>
 
 <entry>
   <title>The On-Call Programmer</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/EWmMq9-l_lg/the-on-call-programmer" />
   <updated>2012-04-16T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/04/16/the-on-call-programmer</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/EWmMq9-l_lg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/04/16/the-on-call-programmer</feedburner:origLink></entry>
 
 <entry>
   <title>All hands, battlestations!</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/P6hgTreMMUo/all-hands-battlestations" />
   <updated>2012-02-12T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/02/12/all-hands-battlestations</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/P6hgTreMMUo" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/02/12/all-hands-battlestations</feedburner:origLink></entry>
 
 <entry>
   <title>Kicking the tires: My trial month</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/GYTexZnl_Do/kicking-the-tires-my-trial-month" />
   <updated>2012-01-13T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2012/01/13/kicking-the-tires-my-trial-month</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/GYTexZnl_Do" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2012/01/13/kicking-the-tires-my-trial-month</feedburner:origLink></entry>
 
 <entry>
   <title>Danger, Danger: High Voltage! Use Rails 3.1 for Static Sites</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/-kk3FHhJsRE/danger-danger-high-voltage-use-rails-3-1-for-static" />
   <updated>2011-10-21T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2011/10/21/danger-danger-high-voltage-use-rails-3-1-for-static</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/-kk3FHhJsRE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2011/10/21/danger-danger-high-voltage-use-rails-3-1-for-static</feedburner:origLink></entry>
 
 <entry>
   <title>Use Capybara on any HTML fragment or page</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/1hHCY_s1mkc/use-capybara-on-any-html-fragment-or-page" />
   <updated>2011-07-26T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2011/07/26/use-capybara-on-any-html-fragment-or-page</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/1hHCY_s1mkc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2011/07/26/use-capybara-on-any-html-fragment-or-page</feedburner:origLink></entry>
 
 <entry>
   <title>Redis Pub/Sub…how does it work?</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/5iB-WNWePr4/redis-pub-sub-how-does-it-work" />
   <updated>2011-06-08T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2011/06/08/redis-pub-sub-how-does-it-work</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/5iB-WNWePr4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2011/06/08/redis-pub-sub-how-does-it-work</feedburner:origLink></entry>
 
 <entry>
   <title>Fetching source index for http://rubygems.org/</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/7IfwVUMnzK4/fetching-source-index-for-http-rubygems-org" />
   <updated>2011-01-13T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2011/01/13/fetching-source-index-for-http-rubygems-org</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/7IfwVUMnzK4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2011/01/13/fetching-source-index-for-http-rubygems-org</feedburner:origLink></entry>
 
 <entry>
   <title>Gem Sawyer, Modern Day Ruby Warrior</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/k_xKd4Cz7AM/gem-sawyer-modern-day-ruby-warrior" />
   <updated>2010-10-06T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2010/10/06/gem-sawyer-modern-day-ruby-warrior</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/k_xKd4Cz7AM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2010/10/06/gem-sawyer-modern-day-ruby-warrior</feedburner:origLink></entry>
 
 <entry>
   <title>Sailing down the Hudson with RVM</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/le3Aktl1HmA/sailing-down-the-hudson-with-rvm" />
   <updated>2010-06-18T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2010/06/18/sailing-down-the-hudson-with-rvm</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/le3Aktl1HmA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2010/06/18/sailing-down-the-hudson-with-rvm</feedburner:origLink></entry>
 
 <entry>
   <title>IronRuby drops - make some noise!</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/EAbP30BZS8I/ironruby-drops-make-some-noise" />
   <updated>2010-04-18T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2010/04/18/ironruby-drops-make-some-noise</id>
   <content type="html">&lt;p&gt;A little context about myself and recent events:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;I used to be big into .&lt;span class="caps"&gt;NET&lt;/span&gt; before Ruby.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://litanyagainstfear.com/blog/2008/09/18/switching-to-rails/"&gt;I decided to move away from .&lt;span class="caps"&gt;NET&lt;/span&gt; over 2 years ago.&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;For the past 4 months I&amp;#8217;ve been using &lt;span class="caps"&gt;ASP&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; &lt;span class="caps"&gt;MVC&lt;/span&gt; 2 for my senior capstone project.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.rubyinside.com/ironruby-1-0-released-microsoft-s-3-years-with-ruby-pay-off-3212.html"&gt;IronRuby&amp;#8217;s 1.0 release has dropped!&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This week &lt;a href="http://blog.scottbellware.com/2010/04/ironruby-drops-does-it-make-sound.html"&gt;Scott Bellware wrote&lt;/a&gt; about why this should matter to anyone doing .&lt;span class="caps"&gt;NET&lt;/span&gt;, especially the &amp;#8216;forward thinking&amp;#8217; &lt;a href="http://altdotnet.org"&gt;&lt;span class="caps"&gt;ALT&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt;&lt;/a&gt; crowd. I&amp;#8217;m not too familiar with the history of the &lt;span class="caps"&gt;ALT&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; movement, but I love following smart developers in any sector of our industry on Twitter and I&amp;#8217;ve been watching more .&lt;span class="caps"&gt;NET&lt;/span&gt; devs lately because of my senior project.&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s Scott&amp;#8217;s main points as I saw it:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Comparsions of Rails to &lt;span class="caps"&gt;ASP&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; &lt;span class="caps"&gt;MVC&lt;/span&gt; 2 are difficult (I agree!)&lt;/li&gt;
	&lt;li&gt;Getting the average .&lt;span class="caps"&gt;NET&lt;/span&gt; developer out of the Visual Studio comfort zone is still unlikely&lt;/li&gt;
	&lt;li&gt;You can now painlessly use Ruby and Rails with &lt;span class="caps"&gt;IIS&lt;/span&gt; and .&lt;span class="caps"&gt;NET&lt;/span&gt; in general&lt;/li&gt;
	&lt;li&gt;Stop using .&lt;span class="caps"&gt;NET&lt;/span&gt; ports of Ruby projects, you can just run them with IronRuby now!&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;After reading it and seeing &lt;a href="http://twitter.com/armmer"&gt;Jason Meridth&amp;#8217;s&lt;/a&gt; tweet&amp;#8230;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;img src="http://twictur.es/i/12367649265.gif" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;&amp;#8230;I had to give a Rubyist response. My reaction is: &lt;strong&gt;Welcome!&lt;/strong&gt; I don&amp;#8217;t think fear has anything to do with it, it&amp;#8217;s just hard to break out of the norm for any of us. I&amp;#8217;m positive you&amp;#8217;ll have fun learning Ruby and integrating with your existing .&lt;span class="caps"&gt;NET&lt;/span&gt; infrastructure.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m right behind Scott in that the barrier to entry for those on Windows and in the .&lt;span class="caps"&gt;NET&lt;/span&gt; ecosystem has been lowered immensely. Plenty have said it before, but now is the time to start. Many of us have converted over from C#/VB.&lt;span class="caps"&gt;NET&lt;/span&gt;, and I can&amp;#8217;t be the only one who&amp;#8217;s happy to share their experience with those considering diving into Ruby.&lt;/p&gt;
&lt;p&gt;Let me start you off right now:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;a href="http://guides.rails.info/"&gt;Rails Guides, a daily reference and great starter manual&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://railscasts.com/"&gt;Railscasts, tons of great recipes in video form&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.railstutorial.org/"&gt;Rails Tutorial, a book in progress&lt;/a&gt;&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://www.sinatrarb.com/intro.html"&gt;Intro to Sinatra, the classiest web framework around&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;IronRuby has dropped, but you have to make the noise. We Rubyists are waiting to hear from you!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/EAbP30BZS8I" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2010/04/18/ironruby-drops-make-some-noise</feedburner:origLink></entry>
 
 <entry>
   <title>Redis: Data Cheeseburgers</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/MZl-XGWejVw/redis-data-cheeseburgers" />
   <updated>2010-03-12T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2010/03/12/redis-data-cheeseburgers</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/MZl-XGWejVw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2010/03/12/redis-data-cheeseburgers</feedburner:origLink></entry>
 
 <entry>
   <title>The Rails Module (in Rails 3)</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/GFUMZZ72vvw/the-rails-module" />
   <updated>2010-02-03T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2010/02/03/the-rails-module</id>
   <content type="html">&lt;p&gt;So, you may have noticed this in the &lt;a href="http://guides.rails.info/3_0_release_notes.html"&gt;Rails 3 Changelog&lt;/a&gt;&amp;#8230;&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;Railties now deprecates:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;RAILS_ROOT&lt;/code&gt; in favour of &lt;code&gt;Rails.root&lt;/code&gt;,&lt;br /&gt;
&lt;code&gt;RAILS_ENV&lt;/code&gt; in favour of &lt;code&gt;Rails.env&lt;/code&gt;, and&lt;br /&gt;
&lt;code&gt;RAILS_DEFAULT_LOGGER&lt;/code&gt; in favour of &lt;code&gt;Rails.logger&lt;/code&gt;.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Great&amp;#8230;but why? Better alternatives have existed for a while in Rails core (some since 2.1.0), and it&amp;#8217;s about damn time you start using them properly. There&amp;#8217;s also some other helpful methods on the &lt;code&gt;Rails&lt;/code&gt; module we&amp;#8217;ll explore in this post.&lt;/p&gt;
&lt;h2&gt;Rails.root&lt;/h2&gt;
&lt;p&gt;This is a big one. Every Rails developer has done &lt;code&gt;File.join(RAILS_ROOT, "path", "to", "something")&lt;/code&gt; before. Stop that. And don&amp;#8217;t just replace &lt;code&gt;RAILS_ROOT&lt;/code&gt; with &lt;code&gt;Rails.root&lt;/code&gt; either. &lt;code&gt;Rails.root&lt;/code&gt; is a &lt;a href="http://ruby-doc.org/stdlib/libdoc/pathname/rdoc/index.html"&gt;Pathname&lt;/a&gt;, which means you can do cool stuff like this:&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.root
=&amp;gt; #&amp;lt;Pathname:/Users/qrush/Dev/ruby/new_app&amp;gt;

&amp;gt;&amp;gt; Rails.root.join("config", "database.yml")
=&amp;gt; #&amp;lt;Pathname:/Users/qrush/Dev/ruby/new_app/config/database.yml&amp;gt;

&amp;gt;&amp;gt; _.read
=&amp;gt; "development:\n ...
&lt;/pre&gt;&lt;p&gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2&gt;Rails.env&lt;/h2&gt;
&lt;p&gt;Same deal, you&amp;#8217;ve probably done something like &lt;code&gt;if RAILS_ENV == "production"&lt;/code&gt; in your Rails apps. Stop that too. Oh, you thought this would just be a &lt;code&gt;String&lt;/code&gt;?&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.env
=&amp;gt; "development"

&amp;gt;&amp;gt; Rails.env.class
=&amp;gt; ActiveSupport::StringInquirer
&lt;/code&gt;&lt;/pre&gt;
&lt;p&gt;&lt;a href="http://www.hulu.com/watch/124915/family-guy-back-to-jail#s-p1-sr-i1"&gt;Whaaaat?&lt;/a&gt; Actually, this is a really neat utility. From &lt;code&gt;activesupport/lib/active_support/string_inquirer.rb&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ActiveSupport&lt;/span&gt;
  &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;StringInquirer&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="nb"&gt;String&lt;/span&gt;
    &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;method_missing&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;method_name&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="o"&gt;*&lt;/span&gt;&lt;span class="n"&gt;arguments&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
      &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;method_name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="o"&gt;[-&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="mi"&gt;1&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;?&amp;quot;&lt;/span&gt;
        &lt;span class="nb"&gt;self&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="n"&gt;method_name&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
      &lt;span class="k"&gt;else&lt;/span&gt;
        &lt;span class="k"&gt;super&lt;/span&gt;
      &lt;span class="k"&gt;end&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Awesome. This lets us do stuff like this in &lt;a href="http://github.com/qrush/gemcutter"&gt;Gemcutter&lt;/a&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;development?&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;env&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;test?&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="ss"&gt;Vault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:FS&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="ss"&gt;Vault&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:S3&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2&gt;Rails.logger&lt;/h2&gt;
&lt;p&gt;This is your favorite &lt;code&gt;Logger&lt;/code&gt; class, just now without an annoying constant name of &lt;code&gt;RAILS_DEFAULT_LOGGER&lt;/code&gt;. Much easier to remember.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.logger
=&amp;gt; #&amp;lt;ActiveSupport::BufferedLogger:0x21de384 ...

&amp;gt;&amp;gt; Rails.logger.info "zomg!"
=&amp;gt; "zomg!\n"

&amp;gt;&amp;gt; File.read("log/development.log")
=&amp;gt; "zomg!\n"
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Rails.public_path&lt;/h2&gt;
&lt;p&gt;A helpful shortcut to what your &lt;code&gt;public&lt;/code&gt; assets directory is called, probably to use with &lt;code&gt;Rails.root&lt;/code&gt;. (Why this isn&amp;#8217;t a &lt;code&gt;Pathname&lt;/code&gt; is beyond me, sounds like a good patch to whip up!)&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.public_path
=&amp;gt; "public"
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Rails.cache&lt;/h2&gt;
&lt;p&gt;Now the rabbit hole goes deeper. This is a unified interface to memory/file/you name it caching stores that can be used with Rails. If you&amp;#8217;ve ever made some sort of caching global variable, like &lt;code&gt;$memcache&lt;/code&gt; or &lt;code&gt;CACHE&lt;/code&gt;, you should &lt;a href="http://guides.rubyonrails.org/caching_with_rails.html"&gt;read up here.&lt;/a&gt;&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.cache
=&amp;gt; #&amp;lt;ActiveSupport::Cache::MemoryStore:0x21e04b8 @data={}&amp;gt;

&amp;gt;&amp;gt; Rails.cache.write("rush", "limelight")
=&amp;gt; "limelight"

&amp;gt;&amp;gt; Rails.cache.read("rush")
=&amp;gt; "limelight"

&amp;gt;&amp;gt; Rails.cache
=&amp;gt; #&amp;lt;ActiveSupport::Cache::MemoryStore:0x21e04b8
     @data={"rush"=&amp;gt;"limelight"}&amp;gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Rails.application&lt;/h2&gt;
&lt;p&gt;The new &lt;code&gt;Rails::Application&lt;/code&gt; class encapsulates &lt;strong&gt;a lot&lt;/strong&gt; of what was thrown around in Railties in previous releases of Rails, and really represents the ultimate embracing of Rack&amp;#8217;s modularity. &lt;a href="http://www.engineyard.com/blog/2010/rails-and-merb-merge-rails-core-part-4-of-6/"&gt;Yehuda&amp;#8217;s post&lt;/a&gt; can explain it further, but the important thing is now you can run multiple &lt;code&gt;Rails::Application&lt;/code&gt;s in the same process if you need to, and it&amp;#8217;s promoting decoupling even further by starting from the inside of the framework. Awesome.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.application
=&amp;gt; #&amp;lt;NewApp::Application:0x13896b0 ...

&amp;gt;&amp;gt; Rails.application.routes
=&amp;gt; #&amp;lt;ActionDispatch::Routing::RouteSet:0x162877c ...

&amp;gt;&amp;gt; Rails.application.routes.recognize_path("rails/info/properties")
=&amp;gt; {:controller=&amp;gt;"rails/info", :action=&amp;gt;"properties"}
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Rails.configuration&lt;/h2&gt;
&lt;p&gt;This gives you global access to all of the configuration data set up in your &lt;code&gt;config/application.rb&lt;/code&gt; and various &lt;code&gt;config/environments/#{Rails.env}.rb&lt;/code&gt; files, if you should ever need it.&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;$ rails console
&amp;gt;&amp;gt; Rails.configuration
=&amp;gt; #&amp;lt;Rails::Application::Configuration:0x7e1ab0 ...

&amp;gt;&amp;gt; pp Rails.configuration.middleware
[ActionDispatch::Static,
 Rack::Lock,
 Rack::Runtime,
 Rails::Rack::Logger,
 ActionDispatch::ShowExceptions,
 ActionDispatch::Callbacks,
 ActionDispatch::Cookies,
 ActionDispatch::Session::CookieStore,
 ActionDispatch::Flash,
 ActionDispatch::Cascade,
 ActionDispatch::ParamsParser,
 Rack::MethodOverride,
 ActionDispatch::Head,
 ActiveRecord::ConnectionAdapters::ConnectionManagement,
 ActiveRecord::QueryCache]
=&amp;gt; nil
&lt;/code&gt;&lt;/pre&gt;
&lt;h2&gt;Wrapup&lt;/h2&gt;
&lt;p&gt;I&amp;#8217;m sure some are missing here (like &lt;code&gt;Rails.version&lt;/code&gt;), but these are the ones that I think matter most to Rails developers. If something else should be covered here, let me know!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/GFUMZZ72vvw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2010/02/03/the-rails-module</feedburner:origLink></entry>
 
 <entry>
   <title>Load Rails conditionally with Rack</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/Vs6ds5Gkp8E/load-rails-conditionally-with-rack" />
   <updated>2009-11-10T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/11/10/load-rails-conditionally-with-rack</id>
   <content type="html">&lt;p&gt;One of the great things about &lt;a href="http://gemcutter.org"&gt;Gemcutter&lt;/a&gt; is that it&amp;#8217;s using &lt;a href="http://www.sinatrarb.com"&gt;Sinatra&lt;/a&gt; via &lt;a href="http://guides.rubyonrails.org/rails_on_rack.html"&gt;Rails Metal&lt;/a&gt; to serve up the gems. Recently, I had to run some long migrations (~10 minutes) and I&amp;#8217;m sure we&amp;#8217;ll have some more in the future. Since the gem server is decoupled from the Rails app, some clever Rack loading now allows us to continue to serve gems even when we&amp;#8217;re down for maintenance.&lt;/p&gt;
&lt;p&gt;The &lt;code&gt;config.ru&lt;/code&gt; now looks like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;MAINTENANCE_MODE&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;
  &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;vendor&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;bundler_gems&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;environment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;config&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;environment&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
 
  &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;Rack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Static&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;:urls&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;/index.html&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;&amp;quot;/favicon.ico&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;&amp;quot;/images&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
              &lt;span class="s2"&gt;&amp;quot;/stylesheets&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;:root&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;public/maintenance&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Hostess&lt;/span&gt;
  &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="ss"&gt;Rack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Maintenance&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;
    &lt;span class="ss"&gt;:file&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;join&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;public&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;maintenance&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;index.html&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ss"&gt;Sinatra&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Application&lt;/span&gt;
&lt;span class="k"&gt;else&lt;/span&gt;
  &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;thin&amp;#39;&lt;/span&gt;
 
  &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="ss"&gt;Rack&lt;/span&gt;&lt;span class="p"&gt;:&lt;/span&gt;&lt;span class="ss"&gt;:Adapter&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="ss"&gt;:environment&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;RAILS_ENV&amp;#39;&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So now, Heroku treats Gemcutter as a Rack app, and not a pure Rails app. Normally, it&amp;#8217;ll just use Thin and boot up Rails as normal with &lt;code&gt;Rack::Adapter::Rails&lt;/code&gt;. &lt;code&gt;script/server&lt;/code&gt; still works as normal, too, but I&amp;#8217;ll probably use &lt;a href="http://github.com/rtomayko/shotgun"&gt;shotgun&lt;/a&gt; instead.&lt;/p&gt;
&lt;p&gt;The fun begins when you run &lt;code&gt;MAINTENANCE_MODE=on rackup&lt;/code&gt;. The following happens from there:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;Load up the &lt;a href="http://litanyagainstfear.com/blog/2009/10/14/gem-bundler-is-the-future/"&gt;Bundler&lt;/a&gt; environment that has all of our gems, and some of Rails&amp;#8217; magic.&lt;/li&gt;
	&lt;li&gt;Fire up &lt;a href="http://rack.rubyforge.org/doc/classes/Rack/Static.html"&gt;Rack::Static&lt;/a&gt; to serve static assets like the images and &lt;span class="caps"&gt;CSS&lt;/span&gt; to make the site look nice&lt;/li&gt;
	&lt;li&gt;Use the &lt;a href="http://github.com/qrush/gemcutter/blob/master/app/metal/hostess.rb"&gt;Hostess&lt;/a&gt;, Gemcutter&amp;#8217;s Sinatra gem server to continue to serve gems&lt;/li&gt;
	&lt;li&gt;All other requests are then caught by David Dollar&amp;#8217;s &lt;a href="http://github.com/ddollar/rack-maintenance"&gt;rack-maintenance&lt;/a&gt; that simply serves up a static &lt;span class="caps"&gt;HTML&lt;/span&gt; page.&lt;/li&gt;
	&lt;li&gt;Use &lt;code&gt;Sinatra::Application&lt;/code&gt; since we need some sort of endpoint.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;And boom, we have a read-only site that continues to serve gems. Rack rules.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;img src="http://6.media.tumblr.com/tumblr_kobz0jtHsN1qzln4lo1_400.jpg" alt="" /&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/Vs6ds5Gkp8E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/11/10/load-rails-conditionally-with-rack</feedburner:origLink></entry>
 
 <entry>
   <title>Gem Bundler is the Future</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/iVVnYNeXVDw/gem-bundler-is-the-future" />
   <updated>2009-10-14T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/10/14/gem-bundler-is-the-future</id>
   <content type="html">&lt;p style="text-align:center;"&gt;&lt;a href="http://www.flickr.com/photos/mrcam/206628748/"&gt;&lt;img src="http://farm1.static.flickr.com/59/206628748_8f2594a16b_m.jpg" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you haven&amp;#8217;t checked out &lt;a href="http://twitter.com/wycats"&gt;Yehuda Katz&amp;#8217;s&lt;/a&gt; and &lt;a href="http://twitter.com/carllerche"&gt;Carl Lerche&amp;#8217;s&lt;/a&gt; gem bundler yet, &lt;a href="http://github.com/wycats/bundler"&gt;now is the time&lt;/a&gt;. This project replaces the horribly broken dependency resolution in Rails and what we all know and use as &lt;code&gt;config.gem&lt;/code&gt;&amp;#8216;s. Ever seen &lt;code&gt;can&amp;#8217;t activate $gemname ($gemversion = runtime)&lt;/code&gt;? Or maybe my favorite, when it can&amp;#8217;t even figure out what gem can&amp;#8217;t be activated. If so, read on, bundler&amp;#8217;s about to make your life a lot easier.&lt;/p&gt;
&lt;p&gt;Yehuda has a great roundup of what can be done (and has been done with the bundler) &lt;a href="http://yehudakatz.com/2009/07/08/rails-bundling-revisited/"&gt;on his blog&lt;/a&gt;. This is going to be a part of Rails 3, so you&amp;#8217;re going to have to run into this sooner or later. I was getting frustrated with managing gem dependencies in &lt;a href="http://github.com/qrush/gemcutter"&gt;Gemcutter&lt;/a&gt;, so now it&amp;#8217;s bundled up and ready as a decent example of the bundler in action.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Enter the bundler&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m using the edge gem built from their repo, and I suggest you do as well. Hopefully soon they&amp;#8217;ll push it to that &lt;a href="http://gemcutter.org"&gt;new gem hosting site&lt;/a&gt; I&amp;#8217;ve heard so much about.&lt;/p&gt;
&lt;pre&gt;
git clone git://github.com/wycats/bundler
cd bundler
sudo rake install
&lt;/pre&gt;
&lt;p&gt;&lt;strong&gt;The Gemfile&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now we&amp;#8217;re ready to make a &lt;code&gt;Gemfile&lt;/code&gt;. This is basically a specification of what gems should be included in your app. Here&amp;#8217;s Gemcutter&amp;#8217;s:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="n"&gt;clear_sources&lt;/span&gt;
&lt;span class="n"&gt;bundle_path&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;vendor/bundler_gems&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://gemcutter.org&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;source&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;http://gems.github.com&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rails&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;2.3.4&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;clearance&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;will_paginate&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;sinatra&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;xml-simple&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;gchartrb&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;google_chart&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ddollar-pacecar&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;1.1.6&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;pacecar&amp;quot;&lt;/span&gt;
&lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;net-scp&amp;quot;&lt;/span&gt;

&lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;shoulda&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;factory_girl&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;webrat&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;cucumber&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;0.3.101&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rr&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;redgreen&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;fakeweb&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rack-test&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rack/test&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;

&lt;span class="n"&gt;only&lt;/span&gt; &lt;span class="ss"&gt;:production&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rack-cache&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;        &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;rack/cache&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;aws-s3&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;            &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;aws/s3&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;ambethia-smtp-tls&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;smtp-tls&amp;quot;&lt;/span&gt;
  &lt;span class="n"&gt;gem&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;memcache-client&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;   &lt;span class="ss"&gt;:require_as&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;memcache&amp;quot;&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Some notes here:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;By default the gem host is &lt;code&gt;gems.rubyforge.org&lt;/code&gt;, so I&amp;#8217;ve cleared the sources to use gemcutter.org instead.&lt;/li&gt;
	&lt;li&gt;You can easily specify gems for a given environment and multiple gems with &lt;code&gt;only&lt;/code&gt; and pass it a symbol for the environment name. Thank goodness.&lt;/li&gt;
	&lt;li&gt;The default bundle path is &lt;code&gt;vendor/gems&lt;/code&gt;. This won&amp;#8217;t work for Rails since it assumes way too much about this directory, so we switch it to &lt;code&gt;vendor/bundler_gems&lt;/code&gt;. &lt;strong&gt;Note:&lt;/strong&gt; Yehuda has told me that this will work as normal once Rails 3 is closer/done.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;strong&gt;Bundle up!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now we&amp;#8217;re ready to run &lt;code&gt;gem bundle&lt;/code&gt;. This pulls down the gems from the given sources along with any dependencies. This basically creates a virtual RubyGems environment right inside of your &lt;code&gt;vendor&lt;/code&gt; directory. (I&amp;#8217;m cutting some out since the log is so long)&lt;/p&gt;
&lt;pre&gt;
$ gem bundle
Calculating dependencies...
Updating source: http://gems.github.com
Updating source: http://gemcutter.org
Downloading actionmailer-2.3.4.gem
Downloading actionpack-2.3.4.gem
...
Downloading xml-simple-1.0.12.gem
Installing rr (0.10.4)
Installing fakeweb (1.2.6)
...
Installing nokogiri (1.3.3)
Building native extensions.  This could take a while...
Done.
&lt;/pre&gt;
&lt;p&gt;So now in your &lt;code&gt;vendor/bundler_gems&lt;/code&gt; directory, we&amp;#8217;ve got the &lt;code&gt;.gem&lt;/code&gt; files pulled down in &lt;code&gt;cache&lt;/code&gt;, unpacked in the &lt;code&gt;gems&lt;/code&gt; directory, and the gem specifications are unloaded into &lt;code&gt;specifications&lt;/code&gt;. Bundler also makes its own &lt;code&gt;environment.rb&lt;/code&gt; for loading the dependencies.&lt;/p&gt;
&lt;pre&gt;
vendor
|-- bundler_gems
|   |-- cache
|   |   |-- actionmailer-2.3.4.gem
|   |   |-- actionpack-2.3.4.gem
|   |   |-- ...
|   |   `-- xml-simple-1.0.12.gem
|   |-- doc
|   |-- environment.rb
|   |-- gems
|   |   |-- actionmailer-2.3.4
|   |   |-- actionpack-2.3.4
|   |   |-- ...
|   |   `-- xml-simple-1.0.12
|   `-- specifications
|       |-- actionmailer-2.3.4.gemspec
|       |-- actionpack-2.3.4.gemspec
|       |-- ...
|       `-- xml-simple-1.0.12.gemspec
`-- plugins
&lt;/pre&gt;
&lt;p&gt;Bundler will also dump gem executables in your &lt;code&gt;Rails.root/bin&lt;/code&gt; directory. This means you can then use &lt;code&gt;bin/rake&lt;/code&gt;, for example. Running &lt;code&gt;rake&lt;/code&gt; as normal should still work though. As for your version control, it&amp;#8217;s recommended to check in the &lt;code&gt;.gem&lt;/code&gt;&amp;#8217;s only, then run &lt;code&gt;gem bundle&lt;/code&gt; to unpack/install them. This goes both for new developers and getting code deployed.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Loading the Environment&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Now the issue is to load up the bundled environment instead of the system installed one. Start by creating a &lt;code&gt;config/preinitializer.rb&lt;/code&gt;, which is loaded first before &lt;code&gt;config/environment.rb&lt;/code&gt;:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;File&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;dirname&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="bp"&gt;__FILE__&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/../vendor/bundler_gems/environment&amp;quot;&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Then, in each &lt;code&gt;config/environments/*.rb&lt;/code&gt; file:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="no"&gt;Bundler&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;require_env&lt;/span&gt; &lt;span class="no"&gt;RAILS_ENV&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This basically does a &lt;code&gt;require&lt;/code&gt; for every gem listed in your Gemfile and their associated dependencies. That should be it! Your app should (hopefully) boot and now you should run your tests to ensure your application is still working right.&lt;/p&gt;
&lt;p&gt;If you want to see this all in action &lt;a href="http://github.com/qrush/gemcutter"&gt;clone Gemcutter&lt;/a&gt; and follow the &lt;a href="http://wiki.github.com/qrush/gemcutter/contribution-guidelines"&gt;contribution guidelines for getting up and running&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Issues&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;So, I had a few roadblocks with the bundler, and I don&amp;#8217;t think it would be fair to not mention them.&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;The documentation sucks. I&amp;#8217;m hoping this will improve before Rails 3 is ready (whenever that is). Maybe a Rails guide would be appropriate, and I&amp;#8217;ll definitely help start it.&lt;/li&gt;
	&lt;li&gt;Gemcutter&amp;#8217;s on Heroku, so it&amp;#8217;s necessary to check in a lot of the vendored code (in fact, all of the development/production dependencies). New contributors just have to run &lt;code&gt;gem bundle -u&lt;/code&gt; to get the test dependencies.&lt;/li&gt;
	&lt;li&gt;In my staging environment I had to use &lt;code&gt;Bundler.require_env "production"&lt;/code&gt;. Pretty self-explanatory but I missed it at first.&lt;/li&gt;
	&lt;li&gt;Shoulda macros just stopped working, since it assumes the location of gems in &lt;code&gt;vendor/gems&lt;/code&gt; or &lt;code&gt;vendor/plugins&lt;/code&gt;. I had to include this in &lt;code&gt;test/test_helper.rb&lt;/code&gt; to make it happy:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="no"&gt;Shoulda&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;autoload_macros&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="no"&gt;Rails&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;root&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;&amp;quot;vendor/bundler_gems/gems/*&amp;quot;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;Wrapup&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This guide went over how to use Bundler today, with a Rails 2.3.4 app. According to Yehuda, this eventually will be packaged in Rails 3, so the commands will be baked into Rails&amp;#8230;so something like &lt;code&gt;script/bundle&lt;/code&gt;. The nice thing is that you can use the bundler with any Ruby project, so this is good to know in general.&lt;/p&gt;
&lt;p&gt;The bundler is really the future of gem dependency management. If you&amp;#8217;re sick of fighting with &lt;code&gt;config.gem&lt;/code&gt;&amp;#8216;s or are starting a new app it would be well worth your time to start looking at it. If you&amp;#8217;re having trouble with the bundler (or success stories!) feel free to comment here or hop in &lt;code&gt;#carlhuda&lt;/code&gt; on &lt;code&gt;irc.freenode.net&lt;/code&gt;. Check it out on &lt;a href="http://github.com/wycats/bundler"&gt;GitHub&lt;/a&gt; if you haven&amp;#8217;t yet.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/iVVnYNeXVDw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/10/14/gem-bundler-is-the-future</feedburner:origLink></entry>
 
 <entry>
   <title>On Gem Forking</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/kXI4KJGDEwU/on-gem-forking" />
   <updated>2009-10-09T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/10/09/on-gem-forking</id>
   <content type="html">&lt;p style="text-align:center;"&gt;&lt;img src="http://cloud.github.com/downloads/qrush/litanyagainstfear/fork2.JPG" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;So, &lt;a href="http://github.com/blog/515-gem-building-is-defunct"&gt;GitHub has recommended Gemcutter&lt;/a&gt; as an alternative to hosting gems on GitHub. Of course, there seems to be an outcry, for three main reasons that I can see:&lt;/p&gt;
&lt;p&gt;1) Effort must be made to move documentation and install instructions&lt;br /&gt;
2) Gem forking is not possible with the new site&lt;br /&gt;
3) GitHub gave no warning on this&lt;/p&gt;
&lt;p&gt;As for #1, you&amp;#8217;ve got a year to update your user base and get gems off GitHub. I&amp;#8217;d assume that any actively maintained project has figured Gemcutter out by then. And for #3, at least we&amp;#8217;ve got a new service that works and can meet the same needs.&lt;/p&gt;
&lt;p&gt;Regarding RubyGem forking, I&amp;#8217;d like to state that this statement is &lt;strong&gt;false&lt;/strong&gt;. Gemcutter accepts built gems, so you simply need to mimic the actions that GitHub&amp;#8217;s gem builder did: Open your .gemspec up, append your username to the gem name, and save. &lt;code&gt;gem build&lt;/code&gt;, &lt;code&gt;gem push&lt;/code&gt;, and done.&lt;/p&gt;
&lt;p&gt;I think an important distinction must be made here: &lt;strong&gt;gem forking != scm forking&lt;/strong&gt;. GitHub made it easy for anyone to automatically push modifications to gems, but there&amp;#8217;s a bigger picture to think of here. Hopefully at some point, the changes you made will be brought back into the mainline gem. As &lt;a href="http://daviddollar.org/"&gt;David Dollar&lt;/a&gt; so eloquently puts it:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I think the general idea is that gem forks should be a huge special case. I&amp;#8217;m somewhat of the mind personally that making gem forks too &amp;#8216;easy&amp;#8217; causes a great deal of unnecessary fragmentation in the community. It seems reasonable to me, that if your project is going to depend on a gem fork, that the dependency resolution not be automatic, and your installation instructions can tell the user how to get the forked dependency.&lt;/p&gt;
&lt;p&gt;If a fork is going to be long-term, or a true alternative, it should probably be reregistered under a new name as a different project.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Like I stated above, &amp;#8216;gem forking&amp;#8217; is still supported just because of the nature of how Gemcutter works. I felt there needed to be a longer term solution for this in general, since now the community has grown used to it. This &lt;a href="http://wiki.github.com/qrush/gemcutter/fork-support"&gt;lively discussion&lt;/a&gt; ensued, and after some deliberation we&amp;#8217;re going to use subdomains in order to solve the problem.&lt;/p&gt;
&lt;p&gt;The idea is this: you&amp;#8217;ll be able to register your own subdomain on gemcutter.org, such as &lt;code&gt;qrush.gemcutter.org&lt;/code&gt;, and we&amp;#8217;ll give you a completely blank index to push to. Hopefully you&amp;#8217;ll be able to add others like the &lt;a href="http://gemcutter.org/pages/gem_docs#owner"&gt;gem owner&lt;/a&gt; system works now. I feel this feature needs to be used in the following ways:&lt;/p&gt;
&lt;p&gt;1) Subdomain use should be infrequent. It&amp;#8217;s for trial/forked gems that shouldn&amp;#8217;t be relied on for production.&lt;br /&gt;
2) Use prerelease versions for development snapshots (version numbers like 1.0.0pre, &lt;code&gt;gem install yourgem --prerelease&lt;/code&gt;)&lt;br /&gt;
3) Don&amp;#8217;t add someone&amp;#8217;s subdomain as a source, unless you can completely trust anything they toss there. (like, your own for example)&lt;br /&gt;
4) Consider gemcutter.org/rubygems.org as the main, canonical repo that you can trust.&lt;br /&gt;
5) Start looking into &lt;a href="http://blog.segment7.net/articles/2009/02/04/a-rubygems-github-proposal"&gt;gem signing/cert&lt;/a&gt; since it&amp;#8217;s &lt;strong&gt;the&lt;/strong&gt; way we can really trust gems&lt;/p&gt;
&lt;p&gt;Of course, none of this subdomains stuff works yet, but it seems like the best way forward. It&amp;#8217;s also spawning new, awesome ideas like &lt;a href="http://github.com/qrush/gemcutter/issues#issue/91"&gt;password protected, private subdomains&lt;/a&gt;. If you&amp;#8217;re interested in contributing to the project, please &lt;a href="http://github.com/qrush/gemcutter"&gt;fork away&lt;/a&gt; or hop in #gemcutter on Freenode to see what&amp;#8217;s happening.&lt;/p&gt;
&lt;p&gt;This is &lt;strong&gt;our&lt;/strong&gt; gem host now, let&amp;#8217;s make it awesome.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/kXI4KJGDEwU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/10/09/on-gem-forking</feedburner:origLink></entry>
 
 <entry>
   <title>Internbot Chronicles #6: The end</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/ZwJ92bpLB4g/internbot-chronicles-5-the-end" />
   <updated>2009-08-26T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/08/26/internbot-chronicles-5-the-end</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/ZwJ92bpLB4g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/08/26/internbot-chronicles-5-the-end</feedburner:origLink></entry>
 
 <entry>
   <title>Stupid ruby tricks</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/MKJwtlVvP_w/stupid-ruby-tricks" />
   <updated>2009-08-13T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/08/13/stupid-ruby-tricks</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/MKJwtlVvP_w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/08/13/stupid-ruby-tricks</feedburner:origLink></entry>
 
 <entry>
   <title>RailsCamp NE Adventures</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/9d25pwjAmKM/railscamp-ne-adventures" />
   <updated>2009-07-20T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/07/20/railscamp-ne-adventures</id>
   <content type="html">&lt;p&gt;The concept is simple: Get a bunch of developers together for a weekend away from the internet and most of civilization to have fun and relax. To be honest, I didn&amp;#8217;t get to relax much, but it was made up in spades just by how awesome the event was.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://railscamps.com"&gt;&lt;p style="text-align:center;"&gt;&lt;img style="padding:5px; background: #fff" src="http://railscamps.com/images/yield.png" /&gt;&lt;/p&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The venue was the &lt;a href="http://www.themainehouses.com/mountain_house/mountain_house.php"&gt;Maine MountainView House&lt;/a&gt; in &lt;a href="http://maps.google.com/maps?q=bryant+pond,+me&amp;amp;oe=utf-8&amp;amp;rls=com.ubuntu:en-US:unofficial&amp;amp;client=firefox-a&amp;amp;um=1&amp;amp;ie=UTF-8&amp;amp;split=0&amp;amp;gl=us&amp;amp;ei=42BkSrOdNYXeNbClrPcB&amp;amp;sa=X&amp;amp;oi=geocode_result&amp;amp;ct=title&amp;amp;resnum=1"&gt;Bryant Pond, ME&lt;/a&gt; I&amp;#8217;m sure others will post better pictures soon, but the pond itself was beautiful. A dock, fire pit, and plenty of chairs made for some fun smore-making and &lt;a href="http://en.wikipedia.org/wiki/Mafia_(party_game)"&gt;werewolf&lt;/a&gt; games. The house was huge and definitely stood up to nearly 30 developers&amp;#8217; antics throughout the weekend.&lt;/p&gt;
&lt;p&gt;The event itself was slightly organized, which was just perfect: catered lunch and dinner, and plenty of social hacking. Each day had a few talks showing off fun projects and interesting problems. Topics included covered &lt;a href="http://www.yotabanana.com/hiki/ruby-gettext-howto-rails.html"&gt;internationalization with gettext&lt;/a&gt;, &lt;a href="http://couchdb.apache.org"&gt;CouchDB&lt;/a&gt;, the &lt;a href="http://railsrumble.com"&gt;Rails Rumble&lt;/a&gt;, &lt;a href="http://rdoc.info"&gt;rdoc.info&lt;/a&gt;, &lt;a href="http://radiantcms.org"&gt;RadiantCMS&lt;/a&gt;, and plenty more I&amp;#8217;m probably missing. &lt;a href="http://img39.yfrog.com/i/kaed.jpg/"&gt;I showed off&lt;/a&gt; &lt;a href="http://gemcutter.org"&gt;Gemcutter&lt;/a&gt; and got plenty of awesome feedback and ideas for the site.&lt;/p&gt;
&lt;p&gt;As for hacking, it was an interesting mix of people and skill levels. Quite a few developers were there mostly to observe what others were using for tools and to understand how they work. I loved showing off Cucumber and I definitely heard the good word of &lt;a href="http://rubyhoedown2008.confreaks.com/05-bryan-liles-lightning-talk-tatft-test-all-the-f-in-time.html"&gt;&lt;span class="caps"&gt;TATFT&lt;/span&gt;&lt;/a&gt; being preached. I wish I could have watched a little more, but I was having too much fun coding away.&lt;/p&gt;
&lt;p&gt;My adventure went something like this: The start of Saturday got a few people talking about ideas to hack on, and perhaps a project the group could work on together. &lt;a href="http://zerosum.org"&gt;Nick Plante&lt;/a&gt; mentioned games via Twitter, and that eventually lead to implementing &lt;a href="http://en.wikipedia.org/wiki/Dope_Wars"&gt;DopeWars&lt;/a&gt;. From there, some went outside on the porch to sketch out how the app would work, and we then wrote some basic user stories. It ended up that &lt;a href="http://jayunit.net"&gt;Jason&lt;/a&gt; and I banged out a quick prototype in Sinatra and got something decently working. On Sunday, amongst recovering from some late night &lt;a href="http://www.urbanterror.net/news.php"&gt;Urban Terror&lt;/a&gt;, I hacked with some others on searching gems via Gemcutter&amp;#8217;s web interface.&lt;/p&gt;
&lt;p&gt;If there&amp;#8217;s a &lt;a href="http://railscamps.com"&gt;RailsCamp&lt;/a&gt; going on even remotely close to you, do everything you can to get there. It was more hands on than RailsConf, and the amount of networking and fun being had was multiplied. I&amp;#8217;d just like to say thanks to the organizers, &lt;a href="http://freelancing-god.com"&gt;Pat Allan&lt;/a&gt; and &lt;a href="http://cardarella.blogspot.com/"&gt;Brian Cardarella&lt;/a&gt;, for working hard to put on a great time for all. I&amp;#8217;d love to help organize a RailsCamp in the future, perhaps since I&amp;#8217;m returning to Rochester soon it could include the Great Lakes region and bring in hackers from NY, PA, OH, MI, and more. (If you&amp;#8217;re interested too, leave a comment!)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/9d25pwjAmKM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/07/20/railscamp-ne-adventures</feedburner:origLink></entry>
 
 <entry>
   <title>The Journey to Ruby 1.9</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/C24RBQi621w/the-journey-to-ruby-1-9" />
   <updated>2009-07-17T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/07/17/the-journey-to-ruby-1-9</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/C24RBQi621w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/07/17/the-journey-to-ruby-1-9</feedburner:origLink></entry>
 
 <entry>
   <title>Internbot Chronicles #5: Training Reflections</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/ED9FH4wY8Jc/internbot-chronicles-5-training-reflections" />
   <updated>2009-06-25T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/06/25/internbot-chronicles-5-training-reflections</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/ED9FH4wY8Jc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/06/25/internbot-chronicles-5-training-reflections</feedburner:origLink></entry>
 
 <entry>
   <title>Internbot Chronicles #4: CI &amp; Test Metrics</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/Zdgl6Gq4XhA/internbot-chronicles-4-ci-test-metrics" />
   <updated>2009-05-29T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/05/29/internbot-chronicles-4-ci-test-metrics</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/Zdgl6Gq4XhA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/05/29/internbot-chronicles-4-ci-test-metrics</feedburner:origLink></entry>
 
 <entry>
   <title>Git Started with Git</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/OWublvu4IAA/git-started-with-git" />
   <updated>2009-05-01T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/05/01/git-started-with-git</id>
   <content type="html">&lt;p&gt;One of the best parts about my internship at Thoughtbot is that I&amp;#8217;m able to participate in the awesome Ruby user group meetings nearby. For the month of April I talked about learning Git and how it can be integrated into your daily life at three different venues: &lt;a href="http://bostonrb.org"&gt;Boston.rb&lt;/a&gt;, &lt;a href="http://barcampboston.org"&gt;BarCampBoston 4&lt;/a&gt;, and &lt;a href="http://nhruby.org"&gt;NHRuby&lt;/a&gt;. Here&amp;#8217;s the slides from the talk:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;object style="margin:0px" width="425" height="355"&gt;&lt;param name="movie" value="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gitstartedwithgit-nhruby-090501133113-phpapp02&amp;stripped_title=git-started-with-git" /&gt;&lt;param name="allowFullScreen" value="true"/&gt;&lt;param name="allowScriptAccess" value="always"/&gt;&lt;embed src="http://static.slidesharecdn.com/swf/ssplayer2.swf?doc=gitstartedwithgit-nhruby-090501133113-phpapp02&amp;stripped_title=git-started-with-git" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;What I definitely enjoyed the most was getting questions and feedback from the audience. I was half afraid that I was leaving them far behind with some of the advanced topics (especially with rebasing) but from what I gathered most seemed pretty solid after the talk. I don&amp;#8217;t think I could ask for more than responses like this (thanks!):&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://twitter.com/jayroh/statuses/1521155516"&gt;&lt;img src="http://twictur.es/i/1521155516.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://twitter.com/goldeneye/statuses/1664432958"&gt;&lt;img src="http://twictur.es/i/1664432958.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://twitter.com/renaebair/statuses/1664704854"&gt;&lt;img src="http://twictur.es/i/1664704854.gif" alt="" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;One aspect that really bit me was dealing with amount of material and questions, especially since the time requirements were different for all three. I cut plenty of slides out to fit it under an hour by the end, since my original timeslot was roughly double that. You can get all three versions if you&amp;#8217;re extra curious &lt;a href="http://drop.io/gitstarted"&gt;here&lt;/a&gt;.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/OWublvu4IAA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/05/01/git-started-with-git</feedburner:origLink></entry>
 
 <entry>
   <title>BarCamp Boston 4 Roundup</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/DLnTLdL3l0s/barcamp-boston-4-roundup" />
   <updated>2009-04-26T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/04/26/barcamp-boston-4-roundup</id>
   <content type="html">&lt;p&gt;BarCamp Boston 4 has been a lot of fun. This post is just a roundup of the talks I went to on Sunday. I gave a talk about &lt;a href="http://drop.io/gitstarted"&gt;getting started with git&lt;/a&gt;, which seems to have went well.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;ve never been to &lt;span class="caps"&gt;MIT&lt;/span&gt; before, and I need to come back and explore the campus more. It was held in the &lt;span class="caps"&gt;MIT&lt;/span&gt; Strata center, which is absolutely ridiculous. The architecture is really just unreal. Also, I can&amp;#8217;t believe how much pizza a few hundred nerds can down in a manner of minutes.&lt;/p&gt;
&lt;p&gt;One of the neatest things was that a project was being run in the hallway with a &lt;a href="http://wiffiti.com"&gt;Wiffiti&lt;/a&gt; stream of the tweets, pictures, and more that was going on:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;object type="application/x-shockwave-flash" data="http://flash.alpha.locamoda.com/wiffiti.com/cloud/cataclysm.swf?&amp;loca=loca6848&amp;total=4&amp;tags=%23bcb4,bcb4,%21barcampboston,@loca6848&amp;twitter=1&amp;flickr=1&amp;locamoda=1&amp;background=http://locamoda-staging.s3.amazonaws.com/wiffiti_cloud_assets/173/bcamp-logo.png" height="460" width="500"&gt;&lt;param name="movie" value="http://flash.alpha.locamoda.com/wiffiti.com/cloud/cataclysm.swf?&amp;loca=loca6848&amp;total=4&amp;tags=%23bcb4,bcb4,%21barcampboston,@loca6848&amp;twitter=1&amp;flickr=1&amp;locamoda=1&amp;background=http://locamoda-staging.s3.amazonaws.com/wiffiti_cloud_assets/173/bcamp-logo.png"/&gt;&lt;param name="allowFullScreen" value="true"&gt;&lt;/object&gt;&lt;/p&gt;
&lt;p&gt;Here&amp;#8217;s the talks I went to and what I got out of them. You can see the &lt;a href="http://wiki.barcampboston.org/index.php?title=2009_Schedule"&gt;full schedule here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;how to be a freelancer&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The person giving this talk wanted to hit like 8 points, but I think he only got to 3. What ensued was plenty of discussion on how to deal with clients, how to ditch them, and problems that come up with freelancing in general. The general gist I got from it: I&amp;#8217;m glad I don&amp;#8217;t have to deal with that.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Code secrets&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This was a great idea: people in the audience write down horrible, deep, dark secrets about code they&amp;#8217;ve written, and then they&amp;#8217;re read off. Hilarity ensued.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Starting a Boston startup space&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sadly I didn&amp;#8217;t pay too much attention to this one, but my basic gist was that it&amp;#8217;s a community service, and it&amp;#8217;s tough to decide a business model that works for the people you&amp;#8217;re serving. I&amp;#8217;ll definitely be utilizing the local coworking if I end up on the lam as a freelancer or mobile worker after school is over.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Fun with QR Codes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;QR codes are really neat, and can do some ridiculous stuff. They&amp;#8217;re really awesome for embedding URLs into the real life, like putting a QR code near a bus stop that can open a schedule for you. I just wish my phone didn&amp;#8217;t suck so I could actually read them. I do wonder how this concept would catch on with the general public. What is really funny is to watch people try to read the QR code on their phones from the screen.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;JavaScript Testing Discussion&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Lots of gripes about the current state of testing JS in the browser. There&amp;#8217;s plenty of ways to DO testing in the browser, but there doesn&amp;#8217;t seem to be a be-all, end-all solution. Listing out various testing frameworks, but there doesn&amp;#8217;t seem to be many familiar with most of them. Complaints, bitching and moaning about how difficult this situation is. It all boils down to not being able to remove the human element from testing it correctly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Ruby Testing Panel&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Seems to be a general discussion of what&amp;#8217;s going on in the Ruby testing world and reactions that people have. Starting off with a rant or reasons why to Test First. Diving into some differences between RSpec and Shoulda and their syntax differences. Some talk about mocking and stubbing and the different libraries. This discussion went for an hour but I skipped out early to make the next talk.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Introduction to the Arduino&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Should be easy to translate software development experience into the microcontroller world. Throwing some around the room so we can get a look at what they are. Huge advantage: the bootloader. All you need is a &lt;span class="caps"&gt;USB&lt;/span&gt; cable and you can load code on it. There&amp;#8217;s ways to get around it or write your own too. Ridiculously neat demo: the arduino spins a platter with a thin slot that has LEDs beneath it. There&amp;#8217;s a lens at the top of the platter that the arduino can hook into, and control the speed of how fast the platter will go. Lots of C code and magic registers that you need data sheets for. I wonder if the Ruby library abstracts any of this away. Data sheets just seem scary, but useful.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;LOLCODE&lt;/span&gt; 101&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This isn&amp;#8217;t 100% serious, but for some reason somebody made a programming language around this meme. I would post some code but pygments doesn&amp;#8217;t support the language. Best part of the language: &lt;span class="caps"&gt;DIAF&lt;/span&gt; is exiting with a status code.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/DLnTLdL3l0s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/04/26/barcamp-boston-4-roundup</feedburner:origLink></entry>
 
 <entry>
   <title>Internbot Chronicles #3</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/S4UH4QZevCk/internbot-chronicles-3" />
   <updated>2009-04-24T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/04/24/internbot-chronicles-3</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/S4UH4QZevCk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/04/24/internbot-chronicles-3</feedburner:origLink></entry>
 
 <entry>
   <title>Internbot Chronicles #2</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/dQaMnfr5StE/internbot-chronicles-2" />
   <updated>2009-03-30T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/03/30/internbot-chronicles-2</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/dQaMnfr5StE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/03/30/internbot-chronicles-2</feedburner:origLink></entry>
 
 <entry>
   <title>Internbot Chronicles #1</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/ttGlHamET6w/internbot-chronicles-i" />
   <updated>2009-03-13T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/03/13/internbot-chronicles-i</id>
   <content type="html">&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/ttGlHamET6w" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/03/13/internbot-chronicles-i</feedburner:origLink></entry>
 
 <entry>
   <title>Checkout tracked remote branch with Git</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/m9Ddwiy6TZ8/checkout-tracked-remote-branch-with-git" />
   <updated>2009-01-07T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2009/01/07/checkout-tracked-remote-branch-with-git</id>
   <content type="html">&lt;p&gt;I frequently need to do this when setting up or syncing my various machines, and I seem to forget the command all the time. So let&amp;#8217;s say you&amp;#8217;ve got more than one branch on your remote, and you want to bring it down into your local repository as well:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;img src="http://gitready.com/images/branches.png" alt="" /&gt;&lt;/p&gt;
&lt;p&gt;Viewing information on the remote should look something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="text"&gt;$ git remote show origin
  * remote origin
    URL: *************
    Remote branch merged with &amp;#39;git pull&amp;#39; 
      while on branch master
        master
      Tracked remote branches
        haml master
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Luckily, the command syntax for this is quite simple:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git checkout --track -b &amp;lt;local branch&amp;gt; &amp;lt;remote&amp;gt;/&amp;lt;tracked branch&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;So in my case, I used this command:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git checkout --track -b haml origin/haml&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;You can also use a simpler version:&lt;/p&gt;
&lt;p&gt;&lt;code&gt;git checkout -t origin/haml&lt;/code&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/m9Ddwiy6TZ8" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2009/01/07/checkout-tracked-remote-branch-with-git</feedburner:origLink></entry>
 
 <entry>
   <title>If you only could follow 10 people on Twitter...</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/X9tBohrrNXA/if-you-only-could-follow-10-people-on-twitter" />
   <updated>2008-12-11T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/12/11/if-you-only-could-follow-10-people-on-twitter</id>
   <content type="html">&lt;p&gt;&amp;#8230;who would they be? I&amp;#8217;m following a staggering number of people (1,337 to be exact), and the signal vs. noise ratio is just getting out of control. I&amp;#8217;m not sure how I got into this situation: I just started following everyone that followed me, and it spun out of control. I see a few options from here:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Remove everyone and start again.&lt;/li&gt;
	&lt;li&gt;Set up groups in TweetDeck and continue to follow a ton of people.&lt;/li&gt;
	&lt;li&gt;Slowly whittle away until my following/follower ratio is down to 1:1.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;This got me thinking&amp;#8230;what if you could only follow 10 people? Who would I follow and why? I present my list, and I encourage you to think of your own.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/ablissfulgal"&gt;ablissfulgal&lt;/a&gt;: My girlfriend. I don&amp;#8217;t need to explain this one.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/mittense"&gt;mittense&lt;/a&gt;: Former coworker from Stardock who plays way too many video games.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/GarrettAtreides"&gt;GarrettAtreides&lt;/a&gt;: Classmate at &lt;span class="caps"&gt;RIT&lt;/span&gt;, MS lover, and all around goofy dude.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/AmazingSyco"&gt;AmazingSyco&lt;/a&gt;: Classmate at &lt;span class="caps"&gt;RIT&lt;/span&gt;, Cocoa hacker, and all around funny dude.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/chorn"&gt;chorn&lt;/a&gt;: Local Ruby fan that&amp;#8217;s a riot. Supposedly he&amp;#8217;s a &lt;span class="caps"&gt;CTO&lt;/span&gt; too.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/BreakingNewsOn"&gt;BreakingNewsOn&lt;/a&gt;: For those who prefer their news in &lt;span class="caps"&gt;ALL&lt;/span&gt; &lt;span class="caps"&gt;CAPS&lt;/span&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/defunkt"&gt;defunkt&lt;/a&gt;: One of the GitHubbers and an awesome Rubyist.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/faithfulgeek"&gt;faithfulgeek&lt;/a&gt;: Convert to the Ruby/&lt;span class="caps"&gt;OSX&lt;/span&gt; world from Microsoft. I&amp;#8217;m going through the same transition.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/nakajima"&gt;nakajima&lt;/a&gt;: Ruby ninja who&amp;#8217;s a code machine. And he&amp;#8217;s hilarious.&lt;/li&gt;
	&lt;li&gt;&lt;a href="http://twitter.com/guykawasaki"&gt;guykawasaki&lt;/a&gt;: Entrepreneur extraordinaire. I&amp;#8217;m listed on his site as a Twitterati too.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;To those who didn&amp;#8217;t make the cut, don&amp;#8217;t feel bad! It&amp;#8217;s not that I don&amp;#8217;t want to communicate with you, just most likely I can communicate easier through a different channel (&lt;span class="caps"&gt;IRC&lt;/span&gt;, IM, what have you).&lt;/p&gt;
&lt;p&gt;Who would you follow? Let me know in the comments or make your own blog post!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/X9tBohrrNXA" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/12/11/if-you-only-could-follow-10-people-on-twitter</feedburner:origLink></entry>
 
 <entry>
   <title>Open Source Collaboration with Git and GitHub</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/mc0m5v_YnOs/open-source-collaboration-with-git-and-github" />
   <updated>2008-12-05T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/12/05/open-source-collaboration-with-git-and-github</id>
   <content type="html">&lt;p&gt;I just gave a talk at the &lt;a href="http://sse.se.rit.edu"&gt;Society of Software Engineers&lt;/a&gt;&amp;#8217; &lt;a href="http://sse.se.rit.edu/programs/tech-talks"&gt;Tech Talk Thursdays&lt;/a&gt; about &lt;a href="http://git-scm.com"&gt;Git&lt;/a&gt; and &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;. The talk was a mashup of &lt;a href="http://jointheconversation.org/"&gt;Scott Chacon&amp;#8217;s&lt;/a&gt; &lt;a href="http://gitisbetterthanx.com"&gt;various&lt;/a&gt; &lt;a href="http://www.slideshare.net/chacon/getting-git"&gt;resources&lt;/a&gt; on Git along with &lt;a href="http://michaelhartl.com/"&gt;Michael Hartl&amp;#8217;s&lt;/a&gt; &lt;a href="http://www.voicesthatmatter.com/content/downloads/ruby2008/presentations/Hartl.pdf"&gt;presentation&lt;/a&gt; on contributing to &lt;a href="http://insoshi.com"&gt;Insoshi&lt;/a&gt; with GitHub. I think it went pretty well and it was followed by some good discussion.&lt;/p&gt;
&lt;p&gt;The talk is an introduction to Git from the perspective of a student who has used version control before (and hopefully has learned a bit of graph theory). I went over the little history that Git has, why Git rocks, and how helpful and easy it is to use GitHub. Check out the slides: (yes, there&amp;#8217;s puppies)&lt;br /&gt;
&lt;div id="__ss_819316" style="text-align:center"&gt;&lt;a style="font:14px Helvetica,Arial,Sans-serif;display:block;margin:12px 0 3px 0;text-decoration:underline;" title="Open Source Collaboration With Git And Git Hub" href="http://www.slideshare.net/qrush/open-source-collaboration-with-git-and-git-hub-presentation-819316?type=powerpoint"&gt;Open Source Collaboration With Git And Git Hub&lt;/a&gt;&lt;object classid="clsid:d27cdb6e-ae6d-11cf-96b8-444553540000" width="425" height="355" codebase="http://download.macromedia.com/pub/shockwave/cabs/flash/swflash.cab#version=6,0,40,0"&gt;&lt;param name="allowFullScreen" value="true" /&gt;&lt;param name="allowScriptAccess" value="always" /&gt;&lt;param name="src" value="http://static.slideshare.net/swf/ssplayer2.swf?doc=opensourcecollaborationwithgitandgithub1228427160717862812284469878819539-1228448536513247-9&amp;amp;stripped_title=open-source-collaboration-with-git-and-git-hub-presentation-819316" /&gt;&lt;embed type="application/x-shockwave-flash" width="425" height="355" src="http://static.slideshare.net/swf/ssplayer2.swf?doc=opensourcecollaborationwithgitandgithub1228427160717862812284469878819539-1228448536513247-9&amp;amp;stripped_title=open-source-collaboration-with-git-and-git-hub-presentation-819316" allowscriptaccess="always" allowfullscreen="true"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;br /&gt;
&lt;div style="font-size: 11px; font-family: tahoma,arial; height: 26px; padding-top: 2px;"&gt;View SlideShare &lt;a style="text-decoration:underline;" title="View Open Source Collaboration With Git And Git Hub on SlideShare" href="http://www.slideshare.net/qrush/open-source-collaboration-with-git-and-git-hub-presentation-819316?type=powerpoint"&gt;presentation&lt;/a&gt; or &lt;a style="text-decoration:underline;" href="http://www.slideshare.net/upload?type=powerpoint"&gt;Upload&lt;/a&gt; your own. (tags: &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/oss"&gt;oss&lt;/a&gt; &lt;a style="text-decoration:underline;" href="http://slideshare.net/tag/collaboration"&gt;collaboration&lt;/a&gt;)&lt;/div&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;It was definitely a lot of fun. (I almost wish someone was taking notes!) Someone was taking a video, so hopefully it&amp;#8217;ll be up soon. Next time I give the talk I want to show how easy it is to convert from svn/cvs as well as create and browse repositories since I got a lot of suprised looks about &lt;strong&gt;git init&lt;/strong&gt; and &lt;strong&gt;git instaweb&lt;/strong&gt; during Q&amp;amp;A.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/mc0m5v_YnOs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/12/05/open-source-collaboration-with-git-and-github</feedburner:origLink></entry>
 
 <entry>
   <title>GitHub Rebase #6</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/XSyBJXJanas/github-rebase-6" />
   <updated>2008-12-01T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/12/01/github-rebase-6</id>
   <content type="html">&lt;p&gt;The sixth edition of my column is live: &lt;a href="http://github.com/blog/246-github-rebase-6"&gt;&lt;span&gt;http://&lt;span&gt;github&lt;/span&gt;.com/blog/246-&lt;span&gt;github&lt;/span&gt;-&lt;span&gt;rebase&lt;/span&gt;-6&lt;/span&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m slowly improving the parsing process. For the last edition I broke out all of the work the app does into rake tasks, and then the Rails site is just for viewing the data. Basically there&amp;#8217;s a few steps:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Download &lt;span class="caps"&gt;ATOM&lt;/span&gt; feeds (This week, 1400. Last week, 1200).&lt;/li&gt;
	&lt;li&gt;Check that all of the downloads went ok. (Bad gateway errors happen to good people)&lt;/li&gt;
	&lt;li&gt;Parse the files, making sure that events are unique and &lt;span style="text-decoration: line-through;"&gt;users&lt;/span&gt; forkers are logged.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Surprisingly I&amp;#8217;m relying less and less on my app to get the column together, which is good. Huge kudos to the GitHubbers for creating the Recently Created page for each language. This helps me diversify the column while avoiding a lot of data crunching on my end.&lt;/p&gt;
&lt;p&gt;Next week I definitely want to parse the entire month&amp;#8217;s worth of events to really see the trends come out. Luckily their atom feed goes back 4000-5000 pages (of 30 events each) or this wouldn&amp;#8217;t be able to happen. What this will mean is that I&amp;#8217;ll actually have to optimize the download and parsing as much as possible. Stay tuned!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/XSyBJXJanas" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/12/01/github-rebase-6</feedburner:origLink></entry>
 
 <entry>
   <title>GitHub Rebase #4</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/ll45SIM8B2g/github-rebase-4" />
   <updated>2008-11-17T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/11/17/github-rebase-4</id>
   <content type="html">&lt;p&gt;The latest edition is now up! http://github.com/blog/224-github-rebase-4&lt;/p&gt;
&lt;p&gt;I really need to get some of this process sped up and automated. Currently I have to manually look up all of the repositories, and creating the table was a bitch. I also need to figure out how to make my Rails site that processes GitHub&amp;#8217;s &lt;span class="caps"&gt;RSS&lt;/span&gt; feed to be multithreaded so it doesn&amp;#8217;t take an hour or two&amp;#8230;or three&amp;#8230;to figure out what&amp;#8217;s going on with it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/ll45SIM8B2g" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/11/17/github-rebase-4</feedburner:origLink></entry>
 
 <entry>
   <title>GitHub Rebase #3</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/qpoJ5ZOQaVU/github-rebase-3" />
   <updated>2008-11-09T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/11/09/github-rebase-3</id>
   <content type="html">&lt;p&gt;Geez, it&amp;#8217;s been 3 weeks already? The third installment is up at:&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/blog/208-github-rebase-3"&gt;http://github.com/blog/208-github-rebase-3&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/qpoJ5ZOQaVU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/11/09/github-rebase-3</feedburner:origLink></entry>
 
 <entry>
   <title>GitHub Rebase #2</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/D9To-zmWR08/github-rebase-2" />
   <updated>2008-11-03T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/11/03/github-rebase-2</id>
   <content type="html">&lt;p&gt;The second edition of my weekly installment is &lt;a href="http://github.com/blog/201-github-rebase-2"&gt;now hosted at GitHub&lt;/a&gt;!&lt;/p&gt;
&lt;p&gt;Next week I&amp;#8217;m going to release it on late Saturday, or perhaps early Sunday. It&amp;#8217;s a bit late this week, but I don&amp;#8217;t think anyone will notice.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/D9To-zmWR08" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/11/03/github-rebase-2</feedburner:origLink></entry>
 
 <entry>
   <title>GitHub Rebase #1</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/bfPCRGD9QFc/github-rebase-1" />
   <updated>2008-10-26T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/10/26/github-rebase-1</id>
   <content type="html">&lt;p&gt;This is the start of a new weekly column that going to recap some of the action that&amp;#8217;s been happening on GitHub during the past week. My goals with this column include:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Prove that Git is a great choice for version control!&lt;/li&gt;
	&lt;li&gt;See how active the community at GitHub really is and what they&amp;#8217;re working on.&lt;/li&gt;
	&lt;li&gt;Show how Open Source development is truly open.&lt;br /&gt;
Using the magic of feed-normalizer, hpricot, and gchartrb, I&amp;#8217;ve created a little Rails app (dubbed &lt;a href="http://github.com/qrush/rebase/tree/master"&gt;Rebase&lt;/a&gt;, of course) that I can use to rip all of the events that are going on at GitHub. I&amp;#8217;m going to try to keep the format of the column consistent, but I definitely need your feedback to make it better.&lt;/li&gt;
&lt;/ol&gt;
&lt;h2&gt;Stats Breakdown&lt;/h2&gt;
&lt;p style="text-align: center;"&gt;&lt;img class="aligncenter" src="http://chart.apis.google.com/chart?chbh=22,2&amp;amp;chf=bg,s,f0f0f0&amp;amp;chxt=y,x&amp;amp;chxl=0:|guide+(4)|commitcomment+(190)|member+(288)|wiki+(548)|delete+(729)|fork+(864)|gist+(1110)|follow+(1236)|create+(1274)|watch+(4299)|commit+(15131)&amp;amp;cht=bhg&amp;amp;chs=530x375&amp;amp;chd=s:9RFEEDCCBAA&amp;amp;chxr=1,0,15000&amp;amp;chco=336699&amp;amp;chtt=GitHub+Rebase+%E2%80%94+Total+Events+%E2%80%94+10/18/2008+to+10/25/2008&amp;amp;chxs=0,4183c4,10,1|1,000000,10,0" alt="" width="530" height="375" /&gt;&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;img class="aligncenter" src="http://chart.apis.google.com/chart?chf=bg,s,f0f0f0&amp;amp;chm=B,bbccd9,0,0,0&amp;amp;chxt=x,y&amp;amp;chxl=0:|Saturday+10/18|Sunday+10/19|Monday+10/20|Tuesday+10/21|Wednesday+10/22|Thursday+10/23|Friday+10/24&amp;amp;cht=lc&amp;amp;chs=530x375&amp;amp;chd=s:llw5934&amp;amp;chxr=1,0,4500&amp;amp;chco=336699&amp;amp;chtt=GitHub+Rebase+%E2%80%94+Daily+Events+%E2%80%94+10/18/2008+to+10/25/2008&amp;amp;chxs=0,4183c4,9,1|1,000000,10,1" alt="" width="530" height="375" /&gt;&lt;/p&gt;
&lt;p&gt;And, just for fun:&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;img class="aligncenter" src="http://chart.apis.google.com/chart?chl=2.55+events/min&amp;cht=gom&amp;chs=400x175&amp;chd=t:25.469246031746" alt="" width="400" height="175" /&gt;&lt;/p&gt;&lt;/p&gt;
&lt;h2&gt;Notably New Projects&lt;/h2&gt;
&lt;p&gt;Each week I&amp;#8217;m going to look over some interesting new projects that have just showed up on GitHub and explain what they&amp;#8217;re about. If you have a project you think I should showcase, let me know and I&amp;#8217;ll see about featuring it!&lt;/p&gt;
&lt;p&gt;&lt;a href="https://github.com/josh/wysihat/tree"&gt;Wysihat&lt;/a&gt;: A minimalist&amp;#8217;s approach to &lt;span class="caps"&gt;WYSIWYG&lt;/span&gt;/Rich Text Editor. Right now it&amp;#8217;s very, very beta, but it has the support of 37Signals so I definitely hope it&amp;#8217;s destined for greatness. Once some decent themes are created for it, I&amp;#8217;d definitely consider integrating it in some of my sites. This project definitely is growing and needs help, so fork away.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/android"&gt;Android&lt;/a&gt;: Google announced that their Android framework was going open source and was hosted on Git, so it was clearly only a matter of time before their code landed on GitHub too. They have a ton of projects in their codebase, but it doesn&amp;#8217;t seem like all of them have pushed yet. Definitely looks promising though, and I really would like to see how their system works.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/webco/acts_as_passive_aggressive/tree/master"&gt;acts_as_passive_aggressive&lt;/a&gt;: Just in case you ever needed a way to vent on your users, this plugin provides the perfect opportunity. I love the project&amp;#8217;s readme.&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/davetroy/votereport/tree/master"&gt;VoteReport&lt;/a&gt;: This is a new Rails site to track the election next week through Twitter. They&amp;#8217;ve got quite a lot of documentation on their &lt;a href="http://votereport.pbwiki.com/FrontPage"&gt;PBWiki&lt;/a&gt;, and I really hope that this site turns out to be a little more useful and fun than watching tweets fly by on Twitter&amp;#8217;s election page. If you want to help them get the project up and running before the 4th, go for it!&lt;/p&gt;
&lt;p&gt;&lt;a href="http://github.com/biilmann/javascript-xhtml-purifier/tree"&gt;javascript-xhtml-purifier&lt;/a&gt;: A new, robust JS script to sanitize &lt;span class="caps"&gt;HTML&lt;/span&gt;. I can guarantee that at some point most web developers will need to do this, so bookmark or clone away. &lt;br /&gt;
Next week I&amp;#8217;d love to break down the stats a little more and figure out what commits were the most commented on, and maybe which projects had the most activity. Let me know what you&amp;#8217;d like to see in the future!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/bfPCRGD9QFc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/10/26/github-rebase-1</feedburner:origLink></entry>
 
 <entry>
   <title>Pumpkin Carving 2008</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/8xadqKmq7Fg/pumpkin-carving-2008" />
   <updated>2008-10-20T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/10/20/pumpkin-carving-2008</id>
   <content type="html">&lt;p&gt;In 2006 I created a &lt;a href="http://photos-a.ak.facebook.com/photos-ak-sf2p/v49/236/39/24408547/n24408547_30746800_6913.jpg"&gt;stormtrooper&lt;/a&gt;. Last year was &lt;a href="http://www.homestarrunner.com/ween_stencils.html"&gt;HomestarRunner&lt;/a&gt;. This year however, I paid homage to the one and the only, &lt;a href="http://www.youtube.com/watch?v=8hm3E2cGQE4"&gt;Octocat&lt;/a&gt;:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://flickr.com/photos/qrush/2960047774/"&gt;&lt;img class="aligncenter" title="Octocat!" src="http://farm4.static.flickr.com/3050/2960047774_6e39a980dc.jpg?v=0" alt="" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;This of course is the logo of one of my favorite sites, &lt;a href="http://github.com"&gt;GitHub&lt;/a&gt;. We&amp;#8217;re having our Halloween party this weekend so I made this guy a little early this year.&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://flickr.com/photos/qrush/2960048602/"&gt;&lt;img class="aligncenter" title="Octocat 3 GitHub" src="http://farm4.static.flickr.com/3250/2960048602_c23942eda0.jpg" alt="" width="500" height="375" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re curious, you can see the &lt;a href="http://flickr.com/qrush"&gt;creation process on my new Flickr account &lt;/a&gt;(their upload and photo managing interface is kickass!). If you&amp;#8217;d like the stencil I used, just leave a comment or email me. Happy Halloween!&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a href="http://flickr.com/photos/qrush/2959191819/"&gt;&lt;img class="aligncenter" src="http://farm4.static.flickr.com/3272/2959191819_3797a3c385.jpg" alt="Fork it." width="375" height="500" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/8xadqKmq7Fg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/10/20/pumpkin-carving-2008</feedburner:origLink></entry>
 
 <entry>
   <title>Where do you get Ruby news from?</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/Qad05Z0C6IE/where-do-you-get-ruby-news-from" />
   <updated>2008-10-19T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/10/19/where-do-you-get-ruby-news-from</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m wondering where other fellow Ruby and Rails hackers get their Ruby-related news fix from. For some reason I just feel continually disconnected from the community at large and I just want to make sure I&amp;#8217;m taking advantage of the resources out there. So here&amp;#8217;s my news sources:&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Ruby.Reddit (&lt;a href="http://reddit.com/r/ruby"&gt;http://reddit.com/r/ruby&lt;/a&gt;): This seems to be one of the most active sources, and usually the commentors are fantastic. It&amp;#8217;s community-driven news at its best, but sometimes it&amp;#8217;s a little slow compared to the other subreddits. What I like most about it is that the community is relatively small, so if you post a story it usually sticks on the page for a few days.&lt;/li&gt;
	&lt;li&gt;RubyFlow (&lt;a href="http://rubyflow.com"&gt;http://rubyflow.com&lt;/a&gt;): I just got into RubyFlow recently, and it seems more like the community well than anything. You can throw a coin in and wish for some visitors to your blog, but you&amp;#8217;re usually lost in the mix. It&amp;#8217;s a very interesting concept though, and it&amp;#8217;s definitely fun to see big names in the Ruby community on the list.&lt;/li&gt;
	&lt;li&gt;Ruby.Alltop (&lt;a href="http://ruby.alltop.com"&gt;http://ruby.alltop.com&lt;/a&gt;): Alltop is awesome for getting an overall sense of where the community is right now. It&amp;#8217;s Guy Kawasaki&amp;#8217;s &amp;#8216;magazine rack&amp;#8217; of latest Ruby stories&amp;#8230;essentially a &lt;span class="caps"&gt;RSS&lt;/span&gt; aggregator. I&amp;#8217;ve discovered quite a few blogs I didn&amp;#8217;t know about and now keep track of through it. One of my goals with this blog is to get on there someday! :)&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I suppose my secondary news sources would be Freenode&amp;#8217;s various Ruby channels (mostly #rubyonrails) and the Rails mailing list, but I don&amp;#8217;t check those as often. I&amp;#8217;ve also heard about a &lt;a href="http://caboo.se"&gt;secret channel&lt;/a&gt;, but who knows if I&amp;#8217;ll ever get in there. Those also don&amp;#8217;t have a handy &lt;span class="caps"&gt;RSS&lt;/span&gt; feed, so I tend not to check them as often. So, where do you get news about the Ruby community from?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/Qad05Z0C6IE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/10/19/where-do-you-get-ruby-news-from</feedburner:origLink></entry>
 
 <entry>
   <title>Calculating Age in Rails</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/90_MNdai4NY/calculating-age-in-rails" />
   <updated>2008-10-13T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/10/13/calculating-age-in-rails</id>
   <content type="html">&lt;p&gt;You&amp;#8217;d think that this would be easy, but for some reason it wasn&amp;#8217;t, at least for me. Let&amp;#8217;s say you keep track of a User&amp;#8217;s birthday with a date field. Great! Let&amp;#8217;s show the user&amp;#8217;s age.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;
  &lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;birthday&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;year&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Done! Right? &lt;span class="caps"&gt;WRONG&lt;/span&gt;. Worked fine for some users, until one of my coworkers asked me&amp;#8230;hey, you&amp;#8217;re not 21 yet&amp;#8230;how&amp;#8217;d you magically gain a year on your profile? Crap. Obviously this will work for everyone&amp;#8217;s whose birthday is &lt;span class="caps"&gt;BEFORE&lt;/span&gt; &lt;code&gt;Date.today&lt;/code&gt;, but not after.&lt;/p&gt;
&lt;p&gt;So, we need a more exact method of calculating the age:&lt;br /&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;age&lt;/span&gt;
  &lt;span class="p"&gt;((&lt;/span&gt;&lt;span class="no"&gt;Date&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;today&lt;/span&gt; &lt;span class="o"&gt;-&lt;/span&gt; &lt;span class="n"&gt;birthday&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="o"&gt;/&lt;/span&gt; &lt;span class="mi"&gt;365&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;floor&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;/p&gt;
&lt;p&gt;So what this method does instead is use the &lt;code&gt;Rational&lt;/code&gt; value given by subtracting two &lt;code&gt;Date&lt;/code&gt;s, and divides it by the number of days in a year. Since that number is still a &lt;code&gt;Rational&lt;/code&gt;, calling &lt;code&gt;floor&lt;/code&gt; on it will round it down to the nearest &lt;code&gt;Fixnum&lt;/code&gt;, giving us a (slightly more) precise account of this user&amp;#8217;s age. &lt;strong&gt;&lt;span class="caps"&gt;EDIT&lt;/span&gt;: But this is still inaccurate!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Yeah, I thought it was easy too. Perhaps this shows that I need to test my app a little more thoroughly! It also would be nice to save the age in an instance level variable, but right now I don&amp;#8217;t use the age more than once on a page so it doesn&amp;#8217;t matter.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;span class="caps"&gt;EDIT&lt;/span&gt;&lt;/strong&gt;: It looks like my method is still not sufficient for leap years! The comments have posted &lt;span class="caps"&gt;MANY&lt;/span&gt; great solutions. My method is fine for a general estimation, but the comments have many solutions for that deal with greater accuracy. I&amp;#8217;m honestly not sure which is best, so choose carefully when you&amp;#8217;re developing your app.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/90_MNdai4NY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/10/13/calculating-age-in-rails</feedburner:origLink></entry>
 
 <entry>
   <title>Loading custom code in Rails</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/mnYVMAuZTto/loading-custom-code-in-rails" />
   <updated>2008-09-22T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/09/22/loading-custom-code-in-rails</id>
   <content type="html">&lt;p&gt;This is a question I&amp;#8217;ve seen asked (including by myself) in #rubyonrails on Freenode quite a few times, and I figured I&amp;#8217;d settle it once and for all. There&amp;#8217;s a few different ways to get custom code loaded into your Rails app. The first solution to this is understanding how code gets loaded with Ruby in the first place, which I usually get confused with. Let&amp;#8217;s do a little recap about your different options that Ruby and Rails provides:&lt;/p&gt;
&lt;ul&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Kernel.html#M005966"&gt;load&lt;/a&gt;: &lt;/strong&gt;Loads and executes the Ruby program in the file &lt;em&gt;filename&lt;/em&gt;.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a href="http://www.ruby-doc.org/core/classes/Kernel.html#M005967"&gt;require&lt;/a&gt;: &lt;/strong&gt;Ruby tries to load the library&lt;em&gt;&lt;/em&gt;, returning &lt;tt&gt;true&lt;/tt&gt; if successful.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;&lt;a href="http://wiki.rubyonrails.org/rails/pages/RequireDependency"&gt;require_dependency&lt;/a&gt;: &lt;/strong&gt;Reloads source files on each request when in development mode, so changes are reflected on the next request.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;require_or_load: &lt;/strong&gt;There doesn&amp;#8217;t seem to be much documentation on this, but it doesn&amp;#8217;t seem as safe and &lt;a href="http://github.com/rails/rails/tree/master/activesupport/CHANGELOG#L1123"&gt;it may result in your code being loaded twice&lt;/a&gt;. Review the code &lt;a href="http://github.com/rails/rails/tree/master/activesupport/lib/active_support/dependencies.rb#L228-264"&gt;here&lt;/a&gt; before you use it.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;So, the most ideal keyword to use is &lt;strong&gt;require_dependency&lt;/strong&gt;, since it will reload code during development mode when you make changes. Otherwise, you&amp;#8217;ll have to constantly restart your development server/console, and that just sucks. Plus, it&amp;#8217;ll work perfectly in production mode and only load the files once.&lt;/p&gt;
&lt;p&gt;So, where&amp;#8217;s the best place to put the files with your custom code? Well, there&amp;#8217;s a few folders that are on the Rails load path in the first place: &lt;strong&gt;app, lib, vendor and mock&lt;/strong&gt; &lt;strong&gt;paths&lt;/strong&gt; (&lt;a href="http://github.com/rails/rails/tree/master/railties/lib/initializer.rb#L607-609"&gt;source&lt;/a&gt;) you need to add different folders to the load path, that&amp;#8217;s more than possible. In your config/environment.rb, add whatever folder you want in the config.load_paths variable. For instance,&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="n"&gt;config&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;load_paths&lt;/span&gt; &lt;span class="o"&gt;+=&lt;/span&gt; &lt;span class="sx"&gt;%W( custom )&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This will load the custom directory (RAILS_ROOT/custom) to the load path so you can use those files. The problem with files you put in these directories is that they may be in the load path, but you&amp;#8217;ll have to require the custom files you want in each class that you&amp;#8217;ll want to use them. The solution to this is to get the file required for the entire Rails environment, which is a lot easier than you&amp;#8217;d think.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s say we want to load some extensions to String for your app. Being a forward thinking developer, you&amp;#8217;ve created a new folder in lib, called core_ext, where you can put other ruby files in the future if you need to. So in lib/core_ext/string.rb you&amp;#8217;ve dumped for example:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;String&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;slugify&lt;/span&gt;
    &lt;span class="nb"&gt;self&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;gsub&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="sr"&gt;/[^a-z0-9]+/i&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;chomp&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;&amp;#39;-&amp;#39;&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The folder config/initializers contains files that run once when your Rails environment is getting set up. Create a new file in that folder and this will run through your custom folder and make sure that the files are required properly.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;CoreExtensions&lt;/span&gt;
  &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;require_core_ext&lt;/span&gt;
    &lt;span class="no"&gt;Dir&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s2"&gt;&amp;quot;&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;RAILS_ROOT&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/lib/core_ext/*.rb&amp;quot;&lt;/span&gt;&lt;span class="o"&gt;].&lt;/span&gt;&lt;span class="n"&gt;each&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;f&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;
      &lt;span class="n"&gt;require_dependency&lt;/span&gt; &lt;span class="n"&gt;f&lt;/span&gt;
    &lt;span class="k"&gt;end&lt;/span&gt;
  &lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;span class="no"&gt;Object&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;instance_eval&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;CoreExtensions&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;So now, you can call &lt;code&gt;require_core_ext&lt;/code&gt; in whatever class you want, and it will reload all of your custom code if you&amp;#8217;re in development mode or if you&amp;#8217;re in production, it will only load your custom classes when the file is first loaded. Now you can call &lt;code&gt;String#slugify&lt;/code&gt; all you want, and if you make changes to the method in lib/core_ext it will be reflected when you refresh the page.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve got any other examples of how you bring in custom code, let me know, as I&amp;#8217;d love to find out.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/mnYVMAuZTto" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/09/22/loading-custom-code-in-rails</feedburner:origLink></entry>
 
 <entry>
   <title>Switching to Rails</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/YHLJxyhB6uM/switching-to-rails" />
   <updated>2008-09-18T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/09/18/switching-to-rails</id>
   <content type="html">&lt;p&gt;For a while now I&amp;#8217;ve been &lt;span style="text-decoration: line-through;"&gt;obsessed&lt;/span&gt; working with Ruby on Rails. Rails has caused me to switch from doing .&lt;span class="caps"&gt;NET&lt;/span&gt;/&lt;span class="caps"&gt;ASP&lt;/span&gt;.&lt;span class="caps"&gt;NET&lt;/span&gt; development on my desktop PC using Windows XP to owning a Mac Mini and putting Ubuntu on Dell laptop. Obviously, this is a huge change, and I&amp;#8217;m going to explain why I&amp;#8217;ve switched.&lt;/p&gt;
&lt;h3&gt;Rails is a combination of software engineering principles and web programming best practices.&lt;/h3&gt;
&lt;p&gt;In this respect Rails is a dream: Active Record. RESTful architecture. Built-in xml/json/etc web services. &lt;span class="caps"&gt;TDD&lt;/span&gt;/&lt;span class="caps"&gt;BDD&lt;/span&gt; practices. I could go on and on, but all that matters is &lt;strong&gt;writing Rails applications is an enjoyable&lt;/strong&gt; &lt;strong&gt;and fun process&lt;/strong&gt;. You&amp;#8217;re not writing &lt;a href="http://www.php.net/"&gt;scripts for pages&lt;/a&gt;, not having to worry about &lt;a href="http://asp.net"&gt;the nuts and bolts&lt;/a&gt; of creating a site, or &lt;a href="http://java.sun.com/products/ejb/"&gt;dealing with painful &lt;span class="caps"&gt;XML&lt;/span&gt; files&lt;/a&gt;. Convention over configuration is a real path to productivity, and it&amp;#8217;s going to take the other competing systems a long time to catch up to the headway that Rails is making on a daily basis. Rails isn&amp;#8217;t the solution to everything, and &lt;a href="http://www.zeitgeist.com/wp-content/uploads/2008/06/failwhale.png"&gt;it certainly has had it share of growing pains&lt;/a&gt;, but it&amp;#8217;s being proven again and again as the most efficient way to create data-driven web applications that are very reliable and follow web standards.&lt;/p&gt;
&lt;h3&gt;Tools on *nix based systems are a lot better for Rails development.&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://java.sys-con.com/node/313594"&gt;&lt;span class="caps"&gt;DHH&lt;/span&gt; puts it best&lt;/a&gt;:&lt;br /&gt;
&lt;p style="padding-left: 30px;"&gt;&lt;em&gt;The stigma of being a Web programmer still using Windows will increase.&lt;/em&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;For me, it&amp;#8217;s not that much of a stigma, but more of a practical issue. The power of the Unix command line combined with tools like Textmate makes development on &lt;span class="caps"&gt;OSX&lt;/span&gt; and Linux machines for Rails a &lt;span class="caps"&gt;LOT&lt;/span&gt; easier. The tools on the Windows side are there, but they&amp;#8217;re usually not as powerful and not as easy to set up. Cygwin is piss slow. Most of the non-Visual Studio text editors suck. The command line sucks, and &lt;a href="http://litanyagainstfear.com/blog/2008/03/20/pimping-the-windows-command-line/"&gt;I tried really hard to make it not suck&lt;/a&gt;. &lt;a href="http://blog.mmediasys.com/2008/03/06/is-windows-a-supported-platform-for-ruby-i-guess-not/"&gt; Even Ruby is slower&lt;/a&gt;! All of this pain goes away on &lt;span class="caps"&gt;OSX&lt;/span&gt;/Ubuntu. Rails would be a lot different if it started on Windows, and I wonder if it would really be the same platform. For now though, I&amp;#8217;m loving the productivity boost that I&amp;#8217;m experencing and trying out different operating systems, and it serves my needs well.&lt;/p&gt;
&lt;h3&gt;Bleak future of .&lt;span class="caps"&gt;NET&lt;/span&gt; development.&lt;/h3&gt;
&lt;p&gt;This one will probably get me flamed the most. It&amp;#8217;s not that I don&amp;#8217;t like .&lt;span class="caps"&gt;NET&lt;/span&gt;, it&amp;#8217;s just that I couldn&amp;#8217;t see myself using it any more professionally. I&amp;#8217;m really not a fan of VB.&lt;span class="caps"&gt;NET&lt;/span&gt;, especially compared to Ruby. It&amp;#8217;s a cruft filled language that &lt;a href="http://www.panopticoncentral.net/archive/2007/11/14/22589.aspx"&gt;makes me feel like Mort when writing it.&lt;/a&gt; Great things are possible with the language, but the result is so unreadable and ugly that I don&amp;#8217;t feel it&amp;#8217;s worth it anymore to use, especially if I can choose not to. C# on the other hand I love and always will, especially over Java.&lt;/p&gt;
&lt;p&gt;What scares me more about .&lt;span class="caps"&gt;NET&lt;/span&gt; is where&amp;#8217;s it&amp;#8217;s going: Silverlight and &lt;span class="caps"&gt;WPF&lt;/span&gt;. &lt;span class="caps"&gt;WPF&lt;/span&gt; is supposed to be an awesome new platform that makes it easier for both programmers and designers to collaborate and create great applications.&lt;strong&gt; Seriously though, where are the great &lt;span class="caps"&gt;WPF&lt;/span&gt; applications? &lt;/strong&gt;Why haven&amp;#8217;t we heard as much about them, as say, the newest iPhone apps? I could say the same for Silverlight. Oh wait, the Olympics. ooh, Yahoo Messenger! Whatever. Nothing is going to kill Flash&amp;#8217;s market share.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m sure that things have changed since I was heavy into (bleeding edge) .&lt;span class="caps"&gt;NET&lt;/span&gt; development 6-9 months ago, but still there seems to be no killer app for &lt;span class="caps"&gt;WPF&lt;/span&gt; or Silverlight yet. Until that happens they&amp;#8217;ll just suck like everything else. I&amp;#8217;d love to be proven wrong on this point, so if you know of one please show me.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve switched away from Windows or even if you&amp;#8217;ve become a Rubyist/Pythonista in recent times, let me know what your experiences have been. For now on my blog posts will hopefully be a bit more frequent, and will chronicle various quirks and fun things I&amp;#8217;ve found during my Rails journeys.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/YHLJxyhB6uM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/09/18/switching-to-rails</feedburner:origLink></entry>
 
 <entry>
   <title>Raytracers, snowflakes, and Pac-Man, oh my!</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/FWXnzhbT-30/raytracers-snowflakes-and-pac-man-oh-my" />
   <updated>2008-05-23T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/05/23/raytracers-snowflakes-and-pac-man-oh-my</id>
   <content type="html">&lt;p&gt;So yeah, this is pretty much what I&amp;#8217;ve been up to for the past, oh, 3 months/1 quarter of school. These are a few of the projects I&amp;#8217;ve done for my Computer Graphics 2 class (which I just got an A in, booyah!)&lt;/p&gt;
&lt;p&gt;First up, the classic CG application, &lt;a href="http://litanyagainstfear.com/projects/q-tracer"&gt;a ray tracer&lt;/a&gt; complete with &lt;a href="http://twitter.com/mittense/statuses/805976194"&gt;phongphongphong&lt;/a&gt; shading, procedural shading on the floor, reflection, transmission, and even some tone reproduction.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="/images/reinhard88.png"&gt;&lt;img class="size-medium wp-image-63" title="reinhard88" src="/images/reinhard88-300x233.png" alt="" width="300" height="233" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Secondly, my quarter long personal project, a simple particle system/b-spline curve generator in &lt;span class="caps"&gt;XNA&lt;/span&gt;, dubbed &lt;a href="http://litanyagainstfear.com/projects/q-blizzard"&gt;Q-Blizzard&lt;/a&gt;. Turned out to be quite pretty, not exactly configurable though.&lt;br /&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="/images/qblizzfinal.png"&gt;&lt;img class="size-medium wp-image-73" title="qblizzfinal" src="/images/qblizzfinal-300x233.png" alt="" width="300" height="233" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;/p&gt;
&lt;p&gt;And finally, an image that won me a $25 Barnes and Noble gift certificate in the Pixar Renderman Shader contest. I won third place out of around 30 images! &lt;a href="http://rekaeuqs1.googlepages.com/"&gt;My roommate&lt;/a&gt; noted that I should have added an &lt;a href="http://icanhascheezburger.files.wordpress.com/2007/05/nom-nom-nom.jpg"&gt;OM &lt;span class="caps"&gt;NOM&lt;/span&gt; &lt;span class="caps"&gt;NOM&lt;/span&gt;&lt;/a&gt; caption in for kicks.&lt;/p&gt;
&lt;p style="text-align: center;"&gt;&lt;a href="/images/part2.png"&gt;&lt;img class="size-medium wp-image-53" title="part2" src="/images/part2-300x225.png" alt="" width="300" height="225" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Hopefully this will mark my return to regular blogging (going to try monday, wednesday, friday) for the summer and onward. Hell, if &lt;a href="http://twitter.com/mittense"&gt;mittens&lt;/a&gt; can keep up his &lt;a href="http://gamedev.net"&gt;Daily GameDev.net&lt;/a&gt; postings for 2 months, I can do it too. Right? &amp;#8230;Right? (I seem to tell myself every few months or so&amp;#8230;)&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/FWXnzhbT-30" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/05/23/raytracers-snowflakes-and-pac-man-oh-my</feedburner:origLink></entry>
 
 <entry>
   <title>Rock Band Rocks.</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/rPe279r1TJk/rock-band-rocks" />
   <updated>2008-03-27T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/27/rock-band-rocks</id>
   <content type="html">&lt;p&gt;It simply does. That is all.&lt;/p&gt;
&lt;p&gt;Oh, you wanted to know why! Well, if you&amp;#8217;re still reading and not playing it, there&amp;#8217;s three reasons why Rock Band is an awesome investment (it&amp;#8217;s still $169.99) for your Xbox 360, PS3, or (soonly) your Wii. First off, the UI is a lot cleaner than Guitar Hero 3&amp;#8217;s.&lt;/p&gt;
&lt;p&gt;Now, do remember that 1-4 people are watching the TV at a time for Rock Band instead of only 1-2 for Guitar Hero 3. However, the Rock Band interface is extremely simple. No complex images on the fretboard, a scoreboard that is easy to see, and the Overdrive meter is so much easier to understand than the star power gauges. All you want to know when you&amp;#8217;re playing either of these games is what your multiplier is and if you can use your star power/overdrive or not. With Guitar Hero 3, they&amp;#8217;re on complete opposite sides of the screen! Also, the star power gauge is made of lights that fill up, and it&amp;#8217;s even harder to see when playing with two players. For Rock Band, all of that information is in one place, at the very bottom of the fretboard, beneath where you&amp;#8217;re looking at most of the time to play notes. Obviously, the team behind Rock Band really looked at how people play Guitar Hero and what&amp;#8217;s essential to see when you&amp;#8217;re playing, and turned that into a brilliant design that&amp;#8217;s easy and fun to play.&lt;/p&gt;
&lt;p&gt;Secondly, the downloadable content rules. Grant it, I haven&amp;#8217;t looked that much into GH3&amp;#8217;s available songs, but Rock Band&amp;#8217;s library continues to grow. My most recent downloads have been Limelight and Working Man from Rush, Crushcrushcrush from Paramore, and the huge Boston song pack. These new songs bring so much replay value to the game it&amp;#8217;s not even funny. Obviously they have all 4 playable parts in the songs, but you can opt to play the downloaded songs in the World Tour mode. So now, I can earn money for new looks and instruments by pretending I&amp;#8217;m Geddy Lee.&lt;/p&gt;
&lt;p&gt;Finally, the drums just rule.  It&amp;#8217;s a completely different experience than the lead/bass guitars, and there&amp;#8217;s something truly enjoyable about banging pretend drums with real drumsticks. It&amp;#8217;s also a huge challenge for me, even on Medium the songs are pretty difficult, especially since the bass pedal is a central component to most songs. It&amp;#8217;s a game controller like no other, one you can beat senselessy and not feel bad about it.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;re not able to get it yourself, at least visit someone&amp;#8217;s house that has it, I assure you that you&amp;#8217;ll definitely feel like a rock star, at least for a few minutes. Heck, if they get the &lt;a href="http://gizmodo.com/344301/rock-band-stage-kit-gives-you-smoke-lights-asthma"&gt;new lights and smoke set&lt;/a&gt;, all you&amp;#8217;ll need are some serious clothes to match.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/rPe279r1TJk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/27/rock-band-rocks</feedburner:origLink></entry>
 
 <entry>
   <title>Why I love Twitter</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/f3RzjymCZEQ/why-i-love-twitter" />
   <updated>2008-03-25T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/25/why-i-love-twitter</id>
   <content type="html">&lt;p&gt;I&amp;#8217;ve become quite a &lt;a href="http://twitter.com/qrush"&gt;twitterholic&lt;/a&gt; the past few days. In fact, let&amp;#8217;s &lt;a href="http://tweetstats.com/graphs/qrush"&gt;check the stats&lt;/a&gt;. Yeah, I&amp;#8217;ve been pretty much addicted the past few days. Why? Well, there&amp;#8217;s a few things I love about Twitter:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Twitter is short, sweet, and easy to use.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;The concept is simple: 140 characters to tell the world what you&amp;#8217;re doing. I don&amp;#8217;t think you can get more simple than that. No complex forms, no huge commitments, just a simple request, and your simple answer. It has a wonderful web interface, and the settings allow you completely customize your page&amp;#8217;s background along with colors for fonts. It&amp;#8217;s just a breeze to use and easy to look at, which is a welcome change compared to Facebook or MySpace.&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;#8217;s an awesome way to network with highly connected bloggers.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think &lt;a href="http://scobleizer.com/2008/03/23/the-secret-to-twitter/"&gt;Scoble puts it best&lt;/a&gt;:&lt;br /&gt;
&lt;blockquote&gt;You&amp;#8217;re communicating to the world that you&amp;#8217;d like to be listened to (golden rule: treat people how you&amp;#8217;d like to be treated).&lt;/blockquote&gt;&lt;/p&gt;
&lt;p&gt;Twitter is becoming the heart of the &lt;a href="http://imgs.xkcd.com/comics/interblag.png"&gt;Interblag&lt;/a&gt;. It&amp;#8217;s what bloggers are doing when they&amp;#8217;re &lt;span class="caps"&gt;NOT&lt;/span&gt; blogging. Obviously yes, we all have our jobs and commitments, but Twitter is a way to connect with those people between their blog, vlogs, or however they communicate with the internet at large. It&amp;#8217;s a way for those who are connected to quickly poll, grow, and comment with their audience. The value to bloggers to be active on Twitter is absolutely critical: these are the people who you &lt;span class="caps"&gt;WANT&lt;/span&gt; to be reading your blog. They&amp;#8217;re the people that will link your blog to others, they know where to share it and who to share it with. They&amp;#8217;re all here folks. Come and find them.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;#8217;s a great way to keep in touch with friends.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;I think &lt;a href="http://www.youtube.com/watch?v=ddO9idmax0o"&gt;Twitter in Plain English&lt;/a&gt; hits the nail on head: Twitter is a way to converse with friends in a way that isn&amp;#8217;t that important to email them, but doesn&amp;#8217;t necessarily demands their instant attention. Of course now, you can use Jabber/&lt;span class="caps"&gt;XMPP&lt;/span&gt; to interface with Twitter. Anyway, I find it to be a neat way to keeping in touch with people I know in the real world online that isn&amp;#8217;t exactly bugging them over &lt;span class="caps"&gt;AIM&lt;/span&gt; or Facebook.  Also, if you&amp;#8217;re concerned about random people like me following your every move, you can make your page private and only allow those you approve to watch your updates.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;It&amp;#8217;s just fun to use!&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;What really gets me with this are the &lt;a href="http://iconfactory.com/software/twitterrific"&gt;fantastic&lt;/a&gt; &lt;a href="http://code.google.com/p/wittytwitter/"&gt;clients&lt;/a&gt; &lt;a href="http://www.kosertech.com/blog/?page_id=5"&gt;that&lt;/a&gt; &lt;a href="http://www.tinytwitter.com/"&gt;seem&lt;/a&gt; &lt;a href="http://pockettweets.com/"&gt;to&lt;/a&gt; &lt;a href="http://twitterfeed.com/"&gt;be&lt;/a&gt; &lt;a href="http://itweet.net/web/indexApp.php"&gt;populating&lt;/a&gt; &lt;a href="http://apps.npike.net/MobileTwitter/"&gt;the&lt;/a&gt; &lt;a href="http://www.twitbin.com/"&gt;net&lt;/a&gt;.  The Twitter &lt;span class="caps"&gt;API&lt;/span&gt; is readily accessible and easy to implement, and that&amp;#8217;s extremely important as it seems that most people use twitter through outside clients or through text messaging rather than their web interface. My personal favorite at the moment is &lt;a href="http://www.twhirl.org"&gt;Twhirl&lt;/a&gt;, which is an Adobe &lt;span class="caps"&gt;AIR&lt;/span&gt; client. It&amp;#8217;s got a neat, clean interface and colors are customizable, so I&amp;#8217;m having fun with it. I rarely have to go to the website anymore, the &lt;span class="caps"&gt;API&lt;/span&gt; is so open that the majority of the functionality is accessible through outside clients.&lt;/ol&gt;&lt;/p&gt;
&lt;p&gt;So, why haven&amp;#8217;t you created a &lt;a href="http://www.twitter.com"&gt;Twitter&lt;/a&gt; account yet? I guarantee you that it&amp;#8217;ll do nothing but help you get your blog known, and connect with others who are on the same quest. Feel free to &lt;a href="http://twitter.com/qrush"&gt;follow me&lt;/a&gt; as well, I&amp;#8217;ll make sure to follow you.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/f3RzjymCZEQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/25/why-i-love-twitter</feedburner:origLink></entry>
 
 <entry>
   <title>Pimping the Windows Command Line</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/YhVMfVjI4Hs/pimping-the-windows-command-line" />
   <updated>2008-03-20T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/20/pimping-the-windows-command-line</id>
   <content type="html">&lt;p&gt;Lately I&amp;#8217;ve noticed that a few of my friends have been able to understand or even be aware of the Windows command line.  I have a hard time myself pulling myself away from Explorer, but sometimes the command line is just quicker. However, it&amp;#8217;s a bit drab by default. Today I&amp;#8217;m going to show you just how you can pimp yours out a bit.&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;First up is a wonderful tool called Console2, which is an open source tabbed command line utility. It allows easy configuration of fonts, colors, the background colors, and even lets you do some really crazy things if you wanted such as adding a background image.  The best feature by far though are its tabs, which I&amp;#8217;m sure if you&amp;#8217;ve ever used IE7+ or Firefox you know how useful they can be for multitasking. Another great feature is that you can set up plenty of keyboard shortcuts if you&amp;#8217;re into that sort of thing.  Check it out here: &lt;a href="http://sourceforge.net/projects/console/"&gt;http://sourceforge.net/projects/console/&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Console is great if you want to fire up a specific program all the time, but I&amp;#8217;m used to slamming WinKey + R and typing &lt;strong&gt;cmd&lt;/strong&gt; so much that it&amp;#8217;s basically embedded into my muscle memory. So, I was looking for configuring the default prompt instead of running another program. Pimping out my command prompt has taken me quite a while to find the perfect configuration that suits my needs, and it&amp;#8217;s constantly changing as I find new things to add. Here&amp;#8217;s what I&amp;#8217;ve done to trick mine out:&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m using Consolas as my font. I absolutely love Consolas and I find it much easier to read than Courier New or the default font that the command window has. Consolas is not available by default and requires a simple registry hack along with a reboot in order to work. I haven&amp;#8217;t had any issues with it thus far, and I highly recommend following &lt;a href="http://www.hanselman.com/blog/UsingConsolasAsTheWindowsConsoleFont.aspx"&gt;Scott Hanselman&amp;#8217;s wonderful tutorial&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I&amp;#8217;m not a  Windows command line user at heart, I was raised during my Computer Science classes to poke around Linux machines. Sadly, certain commands like &lt;strong&gt;ls -la&lt;/strong&gt; come much more naturally to me than &lt;strong&gt;dir /a&lt;/strong&gt;. My solution to this is installing the &lt;a href="http://gnuwin32.sourceforge.net/packages/coreutils.htm"&gt;CoreUtils for Windows&lt;/a&gt; package, which adds most of the core &lt;span class="caps"&gt;GNU&lt;/span&gt; utilities into the command line.  This hack requires installing a package from SourceForge and adding to the &lt;span class="caps"&gt;PATH&lt;/span&gt; environment variable, which are covered in &lt;a href="http://www.askstudent.com/tips/how-to-use-unixlinux-commands-at-the-windows-command-prompt/"&gt;this blog post over at AskStudent.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Finally, I&amp;#8217;m a huge fan of using the &lt;strong&gt;pushd/popd&lt;/strong&gt; commands: push directory and pop directory. Basically it&amp;#8217;s a way to return to directories instead of having to overuse &lt;strong&gt;cd&lt;/strong&gt; or even remember where you were. Luckily, there&amp;#8217;s an easy way to keep track of the amount of directories that have been pushed onto the stack by changing the &lt;span class="caps"&gt;PROMPT&lt;/span&gt; environment variable to:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;code&gt;$p$_$+$g&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;&lt;a href="http://www.askstudent.com/tips/how-to-use-unixlinux-commands-at-the-windows-command-prompt/"&gt;Check out the AskStudent tutorial&lt;/a&gt; to see how to do get to the environment variables window if you don&amp;#8217;t know how. What this does is add + symbols to the command line window as shown in the screenshot. It&amp;#8217;s ridiculously useful, and now I just wish I could figure out how to automagically &lt;strong&gt;pushd &lt;/strong&gt;and &lt;strong&gt;cd &lt;/strong&gt;at the same time.&lt;/p&gt;
&lt;p&gt;If you&amp;#8217;ve got any questions regarding pimping out your command line or other great hacks I&amp;#8217;m missing out on, let me know!&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/YhVMfVjI4Hs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/20/pimping-the-windows-command-line</feedburner:origLink></entry>
 
 <entry>
   <title>Defraggle Rock</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/HywSYjbW7Sc/defraggle-rock" />
   <updated>2008-03-18T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/18/defraggle-rock</id>
   <content type="html">&lt;p&gt;As always, I&amp;#8217;m late to jump on the &lt;strike&gt;fail&lt;/strike&gt;boat, and this time I&amp;#8217;ve decided to do some serious maintenance on my computer. I&amp;#8217;ve had enough of having to rely on System Restore and worrying that I&amp;#8217;ve lost all of my data, or that my computer is on the brink of death. So, I&amp;#8217;m going to start maintaining my system more, and that&amp;#8217;s  starting with keeping my hard drive as tidy and speedy as possible. &lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;My buddy &lt;a href="http://www.theislanddog.com/" target="_blank"&gt;Island Dog&lt;/a&gt; pointed me towards a great tool called &lt;a href="http://www.defraggler.com/"&gt;Defraggler&lt;/a&gt;, and this started my journey.  Essentially, it allows you to really control the defrag process from a drive and individual file level. It also includes the color graph that sadly, Vista removed. Obviously, this tool is pretty much only for power users, as I&amp;#8217;m sure grandma doesn&amp;#8217;t even know the slightest about what a hard drive even is. Partly I&amp;#8217;m glad that Vista streamlined the process of defragmentation, but I have a feeling normal users won&amp;#8217;t be doing it regularly until Windows does it for them or it&amp;#8217;s watered down to one huge button called &amp;#8220;Drive Maintenence&amp;#8221; that does Disk Cleanup, a defrag, and whatever else fun stuff Microsoft decides that your drive needs.  For users like me however, I like having a bit of control. Not too much though, I&amp;#8217;m not a &lt;a href="http://ubergeek.tv/article.php?pid=54"&gt;supervillian&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Anyway, Defraggler is a very neat app. It clearly presents the process, what files need to be moved around, and shows your data being moved around. It also allows you to switch the process priority from normal to background so I can actually use my computer during the process. This is nice for XP, while the visualization helps on Vista.  I find the color graph absolutely fascinating since &lt;a href="http://www.litanyagainstfear.com/blog/2007/11/27/im-afraid-of-low-level-programming/"&gt;I&amp;#8217;m scared to death of low level stuff like this&lt;/a&gt;, but my mind does wonder how defragmentation works under the hood. Maybe someday I will be a supervillian after all&amp;#8230;just definitely not using Linux to control my orbiting brain lasers.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/HywSYjbW7Sc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/18/defraggle-rock</feedburner:origLink></entry>
 
 <entry>
   <title>Turning off the Firehose</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/-7qhuHUcb8E/turning-off-the-firehose" />
   <updated>2008-03-16T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/16/turning-off-the-firehose</id>
   <content type="html">&lt;p&gt;I recently came across &lt;a href="http://www.philonoist.net/2008/03/14/im-done-with-reddit/"&gt;this post&lt;/a&gt; about a user who decided he had enough of the user-generated news community, &lt;a href="http://www.reddit.com"&gt;Reddit&lt;/a&gt;. I&amp;#8217;ve been a Reddit user for a quite some time now, and I&amp;#8217;ve done my share of down voting Ron Paul stories as well submitting silly pictures that have made it onto the front page. Lately though, it&amp;#8217;s become more than a habit to check this site.  &lt;!--more--&gt;I have a very compulsive personality, and I tend to find some sort of deep and intensive joy in small, minute improvements and changes. I know this is the reason why over 70 days of my life were wasted on World of Warcraft, and I&amp;#8217;m pretty sure it&amp;#8217;s the reason why I find programming so fun. Most people would be frustrated by missing a semi-colon and be absolutely stumped by the quest for perfection that compilers demand, but to me it&amp;#8217;s another challenge, another hurdle I know I can overcome. It&amp;#8217;s also the reason why some days I&amp;#8217;d refresh Reddit every 5 to 10 minutes to see if my karma had changed.&lt;/p&gt;
&lt;p&gt;Reddit has been sucking up way too much of my time during the day, and I&amp;#8217;ve decided to put an end to it. All I did was block it through my hosts file to redirect to 127.0.0.1, which works out well since during my work time it directs me to the website that I&amp;#8217;m developing.&lt;/p&gt;
&lt;p&gt;So, I&amp;#8217;m turning off the firehose. I will probably end up blocking Digg and Slashdot as well, and I need to set up Google Reader for my favorite blogs. Yeah, this means I&amp;#8217;ll sacrifice that information intake that my brain is used to, but I feel that time could be used to read the several books I have lying around my room, be it Code Complete or the Mythical Man-Month. My guitar is also gathering plenty of dust, and I have a few side projects that I could be working on as well. Here&amp;#8217;s to less distractions!  Do you have distractions that you could probably do without?&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/-7qhuHUcb8E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/16/turning-off-the-firehose</feedburner:origLink></entry>
 
 <entry>
   <title>5 Things That Video Games Do That Really Make Me Angry</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/MU7NXzzaQkw/5-things-that-video-games-do-that-really-make-me-angry" />
   <updated>2008-03-13T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/13/5-things-that-video-games-do-that-really-make-me-angry</id>
   <content type="html">&lt;p&gt;I&amp;#8217;m sure that this list could be a lot longer, but I&amp;#8217;m going to focus on six issues that really piss me off when I&amp;#8217;m playing video games. If games happen to have more than 2 or 3 of these traits they tend to collect dust in my game cases very quickly, or they will do the same at your local game store. So, without further adieu:&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Not being able to skip cut scenes&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Sometimes, gamers just want to jump into the action. Yes, I know that designers have spent grueling hours working in their wonderful plot into the game, and skipping cut scenes may mean that the gamer will miss out on crucial story elements and possibly even essential game hints. Well, that&amp;#8217;s just too bad, and sometimes I don&amp;#8217;t mind taking that kind of chance. Perhaps I just need to vent a bit by blowing up some aliens or lighting a few people on fire. Another gripe I have with this is that some games don&amp;#8217;t make the option apparent if it is available at all during a cut scene. Please make them optional. I beg you. One game I played recently that either I couldn&amp;#8217;t skip or couldn&amp;#8217;t figure out how to skip was Metroid Prime 3: Corruption. It&amp;#8217;s now collecting dust in my cd case.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Bad artificial intelligence&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This one is probably hated by most gamers, and we&amp;#8217;ve all seen it. The AI runs enemy monsters or units into a wall, they can&amp;#8217;t figure out how to path correctly to follow you, or perhaps the designer of the game just didn&amp;#8217;t test the AI in the way that you think it should work. Well, it pretty much sucks when this happens. Rarely though is it a reason to stop playing a game, but when the AI is good it&amp;#8217;s easy to tell, and in some cases it&amp;#8217;s actually frightening.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Hard to use menus&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a killer when you&amp;#8217;re trying to get things done fast. One might think that this kind of behavior is a no brainer and should be somewhat of an industry standard by now, but sometimes game designers absolutely fail at the 2D portions of the UI. One example I love is simple and definitely proven are any of Valve&amp;#8217;s game menus. They are somewhat of a convention in Valve&amp;#8217;s games and they present easy options first for beginner users while also allowing more experienced users to easily whip through menu choices. Crappy menus and other UI options are very easy to spot. One of the worse things you can do is slow down a user as they&amp;#8217;re going through the menus. Warcraft 3 does this with the stupid chain menu system, which I&amp;#8217;ve grown to loathe. Sometimes games can fail completely in both usability and readability, the biggest example of this I can think of is Dead Rising. I couldn&amp;#8217;t even read the menus since the text was horrible and it was laid out poorly. Ugh.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Collect-a-thons&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;When I was 10, I used be able to stand running around various platformer worlds gathering every last bit that games could offer me. Hell, I even got 101% in Donkey Kong 64, but I wasn&amp;#8217;t hardcore enough to get all the stars in Super Mario 64 or all of the golden skulltulas in Ocarina of Time. Now however, I absolutely can&amp;#8217;t stand it. Games can get by without them just fine, but for some reason developers continue to inject these endless quests. World of Warcraft could even be considered one giant collect-a-thon. I guess that this mentality appeals to some gamers, but I&amp;#8217;m over it. And yes, I did beat Super Mario Galaxy, just with the minimum amount of stars.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Voice chat&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Ah, the bane and boon of online gaming. I&amp;#8217;ve become somewhat jaded to this miracle of modern technology, and now I&amp;#8217;m absolutely sick of it. If I&amp;#8217;m playing an &lt;span class="caps"&gt;FPS&lt;/span&gt;, I&amp;#8217;m there to snipe someone&amp;#8217;s head off or lay a trap to waste them with, and not to listen how their day went or who in pop culture is ridiculously hot and said nerd doesn&amp;#8217;t have a chance with. I don&amp;#8217;t want to hear about how someone is cheating, hacking, or just being a bag of douche in the game. Get over yourself, and shut up. One of the first things I&amp;#8217;ll do with games that have voice chat embedded is turn it off immediately. I&amp;#8217;d rather leave voice chat to external programs that can be dedicated to the sole purpose of transmitting voice instead of having to build all of that extra functionality into the game.&lt;/p&gt;
&lt;p&gt;What things tick you off about video games? I&amp;#8217;m sure there&amp;#8217;s irksome moments that occur on a daily basis for any gamer, and here&amp;#8217;s your chance to rant about it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/MU7NXzzaQkw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/13/5-things-that-video-games-do-that-really-make-me-angry</feedburner:origLink></entry>
 
 <entry>
   <title>Flash and WPF: A pain in the ass.</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/nHE1Hyh75h0/flash-and-wpf-a-pain-in-the-ass" />
   <updated>2008-03-09T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2008/03/09/flash-and-wpf-a-pain-in-the-ass</id>
   <content type="html">&lt;p&gt;I could say this about &lt;span class="caps"&gt;WPF&lt;/span&gt; as a whole, but when things actually work with &lt;span class="caps"&gt;WPF&lt;/span&gt; it&amp;#8217;s so damn smooth I can&amp;#8217;t help but feel somewhat accomplished. Nevertheless, I had a real pain trying to get an embedded flash player into my &lt;span class="caps"&gt;WPF&lt;/span&gt; app. Why Flash? Why not&amp;#8230;dare I say, Silverlight? Well, I&amp;#8217;m building a small app that plays YouTube videos, so obviously Flash makes sense. First, here&amp;#8217;s some lessons I learned while on this wonderfully frustrating journey:&lt;!--more--&gt;&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;&lt;strong&gt;For this instance, the &lt;code&gt;WebBrowser&lt;/code&gt; control blows.&lt;/strong&gt;: My first attempt was to add an embed tag into a &lt;code&gt;WebBrowser&lt;/code&gt; control, which is put inside of a &lt;code&gt;WindowsFormsHost&lt;/code&gt; control, which is how .&lt;span class="caps"&gt;NET&lt;/span&gt; encapsulates pre-3.0 controls. This did not work in the long run because first of all, IE throws script errors when you try to play YouTube&amp;#8217;s .&lt;span class="caps"&gt;SWF&lt;/span&gt; files, and also when resizing the background flashes and looks like utter garbage. Don&amp;#8217;t get me wrong, it has its uses. Just not here.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Pre-packaged solutions also suck.&lt;/strong&gt;: There&amp;#8217;s a few flash solutions out there that I tried, either got working and &lt;a href="http://www.f-in-box.com/dotnet/order.html"&gt;had to pay ridiculous amounts for&lt;/a&gt; (oh look, $1000 off this month!), or plainly didn&amp;#8217;t work at all. Just don&amp;#8217;t use them.&lt;/li&gt;
	&lt;li&gt;&lt;strong&gt;Google is your only hope.&lt;/strong&gt;: Basically any problem I&amp;#8217;d come across I&amp;#8217;d have to google immediately, and answers were sparse. The solution I finally ended up with was embedded ActiveX objects, which I also had a lot of trouble with, hence this blog post.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So, here&amp;#8217;s an overview of what I did, and how you can get it working. A small note, I&amp;#8217;m targeting .&lt;span class="caps"&gt;NET&lt;/span&gt; 3.0.&lt;/p&gt;
&lt;ol&gt;
	&lt;li&gt;Reference &lt;code&gt;Interop.ShockwaveFlashObjects&lt;/code&gt; and &lt;code&gt;AxInterop.ShockwaveFlashObjects&lt;/code&gt; in your project. The latter assembly may only be the necessary one, but back in the 2.0 world the forms designer added both. These DLLs will be included in the download project, but you can usually find them in the &lt;span class="caps"&gt;COM&lt;/span&gt; tab of the Add Reference dialog.&lt;/li&gt;
	&lt;li&gt;For whatever &lt;code&gt;UserControl&lt;/code&gt; or &lt;code&gt;Window&lt;/code&gt; you want to show this on, set up a &lt;code&gt;WindowsFormsHost &lt;/code&gt;object as well as a &lt;code&gt;AxShockwaveFlash &lt;/code&gt;object. (Make sure to include a &lt;code&gt;using AxShockwaveFlashObjects;&lt;/code&gt; as well)&lt;/li&gt;
	&lt;li&gt;In the &lt;code&gt;Loaded&lt;/code&gt; event for your &lt;code&gt;UserControl&lt;/code&gt;/&lt;code&gt;Window&lt;/code&gt;, &lt;span class="caps"&gt;NOT&lt;/span&gt; the constructor, set up these objects and set the &lt;code&gt;Child&lt;/code&gt; property of the &lt;code&gt;WindowsFormsHost&lt;/code&gt; to the &lt;code&gt;AxShockwaveFlash&lt;/code&gt; object you made. If you don&amp;#8217;t do it in this order, or do this in the constructor, ActiveX gets quite angry at you.&lt;/li&gt;
	&lt;li&gt;Make sure to add the &lt;code&gt;WindowsFormsHost&lt;/code&gt; to the &lt;code&gt;UserControl&lt;/code&gt;/&lt;code&gt;Window&lt;/code&gt;&amp;#8230;this is one of those gotchas that can save you some time.&lt;/li&gt;
	&lt;li&gt;Now you can set the &lt;code&gt;Movie&lt;/code&gt; property of the flash player, and call &lt;code&gt;Play()&lt;/code&gt; and it should work fine. If not, leave a comment and I&amp;#8217;ll help you out.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Here&amp;#8217;s an example project for you to get started with:&lt;/p&gt;
&lt;p style="text-align:center;"&gt;&lt;a title="Flash WPF Example Project" href="http://litanyagainstfear.com/wp-content/uploads/2008/10/freepopcorn.zip"&gt;&lt;img src="http://litanyagainstfear.com/wp-content/uploads/2008/03/flashwpf.jpg" alt="Flash WPF pic" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/nHE1Hyh75h0" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2008/03/09/flash-and-wpf-a-pain-in-the-ass</feedburner:origLink></entry>
 
 <entry>
   <title>I&amp;#8217;m afraid of low level programming.</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/hgzsFkmNz4M/im-afraid-of-low-level-programming" />
   <updated>2007-11-27T00:00:00-08:00</updated>
   <id>http://litanyagainstfear.com/blog/2007/11/27/im-afraid-of-low-level-programming</id>
   <content type="html">&lt;p&gt;It&amp;#8217;s running right now. Beneath those fancy windows. Under the hood. Shifting bits. Moving words in memory. And its scares the crap out of me.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt; Why? It&amp;#8217;s a facet of human nature: what you don&amp;#8217;t understand, you&amp;#8217;re afraid of. But what can a novice programmer do about it? One of the main reasons I chose software engineering as a major is because I don&amp;#8217;t want to have to think about the lowest level of computing power if I didn&amp;#8217;t need to. I want to solve problems, help the company I&amp;#8217;m at succeed, and enhance my knowledge of the craft.&lt;/p&gt;
&lt;p&gt;However, I&amp;#8217;m starting to learn that I may need to return to the &amp;#8216;roots&amp;#8217; of programming. I&amp;#8217;m taking a computer graphics course this semester, and it will be the most C/C++ programming that I&amp;#8217;ve done in a while. Now grant it, I have had other classes where we did assembly and C, but not the entire course.  It just seems to me that in order to really solve a problem efficiently, you should understand some of the underpinnings and inner workings of what you are programming.&lt;/p&gt;
&lt;p&gt;So, what&amp;#8217;s my solution to this? Well, for now, tinker around with C++ and maybe even poke around the &lt;a href="http://gregs-blog.com/2007/11/25/update-quake-2-net-port-with-visual-studio-2008-v90-and-managed-c/" target="_blank"&gt;Managed C++ Quake port&lt;/a&gt;. Being in the &lt;a href="http://steve-yegge.blogspot.com/2006/03/execution-in-kingdom-of-nouns.html" target="_blank"&gt;Kingdom of Nouns&lt;/a&gt; ruled by Java and .&lt;span class="caps"&gt;NET&lt;/span&gt; is nice though, and it really does let you focus on the problem at hand. Sometimes though, I wonder if escaping from those magical places allows the programmer to really dive into the task at hand and nail it down. I don&amp;#8217;t even want to get into some of those esoteric languages that &lt;a href="http://programming.reddit.com" target="_blank"&gt;I happen to see way too much about&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;One day I&amp;#8217;ll get around to reading &lt;a href="http://en.wikipedia.org/wiki/K_and_R" target="_blank"&gt;K &amp;amp; R&lt;/a&gt; or &lt;a href="http://www.amazon.com/CIL-Programming-Under-Hood-NET/dp/1590590414" target="_blank"&gt;&lt;span class="caps"&gt;CIL&lt;/span&gt; Under the Hood&lt;/a&gt;, but until then&amp;#8230;Are there any other ways to dispel this fear? Let me know what you&amp;#8217;ve done to get over it.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/hgzsFkmNz4M" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2007/11/27/im-afraid-of-low-level-programming</feedburner:origLink></entry>
 
 <entry>
   <title>Digg Labs: Flash doesn&amp;#8217;t suck all the time.</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/oPq_Tfl0IUw/digg-labs-flash-doesnt-suck-all-the-time" />
   <updated>2007-10-31T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2007/10/31/digg-labs-flash-doesnt-suck-all-the-time</id>
   <content type="html">&lt;p&gt;Don&amp;#8217;t get me wrong. I&amp;#8217;m not an expert on Flash. I haven&amp;#8217;t even made anything special in flash. Yeah, I can tween a circle and bounce it around the stage, and that&amp;#8217;s the extent of my Flash knowledge. One thing I do know about it: if you want to drive traffic from Google searches, you&amp;#8217;re better off not using it. Some bloggers even claim &lt;a href="http://www.seoresearcher.com/seo-flash-is-evil-five-big-reasons-not-to-use-flash.htm" target="_blank"&gt;its use to be evil&lt;/a&gt;.  Now I&amp;#8217;m sure there&amp;#8217;s a lot of Adobe fans are ready and willing to tear me a new one by now with arguments about how Flex and &lt;span class="caps"&gt;AIR&lt;/span&gt; will change the face of the interweb, but it&amp;#8217;s my opinion and always will be that your website&amp;#8217;s &lt;span class="caps"&gt;MAIN&lt;/span&gt; content should &lt;span class="caps"&gt;NEVER&lt;/span&gt; be in Flash. Let&amp;#8217;s look at the letters you type into that address bar of your browser at least once every day: &lt;a href="http://en.wikipedia.org/wiki/Http" target="_blank"&gt;&lt;span class="caps"&gt;HTTP&lt;/span&gt;&lt;/a&gt;. Hyper. Text. Not animations, or effects, but text. Until that protocol changes I doubt Flash will ever be used as a serious web design platform.&lt;/p&gt;
&lt;p&gt;&lt;!--more--&gt;&lt;/p&gt;
&lt;p&gt;Once again, don&amp;#8217;t get me wrong. Flash has its uses. In fact, it&amp;#8217;s completely changed how we use the web. &lt;a href="http://www.newgrounds.com" target="_blank"&gt;Newgrounds &lt;/a&gt;and &lt;a href="http://www.youtube.com" target="_blank"&gt;YouTube&lt;/a&gt; immediately spring to mind, as they spawned entire communities and one could say even industries. Flash even has practical uses within sites, such as &lt;a href="http://swfupload.mammon.se/" target="_blank"&gt;SWFUpload&lt;/a&gt; or various visualization tools that are used &lt;a href="http://www.google.com/analytics/features.html"&gt;even inside of Google&amp;#8217;s own pages&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;The real magic of Flash is combining its content together with publicly available APIs and doing what Flash does best, even better than Java in some respects: being platform independent. &lt;a href="http://labs.digg.com" target="_blank"&gt;Digg Labs&lt;/a&gt; is a perfect example of this, and their contests are a testament to the real future of Flash and its real use on the internet. Digg Labs is the perfect mash-up: content generated by users and displayed in a (semi) useful, interactive, and fun way. Now, you can even get them to be your screensaver on Windows or &lt;span class="caps"&gt;OSX&lt;/span&gt;. I tried for a long while to turn some of the Digg Labs .swf files into screensavers before, but it&amp;#8217;s quite a nightmare without the right tools, and all the right data from the Digg servers.&lt;/p&gt;
&lt;p&gt;What&amp;#8217;s so special about Digg Labs creations is that unlike other visualizations of just raw data, be it traffic to your website or your network speed shown to you on a speedometer, you can actually interact with it. You can see the user who just dugg that story, and you can go check it out for yourself. Yes, it may be flooded with an overwhelming amount of Ron Paul stories at the moment, but at least it&amp;#8217;s not the HD-&lt;span class="caps"&gt;DVD&lt;/span&gt; encryption key, or even worse.&lt;/p&gt;
&lt;p&gt;Other websites out there really need to look into Flash for this purpose. This is a unique and fun way to engage your community while providing an actual useful way to access your site&amp;#8217;s data. Be it Reddit, which I would literally love to see an exact clone of Digg Labs for (or even both together in one app&amp;#8230;Blasphemy!), or Facebook, or any Web 2.0 site, they could really use some Flash visualization/interaction apps that can run on your desktop via a screensaver, Flash executable, or &lt;span class="caps"&gt;AIR&lt;/span&gt;. Imagine pictures from your friends on Facebook showing up in real time on your desktop or Del.icio.us links pouring in under a certain tag in a nice animated fashion.  All of the buzz about &lt;a href="http://www.techcrunch.com/2007/10/30/details-revealed-google-opensocial-to-be-common-apis-for-building-social-apps/"&gt;Google&amp;#8217;s Open Social&lt;/a&gt; and bringing out more APIs into the public for use makes this the perfect environment for more Flash goodness like Digg Labs to happen.&lt;/p&gt;
&lt;p&gt;So yeah, Flash doesn&amp;#8217;t suck all the time. Its niche on the internet continues to expand, but some part of me hopes I&amp;#8217;ll never have to learn more than how to move that red circle around the stage.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/oPq_Tfl0IUw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2007/10/31/digg-labs-flash-doesnt-suck-all-the-time</feedburner:origLink></entry>
 
 <entry>
   <title>Why every programmer should play NetHack</title>
   <link href="http://feedproxy.google.com/~r/LitanyAgainstFear/~3/STHtZJcgPiM/why-every-programmer-should-play-nethack" />
   <updated>2007-10-29T00:00:00-07:00</updated>
   <id>http://litanyagainstfear.com/blog/2007/10/29/why-every-programmer-should-play-nethack</id>
   <content type="html">&lt;p&gt;I have a place in my heart for an obscure text based game called &lt;a href="http://www.nethack.org/" title="nethack.org" target="_blank"&gt;NetHack&lt;/a&gt;. This game is an archetype &lt;a href="http://en.wikipedia.org/wiki/Roguelike" title="Wikipedia entry on Roguelike." target="_blank"&gt;roguelike&lt;/a&gt; game, and I&amp;#8217;ve been playing it for over a year now. Not a year in actual game time (yes, I used to play WoW, a lot), but I&amp;#8217;ve been into NetHack seriously for the past 6 months or so, and it still kicks my ass. However, I&amp;#8217;ve managed to &lt;a href="http://alt.org/nethack/player-stats.php?player=DoctorNick" title="My Stats"&gt;ascend (beat the game) twice&lt;/a&gt;, and I can even play it on my Motorola Q.&lt;/p&gt;
&lt;p&gt;How has such a game captured my attention for so long &lt;strong&gt;and&lt;/strong&gt; directly apply towards my career as a software developer? Let me enlighten you as to why I think you should play it, and why it still matters so much.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;NetHack is &lt;span class="caps"&gt;HARD&lt;/span&gt;.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;No, this isn&amp;#8217;t really a reason to play the game. However, it is a testament to how &lt;span class="caps"&gt;NOT&lt;/span&gt; to make your software. The amount of frustration I&amp;#8217;ve had to go through in order to ascend has been utterly ridiculous. Hell, when I first started playing the game, I didn&amp;#8217;t even know there was an ending. I just played because I like to explore. A classic idiom in web development is &lt;a href="http://www.sensible.com/chapter.html" title="Don't Make me think!" target="_blank"&gt;&amp;#8220;Don&amp;#8217;t Make Me Think!&amp;#8221;&lt;/a&gt; I had to do completely the opposite in order to get anywhere in NetHack. One has to remember what monsters do, not to put on that piece of armor because it might be cursed, not to drink from that fountain because snakes might pour out and kill me, and so on and so forth. Well, perhaps under the thousands of lines of C that compose NetHack, someone didn&amp;#8217;t think about that, but I for damn well sure am not going to make sure whoever uses my program won&amp;#8217;t have to think twice about performing actions.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;After 20+ years of development, it still has a vibrant community of users.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This really should be the goal of any community online going forward, be it you&amp;#8217;re creating a forum for users of your software to request features, or you&amp;#8217;re making a wiki-based community, or any of the above. Where will your community be in 20 years? Will it have &lt;a href="http://alt.org/nethack/"&gt;vibrant fan-made sites&lt;/a&gt;? Will it have a &lt;a href="http://nethack.wikia.com"&gt;fleshed out wiki&lt;/a&gt;? How about a &lt;a href="http://groups.google.com/group/rec.games.roguelike.nethack/topics"&gt;newsgroup&lt;/a&gt;? Or will it fizzle and be forgotten? The lesson here is that in order to make your community bloom you need to first plant the seeds.  Dig in a bit and you&amp;#8217;ll find that behind this game of &lt;span class="caps"&gt;ASCII&lt;/span&gt; characters and telnet terminals there lies a deep and invested group of users passionate about the game and willing to help others how to play. If it wasn&amp;#8217;t for the community and the &amp;#8220;spoilers&amp;#8221; it offers, I&amp;#8217;d probably still be wandering around the Dungeons of Doom aimlessly.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&amp;#8220;The DevTeam thinks of everything.&amp;#8221;&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;This is a classic motto of NetHack&amp;#8217;s development team within the community. The level of complexity of the game is ridiculous. Allow me to elaborate on one specific monster, the &lt;a href="http://en.wikipedia.org/wiki/Cockatrice"&gt;cockatrice&lt;/a&gt;. This monster is one of the most feared in the game because it can turn you to stone. Ah, but here&amp;#8217;s the rub: once slain, you can wield its corpse and stone foes. And this is where the DevTeam starts thinking. You picked it up with no gloves on? You turn to stone. Oops, you tripped down some stairs because you were carrying too much? Stoned. Hit the wrong key and now you&amp;#8217;re eating it? Bam, stoned. The list goes on, and on and on. However, the point is clear: the people behind NetHack have really thought of every possible case, every possible scenario in the game, and there&amp;#8217;s a consequence or action for it.&lt;/p&gt;
&lt;p&gt;I tend to strive for this goal now when I&amp;#8217;m coding. I&amp;#8217;d be proud if my program was so robust, so tested, and so mature that it could be said that I thought of everything. And even then, that&amp;#8217;s still a long shot, perhaps even impossible. In the short term, I find myself trying to think of every possible case that I can while I&amp;#8217;m programming, and I hope someday I&amp;#8217;ll be known to be able to really &amp;#8220;think of everything.&amp;#8221;&lt;/p&gt;
&lt;p&gt;Not convinced yet? Check out &lt;a href="http://archive.gamespy.com/legacy/fargo/nethack_a.shtm" target="_blank"&gt;these old&lt;/a&gt; &lt;a href="http://archive.gamespy.com/legacy/halloffame/nethack_a.shtm" target="_blank"&gt;articles&lt;/a&gt; from GameSpy about NetHack.  And if you&amp;#8217;ve played NetHack (and/or if you&amp;#8217;re a coder), leave a comment and let me know what you think about how NetHack relates to your &lt;em&gt;other &lt;/em&gt;9 to 5 job. And for those of you concerned, there are &lt;a href="http://nethack.wikia.com/wiki/Graphical_user_interface"&gt;several &lt;span class="caps"&gt;GUI&lt;/span&gt; versions of the game&lt;/a&gt; in the case that you&amp;#8217;d rather look at pretty pictures instead of characters.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/LitanyAgainstFear/~4/STHtZJcgPiM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://litanyagainstfear.com/blog/2007/10/29/why-every-programmer-should-play-nethack</feedburner:origLink></entry>
 
 
</feed>
