<?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:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0">
 
 <title>Panasonic Youth</title>
 
 <link href="http://robsanheim.com/" />
 <updated>2012-11-27T11:45:28-08:00</updated>
 <id>http://robsanheim.com/</id>
 <author>
   <name>Rob Sanheim</name>
   <email>rsanheim@gmail.com</email>
 </author>
 
 
 
 <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/atom+xml" href="http://feeds.feedburner.com/PanasonicYouth" /><feedburner:info uri="panasonicyouth" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><geo:lat>43.121416</geo:lat><geo:long>-89.349688</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-nc-sa/2.0/" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry>
   <title>Seven Months at Github</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/cQkwVuF95DI/" />
   <updated>2012-11-27T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2012/11/27/seven-months-at-github</id>
   <content type="html">&lt;p&gt;I just passed my seven month anniversary at GitHub, and working here has been amazing.
GitHub is a pretty special company, and I thought I would take a moment to reflect on what makes
it special and some lessons I have learned over the past half year.&lt;/p&gt;

&lt;h2&gt;Great People above all else&lt;/h2&gt;

&lt;p&gt;The quality of people at GitHub enables every other unique and powerful thing
about our company.  We don't have deadlines, top down management, or much in the way of
rules or process &lt;strong&gt;because&lt;/strong&gt; GitHubbers are self motivated, smart, and
passionate.  While it is nice to imagine a world where all companies could be
like GitHub and optimize for happiness and get rid of management, the reality is that you
need awesome people whose &lt;strong&gt;happiness is derived&lt;/strong&gt; from creating a great product for that
to work.&lt;/p&gt;

&lt;h2&gt;Positive Peer Pressure&lt;/h2&gt;

&lt;p&gt;We thrive on very loose process and self management because of positive peer pressure.
GitHubbers want to work on hard, important problems to get their peers to also work on them.
We fix nasty bugs and work the support queue because making customers happy is awesome, and it also
earns the respect of our peers, even if the work is thankless sometimes.&lt;/p&gt;

&lt;h2&gt;GitHub Hiring&lt;/h2&gt;

&lt;p&gt;GitHub hires great people.  We put a lot into hiring and screening of
candidates.  That doesn't mean draining, three day interviews with
comp sci heavy interviews.  You won't have any GitHubbers glaring at you while you try to implement
Quicksort on a whiteboard.  There was a bit of coding in my interview, but it
was actually just pairing on the GitHub codebase, working on a real
problem that my interviewee happened to be working with that day.  It was really
just an exercise to see how I approached solving problems and worked with
other people.  By the time you get to the office for an in-person interview,
it is assumed you have the basic chops to work at GitHub, and the rest is culture fit and
personality fit.&lt;/p&gt;

&lt;h2&gt;Culture of Shipping&lt;/h2&gt;

&lt;p&gt;GitHub has a culture of shipping like nowhere I've seen.
Even when it comes to things that many may not think of as easily
"shippable", like architecture, process change or redesigns.  For example:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;creating a pull request with a spike demonstrating a small (but critical) piece of an
architectural change&lt;/li&gt;
&lt;li&gt;drafting a post in our internal ideas app, with references, diagrams, and examples,
showing how to improve our teamwork&lt;/li&gt;
&lt;li&gt;sketching a redesign idea on paper and uploading a scan to a pull request&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;So while it can be valuable to have conversations about things like
architecture, process, or design, it is more valuable to take concrete action,
even as fuel to move the conversation forward.  Any experienced software
development has seen "bikeshedding" kill productivity - endless philosophical debates and
arguments driven by ego instead of practical value.  Focusing on actions and
shipping cuts through the crap and keeps things progressing forward.&lt;/p&gt;

&lt;h2&gt;Anarchist Structure&lt;/h2&gt;

&lt;p&gt;Much is made of the flat, nearly non-existant management style of GitHub. Yes, it really is true that you can work on whatever you want.
Yes, that means that I could drop everything and work on a Haskell
rewrite of github/github, but in reality that just doesn't happen.&lt;/p&gt;

&lt;p&gt;It turns out when you hire self motivated, talented people who want to work with other
really other good people, folks generally work on important stuff.  Bugs get
fixed and crummy things like grunt-work automation and difficult tests still
get written. And if those things get missed on the first pass, peer pressure and
continual review ensure ensure they get done.&lt;/p&gt;

&lt;h2&gt;End&lt;/h2&gt;

&lt;p&gt;It has been a fantasticly good half a year at GitHub.  I have learned so much, shipped some
great software, and look forward to many more years of learnings and shipping.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=cQkwVuF95DI:ArHLdV0lgBw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=cQkwVuF95DI:ArHLdV0lgBw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/cQkwVuF95DI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2012/11/27/seven-months-at-github/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Day 3 Craftsmanship Swap at 8th Light</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/5mQcJt_CUwk/" />
   <updated>2010-07-11T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2010/07/11/day-3</id>
   <content type="html">&lt;p&gt;(note: this was from my &lt;a href="http://en.wikipedia.org/wiki/Software_craftsmanship"&gt;Craftsmanship swap&lt;/a&gt; Thursday, July 8th at 8th Light)&lt;/p&gt;

&lt;p&gt;My last day of the craftsmanship swap at 8th Light was on Thursday.  Doug and I paired more on the DRb/DRbFire fix that we had been discussing and working towards on Wednesday.  The fixes can be found in &lt;a href="http://github.com/dougbradbury/drbfire/commits/master/"&gt;Doug's fork&lt;/a&gt; of DRbFire.&lt;/p&gt;

&lt;p&gt;The actual code changes resulting from our deep dive into DRb were pretty simple in the end.  The hard part was the learning.  We had to have enough understanding of everything in place, which made the code changes self-evident.  I find with most domains, both technical and business related, this is so often the case -- the solution presents itself once you've learned what you need to know.&lt;/p&gt;

&lt;p&gt;For lunch on the last day, I gave a draft version of my talk for &lt;a href="http://devnation.us/events/10"&gt;DevNation&lt;/a&gt;.  Got some great feedback and questions, and overall it went well.  Post-lunch I was pairing with Doug until it was time for goodbyes and more travel.&lt;/p&gt;

&lt;p&gt;Anyways, the 8th Light office has some very unique opportunities for reflection.  For example, I took advantage of the in-office hammock for an afternoon break:&lt;/p&gt;

&lt;p class="centeredImage"&gt;
  &lt;img src="/images/hammock-8th-light.jpg" alt="Hammock Style" /&gt;
  &lt;br /&gt;
  &lt;span class="caption"&gt;Stop - Hammock time&lt;/span&gt;
&lt;/p&gt;


&lt;p&gt;8th Light also has an in-office treadmill that you can use while coding.  I tried it for a little while, and its a great break from the monotony and inactivity of sitting all day.  Doug setup an adjustable desk over the treadmill, and also wired up the treadmill interface to a LimeLight based GUI.  Treadmill based hacking is something I would love to have at the Relevance office.&lt;/p&gt;

&lt;p class="centeredImage"&gt;
  &lt;img src="/images/treadmill-8th-light.jpg" alt="Treadmill'ing" /&gt;
  &lt;br /&gt;
  &lt;span class="caption"&gt;Doug getting his treadmill hack on&lt;/span&gt;
&lt;/p&gt;


&lt;p&gt;Overall, the 8th Light guys are great, talented bunch.  Their &lt;a href="http://8thlight.com/main/about_description?sub_action=apprenticeship"&gt;apprenticeship program&lt;/a&gt; is a great model to follow for how to train young developers, and I plan on following up on quite a few things I've learned from the swap.  Thanks for 8th Light for having me as a guest, and to Relevance for helping make this happen.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=5mQcJt_CUwk:BFp-GjL_tBA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=5mQcJt_CUwk:BFp-GjL_tBA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/5mQcJt_CUwk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2010/07/11/day-3/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Day 2 Craftsmanship Swap at 8th Light</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/p9CJq4RrAAU/" />
   <updated>2010-07-10T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2010/07/10/day-2-craftsmanship-swap</id>
   <content type="html">&lt;p&gt;(note: this was from my stint on Wednesday, July 7th at 8th Light)&lt;/p&gt;

&lt;p&gt;For Day 2 of my stint at 8th Light, &lt;a href="http://twitter.com/skim"&gt;Skim&lt;/a&gt; and I came in early enough to find a relatively empty office.  I paired with Skim on an app he has been building as part of his apprenticeship at 8th Light.  All apprenticeships have to complete several projects during there time, with their mentor (a craftsman at 8th Light) acting as the product owner.&lt;/p&gt;

&lt;p&gt;Steve's application is a Tic-Tac-Toe game built in Ruby, which had the additional twist of having both a console UI and a &lt;a href="http://limelight.8thlight.com/main/sparkle"&gt;Limelight&lt;/a&gt; UI.  Limelight is a UI framework built in JRuby by the 8th Light guys, and I can definitely see myself reaching for it the next time I need to built a cross-platform rich UI.&lt;/p&gt;

&lt;p&gt;I helped Steve out with some Rspec issues and also increased his git-fu, and we discussed some of the difficulties in testing threading.  A &lt;code&gt;Thread.new&lt;/code&gt; call in his game was causing timing related failures, and we tried to extract out the threading implementation enough to allow his specs to work around it.&lt;/p&gt;

&lt;p&gt;Lunch was taken out of the office at &lt;a href="http://www.yelp.com/biz/thai-gourmet-libertyville"&gt;Thai Gourmet&lt;/a&gt;, which was delicious.  It was at least on par with Thai Cafe, which is a favorite at Relevance.&lt;/p&gt;

&lt;p&gt;I had to fight off curry drowsiness post-lunch to pair with Doug on the same application we had paired on in &lt;a href="" title="http://robsanheim.com/2010/07/08/day-1-craftsmanship-swap-at-8th-light/"&gt;day 1&lt;/a&gt;.  The application uses &lt;a href="http://ruby-doc.org/core/classes/DRb.html"&gt;DRb&lt;/a&gt; and &lt;a href="http://drbfire.rubyforge.org/classes/DRbFire.html"&gt;DRbFire&lt;/a&gt; under the hood to manage client-server communication.  Based on some issues reported from client installations we suspected some socket or connection related issues in the DRb related part of the codes.  And so began a deep dive into DRbFire and DRb itself.&lt;/p&gt;

&lt;p&gt;DRbFire is actually a protocol on to of DRb that does a neat little trick to allow DRb to connect across networks, such as when a client and server need to talk through firewalls or a NAT.  Given the fact that 99% of clients will jump through a NAT or firewall at some point, what DRbfire does is pretty cool.&lt;/p&gt;

&lt;p&gt;Doug and I dusted off a simulator that 8th Light has written to fake out multiple clients connecting to the server without having a ton of real machines around.  By the end of the day we had discovered that something strange was definitely going on, as simulating 40+ clients connecting to the server and disconnecting resulted in over 80 socket connections hanging around in a &lt;a href="http://blogs.technet.com/b/janelewis/archive/2010/03/09/explaining-close-wait.aspx"&gt;CLOSE_WAIT&lt;/a&gt; state on the server.  We were able to reproduce the same error that had been reported from client installations, but weren't 100% sure of the exact source yet.&lt;/p&gt;

&lt;p&gt;Dinner that night was at a Hibachi-style steakhouse with Skim, Micah, and his family.  The Japanese knife dude managed to impress without any injuries, and fine flame broiled food was had by all.  I was back to the hotel by 8 or so and I turned in for an early night.  Apparenlty the travel and pairing was finally catching up to me.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=p9CJq4RrAAU:gde9S3allAE:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=p9CJq4RrAAU:gde9S3allAE:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/p9CJq4RrAAU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2010/07/10/day-2-craftsmanship-swap/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Day 1 Craftsmanship Swap at 8th Light</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/YJsJz70TJa4/" />
   <updated>2010-07-08T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2010/07/08/day-1-craftsmanship-swap-at-8th-light</id>
   <content type="html">&lt;p&gt;Tuesday marked the first day of my craftsmanship swap at 8th Light.  All in all it was a good day of pairing and learning with a fun trip to downtown Chicago on the end.&lt;/p&gt;

&lt;p&gt;First order of business was grabbing a ride with &lt;a href="http://twitter.com/skim"&gt;Steve Kim&lt;/a&gt; for the short trip over to the 8th Light office, and checking out the area.  8th Light is located in a nice office park in Libertyville, IL, overlooking a marshy area, making for a great view from their office.  Libertyville is a suburb about 45 minutes north of Chicago, with a quaint 'main street' type strip not far from the office.&lt;/p&gt;

&lt;p&gt;I spent most of the day getting up to speed on a shared workstation/timeshare application that 8th Light has been working on for a while, which involves a lot of moving parts and quite a few languages.  As I overhead someone explaining, it's a Java application written in Ruby, with C and Objective-C thrown in for good measure.  All told its an impressive app that wrangles a pretty complicated problem domain well.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://twitter.com/dougbradbury"&gt;Doug Bradbury&lt;/a&gt; was my patient pair for most of the day and clearly knows both the tech and the domain very well.  I helped Doug write some acceptance tests in Fitnesse, which went pretty well once I was able to wrap my head around Fitness.  I haven't written Fitness acceptance tests before, but once I understand some of the terms used and basically mapped it to how I think of Cucumber features, things went well.  The 'a-ha' moment came when I realized a Fitnesse 'fixture' roughly equals a Cucumber 'step'.&lt;/p&gt;

&lt;p&gt;After that Steve, &lt;a href="http://twitter.com/paytonrules" title="Eric Smith"&gt;Eric Smith&lt;/a&gt; and I headed out to the Metra to grab a train downtown to attend the Chicago Ruby meetup.  There were two talks, with the first one on HTML 5 &lt;a href="http://dev.w3.org/html5/websockets/" title="The WebSocket API"&gt;WebSockets&lt;/a&gt; really grabbing my attention as having a lot of potential for "real" interactive apps in the browser being possible in a year or two.  It will be a happy day for web devs we can drop ajax and polling as our solution for 'live' interaction with the browser and have something more first class and less hacky.&lt;/p&gt;

&lt;p&gt;We closed the night with a few adult beverages at the Elephant and Castle, and after a train ride back I was back in the hotel before midnight.  All in all a great introduction to 8th Light and the Chicago Ruby community.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=YJsJz70TJa4:uwvMT5S0Cuk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=YJsJz70TJa4:uwvMT5S0Cuk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/YJsJz70TJa4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2010/07/08/day-1-craftsmanship-swap-at-8th-light/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>New Releases: LogBuddy 0.5 and CapGun 0.2.4</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/2l6zaZYE5-Y/" />
   <updated>2010-05-28T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2010/05/28/new-releases-of-log-buddy-and-cap-gun</id>
   <content type="html">&lt;p&gt;Hey now, it has been quiet here for too long, so what better way to bring some life back then open source updates?&lt;/p&gt;

&lt;p&gt;First, &lt;a href="http://github.com/relevance/log_buddy"&gt;LogBuddy&lt;/a&gt;, the little developer tool that could, has been updated to 0.5.  What is LogBuddy?  LogBuddy is a very small tool that logs the name of the thing your are logging, plus its value.  Stop typing &lt;code&gt;puts my_var =&amp;gt; #{my_var}&lt;/code&gt; while doing ad-hoc debugging.  For example, assuming you have a local, an ivar, and a class var called 'a':&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;d { a }       =&amp;gt; a = "foo"
d { @a }      =&amp;gt; @a = "my var"
d { @@bar }   =&amp;gt; @@bar = "class var!"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;There are a few significant changes in this release.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;You no longer have to call &lt;code&gt;LogBuddy.init&lt;/code&gt; in order to have the &lt;code&gt;d&lt;/code&gt; method available everywhere - now it just happens upon require unless you specifically set &lt;code&gt;SAFE_LOG_BUDDY&lt;/code&gt; in your environment.  This makes LogBuddy easier to require and use for small tasks.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;No more &lt;code&gt;logger&lt;/code&gt; method mixed in everywhere - that was a bad idea and just asking for namespace bugs.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;LogBuddy will no longer raise if the logged line of code is removed before the output is generated.  This probably only happened if you were coding quickly and using a tool like autotest or watchr to run tests on change.&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;a href="http://github.com/relevance/cap_gun"&gt;CapGun&lt;/a&gt; adds deployment notifications to Capistrano, so you can email blast interested parties on deployments.  Version 0.2.4 fixes a bug where notifications would fail on the very first deploy due to a missing REVISION directory.  This version also got fixes for Rails 3 using the new ActiveSupport, thanks to &lt;a href="http://twitter.com/jdpace"&gt;Jared Pace&lt;/a&gt; for those.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=2l6zaZYE5-Y:KnaW3WqEr0s:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=2l6zaZYE5-Y:KnaW3WqEr0s:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/2l6zaZYE5-Y" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2010/05/28/new-releases-of-log-buddy-and-cap-gun/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Raleigh.rb Dependencies Talk</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/FrsMOPoVRKg/" />
   <updated>2010-03-16T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2010/03/16/raleigh-rb-dependencies</id>
   <content type="html">&lt;p&gt;Last night I gave a talk on Rubygems, Bundler, and dependency management at &lt;a href="http://www.meetup.com/raleighrb/" title="The Raleigh-area Ruby Brigade (raleigh.rb) (Raleigh, NC) - Meetup.com"&gt;Raleigh.rb&lt;/a&gt;.  Below is a list of references from the talk, as well as some extra guides for getting rolling with Bundler.&lt;/p&gt;

&lt;p&gt;Thanks to everyone who came out!&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;a href="http://github.com/carlhuda/bundler/" title="Bundler"&gt;Bundler home on Github&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://andre.arko.net/2010/02/13/using-bundler-09-with-rails-235/" title="Bundler 0.9 and Rails 2.3.5"&gt;Using Bundler 0.9 with Rails 2.3.5&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://gist.github.com/334551" title="gist: 334551 -  GitHub"&gt;Bundler code snippets from the talk&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://semver.org/" title="Semantic Versioning"&gt;Semantic Versioning&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://docs.rubygems.org/read/chapter/16#page74" title="RubyGems User Guide |  RubyGems Manuals"&gt;Pessimistic Version Constraint for Rubygems&lt;/a&gt; - i.e &lt;code&gt;use ~&amp;gt; not =&amp;gt;&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yehudakatz.com/2010/02/01/bundler-0-9-heading-toward-1-0/" title="Bundler 0.9: Heading Toward 1.0 &amp;laquo;  Katz Got Your Tongue?"&gt;Bundler 0.9: Heading towards 1.0&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://yehudakatz.com/2010/02/09/using-bundler-in-real-life/" title="Using Bundler in Real Life &amp;laquo;  Katz Got Your Tongue?"&gt;Using Bundler in Real Life&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=FrsMOPoVRKg:UBn0E5no5hk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=FrsMOPoVRKg:UBn0E5no5hk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/FrsMOPoVRKg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2010/03/16/raleigh-rb-dependencies/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Postgresql and Sphinx and fe_sendauth no password supplied</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/4r5S3obA2dg/" />
   <updated>2009-09-29T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2009/09/29/postgresql-and-sphinx-and-fe_sendauth-no-password-supplied</id>
   <content type="html">&lt;p&gt;Fun fact learned today about interactions between Postgresql and Sphinx.  Assuming you are using Postgres as your app's database, and you are wiring Postgres as the Sphinx data source, you &lt;em&gt;must&lt;/em&gt; set a database level password for your database user.  You also cannot use the &lt;a href="http://www.postgresql.org/docs/8.3/static/auth-methods.html"&gt;'trust'&lt;/a&gt; mode in Postgres and try indexing without a password.  This can be especially confusing when you see that your Rails based db operations all work fine with no password, but then Sphinx indexing (via Thinking Sphinx, in  this case) fail with this error:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;fe_sendauth no password supplied&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;If you decide to setup your postgres database user to have a null password (the default I believe if you don't specify one on creation), or you turn postgres auth mode to "trust", you can never index data with this user.  Sphinx &lt;a href="http://sphinxsearch.com/forum/view.html?id=4355"&gt;&lt;em&gt;requires&lt;/em&gt;&lt;/a&gt; postgres users have actual passwords and use them for auth, even if postgres itself does not care.  Note that I'm referring to the database user password, &lt;em&gt;not&lt;/em&gt; the OS level password.&lt;/p&gt;

&lt;p&gt;Moral of the story: if you plan on using Sphinx and Postgres, make sure you have passwords wired for your Postgres user, even in dev/test environments.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=4r5S3obA2dg:_mA_6tt9HP0:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=4r5S3obA2dg:_mA_6tt9HP0:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/4r5S3obA2dg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/09/29/postgresql-and-sphinx-and-fe_sendauth-no-password-supplied/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Announcing the RunCodeRun Gem</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/r5IZWTLyChw/" />
   <updated>2009-09-28T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2009/09/28/announcing-the-runcoderun-gem</id>
   <content type="html">&lt;p&gt;Hook up your &lt;a href="http://runcoderun.com"&gt;RunCodeRun&lt;/a&gt; builds from your command line.&lt;/p&gt;

&lt;p&gt;Install:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;    gem install runcoderun&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Usage:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;    cd [your-runcoderun-enabled-project]
 rcr [command] [options]
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Right now we just support open.  This opens up your project homepage on RunCodeRun in your default browser.  It is smart enough to make a best guess at the correct owner and project name from your git config.  This requires Launchy, like the &lt;a href="http://github.com/defunkt/github-gem"&gt;Github gem&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;Try it out:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
$ git clone git://github.com/floehopper/mocha.git
$ cd mocha&lt;/p&gt;

&lt;h1&gt;opens http://runcoderun.com/floehopper/mocha in your default browser:&lt;/h1&gt;

&lt;p&gt;$ rcr open          &lt;br/&gt;
$ runcoderun open     # if you like to type more&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Patches or &lt;a href="http://github.com/rsanheim/runcoderun-gem/issues"&gt;ideas&lt;/a&gt; welcome!  This is very much in the spirit of "release early".  A command to tie in with &lt;a href="http://www.aaronbedra.com/2009/06/05/getting-rcr-status-for-a-specific-project.html"&gt;the API&lt;/a&gt; is clearly the next easy win for this.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=r5IZWTLyChw:8w2U8M7onNc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=r5IZWTLyChw:8w2U8M7onNc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/r5IZWTLyChw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/09/28/announcing-the-runcoderun-gem/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Rails 2.3, JSON, and lamentations</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/Lw-lPLxdqvs/" />
   <updated>2009-06-23T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2009/06/23/rails-23-json-and-lamentations</id>
   <content type="html">&lt;p&gt;There is a nasty gotcha in Rails 2.3 involving rendering JSON from models and a surprising change in behavior.  If you are familiar with how Rails renders xml for models, you may expect json to be very similar.  You would probably expect a top level root node followed by the attributes:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{"person" =&gt; { "city=&gt;nil, "name"=&gt; "Foo Bar" } }&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It appears somewhere on the road to 2.3, the JSON encoding changed so there is no longer a top level node:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;{"city"=&gt;nil, "name"=&gt;"Foo Bar" } &lt;/code&gt;&lt;/p&gt;

&lt;p&gt;The end result of this change means that if you have consumers expecting JSON in a typical "Rails" format, with a top level element denoting the class, there will be pain.  We just hit this in a project when trying to use ActiveResource to consume some models exposed via standard restful actions.&lt;/p&gt;

&lt;p&gt;The following demonstrates how this breaks down exactly:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;# in the backend web app
Person.create! :name =&gt; "foo"&lt;/p&gt;

&lt;h1&gt;meanwhile, in an active resource consumer&lt;/h1&gt;

&lt;p&gt;person = Person.find(1)  # finds a model okay, but...&lt;/p&gt;

&lt;h1&gt;the below all raise NoMethodError&lt;/h1&gt;

&lt;h1&gt;they &lt;em&gt;should&lt;/em&gt; find the attribute from the attribute hash&lt;/h1&gt;

&lt;h1&gt;and quack like an ActiveRecord model&lt;/h1&gt;

&lt;p&gt;person.name
person.age
person.any_field_on_the_model&lt;/p&gt;

&lt;p&gt;person.attributes # returns a hash in the format of { "person" =&gt; { "name" =&gt; "foo"...}, which is where the problem lies&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It appears this issue is fixed or on the way to be fixed in the 2.3 stable branch, but for now be wary of JSON support in general on 2.3 until more of the below tickets get resolved.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;References:
&lt;/strong&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;li&amp;gt;&amp;lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/2584-232-activeresource-json-doesnt-send-parameters-with-root-node"&amp;gt;the bug in question - still open&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;li&gt;&lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/2456-activeresource-xmljson-encoding-inconsistency"&gt;xml vs json - fight!&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;&amp;lt;li&amp;gt;&amp;lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/2753-to_json-behavior-still-different-between-rails-2321-and-rails-2-3-stable"&amp;gt;2.3 related (?) fix that caused other issues&amp;lt;/a&amp;gt;&amp;lt;/li&amp;gt;
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;&lt;li&gt;&lt;a href="https://rails.lighthouseapp.com/projects/8994/tickets/2196-json-encoding-breaks-when-json-gem-is-loaded-before-active-support"&gt;an unrelated JSON issue, but very annoying and has hit us on multiple projects -- require "json" considered harmful)&lt;/a&gt;&lt;/li&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=Lw-lPLxdqvs:qyk3IA1gF1U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=Lw-lPLxdqvs:qyk3IA1gF1U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/Lw-lPLxdqvs" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/06/23/rails-23-json-and-lamentations/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>CapGun 0.2.0 - now with all Git commits since the last release</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/yu3BSnbuyPc/" />
   <updated>2009-06-21T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2009/06/21/capgun-020-now-with-all-git-commits-since-the-last-release</id>
   <content type="html">&lt;p&gt;&lt;a href="http://thinkrelevance.com"&gt;Relevance&lt;/a&gt; has released &lt;a href="http://github.com/relevance/cap_gun/tree/master"&gt;CapGun 0.2.0&lt;/a&gt; to GitHub and Rubyforge.&lt;/p&gt;

&lt;p&gt;We've added more Git knowledge to this release, courtesy some great work from &lt;a href="http://muness.blogspot.com/"&gt;Muness&lt;/a&gt;.  Your deployment notifications will now contain the branch they were deployed from and a list of all revisions included in the deployment (since the last deploy, of course).&lt;/p&gt;

&lt;p&gt;There was also a overhaul to the internals.  Muness refactored all the email logic to a presenter, so it should easy to change the notification email to your liking.  CapGun now uses Jeweler and Micronaut, to match the rest of the standards for Relevance open source.&lt;/p&gt;

&lt;p&gt;Keep us honest by checking the &lt;a href="http://runcoderun.com/relevance/cap_gun"&gt;build status&lt;/a&gt; on RunCodeRun, and file feature requests and bug reports on &lt;a href="http://github.com/relevance/cap_gun/issues"&gt;Github Issues.&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=yu3BSnbuyPc:0mKBOI30uZQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=yu3BSnbuyPc:0mKBOI30uZQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/yu3BSnbuyPc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/06/21/capgun-020-now-with-all-git-commits-since-the-last-release/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Pair programming? TDD? Where is the proof?</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/HN2W16uXV_A/" />
   <updated>2009-02-10T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2009/02/10/pair-programming-tdd-where-is-the-proof</id>
   <content type="html">&lt;p&gt;Often while discussing agile practices with agile skeptics, the question of proof comes up.  &amp;#8220;Are there studies done showing TDD?  How do you know pairing works and doesn&amp;#8217;t just waste time?&amp;#8221;  &lt;/p&gt;




&lt;p&gt;Those are tough questions.  Software is not a science, and there are no double-blind, randomized controlled projects.  The study of software development barely approaches the level of a social science.  Its easy to discuss the flow and intuitive sense that agile works with other people who have experienced it, but try expressing that to someone who has never stepped beyond the waterfall model.&lt;/p&gt;




&lt;p&gt;Things are getting better in the area of real, hard studies done on agile.  One example is the work being done by &lt;a href="http://research.microsoft.com/en-us/projects/esm/" title="ESM - Microsoft Research"&gt;Microsoft&amp;#8217;s Empirical Software Engineering Group (ESM)&lt;/a&gt;.  The summary from the TDD study is worth citing:&lt;/p&gt;




&lt;p&gt;&lt;cite&gt;&amp;#8220;The results of the case studies indicate that the pre-release defect density of the four products decreased between 40% and 90% relative to similar projects that did not use the TDD practice. Subjectively, the teams experienced a 15–35% increase in initial development time after adopting TDD.&amp;#8221;&lt;/cite&gt;&lt;/p&gt;


&lt;p&gt;I&amp;#8217;ve included full links to some of the standout papers on my @to-read list below.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.springerlink.com/content/q91566748q234325/"&gt;Realizing quality improvement through test driven development: results and experiences of four industrial teams&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www2.computer.org/portal/web/csdl/doi/10.1109/TSE.2008.36"&gt;Do Cross Cutting Concerns Cause Defects?&lt;/a&gt; (my alternate title: &amp;#8220;why the hell should I care about AOP?&amp;#8221;)&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://portal.acm.org/citation.cfm?id=1414004.1414026&amp;amp;coll=Portal&amp;amp;dl=GUIDE&amp;amp;CFID=13908394&amp;amp;CFTOKEN=39610108"&gt;Pair programming: what&amp;#8217;s in it for me?&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://research.microsoft.com/apps/pubs/default.aspx?id=70535"&gt;The Influence of Organizational Structure On Software Quality: An Empirical Case Study&lt;/a&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=HN2W16uXV_A:ywrKtvKonJ4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=HN2W16uXV_A:ywrKtvKonJ4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/HN2W16uXV_A" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/02/10/pair-programming-tdd-where-is-the-proof/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Upgrading git via MacPorts</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/kRJA-97FC-c/" />
   <updated>2009-01-14T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2009/01/14/upgrading-git-via-macports</id>
   <content type="html">&lt;p&gt;&lt;a href="http://git-scm.com/"&gt;Git 1.6.1&lt;/a&gt; was released at Christmas, and if you are still on 1.6.0 or lower its well worth upgrading.  MacPorts is the way to go for Git on the Mac - the ports team has been awesome in keeping up with the latest versions.  Here's how I upgrade:&lt;/p&gt;

&lt;p&gt;First, make sure you have the latest portfiles:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo port sync&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Deactivate any preexisting versions - not sure if this is strictly necessary, but I've seen failures when I don't.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo port deactivate git-core&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Install the new hotness, with all optional add-ons.&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo port install git-core +svn+bash_completion+doc&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Verify it:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;git --version

=&amp;gt; git version 1.6.1
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Note that there is a MacPorts 'upgrade' command, but I've seen it fail to actually upgrade things from time to time.  Doing the install this way always works for me.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=kRJA-97FC-c:6IXEhU41nuM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=kRJA-97FC-c:6IXEhU41nuM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/kRJA-97FC-c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/01/14/upgrading-git-via-macports/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Best Albums of 2008</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/1bPth9REXoc/" />
   <updated>2009-01-09T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2009/01/09/best-albums-of-2008</id>
   <content type="html">&lt;p&gt;So, here are my top ten albums of 2008, just a bit late.  All links go to the album on the Amazon MP3 store (if available) and they are affiliate links.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amazon.com/o/ASIN/B001A3AA0G/panasonicyout-20"&gt;Fleet Foxes - Fleet Foxes&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;This album was on everyone&amp;#8217;s top albums list of the year for good reason.  Whether you like folk, pop, or country, this album has no filler and is great through and through.  Pick up their &lt;em&gt;Sun Giant&lt;/em&gt; EP as well to round it out.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://amazon.com/o/ASIN/B0013IKUIK/panasonicyout-20"&gt;Bon Iver - For Emma, Forever Ago&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;I&amp;#8217;m a Wisconsin native, so I may be a little biased in picking an album created in the Wisconsin north woods.  Still, a superb album for cold winter nights and hot cocoa or coffee at your side.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/o/ASIN/B001FLOGT4/panasonicyout-20"&gt;The New Year - The New Year&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Before the New Year, there was a Texan band named Bedhead in the 90s.  Bedhead was quiet, contemplative, and perfect for those lonely hours between midnight and dawn.  Since then, Bubba and Matt Kadane (real names, and real brothers) formed the New Year, got a little more accessible and upbeat, and released three albums.  This third self-titled album is where slow-core and pop come together seamlessly.  &lt;em&gt;The Company I Can Get&lt;/em&gt; is the closest thing the Kadanes have done to a radio friendly single, while still  jaw-dropping beautifully sad songs like &lt;em&gt;The Idea of You&lt;/em&gt;.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/o/ASIN/B001ED8GNU/panasonicyout-20"&gt;Underoath - Lost in the Sound of Separation&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Metalcore that doesn&amp;#8217;t suck and tries new things.  Not easy to find these days.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/o/ASIN/B00158FK42/panasonicyout-20"&gt;Sun Kil Moon - April&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Mark Kozalek released an insane amount of music in 2008, both under his own name and Sun Kil Moon.  &lt;em&gt;April&lt;/em&gt; is the best of the bunch and will grow on you.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/o/ASIN/B00153VU4Q/panasonicyout-20"&gt;Dodos - Visiter&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Catchy, quirky indie pop, producing a sound far bigger then any two humans should be capable of with only drums, guitar, and voice.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/o/ASIN/B001BXWYOK/panasonicyout-20"&gt;Cult of Luna - Eternal Kingdom&lt;/a&gt; &lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Epic post-metal.  Recorded on the site of a demolished mental institution, with lyrics from the diary of a madman who was once a resident there.  If you are a fan of metal, what else do you need to know?&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/Fuse-Presents-Adam-Beyer/o/B0017KVRNG/panasonicyout-20"&gt;Adam Beyer - Fuse Presents&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Minimal techno is notoriously difficult to translate out of the club and into the living room.  Beyer is a top techno producer and DJ, and this mix really captures the banging minimal techno that became so popular in 07/08.  Avoid if your responses to techno include &amp;#8220;wait, where are the lyrics?&amp;#8221; or &amp;#8220;is the CD skipping??&amp;#8221;.  If you can get into the Chemical Brothers, Underworld or even Paul Oakenfold, put this one on and give it some time.  You may just find yourself nodding along and digging techno.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.amazon.com/o/ASIN/B001AGHC1I/panasonicyout-20"&gt;Sigur Ros - Med Sud I Eyrum Vid Spilum Endalaust&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;Sigur Ros finally gets a little less serious and overbearing and make a wonderfully fun album with some actual pop songs alongside the epic twelve minute compositions.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://www.sputnikmusic.com/album.php?albumid=26993"&gt;Daïtro / Sed Non Satiata - Split LP&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;




&lt;p&gt;(&lt;em&gt;This came out in Europe in 2007 and made it over here in 2008.&lt;/em&gt;) Two French post-hardcore/screamo bands in the vein of Page 99 or Envy (read: much heavier and harder then MTV emo) join for an album that is everything good about hardcore right now.  Takes elements of post-rock and math-rock, yet still retain the passion and hooks that made screamo so captivating to begin with.  You don&amp;#8217;t need to understand French to rock out to this split.&lt;/p&gt;


&lt;p&gt;&lt;strong&gt;Honorable Mention&lt;/strong&gt;&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B0010Z46P4?ie=UTF8&amp;amp;tag=panasonicyout-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B0010Z46P4"&gt;This Will Destroy You - (Self Titled)&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=panasonicyout-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B0010Z46P4" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt; &lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B001JPUVZE?ie=UTF8&amp;amp;tag=panasonicyout-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001JPUVZE"&gt;Q-Tip - The Renaissance&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=panasonicyout-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001JPUVZE" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B001BP4UEA?ie=UTF8&amp;amp;tag=panasonicyout-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B001BP4UEA"&gt;Sasha - Invol2ver&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=panasonicyout-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B001BP4UEA" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B00192BEGC?ie=UTF8&amp;amp;tag=panasonicyout-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B00192BEGC"&gt;Death Cab for Cuite - Narrow Stairs&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=panasonicyout-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B00192BEGC" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/gp/product/B0016OCM1Y?ie=UTF8&amp;amp;tag=panasonicyout-20&amp;amp;linkCode=as2&amp;amp;camp=1789&amp;amp;creative=9325&amp;amp;creativeASIN=B0016OCM1Y"&gt;Torche - Meanderthal&lt;/a&gt;&lt;img src="http://www.assoc-amazon.com/e/ir?t=panasonicyout-20&amp;amp;l=as2&amp;amp;o=1&amp;amp;a=B0016OCM1Y" width="1" height="1" border="0" alt="" style="border:none !important; margin:0px !important;" /&gt;&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=1bPth9REXoc:LNShTu_oaqQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=1bPth9REXoc:LNShTu_oaqQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/1bPth9REXoc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2009/01/09/best-albums-of-2008/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>MacPorts Ruby performance gotcha</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/IY4o09QOeDY/" />
   <updated>2008-11-18T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2008/11/18/macports-ruby-performance-gotcha</id>
   <content type="html">&lt;p&gt;If you install Ruby from MacPorts (all the cool kids do), be aware that the first 1.8.7 port had some issues that basically broke performance, making it run three times slower than normal.  Verify that you have the &lt;code&gt;1.8.7-p72_2&lt;/code&gt; version active, and not &lt;code&gt;1.8.7-p72_1&lt;/code&gt;:&lt;/p&gt;




&lt;p&gt;&lt;code&gt;&lt;pre&gt;
~ $ sudo port installed |grep ruby
&lt;code&gt;ruby @1.8.7-p72_1+thread_hooks&lt;/code&gt;
&lt;code&gt;ruby @1.8.7-p72_2+thread_hooks (active)&lt;/code&gt;
&lt;/pre&gt;&lt;/code&gt;&lt;/p&gt;




&lt;p&gt;The &lt;a href="http://trac.macports.org/ticket/17092" title="#17092 (Ruby 1.8.7 is 3x slower than its predecessor) – MacPorts – Trac"&gt;defect on MacPorts Trac&lt;/a&gt; has more details, along with links to a relevant &lt;a href="http://groups.google.com/group/ruby-talk-google/browse_thread/thread/2b326089f18f2b29/49b69aca0f5112e8?lnk=gst&amp;amp;q=macports#49b69aca0f5112e8"&gt;ruby-talk thread&lt;/a&gt;.  &lt;/p&gt;




&lt;p&gt;Its worth pointing out that this issue went from discovery to being fixed and released into the port stream in about a days time.  MacPorts has really come a long way from just a year or two ago.  Fairly major packages used to lag behind the latest stable releases by multiple versions, but now I find everything I care about stays up to date with ease from MacPorts.  They are even able to keep up with &lt;a href="http://www.macports.org/ports.php?by=name&amp;amp;substr=git-core" title="The MacPorts Project -- Available Ports"&gt;git releases&lt;/a&gt;, an impressive task considering how fast and furious releases git releases come.  &lt;/p&gt;




&lt;p&gt;Kudos to the &lt;a href="http://www.macports.org/ports.php?by=name&amp;amp;substr=git-core" title="The MacPorts Project -- Available Ports"&gt;MacPorts team&lt;/a&gt; for doing a fine job and making developers&amp;#8217; lives easier.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=IY4o09QOeDY:Eps8pBt0P5k:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=IY4o09QOeDY:Eps8pBt0P5k:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/IY4o09QOeDY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/11/18/macports-ruby-performance-gotcha/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Tarantula 0.0.5 Released - the "Naked Aardvark" release</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/pINj08CgZ18/" />
   <updated>2008-09-26T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/09/26/tarantula-005-released-the-naked-aardvark-release</id>
   <content type="html">&lt;p&gt;Announcing version 0.0.5 of &lt;a href="http://github.com/relevance/tarantula/tree/master"&gt;Tarantula.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tarantula is a big fuzzy spider. It crawls your Rails application, fuzzing data to see what breaks.  It can verify HTML validation across all your pages, ensure you don't have 404s, and pretty much anything else you want via custom handlers.&lt;/p&gt;

&lt;p&gt;Don't let the version number fool you, we've been using Tarantula across many projects at &lt;a href="http://thinkrelevance.com"&gt;Relevance&lt;/a&gt; and its very stable.  This release fixed a number of annoying bugs, including namespace conflicts with other classes due to Rails dependency loading, improved gem spec with correct dependencies, and clean up on the html reporter.&lt;/p&gt;

&lt;p&gt;Install it via the Github&lt;/p&gt;

&lt;p&gt;&lt;code&gt;gem install relevance-tarantula --source http://gems.github.com&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;or via Rails 2.1+ gem handing:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;config.gem "relevance-tarantula", :source =&gt; "http://gems.github.com"&lt;/code&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=pINj08CgZ18:JOuxdW9Zzlo:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=pINj08CgZ18:JOuxdW9Zzlo:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/pINj08CgZ18" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/09/26/tarantula-005-released-the-naked-aardvark-release/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Scp or rsync failing with no error message?  Check your startup scripts...</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/UkYOfCU420E/" />
   <updated>2008-09-15T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/09/15/scp-or-rsync-failing-with-no-error-message-check-your-startup-scripts</id>
   <content type="html">&lt;p&gt;The other day I was having issues trying to scp/rsync data, with no real error message to try and debug things.  Turns out that any output produced by your startup scripts will break rsync/scp hard.  I had some simple 'echo' statements print when different scripts were being loaded...turns out scp/rysync don't like that.&lt;/p&gt;

&lt;p&gt;My capistrano task was a very simple call out to the 'get' helper, which just uses scp under the hood.  The task ran and looked as if it completed, only nothing was ever transferred and the scp progress bar never came up.  Sometimes it would block and do nothing, which was real fun, too.&lt;/p&gt;

&lt;p&gt;The solution was simple - change all the &lt;a href="http://github.com/relevance/etc"&gt;bash scripts&lt;/a&gt; we use to not output any echo anything when running.  I deployed the new scripts to all servers I needed to scp with, and the issue was resolved.&lt;/p&gt;

&lt;p&gt;Since this is a &lt;a href="http://www.openssh.org/faq.html#2.9"&gt;known issue in the faq&lt;/a&gt;, it won't be fixed or improved with a better error message.  It's just something you need to be aware of and work around, either via detecting if the session has an interactive terminal before sending output or removing your output statements altogether from you startup scripts.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=UkYOfCU420E:ZDa4tfX7JWc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=UkYOfCU420E:ZDa4tfX7JWc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/UkYOfCU420E" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/09/15/scp-or-rsync-failing-with-no-error-message-check-your-startup-scripts/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Git Clone vs cp -R --&gt; WTF?</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/U-JDnCvqtow/" />
   <updated>2008-07-30T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/07/30/git-clone-vs-cp-r-wtf</id>
   <content type="html">&lt;p&gt;I knew git was fast, and I even knew it was faster than a lot of plain linux local file operations.  Still, this still blew me away:&lt;/p&gt;

&lt;p&gt;[code]rsanheim@ares:~/src/personal/oss $ du -hd 0 insoshi/
 26M    insoshi/&lt;/p&gt;

&lt;p&gt;rsanheim@ares:~/src/personal/oss $ time git clone insoshi/ /tmp/insoshi
Initialize /tmp/insoshi/.git
Initialized empty Git repository in /private/tmp/insoshi/.git/
Checking out files: 100% (2193/2193), done.&lt;/p&gt;

&lt;p&gt;real    0m3.826s
user    0m0.251s
sys 0m0.658s&lt;/p&gt;

&lt;p&gt;rsanheim@ares:~/src/personal/oss $ time cp -R insoshi/ /tmp/insoshi_cp&lt;/p&gt;

&lt;p&gt;real    0m9.065s
user    0m0.114s
sys 0m1.442s
[/code]
Ok, so a 26 meg repo takes almost three times as long to copy via a recursive cp than a local git clone.  Thats a fairly small repo, lets try something bigger:&lt;/p&gt;

&lt;p&gt;[code]
rsanheim@ares:~/src/relevance $ du -hd 0 rails
 75M    rails&lt;/p&gt;

&lt;p&gt;rsanheim@ares:~/src/relevance $ time git clone rails /tmp/rails2
Initialize /tmp/rails2/.git
Initialized empty Git repository in /private/tmp/rails2/.git/&lt;/p&gt;

&lt;p&gt;real    0m2.321s
user    0m0.151s
sys 0m0.465s&lt;/p&gt;

&lt;p&gt;rsanheim@ares:~/src/relevance $ time cp -R rails/ /tmp/rails&lt;/p&gt;

&lt;p&gt;real    0m7.133s
user    0m0.067s
sys 0m1.505s
[/code]&lt;/p&gt;

&lt;p&gt;The rails repo at 75 megs is still ~ 3 times faster.&lt;/p&gt;

&lt;p&gt;Obviously, this is not scientific at all, but the point is pretty clear.  Git is doing some magic that lets it move files around locally 2 to 3 times faster than a plain copy.  From looking at the man page, I would guess it has something to do with git using hardlinks for things in .git/objects when cloning locally.  My linux fu falls down a bit here -- what are the ramifications of using hard links versus doing a "real" copy?&lt;/p&gt;

&lt;p&gt;(This also makes me want to try out &lt;a href="http://eigenclass.org/hiki/gibak-backup-system-introduction"&gt;gitbak&lt;/a&gt; even more...)&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=U-JDnCvqtow:z8IAP5cBjUM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=U-JDnCvqtow:z8IAP5cBjUM:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/U-JDnCvqtow" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/07/30/git-clone-vs-cp-r-wtf/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Quick: Find the Bug or Gotcha with named_scope</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/rurK5TLzrXw/" />
   <updated>2008-07-23T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/07/23/quick-find-the-bug-or-gotcha-with-named_scope</id>
   <content type="html">&lt;p&gt;Think fast!  Where's the bug?&lt;/p&gt;

&lt;p&gt;[ruby]
  named_scope :active, :conditions =&gt; ["activated_at &amp;lt; = ?", DateTime.now.utc.to_s(:db)]
[/ruby]&lt;/p&gt;

&lt;p&gt;Looks fine, right?  Maybe you've hit this already, and you see it immediately.&lt;/p&gt;

&lt;p&gt;The symptoms are that the DateTime.now always seems to be a bit off - maybe you just restarted your server and its a only a few minutes off.&lt;/p&gt;

&lt;p&gt;The bug is that DateTime.now gets evaluated at the time the class is loaded, not when the finder is run.  What makes this easy to miss is that it will always work fine in tests and development, as everything is constantly getting reloaded there.&lt;/p&gt;

&lt;p&gt;The fix, obvious once you've spent a combined time of over an hour trying to figure out what is going on:&lt;/p&gt;

&lt;p&gt;[ruby]
  named_scope :active, lambda { { :conditions =&gt; ["activated_at &amp;lt;= ?", DateTime.now.utc.to_s(:db)] } }
[/ruby]&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=rurK5TLzrXw:Et823OrwVEk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=rurK5TLzrXw:Et823OrwVEk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/rurK5TLzrXw" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/07/23/quick-find-the-bug-or-gotcha-with-named_scope/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Notes on testing Bj (Background Job)</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/I3aCh2FNMhc/" />
   <updated>2008-07-10T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/07/10/notes-on-testing-bj-background-job</id>
   <content type="html">&lt;p&gt;Some thoughts and random notes on testing &lt;a href="http://codeforpeople.rubyforge.org/svn/bj/trunk/README"&gt;Bj&lt;/a&gt; within a Rails integration test (or spec).&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;You have to turn transactions off for the scope of the test, or suffer very confusing issues, since Bj itself wraps the job submittal within a transaction.  The way I did this was just overriding the use_transactional_fixtures method in the one specific spec.

[ruby]
describe Foo
  def self.use_transactional_fixtures
    false
  end
[/ruby]
&lt;/li&gt;

&lt;li&gt;Remember, bj = &lt;strong&gt;background&lt;/strong&gt; job.  This may seem obvious, but whatever you submit to bj will be running in an entirely different process, so in our spec you need to wait for that job to complete before trying to assert things.  You can do something as simple as this:

[ruby]
MAX_TIME = 10.0
    seconds = 0.0
    while(job.pending?) do
      job.reload
      seconds += 0.5
      sleep 0.5
      raise if seconds &gt; MAX_TIME
    end
# normal assertions here
[/ruby]
This gives your job up to 10 seconds to finish, and will timeout if it takes too long, which usually means something has gone wrong.
&lt;/li&gt;

&lt;li&gt;You now have to watch multiple logs to figure out what is going on.  So tail your test.log and tail the bj log as well, and run the script in isolation to make sure you understand where exceptions and syntax errors will go.  I wasted some time scanning logs when I really need to check the job.stderr field that bj populates, so be sure to output that for common test failures.&lt;/li&gt;&lt;/ul&gt;


&lt;p&gt;Overall, I've been pleased with bj, besides some open questions I've still been working out by perusing the source.  Check it out if you need a easy to use persistent job queue.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=I3aCh2FNMhc:C0NQ3uaRLJw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=I3aCh2FNMhc:C0NQ3uaRLJw:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/I3aCh2FNMhc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/07/10/notes-on-testing-bj-background-job/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>CapGun and LogBuddy updated to 0.0.5</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/h3D4RnNLXA4/" />
   <updated>2008-07-06T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/07/06/capgun-and-logbuddy-updated-to-005</id>
   <content type="html">&lt;p&gt;Some long overdue releases of &lt;a href="http://github.com/relevance/cap_gun"&gt;cap_gun&lt;/a&gt; and &lt;a href="http://github.com/relevance/logbuddy/tree/master"&gt;log_buddy&lt;/a&gt; - both have been updated to version 0.0.5.  Both are now available as gems on github.com/relevance as well as from rubyforge.&lt;/p&gt;

&lt;p&gt;CapGun gives you super simple deployment notifications from Capistrano.  LogBuddy gives you a log helper through all objects, and can also log the name of the thing passed in along with its value -- saving you on typing and making debugging quicker.&lt;/p&gt;

&lt;p&gt;CapGun got a fix so it does not attempt to display the rails_env if its not defined - this should clean up any strangeness in notifications if you saw something like "my_app was deployed to ".&lt;/p&gt;

&lt;p&gt;LogBuddy got some minor tweaks and improved specs.&lt;/p&gt;

&lt;p&gt;Both libraries now use Echoe, since Hoe complains about readme.txt when I want to use readme.rdoc, dammit.  Both now only have a dev dependency on echoe to play nice with RubyGems 1.2.&lt;/p&gt;

&lt;p&gt;You can install them via github or rubyforge:&lt;/p&gt;

&lt;p&gt;&lt;code&gt;sudo gem install log_buddy
sudo gem install cap_gun&lt;/p&gt;

&lt;p&gt;or&lt;/p&gt;

&lt;p&gt;gem sources -a http://gems.github.com
sudo gem install relevance-log_buddy
sudo gem install relevance-cap_gun
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Please log bugs or issues at our &lt;a href="http://opensource.thinkrelevance.com/"&gt;Trac&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=h3D4RnNLXA4:QCJX1w9w0JQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=h3D4RnNLXA4:QCJX1w9w0JQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/h3D4RnNLXA4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/07/06/capgun-and-logbuddy-updated-to-005/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Git 1.5.6 released</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/0jYdaUf-3cY/" />
   <updated>2008-06-18T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/06/18/git-156-released</id>
   <content type="html">&lt;p&gt;Git 1.5.6 has been &lt;a href="http://kerneltrap.org/Git/1.5.6_Relatively_Small_Impact_Changes"&gt;released&lt;/a&gt;, and there are a lot of usability fixes and tweaks which should make the upgrade worth your while.  Looking at the detailed list of changes since 1.5.5, it looks like submodules have been getting quite a bit of love from many contributors, so it might be time to get them another shot.  Scroll down or search in the &lt;a href="http://kerneltrap.org/Git/1.5.6_Relatively_Small_Impact_Changes"&gt;announcement&lt;/a&gt; for the the part starting with "Changes since v1.5.5" and look through there for some of the submodule improvements that are coming.&lt;/p&gt;

&lt;p&gt;The directions &lt;a href="http://solutions.treypiepmeier.com/2008/02/25/installing-git-on-os-x-leopard/"&gt;posted here&lt;/a&gt; worked fine for me to upgrade my existing source based installation in /usr/local.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=0jYdaUf-3cY:FafmMbf-wKI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=0jYdaUf-3cY:FafmMbf-wKI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/0jYdaUf-3cY" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/06/18/git-156-released/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Git lessons learned</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/hCNkadTbj9s/" />
   <updated>2008-06-06T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/06/06/git-lessons-learned</id>
   <content type="html">&lt;p&gt;Lessons learned from day to day use with various ruby and rails projects.&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;&lt;p&gt;Submodules completely suck when things get complex - I'm moving away from no submodules, and using direct exports for now until I have time to research braid or piston 2.0.  For more details on this, see &lt;a href="http://blog.buildingwebapps.com/2008/5/20/got-git-submodules-not-a-go-go"&gt;this&lt;/a&gt; or &lt;a href="http://groups.google.com/group/github/browse_thread/thread/5f49768707d015dd"&gt;this post&lt;/a&gt; on the github group.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Use capistrano 2.2, not 2.3!  2.3 breaks git support&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Always use :remote_cache for deployments -- super fast with git&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;If you have weird errors, it probably means you need to pull - when in doubt pull to make sure you have the latest&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;Branch more locally - I've been burned a few times when I've started work in master and then regretted it later when I wished my work wasn't in mainline (yes, its possible to fix this after the fact, but that gets into more advanced git usage)&lt;/p&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=hCNkadTbj9s:tbAOV268HWs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=hCNkadTbj9s:tbAOV268HWs:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/hCNkadTbj9s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/06/06/git-lessons-learned/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Refactotum Rails Conf 2008</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/xaZZH8JjvGc/" />
   <updated>2008-05-29T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/05/29/refactotum-rails-conf-2008</id>
   <content type="html">&lt;p&gt;I'm in Portland for Rails Conf with over 80% of the &lt;a href="http://thinkrelevance.com/about" title='see our ugly mugs'&gt;Relevance crew&lt;/a&gt;.  We were testing out our "plane number" yesterday, but thank goodness American didn't let us down.&lt;/p&gt;

&lt;p&gt;We'll be speaking today at about how to contribute to open source at &lt;a href="http://en.oreilly.com/rails2008/public/schedule/detail/2101"&gt;Refactotum&lt;/a&gt; from 1:30 to 5.  We will cover some tools to help you find the code with the most technical debt, go over example refactorings, and then spend the rest of the session going from project to project and helping out as folks hit obstacles.  Please bring a laptop with any projects checked out that you'd like to hack on during the session (git preferred but not necessary).&lt;/p&gt;

&lt;p&gt;Hope to see you there!&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=xaZZH8JjvGc:95YVTH1g57Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=xaZZH8JjvGc:95YVTH1g57Q:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/xaZZH8JjvGc" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/05/29/refactotum-rails-conf-2008/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Testing Velocity Part 2 - Why do we test?</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/ba583UBylfU/" />
   <updated>2008-04-18T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/18/testing-velocity-part-2-why-do-we-test</id>
   <content type="html">&lt;p&gt;A couple weeks ago, I &lt;a href="http://robsanheim.com/2008/03/26/testing-velocity-keeping-your-test-suite-fast-part-1/"&gt;began a series&lt;/a&gt; on keeping your test suite fast and effective.  I now am going to digress a bit, take a step back and view the big picture to establish context.&lt;/p&gt;

&lt;p&gt;Before addressing test performance and what makes up a good test, we should ask ourselves why is it that we write tests at all?  If we want to be effective, we should always stay conscious of the overall goal of testing, as well as the specific goals behind each test in context.&lt;/p&gt;

&lt;p&gt;Some would argue that tests are primarily a design tool.  Or that tests are a living, breathing, specification for our code.  Others would say it's primarily a means to drive and maintain quality.  Some may say that tests are useful to ensure that the really difficult parts of our system work, or to keep lax developers in line.&lt;/p&gt;

&lt;p&gt;Testing is &lt;em&gt;only&lt;/em&gt; valuable and useful insofar as it supports software as a cooperative game.  When you think "cooperative game", imagine rock-climbing, or ?  To quote Alistair Cockburn:&lt;/p&gt;

&lt;p&gt;&lt;cite&gt;&lt;em&gt;Software development is a (resource-limited) cooperative game of invention and communication. The primary goal of the game is to deliver useful, working software. The secondary goal, the residue of the game, is to set up for the next game. The next game may be to alter or replace the system or to create a neighboring system.&lt;/em&gt;&lt;/cite&gt;&lt;/p&gt;

&lt;p&gt;So is testing for design, or quality, or correctness, or communication?  The answer is that it's for &lt;em&gt;all&lt;/em&gt; of those things (and more) as long as it helps deliver working software and prepare for the next game!  So when someone asks, "Why do you write tests?  Why do you care about the speed of your tests?"  The first answer is, "It depends."  It depends on the software you are delivering, on the teammates and domain you are working with, and on what the next game (if any) is.  Since every software project will be different, clearly how you write the code and its tests will differ.  An embedded system targeting your phone will have a much different test suite than a large enterprise web app.&lt;/p&gt;

&lt;p&gt;This digression is to clarify debates I've heard (and been involved in) over issues like what should a "proper" unit test should do, how much setup is okay, mocks or stubs or fake objects, and when it's okay to mock/stub versus when it's not okay.  There are not hard and fast answers to any of these questions.  You need to consider context: What is being built?  What are the current technical issues?  Does the client want to run (or create) acceptance tests?  How slow is the test suite currently, and is it impacting dev speed?  How large is the system, and how much larger do you expect it to be?  Who will be maintaining the system after it's released, and what will their skill level be?&lt;/p&gt;

&lt;p&gt;Answer those types of questions before making statements like "this spec is doing too much setup and runs too slow," or "we shouldn't be stubbing in a functional test like this."  It will ensure that your discussions and debates will stay grounded and useful instead of becoming endless religious debates.  Keep context and the cooperative game model of software in the back of your mind, and I will too as I continue this series and try to lay out some practical, overall guidelines.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=ba583UBylfU:0olzZQ4n-Rg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=ba583UBylfU:0olzZQ4n-Rg:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/ba583UBylfU" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/18/testing-velocity-part-2-why-do-we-test/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>CapGun Released!  Super simple Capistrano deployment notifications</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/_FYJeDKm7jQ/" />
   <updated>2008-04-17T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/17/capgun-released-super-simple-capistrano-deployment-notifications</id>
   <content type="html">&lt;p&gt;Tell everyone about your releases!  Send email notification after Capistrano deployments!  Rule the world!&lt;/p&gt;




&lt;p&gt;Drop your ActionMailer configuration information into your deploy.rb file, configure recipients for the deployment notifications, and setup the callback task.&lt;/p&gt;




&lt;p&gt;Setup and configuration are done entirely inside your deploy.rb file to keep it super simple.  Your emails are sent locally from the box performing the deployment, but CapGun queries the server to grab the necessary release info.&lt;/p&gt;




&lt;p&gt;This even includes the Net::SMTP TLS hack inside as a vendored dependancy to allow super easy email sending without setting up an MTA.&lt;/p&gt;




&lt;p&gt;This is the "Rock n Roll McDonalds" release - 0.0.1.&lt;/p&gt;




&lt;h4&gt;INSTALL&lt;/h4&gt;




&lt;ul&gt;
&lt;li&gt;sudo gem install cap_gun  and gem unpack into your vendor/plugins&lt;/li&gt;
&lt;li&gt;or just grab the tarball from github (see below)&lt;/li&gt;
&lt;li&gt;see the readme and rdocs for more config notes&lt;/li&gt;
&lt;/ul&gt;




&lt;h4&gt;URLS&lt;/h4&gt;




&lt;ul&gt;
&lt;li&gt;Log bugs, issues, and suggestions on Trac: &lt;a href="http://opensource.thinkrelevance.com/wiki/cap_gun"&gt; http://opensource.thinkrelevance.com/wiki/cap_gun &lt;/a&gt;&lt;/li&gt;
&lt;li&gt;View source: &lt;a href="http://github.com/relevance/cap_gun/tree/master"&gt;http://github.com/relevance/cap_gun/tree/master&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Git clone source: git://github.com/relevance/cap_gun.git&lt;/li&gt;
&lt;li&gt;RDocs: &lt;a href="http://thinkrelevance.rubyforge.org/cap_gun/"&gt;http://thinkrelevance.rubyforge.org/cap_gun/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=_FYJeDKm7jQ:caiMIY0BotI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=_FYJeDKm7jQ:caiMIY0BotI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/_FYJeDKm7jQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/17/capgun-released-super-simple-capistrano-deployment-notifications/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>history meme onwards...</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/I4JDo4_LAPQ/" />
   <updated>2008-04-16T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/16/history-meme-onwards</id>
   <content type="html">&lt;p&gt;&lt;code style="font-size:small"&gt;rsanheim@ares:~$ history 1000 | awk '{a[$2]++}END{for(i in a){print a[i] " " i}}' | sort -rn | head
71 gst
67 l
38 ****
38 c
28 git
22 ss
21 gca
13 gsd
13 :
12 rake
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;I like keeping it short.  The 3rd one thats bleeped out is a shortcut to my main client project right now.  The aliases can be found in our open source'd &lt;a href="http://github.com/relevance/etc/tree/master/bash"&gt;etc stash on github.&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;Tagging &lt;a href="http://muness.blogspot.com/"&gt;Muness&lt;/a&gt;, &lt;a href="http://jasonrudolph.com"&gt;Jason&lt;/a&gt;, &lt;a href="http://aaronbedra.com"&gt;Aaron&lt;/a&gt;, and &lt;a href="http://ozmm.org/"&gt;Chris&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=I4JDo4_LAPQ:LkUhZbs5iis:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=I4JDo4_LAPQ:LkUhZbs5iis:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/I4JDo4_LAPQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/16/history-meme-onwards/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>If you think Huddle is ripping off Campfire</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/VhOgmrh23ic/" />
   <updated>2008-04-08T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/08/if-you-think-huddle-is-ripping-off-campfire</id>
   <content type="html">&lt;p&gt;...then you haven't seen mIRC, an irc client app that has been around for years:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://www.aliendownload.com/files/screens/2228_mirc.gif" alt="mirc screen shot" /&gt;&lt;/p&gt;

&lt;p&gt;See anything familiar in the screen shot above?&lt;/p&gt;

&lt;p&gt;Tabs on the top, list of participants in the right hand pane, and chat in the main window.  Change the font to Lucida Grande 12 pt and put in a browser and you pretty much have the Campfire l&amp;amp;f, minus a whole lot of polish and design love.  Chat applications tend to follow a pretty standard UI model, and the fact that Huddle took the 37 Signals style is a good thing for Jason Fried and co.&lt;/p&gt;

&lt;p&gt;Here's why: The look and feel from Basecamp and Campfire have become the defacto "template" for web 2.0 apps without a design of their own.  There is a good reason for that: 37 Signals develops kickass UI's.  As long as they stay on top of their game and keep their customers happy, they have &lt;strong&gt;nothing to worry about&lt;/strong&gt; from people ripping off their design.  The customer who leaves your app for a free one because the CSS is the same is a customer you don't really want anyways.&lt;/p&gt;

&lt;p&gt;Here's the standard process whenever this becomes public and everyone gets up in arms about it:&lt;/p&gt;

&lt;ul&gt;
&lt;li&gt;37 Signals gets a ton of free press and attention. &lt;/li&gt;
    &lt;li&gt;Paid users for the app in question (campfire in this instance) shrug and say "huh, I'm pretty happy with my service, and I'm not going to switch.&lt;/li&gt;
&lt;li&gt;People new to both apps who are in the market try both and choose on their merits.&lt;/li&gt;
    &lt;li&gt;The user experience for the 37 Signals' apps remains superior in most cases, as they are continuously tweaking and improving while copycats are stagnant or trying to keep up.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;What exactly is the problem here?&lt;/p&gt;

&lt;p&gt;The more interesting point about Huddle, and Google App Engine in general, is the &lt;a href="http://gilesbowkett.blogspot.com/2008/04/geek-politics-ftl.html"&gt;lack of diversity the platform provides for&lt;/a&gt;.  But please, drop the "Google ripped off 37 Signals oh noess!!!!" angle.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=VhOgmrh23ic:J1_aT82mPLk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=VhOgmrh23ic:J1_aT82mPLk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/VhOgmrh23ic" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/08/if-you-think-huddle-is-ripping-off-campfire/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Zero to a Fully Git Enabled Rails App in the time it takes to drink an espresso</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/Cpb_uVBqyIE/" />
   <updated>2008-04-05T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/05/zero-to-a-fully-git-enabled-rails-app-in-the-time-it-takes-to-drink</id>
   <content type="html">&lt;p&gt;&lt;strong&gt;updated: &lt;/strong&gt; now uses the real Rails git master at github, now that its live.&lt;/p&gt;

&lt;p&gt;So you want to set up a fresh Rails app in a fresh git repo, with proper ignores setup, with vendor/rails using a git submodule (which enables switching to &lt;strong&gt;any&lt;/strong&gt; Rails branch or tag locally)?   This isn't rocket science or anything, but I figured I'd post it to see what things could be done better.&lt;/p&gt;

&lt;h4&gt;Assumptions&lt;/h4&gt;


&lt;ul&gt;
    &lt;li&gt;You have a working, recent version of git installed.&lt;/li&gt;
    &lt;li&gt;You have the &lt;a href="http://blog.nanorails.com/git-rails"&gt;git-rails&lt;/a&gt; gem installed.&lt;/li&gt;
    &lt;li&gt;You have the bash &lt;a href="#aliases"&gt;aliases&lt;/a&gt; at the bottom of the post.&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;&lt;code&gt;
rails app_name
cd app_name&lt;/p&gt;

&lt;p&gt;git-rails init&lt;/p&gt;

&lt;p&gt;gca -m 'initial commit'&lt;/p&gt;

&lt;p&gt;git submodule add git://github.com/rails/rails.git vendor/rails&lt;/p&gt;

&lt;h1&gt;bring in rails from github&lt;/h1&gt;

&lt;p&gt;git submodule init&lt;/p&gt;

&lt;h1&gt;Submodule 'vendor/rails' (git://github.com/rails/rails.git) registered for path 'vendor/rails'&lt;/h1&gt;

&lt;p&gt;git submodule update&lt;/p&gt;

&lt;p&gt;gca -m 'bring in rails via submodule'&lt;/p&gt;

&lt;h1&gt;Created commit 3b67dee: bring in rails via submodule&lt;/h1&gt;

&lt;h1&gt;2 files changed, 4 insertions(+), 0 deletions(-)&lt;/h1&gt;

&lt;h1&gt;create mode 100644 .gitmodules&lt;/h1&gt;

&lt;h1&gt;create mode 160000 vendor/rails&lt;/h1&gt;

&lt;p&gt;cd vendor/rails
gba # pick branch of Rails you wanna use
git co BRANCH # where BRANCH is the specific branch you want, unless you want the default of going against edge
&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;You're done!&lt;/p&gt;

&lt;p&gt;&lt;span id="aliases"&gt;Here's those aliases you need:&lt;/span&gt;&lt;/p&gt;

&lt;p&gt;&lt;code&gt;
alias g='git'
alias gb='git branch'
alias gba='git branch -a'
alias gc='git commit -v'
alias gca='git commit -v -a'
alias gd='git diff | mate'
alias gl='git pull'
alias gp='git push'
&lt;/code&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=Cpb_uVBqyIE:JbLcOHDuoHc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=Cpb_uVBqyIE:JbLcOHDuoHc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/Cpb_uVBqyIE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/05/zero-to-a-fully-git-enabled-rails-app-in-the-time-it-takes-to-drink/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>log_buddy 0.0.2 released</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/JMVM6ZQZBqM/" />
   <updated>2008-04-04T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/04/log_buddy-002-released</id>
   <content type="html">&lt;h3&gt;Description&lt;/h3&gt;


&lt;p&gt;log_buddy is your friendly little log buddy at your side, helping you dev, debug, and test.&lt;/p&gt;

&lt;h3&gt;Synopsis&lt;/h3&gt;


&lt;p&gt;Call LogBuddy.init to use log_buddy.  It will add two methods to object instance and class level: "d" and "logger".  You can
use your own logger with Logbuddy by passing it into init's options hash:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;LogBuddy.init :default_logger =&amp;gt; Logger.new('my_log.log')
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;Now you have your logger available from any object, at the instance level and class level:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;obj = Object.new
obj.logger.debug("hi")
class MyClass; end
MyClass.logger.info("heya")
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;You also have a method called "d" (for "debug") on any object, which is used for quick debugging and logging of things while you are developing.  Its especially useful while using autotest.  When you call the "d" method with an inline block, it will log the name of the things
in the block and the result.  Examples:&lt;/p&gt;

&lt;h3&gt;Changes&lt;/h3&gt;


&lt;p&gt;0.0.2
* rdocs
* support for multiple statements in one "d" call separated by semicolons&lt;/p&gt;

&lt;h3&gt;Installation&lt;/h3&gt;


&lt;p&gt;sudo gem install log_buddy
&lt;a href="http://thinkrelevance.rubyforge.org/log_buddy"&gt;full docs here&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=JMVM6ZQZBqM:QEj2m9vRXbU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=JMVM6ZQZBqM:QEj2m9vRXbU:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/JMVM6ZQZBqM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/04/log_buddy-002-released/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Rails is moving to Git (and Lighthouse)</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/eiTjtmxBuLk/" />
   <updated>2008-04-02T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/04/02/rails-is-moving-to-git-and-lighthouse</id>
   <content type="html">&lt;p&gt;The Rails core team is making a &lt;a href="http://weblog.rubyonrails.org/2008/4/2/rails-is-moving-from-svn-to-git"&gt;big move&lt;/a&gt; to Git (and &lt;a href="http://github.com"&gt;Github&lt;/a&gt;) for source control and &lt;a href="http://www.lighthouseapp.com/"&gt;Lighthouse&lt;/a&gt; for issue tracking.  I love the move to github - it will make managing patches and your small tweaks to Rails much easier to keep in sync with your chosen branch of Rails.  The move to Lighthouse I'm not sold on, only because I haven't felt the big benefits it offers over Trac, though I haven't really used Lighthouse much over the past few months.&lt;/p&gt;

&lt;p&gt;We've been moving all internal things at &lt;a href="http://thinkrelevance.com"&gt;Relevance&lt;/a&gt; to Git and Github, and so far we've been very happy with the move.  Local commits are great, git is blazing fast, and github is the bees knees.  If you haven't learned Git yet, &lt;a href="http://robsanheim.com/2008/02/22/learn-git-10-different-ways/" title="learn git"&gt;now is the time.&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=eiTjtmxBuLk:wJYEFPtDZMk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=eiTjtmxBuLk:wJYEFPtDZMk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/eiTjtmxBuLk" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/04/02/rails-is-moving-to-git-and-lighthouse/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>How to move your domains off GoDaddy</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/tBz0ehpBdSE/" />
   <updated>2008-03-29T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/03/29/how-to-move-your-domains-off-godaddy</id>
   <content type="html">&lt;p&gt;Its common internet knowledge that GoDaddy is one of the worst, most unfriendly registrars out there.  Go to &lt;a href="http://nodaddy.com/"&gt;NoDaddy&lt;/a&gt; for all sorts of nasty things that GoDaddy that make them completely disreputable, or google "&lt;a href="http://www.google.com/search?q=godaddy+sucks"&gt;godaddy sucks&lt;/a&gt;" for a thousand other reasons.&lt;/p&gt;

&lt;p&gt;What's less common is knowing how to actually get your domains off GoDaddy once you've had enough and have smartened up about finding a good registrar.  Its simple once you know the process and can ignore the five thousand gratuitous options that godaddy has on their control panel.&lt;/p&gt;

&lt;p&gt;First, you must make sure your domain is unlocked.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;go to your domain control panel&lt;/li&gt;
&lt;li&gt;click the checkbox(s) next to the domains you want to unlock&lt;/li&gt;
&lt;li&gt;click the "Locking" button&lt;/li&gt;
&lt;li&gt;choose "unlock" and click ok&lt;/li&gt;

That will take a few minutes to process...in the interim go &lt;a href="http://www.namecheap.com/?aid=88&amp;rid=136544"&gt;sign up for a NameCheap account (referral link)&lt;/a&gt; so you can have a nice, usable control panel and a reputable registrar.  I've also heard good things about &lt;a href="http://www.dotster.com/"&gt;dotster&lt;/a&gt;, but have not used them personally.

Now, once your domain has been unlocked at godaddy, go back to the control panel there and get an authorization code:

&lt;/ul&gt;


&lt;ul&gt;&lt;li&gt;Click on the domain name itself that you want to transfer&lt;/li&gt;
&lt;li&gt;You are now on the "show details" page from hell -- the link you want is &lt;em&gt;Authorization Code:        Send by Email&lt;/em&gt; - click on that "send by email" link, then click OK in the confirmation page that comes up.&lt;/li&gt;
&lt;li&gt;Check your email in a few minutes, and you'll have the auth code (aka EPP Code) you need!  Use that code at the new registar you want to transfer to, and you'll be off godaddy soon enough&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;There is a &lt;a href="http://www.acstucson.info/transfer+domain+from+godaddy"&gt;helpful page here&lt;/a&gt; showing this process with screenshots, but it loads very slow.  Here's a &lt;a href="http://www.acstucson.info.nyud.net/transfer+domain+from+godaddy"&gt;cached copy&lt;/a&gt; that may work better.&lt;/p&gt;

&lt;p&gt;I'm happy to say the last of my domains will be off godaddy by tomorrow, and I'll be 100% godaddy free.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=tBz0ehpBdSE:Z4ZR0dt7oRA:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=tBz0ehpBdSE:Z4ZR0dt7oRA:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/tBz0ehpBdSE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/03/29/how-to-move-your-domains-off-godaddy/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>log_buddy Released - your helpful little dev buddy</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/N9PrIEZW-T4/" />
   <updated>2008-03-28T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/03/28/log_buddy-released-your-helpful-little-dev-buddy</id>
   <content type="html">&lt;p&gt;&lt;a href="http://opensource.thinkrelevance.com/wiki/log_buddy"&gt;LogBuddy&lt;/a&gt; is your friendly little log buddy at your side, helping you dev, debug, and test.  It plays well with Rails and plain old Ruby projects.  To use it, sudo gem install log_buddy, then require 'log_buddy' and call LogBuddy.init.  It will add two methods to object instance and class level: "d" and "logger".  You probably only want to use it in non-production environments.&lt;/p&gt;

&lt;ul&gt;&lt;li&gt;The "logger" method is just a typical logger - it will use the Rails logger if its available.  &lt;/li&gt;
&lt;li&gt;The "d" method is a special helper that will output the code in the block and its result - note that you *must* use the bracket block form - do...end is not supported.&lt;/li&gt;&lt;/ul&gt;


&lt;p&gt;Examples&lt;/p&gt;

&lt;p&gt;[ruby]
require 'lib/log_buddy'
LogBuddy.init&lt;/p&gt;

&lt;p&gt;a = "foo"
@a = "my var"
@@bar = "class var!"
def bark
 "woof!"
end&lt;/p&gt;

&lt;p&gt;module Foo;
  def self.module_method&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;"hi!!"
&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;  end
end&lt;/p&gt;

&lt;p&gt;d { a }                   # logs "a = 'foo'"
d { @a }                  # logs "@a = 'my var'"
d { @@bar }               # logs "@@bar = 'class var!'"
d { bark }                # logs "bark = woof!"
d { Foo::module_method }  # logs Foo::module_method = 'hi!!'
[/ruby]&lt;/p&gt;

&lt;h3&gt;More Details&lt;/h3&gt;




&lt;ul&gt;
&lt;li&gt;Log bugs/issues/suggestions here: &lt;a href="http://opensource.thinkrelevance.com/wiki/log_buddy"&gt;http://opensource.thinkrelevance.com/wiki/log_buddy&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Source: &lt;a href="http://github.com/relevance/logbuddy/tree/master"&gt;http://github.com/relevance/logbuddy/tree/master&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;git clone git://github.com/relevance/logbuddy.git&lt;/li&gt;
&lt;li&gt;rdocs: &lt;a href="http://thinkrelevance.rubyforge.org/log_buddy/"&gt;http://thinkrelevance.rubyforge.org/log_buddy/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;



&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=N9PrIEZW-T4:6QNSLplwDuQ:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=N9PrIEZW-T4:6QNSLplwDuQ:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/N9PrIEZW-T4" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/03/28/log_buddy-released-your-helpful-little-dev-buddy/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Testing Velocity - Keeping your test suite fast, Part 1</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/rY-nJgCzPRI/" />
   <updated>2008-03-26T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/03/26/testing-velocity-keeping-your-test-suite-fast-part-1</id>
   <content type="html">&lt;p&gt;If you are a Ruby or Rails developer, and you know what you are doing, you are writing tests or specs.  Tests express the intent of your code, help verify correctness, and aid in design and exploration.  Rails gives you helpful conventions to follow and functional and integration testing support for free out of the box.  Ruby's power and flexibility allows you to reach in and alter objects at runtime so you can easily &lt;a href="http://mocha.rubyforge.org/"&gt;mock and stub&lt;/a&gt; external dependancies.  In all the discussion and attention giving to tests versus &lt;a href="http://rspec.info/"&gt;specs&lt;/a&gt;, mocks and stubs, fixtures, and test coverage, one thing that doesn't nearly get enough attention is the importance of your test suite's speed.&lt;/p&gt;

&lt;p&gt;Why does test speed matter?  Consider at the most basic level what a test is: the smallest level of automated feedback in your application.  You can view a typical agile application as a series of concentric feedback circles, the smallest being unit tests at the method level, up to story level tests (ie acceptance or integration), on to daily standups, iteration planning/review and release planning and retrospectives.  The more you can tighten and tune all those feedback loops, from the micro level to macro, the more you can quickly respond to change and complete quality features that your app's users will really use and love.&lt;/p&gt;

&lt;p&gt;If you've ever worked on an larger project with a lot of slow tests, you've probably seen the "slow tests antipattern": developers stop running the whole suite after small changes, because it takes too long and they get bored or distracted while they wait.  Changes that require many small steps, such as major refactorings or API changes, become too burdensome to do regularly.  Design, quality, and the code base as a whole suffer as a result.  In the worst cases, developers stop running the test suite interactively and let a nightly build run it, or maybe the tests are abandoned altogether.  Tests aren't run before checking code, and all the value from automated tests/specs is lost.  &lt;em&gt;Abandon all hope, ye who enter here.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;Ruby, particularly in the current 1.8.6 MRI implementation, isn't exactly known for its peformance.  Just ask the &lt;a href="http://www.railsenvy.com/"&gt;Rails Envy&lt;/a&gt; guys and they will tell you - "Rails doesn't scale".  Maybe Rubinius or JRuby can rescue your slow tests a year or two from now when new virtual machines bring major improvements, but for right now it primarily comes down to you and your team's development practices.&lt;/p&gt;

&lt;p&gt;What is a "fast" test suite?  It depends on project size of course, but generally unit tests should run in the tens of seconds or less, and the full suite (including functional+integration) should be at most a few minutes.  Browser-based acceptance level tests using something like Selenium are typically outside of the "interactive tests" group that I'm considering here, and take much longer.  If your unit tests alone take a minute or two to run you will have some serious obstacles, if not now then later as your code base and technical debt increase.&lt;/p&gt;

&lt;p&gt;So your test speed matters if you anticipate your app growing beyond 500 lines of code.  Ruby is built for developer productivity and not machine productivity, but in order to sustain developer productivity we need to keep our tests running fast.&lt;/p&gt;

&lt;p&gt;Future posts in this series will discuss different ideological and technical approaches to keeping you tests running fast.  What does Rails consider a "unit" and "functional" test, and does it make sense?  What is the actual goal of a good unit test?  Should we use &lt;a href="http://unit-test-ar.rubyforge.org/"&gt;unit_record&lt;/a&gt;, nulldb, or something else?  What about plain Rails2 fixtures versus &lt;a href="http://replacefixtures.rubyforge.org/"&gt;fixture replacement&lt;/a&gt;, or maybe a home grown factory?  Do YARV or JRuby offer some hope for the near future for some easy, free improvements in runtime?&lt;/p&gt;

&lt;p&gt;I'm curious as to know what the "average" Rails test suite clocks in at, and what level of coverage it attains.  Is your test slowness hampering your development?  Do you rely on autotest, focused tests, or something else to keep the tests you run relevant?   Please do share your thoughts on test speed and what sorts of issues this series should cover in upcoming posts.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=rY-nJgCzPRI:Ad4aCqutRa8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=rY-nJgCzPRI:Ad4aCqutRa8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/rY-nJgCzPRI" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/03/26/testing-velocity-keeping-your-test-suite-fast-part-1/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Dave Thomas' testing library (thrown in github)</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/Qll5BiC1dsQ/" />
   <updated>2008-03-14T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/03/14/dave-thomas-testing-library-thrown-in-github</id>
   <content type="html">&lt;p&gt;Dave recently blogged a &lt;a href="http://pragdave.blogs.pragprog.com/pragdave/2008/03/playing-with-a.html"&gt;very cool little test framework&lt;/a&gt; he whipped up.  Its under 100 lines of code and he says he definitely does &lt;strong&gt;not&lt;/strong&gt; plan on supporting it publicly.&lt;/p&gt;

&lt;p&gt;At the very least I intend on playing with it and incorporating some of the ideas, so I put it &lt;a href="http://github.com/rsanheim/prag_dave_testing/tree/master"&gt;up on github.&lt;/a&gt;  This does not constitute a release or support - I just want to watch the forks develop.&lt;/p&gt;

&lt;p&gt;Grab it with &lt;pre&gt;&lt;code&gt;git clone git://github.com/rsanheim/prag_dave_testing.git&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=Qll5BiC1dsQ:8OIKco65e9U:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=Qll5BiC1dsQ:8OIKco65e9U:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/Qll5BiC1dsQ" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/03/14/dave-thomas-testing-library-thrown-in-github/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Staging Environments in Rails</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/zx8_5uK3eOg/" />
   <updated>2008-03-11T00:00:00-07:00</updated>
   <id>http://robsanheim.com/2008/03/11/staging-environments-in-rails</id>
   <content type="html">&lt;p class="right img"&gt;&lt;img id="alltheworldsastage..." src="http://farm1.static.flickr.com/57/165488318_e85a287039_m.jpg" alt="all the worlds a stage..." title="" /&gt;&lt;br /&gt; (&lt;a style="font-size:75%" href="http://www.flickr.com/photos/wvs/165488318/" title="R. Fraser Elliott Hall on Flickr - Photo Sharing!"&gt;photo @ flickr&lt;/a&gt;)&lt;/p&gt;




&lt;p&gt;Most Rails apps that grow beyond the &amp;#8220;toy&amp;#8221; or &amp;#8220;small&amp;#8221; stage benefit greatly from the addition of a staging environment.  Staging is where you deploy to flush out integration issues, to demo new features to users and clients, and generally put the app through its paces in a &amp;#8220;production-like&amp;#8221; environment before doing a real production deployment.  It should match the production environment as closely as possible, though in practice things do diverge for certain cases and for most apps the cost of truly duplicating production hardware is prohibitive.&lt;/p&gt;




&lt;p&gt;Rails lets you setup a staging environment easily.  Create a file in config/environments called &amp;#8216;staging.rb&amp;#8217;, and then start your server(s) with RAILS_ENV=staging, and you are all set.  Here&amp;#8217;s quick steps to get up and running with a staging environment:&lt;/p&gt;




&lt;ol&gt;
&lt;li&gt;copy config/environments/production.rb to staging.rb&lt;/li&gt;
&lt;li&gt;add an entry to database.yml for staging&lt;/li&gt;
&lt;li&gt;&lt;p&gt;tweak your deployment to respect your new environment using &lt;a href="http://weblog.jamisbuck.org/2007/7/23/capistrano-multistage"&gt;multistage&lt;/a&gt; or something simple like this:&lt;br /&gt;[ruby]
task :production do
  set :rails_env, "production"
  role :web, "prod.ip.here"
  # other roles...
end

task :staging do
  set :rails_env, "staging"
  role :web, "stage.ip.here"
  # other roles
end[/ruby]&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;setup and deploy staging: &lt;pre&gt;cap staging setup; cap staging deploy:cold; etc...&lt;/pre&gt;&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;tweak and iterate as you see fit&lt;/li&gt;
&lt;/ol&gt;




&lt;p&gt;You may ask at this point &amp;#8220;why not just a copy of my production stack as staging?&amp;#8221;  The fundamental reason is that &lt;em&gt;abstractions leak&lt;/em&gt;.  Your staging environment is &lt;em&gt;similar&lt;/em&gt; to production, but its not an exact copy.  Think about email notifications - do you really want exception notifications or activation messages to be send the same in staging as production?  Usually the answer is no - you want to be able to tell immediately if an error is from prod or staging, which could mean prepending [STG] in the subject and maybe changing the sender to be staging@domain.com.  For a lot of apps, you will have tasks that will perform differently between staging and production.  Some typical processes like this includes batch jobs, web service calls, and all sorts of notification jobs that would notify users or do a real external call, but in staging should just do a fake call and log the result.&lt;/p&gt;




&lt;p&gt;To enable easier testing and cleaner code, a very simple wrapper class around RAILS_ENV is nice to have.  It also makes me happier to have less constants in my code, as I feel all caps detracts from the beauty of Ruby.  You can use &lt;a href="http://blog.codahale.com/2006/04/09/rails-environments-a-plugin-for-well-rails/" title="Rails Environments: a plugin for, well, Rails | Archives | codablog | Coda Hale"&gt;Coda&amp;#8217;s plugin&lt;/a&gt; or write your own in probably 5 minutes.  Since you have a level of indirection around your environment checks, you can write specs like this:&lt;/p&gt;


&lt;p&gt;[ruby]it "should only log notifier emails in staging" do
  Rails.stubs(:staging).returns(true)
  AppNotifier.expects(:debug).returns(mock("logger", :debug =&amp;gt; "some logger call"))
  AppNotifier.send_reports
end&lt;/p&gt;

&lt;p&gt;it "should send emails in production" do
  Rails.stubs(:production).returns(true)
  AppMailer.expects(:deliver_reports)
  AppNotifier.send_reports
end
[/ruby]&lt;/p&gt;

&lt;p&gt;So don&amp;#8217;t be afraid to create a separate staging environment and give it the respect it deserves when your deployment is complex enough to demand it.  It will make your life easier and your app easier to maintain and scale.&lt;/p&gt;

&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=zx8_5uK3eOg:AunclDPqfUI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=zx8_5uK3eOg:AunclDPqfUI:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/zx8_5uK3eOg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/03/11/staging-environments-in-rails/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Tarantula, Rails super-fuzzer, released</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/kFJjXtHPiQg/" />
   <updated>2008-02-26T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2008/02/26/tarantula-rails-super-fuzzer-released</id>
   <content type="html">&lt;p&gt;Stu has &lt;a href="http://blog.thinkrelevance.com/2008/2/26/tarantula-vs-your-rails-app"&gt;finally released Tarantula&lt;/a&gt; over on the main Relevance blog.  Tarantula is probably the most exciting open source release Relevance has put out since I've joined the company about half a year ago.  It basically will crawl your app intelligently, try putting garbage into forms and query params, and give you a nice looking report of what breaks and what doesn't.  It can also validate html as it goes.&lt;/p&gt;

&lt;p&gt;We have a lot of good ideas and plans for many more things this tool can do - one big thing I'd like to see is the ability for it to run in a black box mode against your real app (in a staging env, of course) in addition to a running as a Rails integration test.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://www.flickr.com/photos/robsanheim/2293635887/" title="Tarantula sample by robsanheim, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2329/2293635887_93bc920eb9_m.jpg" width="240" height="181" alt="Tarantula sample" /&gt;&lt;/a&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=kFJjXtHPiQg:qD456IEKUyk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=kFJjXtHPiQg:qD456IEKUyk:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/kFJjXtHPiQg" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/02/26/tarantula-rails-super-fuzzer-released/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Learn Git 10 Different Ways</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/X_Z0G8sdzPE/" />
   <updated>2008-02-22T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2008/02/22/learn-git-10-different-ways</id>
   <content type="html">&lt;p&gt;No particular order - things near the top just happen to be what I've had time to look into so far.&lt;/p&gt;




&lt;ul&gt;
&lt;li&gt;&lt;a href="http://git.or.cz/course/svn.html" title="Git - SVN Crash Course"&gt;Git-svn crash course&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;FLOSS Weekly #19 - &lt;a href="http://twit.tv/floss19" title="The TWiT Netcast Network with Leo Laporte"&gt;Interview with Junio Hamano, maintainer of Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.kernel.org/pub/software/scm/git/docs/tutorial.html" title="A tutorial introduction to git (for version 1.5.1 or newer)"&gt;Git tutorial&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://tsunanet.blogspot.com/2007/07/learning-git-svn-in-5min.html" title="Tsuna's blog: Learning git-svn in 5min"&gt;Learning git-svn in 5 minutes&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Scott Chacon&amp;#8217;s &lt;a href="http://www.vimeo.com/369095" title="Git with Rails Tutorial on Vimeo"&gt;Git with Rails screencast&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://www.youtube.com/watch?v=4XpnKHJAok8" title="YouTube - Tech Talk: Linus Torvalds on git"&gt;Tech Talk: Linus Torvalds on git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href="http://video.google.com/videoplay?docid=-3999952944619245780" title="Git - a Talk by Randal Schwartz"&gt;Tech Talk: Randal Schwartz on Git&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Using Git without feeling stupid (parts &lt;a href="http://smalltalk.gnu.org/blog/bonzinip/using-git-without-feeling-stupid-part-1" title="Using git without feeling stupid (part 1) | GNU Smalltalk"&gt;one&lt;/a&gt; and &lt;a href="http://smalltalk.gnu.org/blog/bonzinip/using-git-without-feeling-stupid-part-2" title="Using git without feeling stupid (part 2) | GNU Smalltalk"&gt;two&lt;/a&gt;)&lt;/li&gt;
&lt;li&gt;&lt;a href="http://oebfare.com/blog/2008/jan/23/using-git-django-screencast/" title="Using git with Django Screencast | oebfare"&gt;Using Git with Django&lt;/a&gt; screencast&lt;/li&gt;
&lt;li&gt;&lt;a href="http://peepcode.com/products/git" title="Git | PeepCode Screencasts for Ruby on Rails Developers"&gt;Git Screencast&lt;/a&gt; at Peepcode&lt;/li&gt;
&lt;/ul&gt;


&lt;p&gt;Friends don't let friends commit centralized.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=X_Z0G8sdzPE:gq_18O3k0oc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=X_Z0G8sdzPE:gq_18O3k0oc:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/X_Z0G8sdzPE" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/02/22/learn-git-10-different-ways/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>Productivity Talk abstract and resources</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/5TxuvdnMJ5s/" />
   <updated>2008-02-20T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2008/02/20/productivity-talk-abstract-and-resources</id>
   <content type="html">&lt;p&gt;Thanks to everyone who came out to Raleigh.rb last night for my talk.  You can &lt;a href="http://feeds.feedburner.com/~r/raleighrb/~3/238194153/2008-02-19_productivity.mp3"&gt;hear the talk (mp3 ~25 mb)&lt;/a&gt; thanks to &lt;a href="http://matthewbass.com"&gt;Matthew Bass&lt;/a&gt;.  The sound quality is decent considering it was just recording right into his macbook.&lt;/p&gt;

&lt;p&gt;I've posted more details from the talk, the abstract, and references (books, tools, etc) at the &lt;a href="/i-can-has-productivity/"&gt;main "can has productivity" page&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=5TxuvdnMJ5s:JKSt2U0F9i4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=5TxuvdnMJ5s:JKSt2U0F9i4:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/5TxuvdnMJ5s" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/02/20/productivity-talk-abstract-and-resources/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>I Can Has Productivity?</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/bEVG4YSifHM/" />
   <updated>2008-02-18T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2008/02/18/i-can-has-productivity</id>
   <content type="html">&lt;p&gt;I'll be speaking at &lt;a href="http://ruby.meetup.com/3/"&gt;Raleigh.rb&lt;/a&gt; tomorrow on Productivity, Ruby, and how to get more stuff done.  Spend more time programming and less time reading about programming (or reading PerezHilton, if thats your poison).&lt;/p&gt;

&lt;p&gt;If you are in the area you should come out and say hi.  Productivity is serious business.&lt;/p&gt;

&lt;p&gt;&lt;img src="http://farm2.static.flickr.com/1312/1417656455_d8448a0c55_m.jpg" /&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=bEVG4YSifHM:3X9tY7eJvG8:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=bEVG4YSifHM:3X9tY7eJvG8:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/bEVG4YSifHM" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/02/18/i-can-has-productivity/</feedburner:origLink></entry>
 
 
 
 <entry>
   <title>[ANN] brain_buster 0.8.0 released</title>
   <link href="http://feedproxy.google.com/~r/PanasonicYouth/~3/d8eJT998j9c/" />
   <updated>2008-02-12T00:00:00-08:00</updated>
   <id>http://robsanheim.com/2008/02/12/ann-brain_buster-080-released</id>
   <content type="html">&lt;p&gt;I'm happy to release version 0.8.0 of &lt;a href="http://opensource.thinkrelevance.com/wiki/BrainBuster" title="BrainBuster - Relevance Open Source - Trac"&gt;BrainBuster&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;This is a long overdue release.  I've removed all deprecated code, updated for Rails 2.0, improved specs considerably, and cleaned up the api and views.&lt;/p&gt;

&lt;p&gt;Because of the way the filter chain is handled in Rails 2.0, you will now have to handle a captcha failure explicitly.  Right now thats just done by overriding a method in your controller.  See the &lt;a href="http://opensource.thinkrelevance.com/browser/brain_buster/trunk/README"&gt;README&lt;/a&gt; for more info.&lt;/p&gt;

&lt;p&gt;I hope to post a quick tutorial for getting up and running with BrainBuster over the next few days, so please &lt;a href="http://robsanheim.com/feed"&gt;watch for that&lt;/a&gt; if you want to learn how to add an accessible, image free captcha to your app.&lt;/p&gt;

&lt;p&gt;BrainBuster has now been moved to &lt;a href="http://github.com/rsanheim/brain_buster/tree" title="rsanheim's brain_buster at master &amp;mdash; GitHub"&gt;github for the dev scm&lt;/a&gt;, and to the &lt;a href="http://opensource.thinkrelevance.com/wiki/BrainBuster" title="BrainBuster - Relevance Open Source - Trac"&gt;Relevance Trac&lt;/a&gt; for tickets and bugs.&lt;/p&gt;

&lt;p&gt;The mailing list is still at &lt;a href="http://groups.google.com/group/brainbuster-discuss" title="BrainBuster Discussion | Google Groups"&gt;google groups&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=d8eJT998j9c:KY7c1rqqR6I:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/PanasonicYouth?a=d8eJT998j9c:KY7c1rqqR6I:7Q72WNTAKBA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/PanasonicYouth?d=7Q72WNTAKBA" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/PanasonicYouth/~4/d8eJT998j9c" height="1" width="1"/&gt;</content>
 <feedburner:origLink>http://robsanheim.com/2008/02/12/ann-brain_buster-080-released/</feedburner:origLink></entry>
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
 
</feed>
