<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.simpable.com/~d/styles/itemcontent.css"?><rss xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:content="http://purl.org/rss/1.0/modules/content/" xmlns:media="http://search.yahoo.com/mrss/" xmlns:yt="http://gdata.youtube.com/schemas/2007" version="2.0">
   <channel>
      <title>Scott Watermasysk</title>
      <description>Really important stuff you absolutely need to know.</description>
      <link>http://pipes.yahoo.com/pipes/pipe.info?_id=31ef79a7f6579cb0d9b694ea1393f915</link>
      <pubDate>Thu, 02 Sep 2010 09:50:43 -0700</pubDate>
      <generator>http://pipes.yahoo.com/pipes/</generator>
      <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.simpable.com/Simpable" /><feedburner:info xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" uri="simpable" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
         <title>Flexibility and Power</title>
         <link>http://scottw.me/post/942815952</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://inessential.com/2010/08/09/flexibility_and_power"&gt;Flexibility and Power&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;Flexibility is the ability to change how software works; power is the ability to do more with less effort.&lt;/p&gt;
&lt;/blockquote&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/942815952</guid>
         <pubDate>Thu, 12 Aug 2010 09:49:50 -0700</pubDate>
      </item>
      <item>
         <title>Scarcity in Design</title>
         <link>http://scottw.me/post/866758213</link>
         <description>&lt;p&gt;Great interview of &lt;a rel="nofollow" target="_blank" href="http://en.wikipedia.org/wiki/Fred_Brooks"&gt;Fred Brooks&lt;/a&gt; in the August 2010 Wired magazine (sorry, no link at this time).&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;The critical thing about the design process is to identify your scarcest resource. Despite what you think that very often is not money. For example, in a NASA moon shot, money is abundant but lightness is scare; every ounce of weight requires tons of material below. On the design of a beach vacation home, the limitation may be your ocean-front footage. You have to make sure your whole team understands what the scarce resource you’re optimizing.&lt;/p&gt;
&lt;/blockquote&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/866758213</guid>
         <pubDate>Tue, 27 Jul 2010 10:31:35 -0700</pubDate>
         <category>design</category>
      </item>
      <item>
         <title>Ocean City Maryland</title>
         <link>http://crinket.com/ocean-city-maryland</link>
         <description>&lt;p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/DsfjryxsEyenegkfaJzEaoCsxDcHIFFjCkAGIqmvqzrJkuwcussjnDpHpour/IMG_0008.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/DsfjryxsEyenegkfaJzEaoCsxDcHIFFjCkAGIqmvqzrJkuwcussjnDpHpour/IMG_0008.jpg.scaled500.jpg" width="500" height="373"/&gt; &lt;/a&gt;
&lt;/p&gt;The red sun.  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/ocean-city-maryland"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/ocean-city-maryland#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/ocean-city-maryland</guid>
         <pubDate>Tue, 20 Jul 2010 02:58:32 -0700</pubDate>
         <media:content width="2592" url="http://posterous.com/getfile/files.posterous.com/scottwater/DsfjryxsEyenegkfaJzEaoCsxDcHIFFjCkAGIqmvqzrJkuwcussjnDpHpour/IMG_0008.jpg" type="image/jpeg" height="1936">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/DsfjryxsEyenegkfaJzEaoCsxDcHIFFjCkAGIqmvqzrJkuwcussjnDpHpour/IMG_0008.jpg.scaled500.jpg" height="373" />
         </media:content>
      </item>
      <item>
         <title>DogFish Head Advertising</title>
         <link>http://crinket.com/dogfish-head-advertising</link>
         <description>&lt;p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/rDDcBjfkkDoiEofuGIJCuyFzeduyvFhvBwsiucvjeiavGxfhovwlhjHbjgIa/IMG_0007.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/rDDcBjfkkDoiEofuGIJCuyFzeduyvFhvBwsiucvjeiavGxfhovwlhjHbjgIa/IMG_0007.jpg.scaled500.jpg" width="500" height="669"/&gt; &lt;/a&gt;
&lt;/p&gt;If you are hiring, I could sell a ton of this stuff.  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/dogfish-head-advertising"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/dogfish-head-advertising#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/dogfish-head-advertising</guid>
         <pubDate>Mon, 19 Jul 2010 17:29:34 -0700</pubDate>
         <media:content width="2592" url="http://posterous.com/getfile/files.posterous.com/scottwater/rDDcBjfkkDoiEofuGIJCuyFzeduyvFhvBwsiucvjeiavGxfhovwlhjHbjgIa/IMG_0007.jpg" type="image/jpeg" height="1936">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/rDDcBjfkkDoiEofuGIJCuyFzeduyvFhvBwsiucvjeiavGxfhovwlhjHbjgIa/IMG_0007.jpg.scaled500.jpg" height="669" />
         </media:content>
      </item>
      <item>
         <title>Smoking in Maryland</title>
         <link>http://crinket.com/smoking-in-maryland</link>
         <description>&lt;p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/sHzefCvjvjEFeiClcCyvcFgHzzzyIarxusqEgvHtxFIzGyAaFshhjJcslCbq/IMG_0006.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/sHzefCvjvjEFeiClcCyvcFgHzzzyIarxusqEgvHtxFIzGyAaFshhjJcslCbq/IMG_0006.jpg.scaled500.jpg" width="500" height="669"/&gt; &lt;/a&gt;
&lt;/p&gt;Way to stick it to the smokers Maryland.  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/smoking-in-maryland"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/smoking-in-maryland#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/smoking-in-maryland</guid>
         <pubDate>Mon, 19 Jul 2010 17:28:28 -0700</pubDate>
         <media:content width="2592" url="http://posterous.com/getfile/files.posterous.com/scottwater/sHzefCvjvjEFeiClcCyvcFgHzzzyIarxusqEgvHtxFIzGyAaFshhjJcslCbq/IMG_0006.jpg" type="image/jpeg" height="1936">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/sHzefCvjvjEFeiClcCyvcFgHzzzyIarxusqEgvHtxFIzGyAaFshhjJcslCbq/IMG_0006.jpg.scaled500.jpg" height="669" />
         </media:content>
      </item>
      <item>
         <title>"Your #1 competitor starting out will always be the BACK button, nothing else."</title>
         <link>http://scottw.me/post/802727255</link>
         <description>“Your #1 competitor starting out will always be the BACK button, nothing else.”&lt;br/&gt;&lt;br/&gt; - &lt;em&gt;Gary Tan&lt;/em&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/802727255</guid>
         <pubDate>Mon, 12 Jul 2010 10:34:55 -0700</pubDate>
         <category>Business</category>
      </item>
      <item>
         <title>Lost Time</title>
         <link>http://scottw.me/post/789488377</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://www.paulgraham.com/selfindulgence.html"&gt;Lost Time&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;The most dangerous way to lose time is not to spend it having fun, but to spend it doing fake work.&lt;/p&gt;
&lt;/blockquote&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/789488377</guid>
         <pubDate>Fri, 09 Jul 2010 06:38:14 -0700</pubDate>
         <category>life</category>
      </item>
      <item>
         <title>Derek Sivers - My Loss</title>
         <link>http://scottw.me/post/786352109</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://sivers.org/loss"&gt;Derek Sivers - My Loss&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;We all underestimate our ability to massively change our life when it’s gone off track.&lt;/p&gt;
&lt;/blockquote&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/786352109</guid>
         <pubDate>Thu, 08 Jul 2010 13:01:33 -0700</pubDate>
         <category>life</category>
      </item>
      <item>
         <title>Reading PDF eBooks on an iPad</title>
         <link>http://scottw.me/post/785245836</link>
         <description>&lt;p&gt;The recent update to iBooks added PDF support. Unfortunately, the reading experience is no where near as good as the epub experience.&lt;/p&gt; &lt;p&gt;This was a bummer for me since I own quite a few eBooks in PDF format (and converting them to epub does not yield better results).&lt;/p&gt; &lt;p&gt;Thankfully, &lt;a rel="nofollow" target="_blank" href="http://twitter.com/gruber/status/15376652813"&gt;a tweet from John Grubber&lt;/a&gt; lead me to &lt;a rel="nofollow" target="_blank" href="http://itunes.apple.com/us/app/simplypdf/id368153164?mt=8"&gt;SimplyPDF&lt;/a&gt; which makes the PDF experience much more tolerable by allowing you to &lt;em&gt;focus&lt;/em&gt; on a particular area of the page.&lt;/p&gt; &lt;p&gt;Here are too screen shots to compare:&lt;/p&gt; &lt;p&gt;The Default View in SimplyPDF&lt;/p&gt; &lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l58r1jdA0B1qzt6ba.jpg" alt="Default PDF View"/&gt;&lt;/p&gt; &lt;p&gt;The &lt;strong&gt;Focused&lt;/strong&gt; View in SimplyPDF&lt;/p&gt; &lt;p&gt;&lt;img src="http://media.tumblr.com/tumblr_l58r2a9QiO1qzt6ba.jpg" alt="Focused PDF View"/&gt;&lt;/p&gt; &lt;p&gt;While it is no way near as good as a epub in iBooks or mobi in the Kindle app, it does get the job done for now.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/785245836</guid>
         <pubDate>Thu, 08 Jul 2010 06:45:00 -0700</pubDate>
      </item>
      <item>
         <title>A really interesting look at the design decisions in FireFox 4...</title>
         <link>http://scottw.me/post/734569587</link>
         <description>&lt;iframe class="embeddedvideo" src="http://www.youtube.com/v/HmgtW2Iw-kE&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1" type="application/x-shockwave-flash" width="400" height="336"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;A really interesting look at the design decisions in FireFox 4 for moving tabs to the top of the main window.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/734569587</guid>
         <pubDate>Fri, 25 Jun 2010 06:35:40 -0700</pubDate>
      </item>
      <item>
         <title>You are as Dumb as You Ever Will Be</title>
         <link>http://scottw.me/post/728997961</link>
         <description>&lt;p&gt;A great line from &lt;a rel="nofollow" target="_blank" href="http://amzn.to/dauILi"&gt;Design Patterns in Ruby&lt;/a&gt; by Russ Olsen in talking about &lt;strong&gt;You Ain’t Gonna Need It&lt;/strong&gt; (YAGNI):&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Barring a sharp blow to the head, as you stand here today you are as dumb as you ever will be.&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;You get smarter every day. Your users (generally) understand your app and their needs better every day. Unnecessarily trying to solve future problems is really just guessing, so why do it if you do not have to?&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/728997961</guid>
         <pubDate>Wed, 23 Jun 2010 06:18:04 -0700</pubDate>
      </item>
      <item>
         <title>Steak at a dollar store. Could this happen anywhere but in the...</title>
         <link>http://scottw.me/post/722418621</link>
         <description>&lt;img src="http://24.media.tumblr.com/tumblr_l4djymzA5G1qzt84po1_500.jpg"/&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Steak at a dollar store. Could this happen anywhere but in the US?&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/722418621</guid>
         <pubDate>Mon, 21 Jun 2010 10:15:58 -0700</pubDate>
      </item>
      <item>
         <title>Coder.io</title>
         <link>http://scottw.me/post/700868560</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://coder.io"&gt;Coder.io&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;It’s my attempt at fixing the process of discovering and maintaining knowledge and references relating to development topics I’m/you’re interested in.&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;In short, you tell Coder.io what you are interested in and it filters through the content and presents you with a list of fresh content.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/700868560</guid>
         <pubDate>Tue, 15 Jun 2010 05:50:49 -0700</pubDate>
      </item>
      <item>
         <title>Great video by Gary Vaynerchuk at RailsConf about actually...</title>
         <link>http://scottw.me/post/697447865</link>
         <description>&lt;iframe class="embeddedvideo" src="http://www.youtube.com/v/-QWHkcCP3tA&amp;rel=0&amp;egm=0&amp;showinfo=0&amp;fs=1" type="application/x-shockwave-flash" width="400" height="336"&gt;&lt;/iframe&gt;&lt;br/&gt;&lt;br/&gt;&lt;p&gt;Great video by &lt;a rel="nofollow" target="_blank" href="http://garyvaynerchuk.com/"&gt;Gary Vaynerchuk&lt;/a&gt; at RailsConf about actually giving a damn.&lt;/p&gt; &lt;p&gt;Think for a second if you would have made that last tweet or posted a very negative blog rant if your grandchildren might someday read it?&lt;/p&gt; &lt;p&gt;People are increasingly understanding once something gets published online, it is impossible for it to be removed. However, I don’t think people are completely grasping the historical perspective of information in general.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/697447865</guid>
         <pubDate>Mon, 14 Jun 2010 06:26:48 -0700</pubDate>
         <category>business</category>
      </item>
      <item>
         <title>Stack Exchange Making the Internet Better</title>
         <link>http://scottw.me/post/697419809</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://blog.stackoverflow.com/2010/06/introducing-stack-exchange-data-explorer/"&gt;Stack Exchange Making the Internet Better&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;Everything contributed to the Stack Exchange network of websites is licensed under Creative Commons Attribution – Share Alike. This means it belongs to everyone, and can be freely reused (even commercially!), so long as it is follows our simple rules of attribution. That’s our contract with the community — it’s your generously contributed content that makes these websites worth visiting in the first place!&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;The way it should be. Kudos to the Stack Exchange folks for working to make their data as open as possible.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/697419809</guid>
         <pubDate>Mon, 14 Jun 2010 06:13:00 -0700</pubDate>
      </item>
      <item>
         <title>1% Better</title>
         <link>http://scottw.me/post/687174151</link>
         <description>&lt;p&gt;In reading &lt;a rel="nofollow" target="_blank" href="http://blogs.zappos.com/blogs/ceo-and-coo-blog"&gt;Tony Hsieh’s&lt;/a&gt; excellent &lt;a rel="nofollow" target="_blank" href="http://amzn.to/9iZtk3"&gt;Delivering Happiness&lt;/a&gt; there is a &lt;a rel="nofollow" target="_blank" href="http://blogs.zappos.com/blogs/ceo-and-coo-blog/2009/01/07/the-power-of-1"&gt;blog post by CFO&lt;/a&gt;, Alfred Lin, about what can be accomplished by getting 1% better everyday (personally, community, company, etc.).&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;Imagine yourself making 1% changes every day that compounds and will make you and Zappos 37x better by the end of the year. Imagine if every employee at Zappos was doing the same. Imagine how much better you, Zappos and the world will be next year.&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;A 1% improvement everyday will yield a 37x return. As an example, $100 with a 1% daily return would net you $3,700 at the end of the year ($100 * (1 + 1%) ^ 365 = $3,778.34).&lt;/p&gt; &lt;p&gt;While you cannot calculate mathematically a 1% life improvement it still a great daily goal. What can you do today to improve the world around you by 1%? Can you do it tomorrow as well?&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/687174151</guid>
         <pubDate>Fri, 11 Jun 2010 07:00:00 -0700</pubDate>
      </item>
      <item>
         <title>Great Git Reference</title>
         <link>http://scottw.me/post/687000687</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://gitref.org/"&gt;Great Git Reference&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;This is the Git reference site. This is meant to be a quick reference for learning and remembering the most important and commonly used Git commands. The commands are organized into sections of the type of operation you may be trying to do, and will preset the common options and commands needed to accomplish these common tasks&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;The doc and ProGit book integration throughout is great.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/687000687</guid>
         <pubDate>Fri, 11 Jun 2010 06:15:00 -0700</pubDate>
         <category>Git</category>
      </item>
      <item>
         <title>Mongoid - Hottest OSS Project Site Ever</title>
         <link>http://scottw.me/post/684539777</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://mongoid.org/"&gt;Mongoid - Hottest OSS Project Site Ever&lt;/a&gt;: &lt;p&gt;Definitely something to aspire to.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/684539777</guid>
         <pubDate>Thu, 10 Jun 2010 12:53:19 -0700</pubDate>
      </item>
      <item>
         <title>RVM</title>
         <link>http://scottw.me/post/683583703</link>
         <description>&lt;p&gt;I have been using a tool called &lt;a rel="nofollow" target="_blank" href="http://rvm.beginrescueend.com/"&gt;Ruby Version Manager&lt;/a&gt; (RVM) for the last couple of weeks and it has been pure gold.&lt;/p&gt; &lt;blockquote&gt; &lt;p&gt;RVM is a command line tool which allows us to easily install, manage and work with multiple ruby environments from interpreters to sets of gems. RVM itself is easy to install!&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;When I first set it up, I was still using Ruby 1.8.7 at the system (non-RVM) level and set up a quick instance of 1.9.1 in RVM. My initial demo tests worked great, but once I started to actually go beyond the basics with it I started to run into some weird gem issues in regards to executables.&lt;/p&gt; &lt;p&gt;The fix for me was to remove all of my gems (and executables) from the system version of Ruby and instead set up a new instance of 1.8.7 under RVM. Once completed, I just set this instance of 1.8.7 as my system wide default (rvm 1.8.7 —default).&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/683583703</guid>
         <pubDate>Thu, 10 Jun 2010 06:08:35 -0700</pubDate>
      </item>
      <item>
         <title>RVM &amp; Textmate</title>
         <link>http://scottw.me/post/680852472</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://rvm.beginrescueend.com/integration/textmate/"&gt;RVM &amp; Textmate&lt;/a&gt;: &lt;p&gt;Looks like this has been out for a while, but it was new for me.&lt;/p&gt; &lt;p&gt;if you get an error executing “rvm wrapper” you will need to update rvm.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/680852472</guid>
         <pubDate>Wed, 09 Jun 2010 11:30:09 -0700</pubDate>
      </item>
      <item>
         <title>Cache Hit Ratio</title>
         <link>http://scottw.me/post/670231961</link>
         <description>&lt;a rel="nofollow" target="_blank" href="http://www.mysqlperformanceblog.com/2010/05/19/beyond-great-cache-hit-ratio/"&gt;Cache Hit Ratio&lt;/a&gt;: &lt;blockquote&gt; &lt;p&gt;The great memcached hit ratio is great however even more than that you should target eliminating requests all together. Hit rate is very bad indicator to begin with. Imagine you have application which gets 90 memcache gets (hits) to retrieve some data plus there are 10 more requests which resulted in misses and caused MySQL queries. The hit ratio is 90%. Imagine now you have found a way to store the data which required 90 requests as the single object. You have 1 request (hit) now and 10 misses which drops your hit rate down to less than 10% but performance will likely be a lot better.&lt;/p&gt;
&lt;/blockquote&gt; &lt;p&gt;For those in the Microsoft space, this logic applies equally well to Velocity/AppFabric. The act of caching is just the first step. You need to think about what you cache, why you are caching it, and then ensure you can re-use it effectively.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/670231961</guid>
         <pubDate>Sun, 06 Jun 2010 10:30:49 -0700</pubDate>
      </item>
      <item>
         <title>Readability</title>
         <link>http://scottw.me/post/669645103</link>
         <description>&lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://blog.arc90.com/2010/06/03/readability-updated-an-end-to-the-yank-of-the-hyperlink/"&gt;Some nice updates&lt;/a&gt; to the excellent &lt;a rel="nofollow" target="_blank" href="http://lab.arc90.com/experiments/readability/"&gt;Readability&lt;/a&gt; bookmark tool.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/669645103</guid>
         <pubDate>Sun, 06 Jun 2010 06:22:48 -0700</pubDate>
      </item>
      <item>
         <title>Purpose Vs. Profit</title>
         <link>http://scottw.me/post/667209776</link>
         <description>&lt;p&gt;
 
 
&lt;iframe class="embeddedvideo" src="http://www.youtube.com/v/u6XAPnuFjJc&amp;hl=en_US&amp;fs=1&amp;rel=0&amp;color1=0x3a3a3a&amp;color2=0x999999" type="application/x-shockwave-flash" width="640" height="385"&gt;&lt;/iframe&gt;&lt;/p&gt; &lt;p&gt;This really gels with a great book I am reading, &lt;a rel="nofollow" target="_blank" href="http://www.startwithwhy.com/"&gt;Start With Why&lt;/a&gt;.&lt;/p&gt; &lt;p&gt;Once you loose site of the purpose (WHY), nothing else really matters.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.me/post/667209776</guid>
         <pubDate>Sat, 05 Jun 2010 11:52:48 -0700</pubDate>
      </item>
      <item>
         <title>.Text Lives (sort of)</title>
         <link>http://scottw.com/dottext-lives</link>
         <description>&lt;p&gt;If you are seeing this post, it means you are visiting my new home on the Intertubes &amp;#8211; &lt;a rel="nofollow" target="_blank" href="http://scottw.com"&gt;ScottW.com&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;I have owned ScottW.com for a while, so I figured it was time to actually put it to use. Since I was going to make a change, I figured I would take the time to clean some things up and simplify the site.&lt;/p&gt;
&lt;ol&gt; &lt;li&gt;I removed a bunch of posts which are no longer relevant (example: open positions). I am going to try to push content that is date sensitive over to my &lt;a rel="nofollow" target="_blank" href="http://scottw.me"&gt;tumblr blog&lt;/a&gt;.&lt;/li&gt; &lt;li&gt;The site is now generated by &lt;a rel="nofollow" target="_blank" href="http://jekyllrb.com"&gt;Jekyll&lt;/a&gt;, powered by &lt;a rel="nofollow" target="_blank" href="http://github.com/bry4n/rack-jekyll"&gt;Rack-Jekyll&lt;/a&gt;, and hosted on &lt;a rel="nofollow" target="_blank" href="http://heroku.com"&gt;Heroku&lt;/a&gt;. This means I can write it in a simple text editor and then publish it easily via git.&lt;/li&gt; &lt;li&gt;I am going without comments for now. If you have questions or comments you can email me at &lt;a rel="nofollow" target="_blank" href="mailto:scottwater@gmail.com"&gt;scottwater@gmail.com&lt;/a&gt; or use the &lt;a rel="nofollow" target="_blank" href="http://scottw.me/ask"&gt;ask&lt;/a&gt; feature on Tumblr.&lt;/li&gt; &lt;li&gt;Blog posts about blogs are lame, so I am going to stop here. I really just wanted to callout the new url and apologize for unread posts you may be seeing in your aggregator. Sorry. :(&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;If you want to see how it is all put together and works, you can grab a copy of it from &lt;a rel="nofollow" target="_blank" href="http://github.com/scottwater/"&gt;my git&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://github.com/scottwater/scottw_com_blog"&gt;repository&lt;/a&gt;.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/dottext-lives</guid>
         <pubDate>Tue, 06 Apr 2010 17:00:00 -0700</pubDate>
      </item>
      <item>
         <title>Setting A Tab Title in Terminal</title>
         <link>http://scottw.com/setting-a-tab-title-in-terminal</link>
         <description>&lt;p&gt;I have been spending a lot more time in terminal recently. I routinely find myself having more tabs open than I can keep track of.&lt;/p&gt;
&lt;p&gt;I then end up forgetting what&amp;#8217;s open and end up opening even more tabs which just make the problem worse.&lt;/p&gt;
&lt;p&gt;I finally got tired of this and &lt;a rel="nofollow" target="_blank" href="http://twitter.com/scottw/status/9900627749"&gt;posted a quick question on Twitter&lt;/a&gt;. While waiting for a twitter response, I figured I would finally checkout &lt;a rel="nofollow" target="_blank" href="http://superuser.com"&gt;SuperUser&lt;/a&gt; which of course &lt;a rel="nofollow" target="_blank" href="http://superuser.com/questions/105499/change-terminal-title-in-osx"&gt;had the answer&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;You just need to execute the following command:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="nb"&gt;echo&lt;/span&gt; -n -e &lt;span class="s2"&gt;"&amp;#92;033]0;YOUR TAB TITLE HERE&amp;#92;007"&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Since there is no way I will remember that command (and who should) I wrapped it in a function that I can put in my .bash_profile.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;&lt;span class="k"&gt;function &lt;/span&gt;title&lt;span class="o"&gt;(){&lt;/span&gt; &lt;span class="nb"&gt;echo&lt;/span&gt; -n -e &lt;span class="s2"&gt;"&amp;#92;033]0;$1&amp;#92;007"&lt;/span&gt;
&lt;span class="o"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Now, in any tab, I just need to execute:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;title &lt;span class="s1"&gt;'My Tab Title'&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;</description>
         <guid isPermaLink="false">http://scottw.com/setting-a-tab-title-in-terminal</guid>
         <pubDate>Mon, 01 Mar 2010 16:00:00 -0800</pubDate>
      </item>
      <item>
         <title>Singing With Sinatra</title>
         <link>http://scottw.com/sinatra</link>
         <description>&lt;p&gt;I attended a couple Ruby sessions at &lt;a rel="nofollow" target="_blank" href="http://scottw.com/code/codemash-2010/"&gt;CodeMash&lt;/a&gt; this year which really piqued my interest level in Ruby.&lt;/p&gt;
&lt;p&gt;For many people (especially web developers) when you hear about Ruby they think Ruby on Rails. While Rails is an impressive framework, there are some other interesting options available. One of them that recently caught my attention (and admiration) is called &lt;a rel="nofollow" target="_blank" href="http://www.sinatrarb.com/"&gt;Sinatra&lt;/a&gt;.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;Sinatra is a &lt;span class="caps"&gt;DSL&lt;/span&gt; for quickly creating web applications in Ruby with minimal effort.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Sinatra is a drop dead simple way to create a small site, blog, service, or even a prototype. Here is all it takes to serve a web request with Sinatra:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubygems'&lt;/span&gt; &lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sinatra'&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/hi'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="s2"&gt;"Hello World!"&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;While the code above returns the UI inline, there is full support for templates, layouts, and much more.&lt;/p&gt;
&lt;p&gt;If you are new to Ruby and want to see what you can do with the language with almost no effort, Sinatra is a great place to start.&lt;/p&gt;
&lt;p&gt;I have been hacking around on it for a couple of days and decided to write a simple plugin. While I am sure I will cringe at this code a couple of months from now, I figured I would post it see if it is useful to others.&lt;/p&gt;
&lt;p&gt;Goal:&lt;br /&gt;
Ensure urls served by the application are consistent by requiring no trailing slash and requiring all urls to be lower cased. If either one of these conditions are not met, the plugin will do a 301 redirect to the proper url.&lt;/p&gt;
&lt;p&gt;Here is the actual plugin:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sinatra/base'&lt;/span&gt; &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;Sinatra&lt;/span&gt; &lt;span class="k"&gt;module&lt;/span&gt; &lt;span class="nn"&gt;ConsistentUrls&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;validate_url_requests&lt;/span&gt;&lt;span class="p"&gt;()&lt;/span&gt; &lt;span class="n"&gt;before&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;downcase&lt;/span&gt; &lt;span class="n"&gt;path_to_redirect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="kp"&gt;nil&lt;/span&gt; &lt;span class="c1"&gt;#if the path ends in '/' remove it&lt;/span&gt; &lt;span class="n"&gt;path_to_redirect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="mi"&gt;0&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;.&lt;/span&gt;&lt;span class="o"&gt;-&lt;/span&gt;&lt;span class="mi"&gt;2&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="sr"&gt; /.+&amp;#92;/$/&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;match&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="c1"&gt;#if the original path was not lower case. NOTE: we lowercase this above to minimize steps&lt;/span&gt; &lt;span class="n"&gt;path_to_redirect&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="o"&gt;!&lt;/span&gt;&lt;span class="n"&gt;path_to_redirect&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;path&lt;/span&gt; &lt;span class="c1"&gt;#if we need to redirect, build a query_string&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;path_to_redirect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="n"&gt;hash_to_querystring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;params&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;path_to_redirect&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"?"&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;redirect&lt;/span&gt; &lt;span class="n"&gt;path_to_redirect&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="mi"&gt;301&lt;/span&gt; &lt;span class="k"&gt;if&lt;/span&gt; &lt;span class="n"&gt;path_to_redirect&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="c1"&gt;#borrowed from http://justanothercoder.wordpress.com/2009/04/24/converting-a-hash-to-a-query-string-in-ruby/&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;hash_to_querystring&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;inject&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;''&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;query_string&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s1"&gt;'&amp;amp;'&lt;/span&gt; &lt;span class="k"&gt;unless&lt;/span&gt; &lt;span class="n"&gt;key&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;keys&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;first&lt;/span&gt; &lt;span class="n"&gt;query_string&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&amp;lt;&lt;/span&gt; &lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;to_s&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;=&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;URI&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;encode&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="nb"&gt;hash&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="n"&gt;key&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;register&lt;/span&gt; &lt;span class="no"&gt;ConsistentUrls&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;A minimal application skeleton. The key line is the validate_url_requests which is what invokes the plugin.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rubygems'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'sinatra'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'consistenturls'&lt;/span&gt; &lt;span class="c1"&gt;#plugin &lt;/span&gt;
&lt;span class="n"&gt;validate_url_requests&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="s1"&gt;'/'&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="s2"&gt;"Hello World"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="sr"&gt;%r{(.+)}&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;catch_all&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="s2"&gt;"I am the catch all &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;catch_all&lt;/span&gt;&lt;span class="si"&gt;}#{&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;not_found&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="s2"&gt;"The path &lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt; does not exist"&lt;/span&gt;
&lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;A set of tests.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'demo_app'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'test/unit'&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'rack/test'&lt;/span&gt; &lt;span class="n"&gt;set&lt;/span&gt; &lt;span class="ss"&gt;:environment&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:test&lt;/span&gt; &lt;span class="k"&gt;class&lt;/span&gt; &lt;span class="nc"&gt;ConsistentUrlsTests&lt;/span&gt; &lt;span class="o"&gt;&amp;lt;&lt;/span&gt; &lt;span class="no"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Unit&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;TestCase&lt;/span&gt; &lt;span class="kp"&gt;include&lt;/span&gt; &lt;span class="no"&gt;Rack&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Test&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Methods&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;app&lt;/span&gt; &lt;span class="vi"&gt;@app&lt;/span&gt; &lt;span class="o"&gt;||&lt;/span&gt; &lt;span class="no"&gt;Sinatra&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Application&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_urls_with_trailing_slashes_will_be_redirected&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/some-random-url/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/some-random-url'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/some-random-url/second-path/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/some-random-url/second-path'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_urls_with_trailing_slashes_and_querystrings_will_be_redirected&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/some-random-url/?abc=123'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/some-random-url?abc=123'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/some-random-URL/?abc=123&amp;amp;z=abc'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/some-random-url?abc=123&amp;amp;z=abc'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_case_sensitive_url_will_be_redirected&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/CAPS-LOCK-ROCKS'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/caps-lock-rocks'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_case_sensitive_url_with_trailing_slash_will_be_redirected&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/CAPS-LOCK-ROCKS/'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/caps-lock-rocks'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;test_case_sensitive_url_with_query_string_will_be_redirected&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/CAPS-LOCK-ROCKS?abc=123&amp;amp;def=HIJ'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/caps-lock-rocks?abc=123&amp;amp;def=HIJ'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s1"&gt;'/CAPS-LOCK-ROCKS/ROCKS/It/ROCKs/?abc=123&amp;amp;def=HIJ'&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'/caps-lock-rocks/rocks/it/rocks?abc=123&amp;amp;def=HIJ'&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;def&lt;/span&gt; &lt;span class="nf"&gt;execute_url_test&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;url_to_test&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="n"&gt;expected_redirect&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt; &lt;span class="n"&gt;get&lt;/span&gt; &lt;span class="n"&gt;url_to_test&lt;/span&gt; &lt;span class="n"&gt;follow_redirect!&lt;/span&gt; &lt;span class="n"&gt;assert_equal&lt;/span&gt; &lt;span class="n"&gt;last_request&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;url&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'http://example.org'&lt;/span&gt; &lt;span class="o"&gt;+&lt;/span&gt; &lt;span class="n"&gt;expected_redirect&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Getting started:&lt;/p&gt;
&lt;p&gt;Setup steps for Sinatra can be &lt;a rel="nofollow" target="_blank" href="http://github.com/sinatra/sinatra"&gt;found here&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Two things to note.&lt;/p&gt;
&lt;p&gt;1. To run the tests, you will need to get &lt;a rel="nofollow" target="_blank" href="http://github.com/brynary/rack-test"&gt;rack-test&lt;/a&gt;. I mistakenly assumed this part of Rack which tripped me up a bit.&lt;/p&gt;
&lt;p&gt;2. You need to grab &lt;a rel="nofollow" target="_blank" href="http://rtomayko.github.com/shotgun/"&gt;Shotgun&lt;/a&gt; if you want to have the site reloaded anytime you make a change. This requirement was apparently something that changed recently. It is documented nicely on the Sinatra site, but seems to catch people off guard.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/sinatra</guid>
         <pubDate>Tue, 16 Feb 2010 16:00:00 -0800</pubDate>
      </item>
      <item>
         <title>One Less Step</title>
         <link>http://scottw.com/one-less-step</link>
         <description>&lt;p&gt;Every step a user must take provides a chance for failure and frustration.&lt;/p&gt;
&lt;p&gt;Compare these two shipping confirmation emails from 1-800-Flowers and Zappos.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;1-800-Flowers&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://scottw.com/images/wlw/OneLessStep_8C64/1800Flowers_a404a639-a632-4bcb-b2e7-734bc152e196.jpg" title="1800 Flowers" alt="1800 Flowers"/&gt;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Zappos&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src="http://scottw.com/images/wlw/OneLessStep_8C64/zappos_bda0db96-1cdb-405c-9876-2c29610543ad.jpg" title="Zappos" alt="Zappos"/&gt;&lt;/p&gt;
&lt;p&gt;1-800-Flowers actually says, &amp;#8220;2 easy steps&amp;#8221;.&lt;/p&gt;
&lt;p&gt;However, what they are not counting on:&lt;/p&gt;
&lt;ol&gt; &lt;li&gt;The tracking code is 18 characters. While more savvy computer users will simply copy and paste, many will try to manually enter the 18 characters. Those that do copy and paste will usually need to highlight the text, go to the edit menu select copy&amp;#8230; in short, they are usually not going to use control+C and then control+V.&lt;/li&gt; &lt;li&gt;The &lt;span class="caps"&gt;UPS&lt;/span&gt; website is stuck in the mid-90&amp;#8217;s and requires you to first pick your country. Don&amp;#8217;t every make the wrong choice here (and of course this adds another step).&lt;/li&gt; &lt;li&gt;Users will need to switch back and forth between their email app/screen/tab and the &lt;span class="caps"&gt;USP&lt;/span&gt; screen.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The funny thing about this is 1-800-Flowers actually has other links in the confirmation email, including one to &lt;span class="caps"&gt;UPS&lt;/span&gt;. They just don&amp;#8217;t link to the one that really matters.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/one-less-step</guid>
         <pubDate>Tue, 09 Feb 2010 16:00:00 -0800</pubDate>
      </item>
      <item>
         <title>Branding Gone Wild</title>
         <link>http://crinket.com/branding-gone-wild</link>
         <description>&lt;p&gt;&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/ntFBtemiCfoogIjujHFvpoEzuItFlrcycjgtIzpqetAjeobkraGghCkCoszE/IMG_0005.jpg.scaled1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/ntFBtemiCfoogIjujHFvpoEzuItFlrcycjgtIzpqetAjeobkraGghCkCoszE/IMG_0005.jpg.scaled500.jpg" width="500" height="667"/&gt; &lt;/a&gt;
&lt;/p&gt;I am not a marketing/branding expert, but I am pretty sure this is not a very good idea.  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/branding-gone-wild"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/branding-gone-wild#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/branding-gone-wild</guid>
         <pubDate>Mon, 04 Jan 2010 15:38:04 -0800</pubDate>
         <media:content width="1600" url="http://posterous.com/getfile/files.posterous.com/scottwater/ntFBtemiCfoogIjujHFvpoEzuItFlrcycjgtIzpqetAjeobkraGghCkCoszE/IMG_0005.jpg" type="image/jpeg" height="1200">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/ntFBtemiCfoogIjujHFvpoEzuItFlrcycjgtIzpqetAjeobkraGghCkCoszE/IMG_0005.jpg.scaled500.jpg" height="667" />
         </media:content>
      </item>
      <item>
         <title>Only Thing Worse Than A Spammer</title>
         <link>http://crinket.com/only-thing-worse-than-a-spammer</link>
         <description>&lt;p&gt;...is a really lazy spammer.&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/eju1CafwNHrFP0g0AkCbqFCH1YVyICfhWTKpOkjvlg8CLpmjAjuIbOUVlTeW/spammer.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/83yKkQ7DL8tax16k3OyHkzpxwLxCCljam0VTSmDhjK0TVub3XnBhGS9E16p7/spammer.jpg.scaled.500.jpg" width="500" height="85"/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt; &lt;div class='downloadFlyout'&gt; &lt;div class="downloadIcon"&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/OI2IJwqgBH3dFhLRjiiTrhBJKNtlkC8kq36QD8zQyb4gEolcR6doDBKtm9TF/ATT00001..c'&gt;&lt;img src='http://posterous.com/images/filetypes/unknown.png' style='border:none;'/&gt;&lt;/a&gt;&lt;/div&gt; &lt;div class="downloadlinkInstructions"&gt;Click here to download:&lt;/div&gt; &lt;b&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/OI2IJwqgBH3dFhLRjiiTrhBJKNtlkC8kq36QD8zQyb4gEolcR6doDBKtm9TF/ATT00001..c'&gt;ATT00001..c&lt;/a&gt;&lt;/b&gt; &lt;span class="downloadSize"&gt;(0 KB)&lt;/span&gt; &lt;br class="clearboth"/&gt;&lt;/div&gt;   &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/only-thing-worse-than-a-spammer"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/only-thing-worse-than-a-spammer#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/only-thing-worse-than-a-spammer</guid>
         <pubDate>Tue, 29 Dec 2009 06:24:07 -0800</pubDate>
         <media:content width="579" url="http://posterous.com/getfile/files.posterous.com/scottwater/eju1CafwNHrFP0g0AkCbqFCH1YVyICfhWTKpOkjvlg8CLpmjAjuIbOUVlTeW/spammer.jpg" type="image/jpeg" height="98">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/83yKkQ7DL8tax16k3OyHkzpxwLxCCljam0VTSmDhjK0TVub3XnBhGS9E16p7/spammer.jpg.scaled.500.jpg" height="85" />
         </media:content>
      </item>
      <item>
         <title>The difference between hiring and recruiting</title>
         <link>http://crinket.com/the-difference-between-hiring-and-recruiting</link>
         <description>&lt;p&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;blockquote class="posterous_short_quote"&gt;Recruiting is the act of finding the very best person for a job and persuading them to stop doing what they're doing and come join you&lt;/blockquote&gt; &lt;div class="posterous_quote_citation"&gt;via &lt;a rel="nofollow" target="_blank" href="http://sethgodin.typepad.com/seths_blog/2009/12/the-difference-between-hiring-and-recruiting.html?utm_source=feedburner&amp;amp;utm_medium=feed&amp;amp;utm_campaign=Feed%3A+typepad%2Fsethsmainblog+%28Seth%27s+Blog%29"&gt;sethgodin.typepad.com&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/the-difference-between-hiring-and-recruiting"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/the-difference-between-hiring-and-recruiting#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/the-difference-between-hiring-and-recruiting</guid>
         <pubDate>Mon, 28 Dec 2009 09:57:29 -0800</pubDate>
      </item>
      <item>
         <title>Pork</title>
         <link>http://crinket.com/pork-119</link>
         <description>&lt;p&gt;When three types of pork is not enough.&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/Byzkn1tgeylCXgwhbjDzsaQIxxfk2ucXC7aAufwAoxDRX2zm3p0IwwbeRnNF/IMG_0988.jpg.scaled.1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/0RUlUaTdpn3ADtRlGalqqpWS5Df2RqlbAdfL2pp4QB9rQtEeV4ep4eW67ZFX/IMG_0988.jpg.scaled.500.jpg" width="500" height="253"/&gt;&lt;/a&gt;
&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/pork-119"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/pork-119#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/pork-119</guid>
         <pubDate>Tue, 08 Dec 2009 08:30:15 -0800</pubDate>
         <media:content width="1430" url="http://posterous.com/getfile/files.posterous.com/scottwater/aUbXRCEVXb7iB6P97k1mYRwBFwLW1TXw96rwPn9806mpsVlY1fkT6JmxRSuf/IMG_0988.jpg" type="image/jpeg" height="723">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/0RUlUaTdpn3ADtRlGalqqpWS5Df2RqlbAdfL2pp4QB9rQtEeV4ep4eW67ZFX/IMG_0988.jpg.scaled.500.jpg" height="253" />
         </media:content>
      </item>
      <item>
         <title>Twitter Mag</title>
         <link>http://crinket.com/twitter-mag</link>
         <description>&lt;p&gt;Does the world really this?&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/qLNygsL70hZaTn1lO9pUxxEK6ii78AOR9BWCmJLQ05hyJ38VOx5tfUdZ1EYR/IMG_0962.jpg.scaled.1000.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/tmf1wdigdnGxpNNCt6kkJKgx2rVjNh3MH1qRkzArKnHSPdWf6mJSAwpTKI4z/IMG_0962.jpg.scaled.500.jpg" width="500" height="667"/&gt;&lt;/a&gt;
&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/twitter-mag"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/twitter-mag#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/twitter-mag</guid>
         <pubDate>Sat, 21 Nov 2009 05:46:36 -0800</pubDate>
         <media:content width="1600" url="http://posterous.com/getfile/files.posterous.com/scottwater/V4dE7WqgBiCVF3sO5VjiXNQaXdvf7TBfqsq9V9RTrpnrhpPn6CmCoQezQSpz/IMG_0962.jpg" type="image/jpeg" height="1200">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/tmf1wdigdnGxpNNCt6kkJKgx2rVjNh3MH1qRkzArKnHSPdWf6mJSAwpTKI4z/IMG_0962.jpg.scaled.500.jpg" height="667" />
         </media:content>
      </item>
      <item>
         <title>Popular items and Personalized ranking</title>
         <link>http://crinket.com/popular-items-and-personalized-ranking</link>
         <description>&lt;p&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;blockquote class="posterous_long_quote"&gt;The goal of personalization at Google remains the same as ever: to help you find the best content on the web. We hope these new features help you do just that — go &lt;a rel="nofollow" target="_blank" href="http://www.google.com/reader/view/#stream/pop/explore"&gt;Explore&lt;/a&gt; for yourself.&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a rel="nofollow" target="_blank" href="http://googlereader.blogspot.com/2009/10/reading-gets-personal-with-popular.html"&gt;Official Google Reader Blog: Reading gets personal with Popular items and Personalized ranking&lt;/a&gt;&lt;/div&gt; &lt;p&gt;All I can say is it is about time. If Google does this right, it could be a serious threat to Digg, Reddit and others.&lt;/p&gt;&lt;/div&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/popular-items-and-personalized-ranking"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/popular-items-and-personalized-ranking#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/popular-items-and-personalized-ranking</guid>
         <pubDate>Thu, 22 Oct 2009 17:53:15 -0700</pubDate>
      </item>
      <item>
         <title>How to be lucky</title>
         <link>http://crinket.com/how-to-be-lucky-1</link>
         <description>&lt;p&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;blockquote class="posterous_long_quote"&gt;&lt;ul class="storylist"&gt;&lt;li&gt;Unlucky people often fail to follow their intuition when making a choice, whereas lucky people tend to respect hunches. Lucky people are interested in how they both think and feel about the various options, rather than simply looking at the rational side of the situation. I think this helps them because gut feelings act as an alarm bell - a reason to consider a decision carefully.&lt;/li&gt; &lt;li&gt;Unlucky people tend to be creatures of routine. They tend to take the same route to and from work and talk to the same types of people at parties. In contrast, many lucky people try to introduce variety into their lives. For example, one person described how he thought of a colour before arriving at a party and then introduced himself to people wearing that colour. This kind of behaviour boosts the likelihood of chance opportunities by introducing variety.&lt;/li&gt; &lt;li&gt;Lucky people tend to see the positive side of their ill fortune. They imagine how things could have been worse. In one interview, a lucky volunteer arrived with his leg in a plaster cast and described how he had fallen down a flight of stairs. I asked him whether he still felt lucky and he cheerfully explained that he felt luckier than before. As he pointed out, he could have broken his neck.&lt;/li&gt;&lt;/ul&gt;&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a rel="nofollow" target="_blank" href="http://www.telegraph.co.uk/technology/3304496/Be-lucky---its-an-easy-skill-to-learn.html"&gt;Be lucky - it's an easy skill to learn&lt;/a&gt;&lt;/div&gt; &lt;p&gt;I think it just comes down to attitude. If you wake up everyday thinking it is going to be a crappy unlucky day, it probably will be a crappy day. However, if you wake up and look for some good (luck), you will likely find it as well.&lt;/p&gt;&lt;/div&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/how-to-be-lucky-1"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/how-to-be-lucky-1#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/how-to-be-lucky-1</guid>
         <pubDate>Tue, 13 Oct 2009 04:58:44 -0700</pubDate>
      </item>
      <item>
         <title>Ben Huh and the value of keeping it very simple</title>
         <link>http://crinket.com/ben-huh-and-the-value-of-keeping-it-very-simp</link>
         <description>&lt;p&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;iframe class="embeddedvideo" type="application/x-shockwave-flash" src="http://blip.tv/play/g_RIgaSaQQA%2Em4v" height="211" width="500"/&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a rel="nofollow" target="_blank" href="http://mixergy.com/cheezburger-fail-ben-huh/"&gt;How The Owner Of “Fail Blog” And “I Can Has Cheezburger” Keeps Racking Up Wins – With Ben Huh&lt;/a&gt;&lt;/div&gt; &lt;p&gt;A really interesting interview with Ben Huh of “I Can Has Cheezburger” on the value of keeping things very simple.&lt;/p&gt;&lt;/div&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/ben-huh-and-the-value-of-keeping-it-very-simp"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/ben-huh-and-the-value-of-keeping-it-very-simp#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/ben-huh-and-the-value-of-keeping-it-very-simp</guid>
         <pubDate>Mon, 05 Oct 2009 06:04:30 -0700</pubDate>
      </item>
      <item>
         <title>Google AI</title>
         <link>http://crinket.com/google-ai</link>
         <description>&lt;p&gt;I couldn't remember who Rutgers played next. To save me a couple key strokes I simply Googled "Rutgers Football".&lt;p&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/ue8eZGzpmSpBXyCsh2kzsKKc0BpjXqweWWKPnOUnNYw5Pj3e4cjC4bbZH0fQ/photo.jpg" width="320" height="480"/&gt;
&lt;/p&gt;&lt;p&gt;Poof. Before the first search result is the answer to my question. This probably scares content creators, but I like it.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/google-ai"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/google-ai#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/google-ai</guid>
         <pubDate>Sat, 03 Oct 2009 09:31:24 -0700</pubDate>
         <media:content width="320" url="http://posterous.com/getfile/files.posterous.com/scottwater/ue8eZGzpmSpBXyCsh2kzsKKc0BpjXqweWWKPnOUnNYw5Pj3e4cjC4bbZH0fQ/photo.jpg" type="image/jpeg" height="480">
            <media:thumbnail width="320" url="http://posterous.com/getfile/files.posterous.com/scottwater/ue8eZGzpmSpBXyCsh2kzsKKc0BpjXqweWWKPnOUnNYw5Pj3e4cjC4bbZH0fQ/photo.jpg" height="480" />
         </media:content>
      </item>
      <item>
         <title>Better GReader &amp; Helvetireader</title>
         <link>http://crinket.com/better-greader-and-helvetireader</link>
         <description>&lt;p&gt;The Helvetireader theme in the Better GReader (&lt;a rel="nofollow" target="_blank" href="https://addons.mozilla.org/en-US/firefox/addon/6424)"&gt;https://addons.mozilla.org/en-US/firefox/addon/6424)&lt;/a&gt; FireFox add-on dramatically improves the browser experience of Google Reader.&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/MlXBXO7voo3VKwBJh80diwh0G4OJ7po45uCqhjkcdPvLiyIT6fGfKmUAcRB6/Google_Reader_145-2.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/ph3WL8VKMK8Og9VhVhlKvOaIj0Q6tJZbJFtik56ChNpW984S44NsF0n9O6Li/Google_Reader_145-2.jpg.scaled.500.jpg" width="500" height="250"/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;If you use Google Reader and FireFox I highly recommend checking it out.&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/better-greader-and-helvetireader"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/better-greader-and-helvetireader#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/better-greader-and-helvetireader</guid>
         <pubDate>Thu, 01 Oct 2009 17:39:31 -0700</pubDate>
         <media:content width="651" url="http://posterous.com/getfile/files.posterous.com/scottwater/MlXBXO7voo3VKwBJh80diwh0G4OJ7po45uCqhjkcdPvLiyIT6fGfKmUAcRB6/Google_Reader_145-2.jpg" type="image/jpeg" height="326">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/ph3WL8VKMK8Og9VhVhlKvOaIj0Q6tJZbJFtik56ChNpW984S44NsF0n9O6Li/Google_Reader_145-2.jpg.scaled.500.jpg" height="250" />
         </media:content>
      </item>
      <item>
         <title>US Airways</title>
         <link>http://crinket.com/us-airways-22</link>
         <description>&lt;p&gt;&lt;p&gt;Just wanted to give a big shout out to US Airways.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Over the last couple of months they have consistently been cheaper and easier to fly than Continental.&lt;/p&gt; &lt;p&gt;&lt;/p&gt; &lt;p&gt;Today I arrived at the terminal a couple hours early. While using the kiosk I was informed there was an early flight and asked if I wanted to switch. I clicked yes, selected a seat and was on my way home about 2.5 hours earlier than expected. There were no extra feels, screens, etc. Just good old fashion do the right thing and get you on the road. Thanks!&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/us-airways-22"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/us-airways-22#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/us-airways-22</guid>
         <pubDate>Wed, 30 Sep 2009 18:44:11 -0700</pubDate>
      </item>
      <item>
         <title>Twitterville</title>
         <link>http://crinket.com/twitterville</link>
         <description>&lt;p&gt;Does the world really need 300 pages on 140 characters?&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/dize5aYOKL63lTApBhZSp9EgLOEfW5GVceSKgW9LScP57pZiHV5AWJmGUH9q/photo.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/oEQYssVt7tldQ6bjrhIWCUYzlQmxmcfJjqNKpDbjsenosp6ONxdwysLYcKwE/photo.jpg.scaled.500.jpg" width="500" height="667"/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;Sent from my iPhone&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/twitterville"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/twitterville#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/twitterville</guid>
         <pubDate>Wed, 30 Sep 2009 14:21:37 -0700</pubDate>
         <media:content width="600" url="http://posterous.com/getfile/files.posterous.com/scottwater/dize5aYOKL63lTApBhZSp9EgLOEfW5GVceSKgW9LScP57pZiHV5AWJmGUH9q/photo.jpg" type="image/jpeg" height="800">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/oEQYssVt7tldQ6bjrhIWCUYzlQmxmcfJjqNKpDbjsenosp6ONxdwysLYcKwE/photo.jpg.scaled.500.jpg" height="667" />
         </media:content>
      </item>
      <item>
         <title>Fire Alarm Fail</title>
         <link>http://crinket.com/fire-alarm-fail-0</link>
         <description>&lt;p&gt;I just might have to see if this is true.&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/RfRglmEPknWxDNGToRqGAxbc4G0dIcQCtlXe83Ic8MSuJBowuWlvX4Q1TRoS/photo.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/yPVzHl2BRRiux0Ddt9vv5cw7Yhr8Gz8LsJqL1CVs6Cb3SxTzbjOWwLqaF2QN/photo.jpg.scaled.500.jpg" width="500" height="375"/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;I have stayed in quite a few hotels. None of them have had this warning. Instead of buy 300 signs and subjecting your visitors to fire drills, why not just fix the problem?&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/fire-alarm-fail-0"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/fire-alarm-fail-0#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/fire-alarm-fail-0</guid>
         <pubDate>Mon, 28 Sep 2009 18:44:30 -0700</pubDate>
         <media:content width="800" url="http://posterous.com/getfile/files.posterous.com/scottwater/RfRglmEPknWxDNGToRqGAxbc4G0dIcQCtlXe83Ic8MSuJBowuWlvX4Q1TRoS/photo.jpg" type="image/jpeg" height="600">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/yPVzHl2BRRiux0Ddt9vv5cw7Yhr8Gz8LsJqL1CVs6Cb3SxTzbjOWwLqaF2QN/photo.jpg.scaled.500.jpg" height="375" />
         </media:content>
      </item>
      <item>
         <title>If Only 1%</title>
         <link>http://crinket.com/if-only-1-0</link>
         <description>&lt;p&gt;Great write up on the fallacy of the "If only 1% of people purchase my ...." by Derek Sivers.- &lt;a rel="nofollow" target="_blank" href="http://sivers.org/1pct"&gt;http://sivers.org/1pct&lt;/a&gt;&lt;p /&gt;&lt;div&gt;Money quote: "&lt;b&gt;He forgot there was a number lower than one percent&lt;/b&gt;"&lt;p /&gt;&lt;/div&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/if-only-1-0"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/if-only-1-0#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/if-only-1-0</guid>
         <pubDate>Sun, 27 Sep 2009 20:50:53 -0700</pubDate>
      </item>
      <item>
         <title>Mono not Chasing Tail Lights</title>
         <link>http://crinket.com/mono-not-chasing-tail-lights</link>
         <description>&lt;p&gt;&lt;div class="posterous_bookmarklet_entry"&gt;&lt;blockquote class="posterous_short_quote"&gt;Unsurprisingly someone attacked Miguel and Mono for "always chasing tail lights" which is a common logical fallacy that the anti-Mono folks love to argue...&lt;/blockquote&gt;&lt;div class="posterous_quote_citation"&gt;via &lt;a rel="nofollow" target="_blank" href="http://jeffreystedfast.blogspot.com/2009/09/mono-not-chasing-tail-lights.html"&gt;A Moment of Zen: Mono not Chasing Tail Lights&lt;/a&gt;&lt;/div&gt; &lt;p&gt;&lt;/p&gt;&lt;/div&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/mono-not-chasing-tail-lights"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/mono-not-chasing-tail-lights#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/mono-not-chasing-tail-lights</guid>
         <pubDate>Sun, 27 Sep 2009 20:43:40 -0700</pubDate>
      </item>
      <item>
         <title>ESPN 360</title>
         <link>http://crinket.com/espn-360</link>
         <description>&lt;p&gt;It works, but it us super flaky.&lt;p&gt;&lt;a rel="nofollow" target="_blank" href='http://posterous.com/getfile/files.posterous.com/scottwater/44cdaoViVFPhNJB9ePggz1suExI38aZ4S0g46clUbVUFDZBIw0S4SN5RfFiE/photo.jpg'&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/aocRws09vzm2YJQIg4uGgSuPlmOCY0rnoupBxIe98C5ZG6F3AGy84zsm16YN/photo.jpg.scaled.500.jpg" width="500" height="375"/&gt;&lt;/a&gt;
&lt;/p&gt;&lt;p&gt;Anyone else have a better experience with ESPN 360?&lt;/p&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/espn-360"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/espn-360#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/espn-360</guid>
         <pubDate>Sat, 26 Sep 2009 12:45:09 -0700</pubDate>
         <media:content width="800" url="http://posterous.com/getfile/files.posterous.com/scottwater/44cdaoViVFPhNJB9ePggz1suExI38aZ4S0g46clUbVUFDZBIw0S4SN5RfFiE/photo.jpg" type="image/jpeg" height="600">
            <media:thumbnail width="500" url="http://posterous.com/getfile/files.posterous.com/scottwater/aocRws09vzm2YJQIg4uGgSuPlmOCY0rnoupBxIe98C5ZG6F3AGy84zsm16YN/photo.jpg.scaled.500.jpg" height="375" />
         </media:content>
      </item>
      <item>
         <title>Doodle Jump</title>
         <link>http://crinket.com/doodle-jump</link>
         <description>&lt;p&gt;&lt;div&gt;The 99 cent iPhone game,&amp;nbsp;&amp;nbsp;Doodle Jump (&lt;a rel="nofollow" target="_blank" href="http://DoodleJump.LimaSky.com"&gt;http://DoodleJump.LimaSky.com&lt;/a&gt;)&amp;nbsp;is a great bargain and a ton of fun.&amp;nbsp;&lt;/div&gt;&lt;p /&gt;&lt;div&gt;In addition, it has the best social integration of any game I have played up to this point:&lt;/div&gt;&lt;p /&gt;&lt;div&gt;1. It as one click access to post scores to Twitter&lt;/div&gt;&lt;div&gt;2. It has one click access to post scores to Facebook and will then compare scores with your friends&lt;/div&gt;&lt;div&gt;3. It will quickly and easily generate an email you can send to your friends to further change&amp;nbsp;&lt;/div&gt;&lt;p /&gt;&lt;p /&gt;&lt;img src="http://posterous.com/getfile/files.posterous.com/scottwater/j6SuzeRnedymoeMyGTlnKy16DoWndElSb8KsggTJ7DuBzXHwMaiBuEyFt9ek/PastedGraphic-1.tiff.converted.jpg" width="320" height="480"/&gt;  &lt;p&gt;&lt;a rel="nofollow" target="_blank" href="http://crinket.com/doodle-jump"&gt;Permalink&lt;/a&gt; | &lt;a rel="nofollow" target="_blank" href="http://crinket.com/doodle-jump#comment"&gt;Leave a comment&amp;nbsp;&amp;nbsp;&amp;raquo;&lt;/a&gt; &lt;/p&gt;</description>
         <guid isPermaLink="false">http://crinket.com/doodle-jump</guid>
         <pubDate>Thu, 24 Sep 2009 07:00:40 -0700</pubDate>
         <media:content width="320" url="http://posterous.com/getfile/files.posterous.com/scottwater/j6SuzeRnedymoeMyGTlnKy16DoWndElSb8KsggTJ7DuBzXHwMaiBuEyFt9ek/PastedGraphic-1.tiff.converted.jpg" type="image/tiff" height="480">
            <media:thumbnail width="320" url="http://posterous.com/getfile/files.posterous.com/scottwater/j6SuzeRnedymoeMyGTlnKy16DoWndElSb8KsggTJ7DuBzXHwMaiBuEyFt9ek/PastedGraphic-1.tiff.converted.jpg" height="480" />
         </media:content>
      </item>
      <item>
         <title>Is Tekpub (or PeepCode) Worth the Money?</title>
         <link>http://scottw.com/tekpub</link>
         <description>&lt;p&gt;My answer to this question has consistently been, &amp;#8220;&lt;em&gt;Only if you value your time&lt;/em&gt;&amp;#8221;.&lt;/p&gt;
&lt;p&gt;As an example, I just started watching &lt;a rel="nofollow" target="_blank" href="http://tekpub.com"&gt;Tekpub&amp;#8217;s&lt;/a&gt; &lt;a rel="nofollow" target="_blank" href="http://tekpub.com/preview/iphone"&gt;iPhone Development&lt;/a&gt; series. There is currently about 2 hours worth of content (and I believe more is on the way). The cost for the series is listed as $25 on the site.&lt;/p&gt;
&lt;p&gt;My guess is the videos will save me about 10 to 20 hours of reading, tinkering, and just generally getting things going. Now assuming I put a value of more than $2.50/hr for my time (and i do :), the purchase&lt;sup class="footnote" id="fnr1"&gt;&lt;a rel="nofollow" href="#fn1"&gt;1&lt;/a&gt;&lt;/sup&gt; would be a no brainer.&lt;/p&gt;
&lt;p&gt;I also have a subscription to &lt;a rel="nofollow" target="_blank" href="http://peepcode.com"&gt;Peepcode&lt;/a&gt; which I have been loving as well.&lt;/p&gt;
&lt;p class="footnote" id="fn1"&gt;&lt;a rel="nofollow" href="#fnr1"&gt;&lt;sup&gt;1&lt;/sup&gt;&lt;/a&gt; Disclosure: Rob Conery did comp me a full season pass. However, this came when I was about to personally buy a license so I have no qualms writing this review.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/tekpub-worth</guid>
      </item>
      <item>
         <title>SEO with Rack-Rewrite</title>
         <link>http://scottw.com/seo-rack-rewrite</link>
         <description>&lt;p&gt;I am still very much in the camp of &lt;a rel="nofollow" target="_blank" href="http://scottw.com/best-seo-advice"&gt;write good&lt;/a&gt; (and consistent) content first and let &lt;span class="caps"&gt;SEO&lt;/span&gt; handle itself. However, that does not mean you should not keep an eye out for fundamental problems which can cause bad search engine results.&lt;/p&gt;
&lt;p&gt;One of these problems I believe every developer of public web sites needs to be mindful of is duplicate content. Duplicate content causes quite a few problems:&lt;/p&gt;
&lt;ul&gt; &lt;li&gt;You may appear to be a spammer in the &amp;#8220;eyes&amp;#8221; of a search engine&lt;/li&gt; &lt;li&gt;Links may appear to be directed at two or more urls&lt;/li&gt; &lt;li&gt;Your content may have to compete with itself&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I have long been a fan of &lt;a rel="nofollow" target="_blank" href="http://scottw.com/tags#sapi-rewrite"&gt;ISAPI_Rewrite&lt;/a&gt; for &lt;span class="caps"&gt;IIS&lt;/span&gt; to help manage and control some of these problems (which is in turn heavily influenced by mod_rewrite). However, since I have moved this site to Heroku, I needed to find another solution.&lt;/p&gt;
&lt;p&gt;Thankfully, due to the awesomeness of &lt;a rel="nofollow" target="_blank" href="http://rack.rubyforge.org/"&gt;Rack&lt;/a&gt; and middleware, I found a component called &lt;a rel="nofollow" target="_blank" href="http://github.com/jtrupiano/rack-rewrite"&gt;Rack-Rewrite&lt;/a&gt; and I was able to leverage it with just a couple of minutes effort.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;A web server agnostic rack middleware for defining and applying rewrite rules. In many cases you can get away with Rack::Rewrite instead of writing Apache mod_rewrite rules.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I am already using a customized Rack application, &lt;a rel="nofollow" target="_blank" href="http://github.com/bry4n/rack-jekyll"&gt;Rack-Jekyll&lt;/a&gt;, to power this site, so plugging in Rack-Rewrite was just as simple as adding a couple of lines to my rackup file.&lt;/p&gt;
&lt;p&gt;Here are the full contents of my config.ru&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"rack/jekyll"&lt;/span&gt;
&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s2"&gt;"rack-rewrite"&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'RACK_ENV'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="s1"&gt;'development'&lt;/span&gt;
&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SITE_URL'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;||=&lt;/span&gt; &lt;span class="s1"&gt;'scottw.com'&lt;/span&gt; &lt;span class="n"&gt;use&lt;/span&gt; &lt;span class="no"&gt;Rack&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Rewrite&lt;/span&gt; &lt;span class="k"&gt;do&lt;/span&gt; &lt;span class="n"&gt;r301&lt;/span&gt; &lt;span class="sr"&gt;%r{.*}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s2"&gt;"http://&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SITE_URL'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;$&amp;amp;"&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="ss"&gt;:if&lt;/span&gt; &lt;span class="o"&gt;=&amp;gt;&lt;/span&gt; &lt;span class="no"&gt;Proc&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt; &lt;span class="p"&gt;{&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt;&lt;span class="n"&gt;rack_env&lt;/span&gt;&lt;span class="o"&gt;|&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'RACK_ENV'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;==&lt;/span&gt; &lt;span class="s1"&gt;'production'&lt;/span&gt; &lt;span class="o"&gt;&amp;amp;&amp;amp;&lt;/span&gt; &lt;span class="n"&gt;rack_env&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SERVER_NAME'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="o"&gt;!=&lt;/span&gt; &lt;span class="no"&gt;ENV&lt;/span&gt;&lt;span class="o"&gt;[&lt;/span&gt;&lt;span class="s1"&gt;'SITE_URL'&lt;/span&gt;&lt;span class="o"&gt;]&lt;/span&gt; &lt;span class="p"&gt;}&lt;/span&gt; &lt;span class="n"&gt;r301&lt;/span&gt; &lt;span class="sr"&gt;%r{^(.+)/$}&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt; &lt;span class="s1"&gt;'$1'&lt;/span&gt; &lt;span class="k"&gt;end&lt;/span&gt; &lt;span class="n"&gt;run&lt;/span&gt; &lt;span class="no"&gt;Rack&lt;/span&gt;&lt;span class="o"&gt;::&lt;/span&gt;&lt;span class="no"&gt;Jekyll&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;The two rules I am running on this site ensure that only scottw.com (no www.) is used and that no links end in a &amp;#8220;/&amp;#8221;. The first is particularly important since Heroku issues you a custom url as well.&lt;/p&gt;
&lt;p&gt;What is really interesting about Rack-Rewrite is the ability to execute code as part of your rewrites. This enables a lot of flexibility (such as ignoring some rewrites when running in development mode).&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/seo-rack-rewrite</guid>
      </item>
      <item>
         <title>Dynamics and MongoDB Revisited</title>
         <link>http://scottw.com/dynamics-mongodb-revisited</link>
         <description>&lt;p&gt;A couple of months ago I wrote about wiring up &lt;a rel="nofollow" target="_blank" href="http://scottw.com/mongodb-dynamics"&gt;C# 4.0 dynamics with MongoDB&lt;/a&gt;. At the time, I opened up the &lt;a rel="nofollow" target="_blank" href="http://github.com/samus/mongodb-csharp"&gt;MongoDB-CSharp&lt;/a&gt; library and modified a bit of the code.&lt;/p&gt;
&lt;p&gt;For obvious reasons this was not a good long term solution. In what appeared to be moment of clarity a couple of days ago, I decided to try to use extension methods and add dynamics on top of MongoDB-CSharp.&lt;/p&gt;
&lt;p&gt;To the credit of the MongoDB-CSharp team, getting the basic functionality up and running was very simple. However, in the end it turns out that two compiler hacks (extension methods and dynamics) do not make a right. :)&lt;/p&gt;
&lt;p&gt;Once in place, the code to use it looks something like this:&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="csharp"&gt;&lt;span class="k"&gt;using&lt;/span&gt; &lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;Mongo&lt;/span&gt;&lt;span class="p"&gt;())&lt;/span&gt;
&lt;span class="p"&gt;{&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;[&lt;/span&gt;&lt;span class="s"&gt;"mongocsharp"&lt;/span&gt;&lt;span class="p"&gt;];&lt;/span&gt; &lt;span class="c1"&gt;//ext method to get our "special" collection&lt;/span&gt; &lt;span class="n"&gt;var&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;db&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;GetDynoCollection&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s"&gt;"sample"&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Connect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="c1"&gt;//dynamic object to store our data&lt;/span&gt; &lt;span class="n"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;newDoc&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DynoDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;newDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"Dyno Collections"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;newDoc&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"dyno"&lt;/span&gt;&lt;span class="p"&gt;;&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Insert&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;newDoc&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="k"&gt;new&lt;/span&gt; &lt;span class="n"&gt;DynoDocument&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt; &lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;slug&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="s"&gt;"dyno"&lt;/span&gt; &lt;span class="n"&gt;dynamic&lt;/span&gt; &lt;span class="n"&gt;result&lt;/span&gt; &lt;span class="p"&gt;=&lt;/span&gt; &lt;span class="n"&gt;col&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;FindOne&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;query&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;Console&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;WriteLine&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;result&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;title&lt;/span&gt;&lt;span class="p"&gt;);&lt;/span&gt; &lt;span class="n"&gt;m&lt;/span&gt;&lt;span class="p"&gt;.&lt;/span&gt;&lt;span class="n"&gt;Disconnect&lt;/span&gt;&lt;span class="p"&gt;();&lt;/span&gt;
&lt;span class="p"&gt;}&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;While it works, it still feels too awkward to be useful &lt;span class="caps"&gt;IMO&lt;/span&gt;. Normally, this I would just delete something like this, but I am trying to let less code die on my machine, so I published it all as a GitHub gist: &lt;a rel="nofollow" target="_blank" href="http://gist.github.com/374418"&gt;DynoMongo&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;After working on this, I have come to the following conclusions:&lt;/p&gt;
&lt;ol&gt; &lt;li&gt;MongoDB-CSharp provides adequate flexibility on a schema if I need it in .&lt;span class="caps"&gt;NET&lt;/span&gt;. Mix in Automapper and a helper or two you are all set.&lt;/li&gt; &lt;li&gt;&lt;a rel="nofollow" target="_blank" href="http://github.com/atheken/NoRM"&gt;Norm&lt;/a&gt; provides more structure if that is a requirementl&lt;/li&gt; &lt;li&gt;Dynamics are really just a parlor trick. If I want the flexibility of a dynamic language, using C# is a mistake.&lt;/li&gt; &lt;li&gt;I should probably try to do something similar in IronRuby, but with all the excellent MongoDB Ruby libraries out there, I am not sure it is even worth the thought.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;Anyway, if someone feels this is interesting or useful, feel free to grab the gist, &lt;a rel="nofollow" target="_blank" href="http://gist.github.com/374418"&gt;DynoMongo&lt;/a&gt;, and run with it.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/dynamics-mongodb-revisited</guid>
      </item>
      <item>
         <title>OData</title>
         <link>http://scottw.com/odata</link>
         <description>&lt;p&gt;Yesterday, I made the trip into &lt;span class="caps"&gt;NYC&lt;/span&gt; to added the &lt;a rel="nofollow" target="_blank" href="http://www.odata.org/roadshow"&gt;OData Roadshow&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;For those who have not looked into &lt;a rel="nofollow" target="_blank" href="http://www.odata.org/"&gt;OData&lt;/a&gt;:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;The Open Data Protocol (OData) is a Web protocol for querying and updating data that provides a way to unlock your data and free it from silos that exist in applications today. OData does this by applying and building upon Web technologies such as &lt;span class="caps"&gt;HTTP&lt;/span&gt;, Atom Publishing Protocol (AtomPub) and &lt;span class="caps"&gt;JSON&lt;/span&gt; to provide access to information from a variety of applications, services, and stores.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;ul&gt; &lt;li&gt;I personally do not feel it is truly RESTful, but I am willing to give up some of the tenants of &lt;span class="caps"&gt;REST&lt;/span&gt; in order to gain consistency.&lt;/li&gt; &lt;li&gt;While the protocol specification states it is read and write, I would be 99% of implementations will be read only. In fact, in the 5 hours of content covered by Microsoft, there were zero examples of updates.&lt;/li&gt; &lt;li&gt;If you are using a Linq to &amp;#8220;Your Data Access&amp;#8221; technology adding OData at a high level will be simple. If you are not using one, I expect this as quite a bit of work.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Overall, I really like the concept. Simple conventions for querying and representing data. &lt;span class="caps"&gt;IMO&lt;/span&gt;, this is the kind of stuff Microsoft should be doing more of (instead of silverlight/windows phone/etc). Couple with their data market (Dallas). I would expect to see much more data becoming available via OData.&lt;/p&gt;
&lt;p&gt;On a side note, if the OData Roadshow is coming through your town, I would highly recommend checking it out.&lt;/p&gt;
&lt;p&gt;Finally, for a walk through on setting up your own OData service, check out Hanselman&amp;#8217;s &lt;a rel="nofollow" target="_blank" href="http://www.hanselman.com/blog/CreatingAnODataAPIForStackOverflowIncludingXMLAndJSONIn30Minutes.aspx"&gt;OData For StackOverflow&lt;/a&gt; post.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/odata</guid>
      </item>
      <item>
         <title>Accessing a Restful Service with Ruby via NTLM</title>
         <link>http://scottw.com/rest-ruby-ntlm</link>
         <description>&lt;p&gt;I have been looking for an easy to use library for accessing a restful service which sits behind &lt;span class="caps"&gt;NTLM&lt;/span&gt; via Ruby for sometime now and had been largely unsuccessful until now!&lt;/p&gt;
&lt;p&gt;Last night after a bit more googling, I went back to twitter for help. &lt;a rel="nofollow" target="_blank" href="http://twitter.com/grantc/status/15222076534"&gt;Grant Carpenter&lt;/a&gt; put me on the right path with this:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I had the ntlm part working by patching rubyntlm (and then modifying savon). next stop: wsdl impedance &lt;a rel="nofollow" target="_blank" href="http://bit.ly/982btc"&gt;http://bit.ly/982btc&lt;/a&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;The bitly link above points to a defunct project &lt;a rel="nofollow" target="_blank" href="http://code.google.com/p/ruby-httpclient/"&gt;ruby-httpclient&lt;/a&gt;. However, it appears to have been reborn as &lt;a rel="nofollow" target="_blank" href="http://dev.ctor.org/http-access2"&gt;httpclient&lt;/a&gt; with its source now hosted on &lt;a rel="nofollow" target="_blank" href="http://github.com/nahi/httpclient"&gt;gitub&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Getting a sample up and running could not be easier.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="bash"&gt;gem install httpclient
gem install rubyntlm
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;Note: If you are still doing &lt;em&gt;sudo gem install&lt;/em&gt; and not using &lt;span class="caps"&gt;RVM&lt;/span&gt; you are really missing out.&lt;/p&gt;
&lt;div class="highlight"&gt;&lt;pre&gt;&lt;code class="ruby"&gt;&lt;span class="nb"&gt;require&lt;/span&gt; &lt;span class="s1"&gt;'httpclient'&lt;/span&gt; &lt;span class="n"&gt;domain&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'http://mydomain.com'&lt;/span&gt;
&lt;span class="n"&gt;user&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'username'&lt;/span&gt;
&lt;span class="n"&gt;password&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="s1"&gt;'password'&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt; &lt;span class="o"&gt;=&lt;/span&gt; &lt;span class="no"&gt;HTTPClient&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;new&lt;/span&gt;
&lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;set_auth&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;user&lt;/span&gt;&lt;span class="p"&gt;,&lt;/span&gt;&lt;span class="n"&gt;password&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;
&lt;span class="nb"&gt;puts&lt;/span&gt; &lt;span class="n"&gt;client&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;get&lt;/span&gt;&lt;span class="p"&gt;(&lt;/span&gt;&lt;span class="s2"&gt;"&lt;/span&gt;&lt;span class="si"&gt;#{&lt;/span&gt;&lt;span class="n"&gt;domain&lt;/span&gt;&lt;span class="si"&gt;}&lt;/span&gt;&lt;span class="s2"&gt;/my-path/service/something.json"&lt;/span&gt;&lt;span class="p"&gt;)&lt;/span&gt;&lt;span class="o"&gt;.&lt;/span&gt;&lt;span class="n"&gt;content&lt;/span&gt;
&lt;/code&gt;&lt;/pre&gt;
&lt;/div&gt;&lt;p&gt;I have only been using the httpclient library for an hour or so, but so far the it appears to be very robust with built in support for just about everything Http.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/accessing-restful-service-via-ntlm</guid>
      </item>
      <item>
         <title>Calibrating a MBP Battery</title>
         <link>http://scottw.com/calibrate</link>
         <description>&lt;p&gt;I recently noticed the battery on my 12+ month old &lt;span class="caps"&gt;MBP&lt;/span&gt; was only lasting about 2 hours.&lt;/p&gt;
&lt;p&gt;A single charge on this model is supposed to last about 7 hours. I expected some decline after a year, but a drop off to 2 hours seemed off. In addition, unlike previous battery declines/issues the time seemed accurate. In other words, it was not reporting more time and then quickly draining.&lt;/p&gt;
&lt;p&gt;A quick look around Google led me to the following Apple support document &lt;a rel="nofollow" target="_blank" href="http://support.apple.com/kb/HT1490"&gt;Calibrating your computer&amp;#8217;s battery for best performance&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Quick Steps:&lt;/p&gt;
&lt;ol&gt; &lt;li&gt;Completely charge your battery (and keep it charged for 2 hours).&lt;/li&gt; &lt;li&gt;Unplug the power adapter and allow the battery to completely drain. You can use your computer during this time.&lt;/li&gt; &lt;li&gt;Allow it to sit powerless for at least 5 hours.&lt;/li&gt; &lt;li&gt;Recharge the battery.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I was skeptical, but after completing these steps, my full charge estimate went from about 2 hours to almost 5 hours.&lt;/p&gt;
&lt;p&gt;Tip: Here is a great tool for MacBook users to monitor their battery&amp;#8217;s health &amp;#8211; &lt;a rel="nofollow" target="_blank" href="http://www.sonoragraphics.com/batteryhealth.html"&gt;Battery Health Monitor&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;&lt;b&gt;Update&lt;/b&gt;: It is now appears to be estimating the battery time at about 4 hours instead of 5. Not horrible, but not as good as I originally was seeing. I will report back of the decline continues.&lt;/p&gt;</description>
         <guid isPermaLink="false">http://scottw.com/calibrate-mbp-battery</guid>
      </item>
   </channel>
</rss><!-- fe6.pipes.re3.yahoo.com uncompressed/chunked Thu Sep  2 09:50:41 PDT 2010 -->
