<?xml version="1.0" encoding="UTF-8"?>
<distractions type="array">
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;A great story about not knowing what the hell you're doing and doing it anyway&lt;!--more--&gt;.&lt;/p&gt;

&lt;p&gt;Jeffrey and Jake from &lt;a href="http://www.threadless.com/"&gt;Threadless&lt;/a&gt; on how they figured out how to build a business by not knowing how to build a business.&lt;/p&gt;

&lt;p&gt;
&lt;object width="500" height="375"&gt;&lt;param name="allowfullscreen" value="true" /&gt;&lt;param name="allowscriptaccess" value="always" /&gt;&lt;param name="movie" value="http://vimeo.com/moogaloop.swf?clip_id=9367822&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1" /&gt;&lt;embed src="http://vimeo.com/moogaloop.swf?clip_id=9367822&amp;server=vimeo.com&amp;show_title=1&amp;show_byline=1&amp;show_portrait=1&amp;color=00ADEF&amp;fullscreen=1" type="application/x-shockwave-flash" allowfullscreen="true" allowscriptaccess="always" width="500" height="375"&gt;&lt;/embed&gt;&lt;/object&gt;
&lt;/p&gt;
&lt;p&gt;(via &lt;a href="http://the99percent.com/videos/6299/threadless-the-do-first-work-ethic"&gt;The 99 Percent&lt;/a&gt;)&lt;/p&gt;

&lt;p class='body_footer'&gt;Don't worry about the "how". is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;&lt;p class='body_footer'&gt;Don't worry about the "how" is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2010-02-20T19:32:45Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/dont-worry-about-the-how</guid>
    <id type="integer">55</id>
    <status nil="true"></status>
    <title>Don't worry about the "how"</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2010-02-20T19:33:18Z</updated-at>
    <url>dont-worry-about-the-how</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;Came across this note from 2008&lt;!--more--&gt;.&lt;/p&gt;

&lt;blockquote&gt;
&lt;p&gt;Maybe there's a part of me that takes comfort in being able to say "I'm not successful because I haven't tried" as apposed to being unsuccessful because I'm not talented. Maybe that's why I have excuses for not seeking out commissions? Maybe I am actually scared of failing so I'm scared of trying? Scared of putting myself out there to be judged? I'm unmotivated and uninspired because of that fear. Therefore I need to conquer that fear to become motivated, inspired and ultimately successful.&lt;/p&gt;

&lt;p&gt;I either need to try and fail, then see that it's not so bad. Or try and succeed and see that I shouldn't have been scared. Probably both. I need to embrace that I can either succeed or fail but either way I cannot go on hiding. I need to be brave, confident and thick-skinned. I need to rediscover my talent, my vision and my motivation. I need to see every excuse as just that. I need to remind myself that I know I'm scared, but I must try anyway. I need to remind myself that my skills require many more years of hard work and that I must seek to challenge myself and improve those skills.&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p class='body_footer'&gt;Sometimes I do actually listen to myself is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;&lt;p class='body_footer'&gt;Sometimes I actually do listen to myself is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2010-01-26T06:34:15Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/sometimes-i-actually-do-listen-to-myself</guid>
    <id type="integer">54</id>
    <status nil="true"></status>
    <title>Sometimes I actually do listen to myself</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2010-01-26T06:37:56Z</updated-at>
    <url>sometimes-i-actually-do-listen-to-myself</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;Keep busy, have fun, do good.&lt;/p&gt;&lt;p class='body_footer'&gt;My New Year's Resolution is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2010-01-03T22:04:30Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/my-new-years-resolution</guid>
    <id type="integer">53</id>
    <status nil="true"></status>
    <title>My New Year's Resolution</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2010-01-03T22:04:30Z</updated-at>
    <url>my-new-years-resolution</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;!--more--&gt;
&lt;ul&gt;
&lt;li&gt;A: &lt;a href="http://amazon.com/"&gt;amazon.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;B: &lt;a href="http://blog.asmartbear.com/"&gt;blog.asmartbear.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;C: &lt;a href="http://www.beseamless.com/"&gt;cms.local/&lt;/a&gt; (local development version of Seamless)&lt;/li&gt;
&lt;li&gt;D: &lt;a href="#"&gt;david.localhost:3000/&lt;/a&gt; (for testing subdomains locally)&lt;/li&gt;
&lt;li&gt;E: &lt;a href="http://en.wikipedia.org/"&gt;en.wikipedia.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;F: &lt;a href="http://ffffound.com/"&gt;ffffound.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;G: &lt;a href="http://google.com/"&gt;google.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;H: &lt;a href="http://happiness-project.com/"&gt;happiness-project.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;I: &lt;a href="http://inthereddeeps.com/"&gt;itrd.local/&lt;/a&gt; (local development version of In The Red Deeps)&lt;/li&gt;
&lt;li&gt;J: &lt;a href="http://jakeandamir.com/"&gt;jakeandamir.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;K: &lt;a href="http://kungfugrippe.com/"&gt;kungfugrippe.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;L: &lt;a href="#"&gt;localhost:3000/&lt;/a&gt; (default address for local Rails apps)&lt;/li&gt;
&lt;li&gt;M: &lt;a href="http://mail.google.com/"&gt;mail.google.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;N: &lt;a href="http://netflix.com/"&gt;netflix.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;O: &lt;a href="http://online.wamu.com/"&gt;online.wamu.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;P: &lt;a href="#"&gt;passes.local/&lt;/a&gt; (a password generator/keeper)&lt;/li&gt;
&lt;li&gt;Q: &lt;a href="http://quirksmode.org/"&gt;quirksmode.org/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;R: &lt;a href="http://railscasts.com/"&gt;railscasts.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;S: &lt;a href="http://store.apple.com/"&gt;store.apple.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;T: &lt;a href="#"&gt;twelvemonths.local/&lt;/a&gt; (todo/planner app)&lt;/li&gt;
&lt;li&gt;U: &lt;a href="http://uhhuhyeah.com/"&gt;uhhuhyeah.local/&lt;/a&gt; (local development version of UHY)&lt;/li&gt;
&lt;li&gt;V: &lt;a href="http://validator.w3.org/#validate_by_input"&gt;validator.w3.org/#validate_by_input&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;W: &lt;a href="http://whois.net/"&gt;whois.net/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;X: &lt;a href="http://xkcd.com/"&gt;xkcd.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Y: &lt;a href="http://youtube.com/"&gt;youtube.com/&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Z: &lt;a href="http://zeldman.com/"&gt;zeldman.com/&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;blockquote&gt;&lt;p&gt;A simple game: Go to the address bar in your favorite browser, and type one letter. Start with &#8220;a&#8221;, end with &#8220;z&#8221;.&lt;/p&gt;

&lt;cite&gt;via &lt;a href="http://maxvoltar.com/articles/url-abc"&gt;Tim Van Damme&lt;/a&gt;&lt;/cite&gt;
&lt;/blockquote&gt;

&lt;p&gt;Most of the sites in my list are re-assuredly geeky, or goofy. Or both. See &lt;a href="http://maxvoltar.com/articles/url-abc#comments"&gt;Tim's site&lt;/a&gt; for more lists and to share yours too.&lt;/p&gt;
&lt;p class='body_footer'&gt;URL ABC is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2009-11-28T03:49:38Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/url-abc</guid>
    <id type="integer">52</id>
    <status nil="true"></status>
    <title>URL ABC</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-11-28T04:00:24Z</updated-at>
    <url>url-abc</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;The days I make things, I&amp;#8217;m happy.&lt;/p&gt;
&lt;p&gt;The days I spend fixing things, I&amp;#8217;m not so happy.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;But sometimes to make things, they have to be fixed first.&lt;/p&gt;
&lt;p&gt;I guess I don&amp;#8217;t always have to be happy, but it would be nice.&lt;/p&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p class='body_footer'&gt;When I make things, I'm happy is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2009-10-24T21:52:57Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/when-i-make-things-im-happy</guid>
    <id type="integer">51</id>
    <status nil="true"></status>
    <title>When I make things, I'm happy</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-10-24T21:53:47Z</updated-at>
    <url>when-i-make-things-im-happy</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;I found this on &lt;a href="http://holykaw.alltop.com/dim-sum-wis-dum" rel="nofollow"&gt;holykaw&lt;/a&gt; (via &lt;a href="http://garrysub.posterous.com/dim-sum-wisdom-if-you-want-happiness-from-guy"&gt;@garrytan&lt;/a&gt;) and decided that this (apart from the marriage bit) is sums up how I plan on being (&lt;em&gt;and staying&lt;/em&gt;) happy&lt;!--more--&gt;.&lt;/p&gt;

&lt;div class="img_link"&gt;&lt;a href="http://www.flickr.com/photos/uhhuhyeah/4040425522/" title="If you want happiness... by Uh Huh Yeah, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2505/4040425522_ef4c98473c.jpg" width="339" height="225" alt="If you want happiness..." /&gt;&lt;/a&gt;&lt;p class="description"&gt;&lt;a href="http://www.flickr.com/photos/uhhuhyeah/4040425522/"&gt;If you want happiness...&lt;/a&gt;&lt;/p&gt;&lt;/div&gt;&lt;p class='body_footer'&gt;My (new) Philosophy is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;&lt;p class='body_footer'&gt;My (new) Philosophy is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2009-10-24T18:35:38Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/my-new-philosophy</guid>
    <id type="integer">50</id>
    <status nil="true"></status>
    <title>My (new) Philosophy</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-10-24T18:35:38Z</updated-at>
    <url>my-new-philosophy</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;I received my new business cards from &lt;a href="http://moo.com/"&gt;Moo&lt;/a&gt; yesterday. &lt;a href="http://moo.com/"&gt;Moo&lt;/a&gt; is an online printer I&amp;#8217;ve used a couple of times now and I really love their quality and everything about the experience. This is a quick post about their (well, my) business cards&lt;!--more--&gt;.&lt;/p&gt;

&lt;h3 id="why_i_love_moo"&gt;Why I love Moo&lt;/h3&gt;
&lt;p&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Great quality prints.&lt;/li&gt;
&lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Great, easy, painless ordering experience &amp;ndash; Orders are kept online (with preview images) so you can easily re-order.&lt;/li&gt;
&lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Two-side printing. Images on &lt;strong&gt;both&lt;/strong&gt; sides baby!&lt;/li&gt;
&lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Very quick turn around. I&amp;#8217;ve ordered three times from them and each time I got them in &lt;em&gt;under&lt;/em&gt; a week despite them saying about a week for printing plus five days for delivery.&lt;/li&gt;
&lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; One order can have up to 50 different images, no extra cost. (Drew McLellan from &lt;a href="http://grabaperch.com/"&gt;Perch&lt;/a&gt; recently used Moo&amp;#8217;s &lt;a href="http://us.moo.com/en/products/minicards.php"&gt;MiniCards&lt;/a&gt; to &lt;a href="http://allinthehead.com/retro/346/how-to-create-100-unique-moo-minicards"&gt;great effect making promo-cards.&lt;/a&gt; Something I&amp;#8217;m not ashamed to say I might steal soon&amp;#8230;)&lt;/li&gt;
&lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Not that it matters, but their site is &lt;em&gt;delicious!&lt;/em&gt;&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;You can order a set of 10 business cards free, as a sampler. They do stick a moo logo on these freebies though (if, like me, you were trying to get some free cards you could use yourself. But, like me, you can pay a few dollars and get the 10 pack with the logos removed.)&lt;/p&gt;

&lt;h3 id="what_i_got_from_moo"&gt;What I got from Moo&lt;/h3&gt;

&lt;div class="img_link"&gt;
  &lt;a href="http://www.flickr.com/photos/uhhuhyeah/4037768608/" title="New business cards from moo.com by Uh Huh Yeah, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2645/4037768608_2555e97810.jpg" width="339" height="254" alt="New business cards from moo.com" /&gt;&lt;/a&gt;
  &lt;p class="description"&gt;&lt;a href="http://www.flickr.com/photos/uhhuhyeah/4037768608/"&gt;New business cards from moo.com&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;div class="img_link"&gt;
  &lt;a href="http://www.flickr.com/photos/uhhuhyeah/4037018045/" title="New business cards [front] by Uh Huh Yeah, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3531/4037018045_381bff6929.jpg" width="339" height="254" alt="New business cards [front]" /&gt;&lt;/a&gt;
  &lt;p class="description"&gt;&lt;a href="http://www.flickr.com/photos/uhhuhyeah/4037018045/"&gt;New business cards [front]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p class="small_print"&gt;You may be able to faintly make out &amp;#8220;David A McClain&amp;#8221; above the white email address. The contrast between the black print and the grey background is fine, it's just the lighting/my photography skills letting me down"&lt;/p&gt;

&lt;div class="img_link"&gt;
  &lt;a href="http://www.flickr.com/photos/uhhuhyeah/4037018137/" title="New business cards [back] by Uh Huh Yeah, on Flickr"&gt;&lt;img src="http://farm3.static.flickr.com/2503/4037018137_ae85800f2c.jpg" width="339" height="254" alt="New business cards [back]" /&gt;&lt;/a&gt;
  &lt;p class="description"&gt;&lt;a href="http://www.flickr.com/photos/uhhuhyeah/4037018137/"&gt;New business cards [back]&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;/p&gt;&lt;p&gt;&lt;/p&gt;

&lt;p&gt;Note: I don&amp;#8217;t work for Moo nor am I affiliated with them in anyway. I&amp;#8217;m just a big (un-paid) fan.&lt;/p&gt;&lt;p class='body_footer'&gt;My Moo Cards is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;&lt;p class='body_footer'&gt;My Moo Cards is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2009-10-24T03:07:48Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/my-moo-cards</guid>
    <id type="integer">49</id>
    <status nil="true"></status>
    <title>My Moo Cards</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-10-24T03:07:48Z</updated-at>
    <url>my-moo-cards</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;Is the iPhone a worthwhile market to develop for or is it all a joke?&lt;/p&gt;
&lt;p&gt;A great editorial from John Herrman on &lt;a href="http://gizmodo.com/5378390" title="The App Store Effect: Are iPhone Apps Headed for Oblivion?"&gt;Gizmodo&lt;/a&gt; about what iPhone app prices are (or could be) doing to the market&lt;!--more--&gt;.&lt;/p&gt;

&lt;p&gt;Money quote:&lt;/p&gt;

&lt;blockquote&gt;
  &lt;p&gt;So what does the App Store Effect mean, right now? In the short term, we&amp;#8217;ll get lower prices. This is great. But in the long term, it might not be sustainable.&lt;/p&gt;
  
  &lt;p&gt;The promise that sales volume will make up for the rock-bottom prices you need to charge just to be seen in your app category seems increasingly hollow, and to put it bluntly, if developers don&amp;#8217;t have a chance in hell of recouping their fees, they&amp;#8217;ll stop trying. And I&amp;#8217;m not talking about 99-cent iFart app spammers here&#8212;I&amp;#8217;m talking about big players who already make money selling software. If the navigation companies, the big game studios and the premium content providers can&amp;#8217;t thrive in the App Store, they&amp;#8217;ll have to leave; even playing in Apple&amp;#8217;s sandbox threatens and undercut their (sometimes much more crucial) product lines elsewhere.
  &lt;cite&gt;&lt;a href="http://gizmodo.com/5378390" title="The App Store Effect: Are iPhone Apps Headed for Oblivion?"&gt;John Herrman (Gizmodo)&lt;/a&gt;&lt;/cite&gt;&lt;/p&gt;
&lt;/blockquote&gt;

&lt;p&gt;I&amp;#8217;ve been an iPhone user since &lt;em&gt;almost*&lt;/em&gt; the beginning and as a developer I&amp;#8217;m very interested in making something on this device I love so much. From a creative and technical standpoint iPhone development seems to offer a rewarding and fun experience. I think it would be great for a weekend project or a personal side project. But as a commercial project? My gut tells me I&amp;#8217;d be foolish to spend however many months on a iPhone app that, as trends and anecdotal evidence suggest, will likely be under pressure to sell for pennies and try to &amp;#8220;make it up in volume&amp;#8221;. In my mind that&amp;#8217;s no way to price a product or to make a living. &lt;/p&gt;

&lt;p&gt;The current climate of the App Store is such that I feel I&amp;#8217;d just be throwing money away if I were to invest my time into making a great app. This really saddens me. I feel like I&amp;#8217;m missing out on something worthwhile not doing iPhone development. &lt;/p&gt;

&lt;p&gt;There is some incredible craftsmanship on display in some apps (Atebit&amp;#8217;s &lt;a href="http://www.atebits.com/tweetie-iphone/"&gt;Tweetie&lt;/a&gt; and Things Made Out Of Other Thing&amp;#8217;s &lt;a href="http://eucalyptusapp.com/"&gt;Eucalyptus&lt;/a&gt; spring to mind &amp;ndash; the latter I spend $10 on, the former only $3 by the bye) and I&amp;#8217;m always happy to support great apps with my humble dollars but it seems that it&amp;#8217;s only other developers who value the work that goes into a &amp;#8220;Tweetie&amp;#8221;. The rest (and majority) of App Store patrons wouldn&amp;#8217;t think twice about spending $5 on a fancy latte that will last 20 minutes but balk at paying $3 on an app they&amp;#8217;d use and enjoy every day. In my opinion that&amp;#8217;s a sign the market Apple has created is broken. But the sad thing is, it&amp;#8217;s not &lt;em&gt;really&lt;/em&gt; Apple&amp;#8217;s fault. &lt;/p&gt;

&lt;p&gt;Most iPhone apps seem to only exist within the walls of the App Store. In other words, the developers rely on the App Store as their marketing channel &lt;em&gt;and&lt;/em&gt; their distribution channel. This I believe is where the damage started. This is what has left app developers unable to resist the slide towards low prices and negative profit margins (otherwise called a loss). Long ago I decided that if I was to release an iPhone app I wouldn&amp;#8217;t leave it up to Apple&amp;#8217;s App Store to promote and market it &amp;ndash; &lt;em&gt;unless it was a novelty app of course.&lt;/em&gt;&lt;/p&gt;

&lt;p&gt;If the App Store is to survive (and by that I mean developers can make enough money to recoup their development time, make a small profit and therefor &lt;em&gt;continue&lt;/em&gt; to make apps to sell in the App Store) I think developers need to start seeing iTunes as a distribution channel and take back control of their own marketing efforts. &lt;/p&gt;

&lt;p&gt;If Uh Huh Yeah were to release an iPhone app, even taking my own sage advice into consideration and even if I did a great job marketing it to the right kind of users, I&amp;#8217;d be worried that they&amp;#8217;d be so pre-conditioned to spending a dollar if anything at all that they wouldn&amp;#8217;t buy an app they would have otherwise enjoyed and found useful. Witness the absurd backlash over the pricing for Tweetie 2. If this trend of novelty apps dominating sales and poisoning the market is to stop, developers need to take action &lt;strong&gt;now&lt;/strong&gt; and take back control of their prices, their marketing and their livelihood. &lt;/p&gt;

&lt;p class="small_print"&gt;I held out for an entire month before buying the original iPhone.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;UPDATE:&lt;/strong&gt; &lt;a href="http://www.newsweek.com/id/216788/output/print"&gt;Newsweek&lt;/a&gt; has some researched some (depressing) numbers.&lt;/p&gt;
&lt;p&gt;Money quote:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
Most apps take at least six months of full-time work and cost between $20,000 and $150,000 to develop, according to Forrester Research, which covers the tech industry. Apple rejects almost 60 percent of submissions at least once, often&#8212;according to programmers&#8212;with little more than infuriatingly vague or inconsistent explanations. Of the 85,000 that have been accepted, only a few hundred sellers have much chance of supporting full-time work. "It's a lot like the music business," says Barnard, who left a job in record engineering to develop applications full time. "Some indie bands make money, but most don't."&lt;/p&gt;
&lt;cite&gt;&lt;a href="http://www.newsweek.com/id/216788/output/print"&gt;Newsweek&lt;/a&gt;&lt;/cite&gt;
&lt;/blockquote&gt;

&lt;p class='body_footer'&gt;Is it a waste of time developing for the iPhone? is a post from &lt;a href='http://uhhuhyeah.com/distractions'&gt;Uh Huh Yeah's Distractions&lt;/a&gt;&lt;/p&gt;</body>
    <created-at type="datetime">2009-10-16T19:16:31Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/is-it-a-waste-of-time-developing-for-the-iphone</guid>
    <id type="integer">48</id>
    <status nil="true"></status>
    <title>Is it a waste of time developing for the iPhone?</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-10-16T20:09:36Z</updated-at>
    <url>is-it-a-waste-of-time-developing-for-the-iphone</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;It seems as if AT&amp;amp;T want to put a cap on iPhone user's data use. Which seems like a great thing. For them&lt;!--more--&gt;.&lt;/p&gt;

&lt;p&gt;The iPhone has been a revolutionary device in that it has brought millions of people into the realm of mobile internet. And now, in the name of Net Neutrality* (which I am for) AT&amp;amp;T is now trying it's best to un-do all that. In a recent comment, Ralph de la Vega (president and CEO of AT&amp;amp;T Mobility and Consumer Markets) said to &lt;a href="http://www.pcworld.com/article/173320/atandt_wireless_ceo_hints_at_managing_iphone_data_usage.html"&gt;PC World's Mark Sullivan&lt;/a&gt;&lt;/p&gt;
&lt;blockquote&gt;Just 3 percent of AT&amp;amp;T's smartphone customers use 40 percent of all smartphone data. [...] Without the proper management of these networks regular data users will be "crowded out" by the small number of users who use massive amounts of data.&lt;cite&gt;Ralph de la Vega&lt;/cite&gt;&lt;/blockquote&gt;

&lt;p&gt;I read those statistics as a good thing, the iPhone is actually managing to get their user to, well, use them while other smartphones aren't used nearly as much (or just used for email I'd guess). AT&amp;amp;T read this as "uh-oh, people are actually using the service they pay us money to use". Aside from signing whatever agreement with Apple they signed, has AT&amp;amp;T ever looked happy about the success of the iPhone?&lt;/p&gt;

&lt;p&gt;Even if these data use caps are set to a reasonable level, and I'm sure they will be, once they start metering it we'll go back to how it was with WAP, or even dial-up. We'll start to watch the clock as well or more than the content. We'll think twice before using our phones because we'll be making value judgement calls on whether we should be online or saving our data allowance.&lt;/p&gt;

&lt;p&gt;Can you remember what it was like to be rushed online? For those of us who can, being able to get online whenever and for whatever you wanted was a revolution in itself. I would argue that always on, always available "mobile" internet will turn out to be more important to progressing the web than always on, always available broadband was. I say this because a) pre-broadband internet (dial-up) was much more pleasurable to use than WAP ever was and b) I'd argue that as little as we knew what to do with the internet in the bad old dial-up days, we know even less when it comes to what to do with "mobile" internet.&lt;/p&gt;

&lt;p&gt;Once you make something too cheap to meter, you fundamentally change how that thing is used. Having unlimited data use had that effect in that it didn't matter if you used it a lot or hardly ever, you'd pay the same amount. &lt;em&gt;So why not use it?&lt;/em&gt; Now although the money coming out of my pocket every month may not change (I doubt AT&amp;amp;T will charge me less &lt;em&gt;just&lt;/em&gt; because they're giving me less) my data use is no longer too cheap to meter/too cheap to matter. And as reasonable as the limits may be, it's more of a physiological barrier than a monetary barrier.&lt;/p&gt;

&lt;p&gt;It just feels like we're taking a step backwards. &lt;strike&gt;All&lt;/strike&gt; mainly because AT&amp;amp;T isn't ready to help us move towards the future they're taking their toys and going home unless we all agree to not play with them.&lt;/p&gt;

&lt;p class="small_print"&gt;*Fair play to AT&amp;amp;T for turning something that's good for consumers into something that's bad for consumers.&lt;/p&gt;</body>
    <created-at type="datetime">2009-10-09T15:53:07Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/is-this-progress</guid>
    <id type="integer">47</id>
    <status nil="true"></status>
    <title>Is this progress?</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-10-18T03:23:19Z</updated-at>
    <url>is-this-progress</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;I often need to make random strings and it became a "thing" with me to try and do it differently each time. Here are some of the ways I've done random strings&lt;!--more--&gt;.&lt;/p&gt;

&lt;h3&gt;Seamless&lt;/h3&gt;
&lt;p&gt;
 &lt;script src="http://gist.github.com/203628.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;h3&gt;Coatable&lt;/h3&gt;
&lt;p&gt;
  &lt;script src="http://gist.github.com/203627.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;h3&gt;Due This Week&lt;/h3&gt;
&lt;p&gt;
  &lt;script src="http://gist.github.com/203629.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;h3&gt;Muffin App&lt;/h3&gt; 
&lt;p&gt;
  &lt;script src="http://gist.github.com/203630.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;h3&gt;Muffin App (again)&lt;/h3&gt;
&lt;p&gt;
  &lt;script src="http://gist.github.com/203632.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;h3&gt;UhHuhYeah.com (which I think I stole from restful_authentication)&lt;/h3&gt; 
&lt;p&gt;
  &lt;script src="http://gist.github.com/203634.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;h3&gt;And my favourite (being used in my latest skunkworks project)&lt;/h3&gt;
&lt;p&gt;
  &lt;script src="http://gist.github.com/203636.js"&gt;&lt;/script&gt;
&lt;/p&gt;

&lt;p&gt;
  As you can see, they range from the concise to the utter ridiculous. And that's one of the things I love about Ruby. There's always a few ways to do things, but the code always speaks and it always lets you know when you're being ridiculous. 
&lt;/p&gt;</body>
    <created-at type="datetime">2009-10-07T01:58:06Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/random-strings-in-ruby</guid>
    <id type="integer">46</id>
    <status nil="true"></status>
    <title>Random Strings in Ruby</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-10-07T01:58:06Z</updated-at>
    <url>random-strings-in-ruby</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;h3&gt;Budgeting on a budget&lt;/h3&gt;

&lt;p&gt;Today I'm happy to announce a big change for Muffin - it's cheaper!&lt;/p&gt;

&lt;p&gt;In my ongoing efforts to make Muffin App a useful tool to make and track personal budgets I decided that if I could cut some of the costs and make Muffin more affordable more people could reap the benefits of using it&lt;!--more--&gt;. I was worried that those who could use Muffin App the most might be put off by the $7 a month price. There are a number of apps I'd like to use but even small amounts like that cause me apprehension. Heck, I love Muffin App. I use it &lt;em&gt;all&lt;/em&gt; the time but even to me $7/month didn't seem like a lot to pay for Muffin App, but it did seem a lot to pay. There are so many great apps out there that are deserving of what little they charge but I can't afford to signup for every service out there. I found I had to limit myself to just a few of these apps and I imagine most of you out there are doing this as well.&lt;/p&gt;

&lt;p&gt;So I asked myself a tough question. &amp;#8220;Is Muffin App deserving of $7 a month?&amp;#8221; I decided that as a developer, it was a great price for an app that saved me so much time. However I kept coming back to the paradox of thinking that it was worth it's $7/month price tag but that as a user on a budget it was hard to justify spending, well, anything! And that's when I went with my heart and not my head. I decided to cut Muffin App's price to something I was comfortable paying for myself. In the end I found $25 a year to be a comfortable amount to pay without turning my business into a complete charity. If you do the math, it works out at about a 70% discount. Even as I'm writing this I'm having second thoughts but I know that if I wasn't comfortable paying $7/month for my own Kool-Aid how could I ask anyone else to drink it.&lt;/p&gt;

&lt;h3&gt;&amp;#36;25 a year&lt;/h3&gt;
&lt;p&gt;I hope this won't be a complete disaster but even if it is, I know that I made the wrong decision for the right reason.&lt;/p&gt;

&lt;p&gt;The only bit of Muffin App that has changed is the price, it's a pure price cut. No features have been axed. It's still the same great product it was, it's just that now it's got a price as awesome as itself.&lt;/p&gt;

&lt;h3&gt;30 day free trial&lt;/h3&gt;
&lt;p&gt;And of course, Muffin App still comes with it's 30 day, no-restrictions, free trial. &lt;a href="https://muffinapp.com/signup"&gt;Try Muffin App today&lt;/a&gt; and give it a chance to show you how easy it can be to make, track and stick to a budget.&lt;/p&gt;</body>
    <created-at type="datetime">2009-09-15T18:05:57Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/muffin-app-price-cut</guid>
    <id type="integer">45</id>
    <status nil="true"></status>
    <title>Muffin App Price Cut</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-09-15T18:47:53Z</updated-at>
    <url>muffin-app-price-cut</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;I'm looking for beta testers for Seamless. Before Seamless goes live (for real) I want to get some good, honest, insightful feedback on it so I'm opening up a few places in the private beta program&lt;!--more--&gt;.&lt;/p&gt; 

&lt;h3&gt;What is Seamless?&lt;/h3&gt;
&lt;p&gt;&lt;a href="http://www.beseamless.com/home"&gt;Seamless&lt;/a&gt; is a new app from Uh Huh Yeah that aims to enable artists of all walks who don't know (or choose not to know) how to make great websites on their own to get themselves online and share their work. Seamless is really three things. It's a portfolio for your work, a "back-end" to easily upload and manage the work in your portfolio and the hosting to run it all and put that portfolio on the internet.&lt;/p&gt;

&lt;h3&gt;Who is Seamless for?&lt;/h3&gt;
&lt;p&gt;Seamless is designed for any artist who makes something that can in some way, shape or form be shown to people as a picture or a video. It's designed for photographers, illustrators, designers, painters, sculptors, anyone creative that wants to share their work online and who want to do it easily. Seamless is &lt;em&gt;"a simple &lt;a title="Content Management System"&gt;CMS&lt;/a&gt; for people who just want to make great stuff"&lt;/em&gt;.&lt;/p&gt;

&lt;h3&gt;Want to know more?&lt;/h3&gt;
&lt;p&gt;If you want to know more and also see Seamless in action take a look at &lt;a href="http://www.beseamless.com/home"&gt;www.beseamless.com&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;If you're interested in trying out Seamless (for free) go to &lt;a href="http://www.beseamless.com/home"&gt;www.beseamless.com&lt;/a&gt; and add your email address to beta program waiting list*. I can't guarantee that I can offer a place for everyone who wants to help out but I'll do my best.&lt;/p&gt;

&lt;p&gt;I also urge you to join our totally private, totally in-frequent &lt;a href="/subscribe?value=seamless"&gt;mailing list&lt;/a&gt; so that you can find out how Seamless is progressing, when it'll be publicly available, new features and things like that.&lt;/p&gt;

&lt;p&gt;Thanks for your interest and your help in making Seamless great.&lt;/p&gt;

&lt;p class="small_print"&gt;*If you enter your email address it'll only be used if/when I can offer you a place in the beta. It won't be added to any other list or used for any other reason.&lt;/p&gt;</body>
    <created-at type="datetime">2009-08-09T19:04:54Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/seamless-is-looking-for-beta-testers</guid>
    <id type="integer">44</id>
    <status>complete</status>
    <title>Seamless is looking for beta testers</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-08-09T19:04:54Z</updated-at>
    <url>seamless-is-looking-for-beta-testers</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;I read &lt;a href="http://www.zeldman.com/2009/07/12/web-standards-secret-sauce-webkit-in-iphone/"&gt;Jeffrey Zeldman's post on &lt;strong&gt;WEB STANDARDS SECRET SAUCE&lt;/strong&gt;&lt;/a&gt; and the bit that stood out to me is the somewhat obvious point that it's mostly not "their" fault they're using Internet Explorer&lt;!--more--&gt;. They don't know any better. They don't know that the page would look and feel much better in a better browser. Perhaps it would even work better. They don't know that we hate designing for a broken browser. They don't see all the tape and glue holding the hideous mess together. It's not their job to.&lt;/p&gt;

&lt;p&gt;Our job (considering nobody seems to be able to talk sense to MS) is to either put up with it like we have been or educate our users that there's a difference. A better way. For both of us.&lt;/p&gt;

&lt;p&gt;The latter is a huge burdensome task but the former isn't so easy either. For some of you you'll say (rightly or wrongly) that you cannot educate your users so you must continue fighting the the many-headed Internet Explorer dragon. The rest of you will agree that if our job is to give the user/customer the best experience we can give them, then sometimes that'll include educating them on the parts of our world where a little knowledge will go a long way to achieving that.&lt;/p&gt;

&lt;p&gt;I don't know how best to do this with your users, I don't even know how to do it with mine, but it's something I'm going to work on.&lt;/p&gt;

&lt;h3&gt;Think of it this way&lt;/h3&gt;
&lt;p&gt;If you go to a site that requires the Flash Player plugin and you don't have it installed, the site simply tells you that you need it and where to get it. And I wouldn't seriously try to stretch this analogy that far you could also point out that the site's creator didn't try and build something that would work for us fools who didn't have the Flash plugin installed. He/she simply told us that in order to get the full experience of this site, you'll need this tool*.&lt;/p&gt;

&lt;p&gt;Granted there are key differences between requiring a plugin and &lt;em&gt;suggesting&lt;/em&gt; a browser. And the irony of using a flash site as an example when discussing web standards is not lost on me. However the point I'm trying to make is that taking the step to be vocal about the problem and suggesting that the user would have a better experience (not just on your site, but all over the web) if they installed pretty much any other browser than Microsoft's isn't so crazy as it first appears. Yes I'll be shouting at windmills, but if enough of us start doing it maybe they'll start to believe us. If companies that are paying good money to have great products built for them keep hearing that they won't get their full money's worth on IE, they'll start to believe it.&lt;/p&gt;

&lt;h3&gt;One thing I might try&lt;/h3&gt;
&lt;p&gt;On my &lt;a href="" title="Software As A Service"&gt;SAAS&lt;/a&gt; sites I usual have a FAQ of "what do I need to run this software?" and the answer is usually &amp;#8220;...nothing but a computer with an Internet connection. But to get the full experience I suggest you use a decent browser like Firefox and Safari...&amp;#8221; and I'll helpfully provide links to the download pages for those browsers.&lt;/p&gt; 

&lt;p&gt;I'm also now considering having a bare bones IE stylesheet (something useable, but not something I'm going to kill myself trying to get to work perfectly on IE) and a bar at the top that suggests that they'll get a better experience of this site (and most of the web) if they try out any one of these free browsers instead of Internet Explorer. I'll have a link to "learn why" where I'll attempt to outline in a brief and un-technical way why IE is a poor choice for modern web browsing. I'll have a few side-by-side screenshots of the same page in Safari, Firefox and IE. And if they still don't see the merit in it, at least they've made a conscious choice to stick with using IE.&lt;/p&gt;

&lt;h3&gt;&lt;a href="http://uhhuhyeah.com/distractions/whyuhydoesntsupportie6"&gt;Related: my post on why UHY doesn't support Internet Explorer&lt;/a&gt;&lt;/h3&gt;

&lt;p class="small_print"&gt;*Or he/she created a non-flash version of the site. But let's pretend they didn't, ok!&lt;/p&gt;</body>
    <created-at type="datetime">2009-07-12T19:03:29Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/ZeldmanandWindmills</guid>
    <id type="integer">43</id>
    <status>complete</status>
    <title>Zeldman and Windmills</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-07-12T19:03:29Z</updated-at>
    <url>ZeldmanandWindmills</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;I hope everyone celebrating their independence has a great time and stays safe and all that but I want to get serious for a moment&lt;!--more--&gt;. I want to urge you to take a moment and be thankful for &lt;em&gt; your&lt;/em&gt; independence. That's right, lets thank the mobile computing device that makes it all possible.&lt;/p&gt;

&lt;p&gt;Without their tireless (battery charge permitting) dedication to un-tethering us from our desks we would never know the joy of working at another desk someplace else. Usually that coffee shop across the road, the one with the sticky tables. Ah, what a golden age of on-the-go computing we live in.&lt;/p&gt; 

&lt;h3&gt;Time to give back&lt;/h3&gt;
&lt;p&gt;As well as sparing a thought today for those wifi-enabled boxes of freedom, I also urge you to give something back. Here are three ideas...&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;
    &lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Take your laptop somewhere fun today for a change. Going to a friend's house for a backyard barbecue? Great, bring your laptop too. Going to the park with your betrothed to watch the fireworks? Perfect, your Vaio will LOVE that!&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;
    &lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Treat your laptop today.&lt;/p&gt;
    &lt;p  style="margin-left:30px;"&gt;If your laptop is a Windows machine, give it the laptop equivalent of a pedicure (and we all love those, right); defrag it's poor tired hard drive.&lt;/p&gt;
    &lt;p style="margin-left:30px;"&gt;If your laptop is a Mac, it takes pretty good care of itself anyway but I bet it's aluminium (or titanium if you're into classics) enclosure could do with a good spit-polish.&lt;/p&gt;
    &lt;p style="margin-left:30px;"&gt;If your laptop is running some flavour of Linux, I'm guessing you've never been able to get the driver for that wifi card to work so you've never taken you laptop anywhere. I bet your laptop would love a trip outside. Just take it for a walk even, dude.&lt;/p&gt;
  &lt;/li&gt;

  &lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt; Download my &lt;a href="http://uhhuhyeah.com/wallpapers/"&gt;red_white_blue&lt;/a&gt; wallpaper (available for iPhone too - the mobile computing breakthrough device of 2007) so your laptop can show it's patriotic pride today as well. Yeah it was probably made in Taiwan or China, but is it's default OS language not &lt;code&gt;English (US)&lt;/code&gt;? Enough said.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;div class="img_link"&gt;
  &lt;p style="text-align:right;"&gt;
    &lt;a href="http://uhhuhyeah.com/wallpapers"&gt;
      &lt;img src="http://uhhuhyeah.com/images/wall_thumbs/red_white_blue.jpg" alt="red_white_blue" /&gt;
    &lt;/a&gt;
  &lt;/p&gt;
  &lt;p class="description"&gt;&lt;a href="http://uhhuhyeah.com/wallpapers"&gt;red_white_blue wallpaper (desktop and iPhone)&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;h3&gt;Those who do not learn from history are a something something...&lt;/h3&gt;
&lt;p&gt;I haven't read any history books but I'm sure wikipedia will back me up on this.
I'm sure that the founding fathers, after discovering America and all, weren't able to get any decent wifi coverage. You see, Starbucks was only in a few cities out west at that time and driving 5,000 miles for free wifi had yet to be invented. That's why, or a main reason why, they wrote the Declaration of Independence. They knew that although they might not live to see it in their own lifetimes, &lt;em&gt;we&lt;/em&gt; would someday be free.&lt;/p&gt;

&lt;p&gt;So please, be thankful and enjoy being free. There are so many of us who aren't.&lt;/p&gt;</body>
    <created-at type="datetime">2009-07-04T17:17:21Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/HappyIndependenceDay</guid>
    <id type="integer">42</id>
    <status>complete</status>
    <title>Happy Independence Day</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-09-10T00:35:00Z</updated-at>
    <url>HappyIndependenceDay</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;After some exhausting button pushing, Muffin App (version 2.0) was launched this morning&lt;!--more--&gt;.&lt;/p&gt;

&lt;h3&gt;The all-new Muffin App | Budget Tracking Made Simple&lt;/h3&gt;

&lt;p&gt;It's been a long process but I think the new Muffin far outshines the old one. This post will serve as a brief update to my &lt;a href="http://www.uhhuhyeah.com/distractions/Muffin2Preview"&gt;earlier preview&lt;/a&gt;. You'll want to take a look at &lt;a href="http://www.getmuffin.com"&gt;getmuffin.com&lt;/a&gt; for the big picture.&lt;/p&gt;

&lt;div class="img_link"&gt;
  &lt;a href="http://www.getmuffin.com"&gt;&lt;img src="/images/distractions/getmuffin.png" alt="Muffin" width="700px"/&gt;&lt;/a&gt;
  &lt;p class="description"&gt;The New Muffin &lt;a href="http://www.getmuffin.com"&gt;Learn more&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;I managed to squeeze in to Muffin App 2.0 all the things I wanted, plus a few features I was hoping to introduce at a later time.&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt;Weekly pay-periods
  &lt;p&gt;By much request Muffin users now have the option for weekly pay-periods (in addition to bi-weekly and monthly views). Now for those of you who get paid weekly you can view your budget a week at a time or a month at a time.&lt;/p&gt;
  &lt;/li&gt;
  
  &lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt;Recurring spending
  &lt;p&gt;Muffin App is all about making budgeting easy. Easy enough for you to actually not mind putting in the work to make and track a budget. The recurring spending feature is a huge step forward towards that goal. In Muffin you have a list of your "bills". Regular spending like rent and car insurance etc. Now for any of your bills you can have Muffin automagically add them to your spending - every month - with just one click! I've been using this feature for a while in development and I can tell you that  recurring spending will make budgeting seem a thousand times easier!&lt;/p&gt;
  &lt;/li&gt; 
  
  &lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt;Easier to use design
  &lt;p&gt;The idea behind the redesign wasn't (just) to make it prettier to look out. A lot of time and effort went in to making Muffin's controls and features easy and intuitive. And just incase something isn't quite that intuitive you'll find lots of help within the apps, as well as in the &lt;a href="http://www.getmuffin.com/help/"&gt;help docs&lt;/a&gt;.&lt;/p&gt;
  &lt;p&gt;&lt;/p&gt;
  &lt;p style="margin-left:20px;"&gt;One example is categories. You can add a category to you spending so that you can easily see all spending under a certain group. When you add or edit a spending item Muffin gives you three easy ways to add one of your categories.&lt;br /&gt; 
  1. Muffin shows you a list of all your categories&lt;br /&gt;
  2. Clicking on one of these categories adds that to your spending&lt;br /&gt;
  3. Just start typing. Muffin will suggest categories based on what you've entered.
  &lt;/p&gt;
  &lt;/li&gt;
  
  &lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt;Full SSL encryption
  &lt;p&gt;SSL encryption is what banks use to keep your data secure when you're logged onto your bank account online. Your personal information deserves to be as safe in Muffin too.&lt;/p&gt;
  &lt;/li&gt;
  
  &lt;li&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt;Invite a friend
  &lt;p&gt;Muffin App now has an invitation system. Muffin will send a really nice email to your friend explaining briefly what Muffin is all about. The invite includes a link for them to use to get a free trial and some money off their first paid month. But even better than that, if your friend signs up with that link we'll give you a month free after they've paid for their first month! And there's no limit to how many invites you can send. If you invite twelve of your friends and they all love Muffin enough to sign up too - you'll get an entire year free!!! If you want to get started inviting your friends and family (please, no spamming*) login or sign up today and click the huge invite link at the bottom of every page!&lt;/p&gt;
  &lt;/li&gt;
&lt;/ul&gt;  
  
&lt;h3&gt;What's next?&lt;/h3&gt;  
&lt;p&gt;A lot more has changed "under the hood" which will make Muffin App stronger, securer and easier to add new features to. I think Muffin App is in a really great place now, but I know there's still more I can do to make it even better. I'm guininely interested in hearing your feedback on Muffin. Email me at &lt;a href="mailto:david@uhhuhyeah.com"&gt;david [at] uhhuhyeah [dot] com&lt;/a&gt; and tell me what's good, bad, ugly or indifferent.&lt;/p&gt;

&lt;p&gt;&lt;/p&gt;
  
&lt;p class="small_print"&gt;*Please only invite people who you know and who you think might like Muffin. The invite email will have &lt;em&gt;your&lt;/em&gt; name on it and we can track who it was sent by. If we get legitimate complaints about a particular user we'll take away their ability to send invites. And remember, you only get a month free &lt;em&gt;after&lt;/em&gt; the person you've invited pays for their first month. I don't really think any of you would abuse the system&lt;/p&gt;
</body>
    <created-at type="datetime">2009-06-08T18:37:11Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/Muffin2isLaunched</guid>
    <id type="integer">41</id>
    <status>complete</status>
    <title>Muffin 2 is Launched</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-09-10T00:37:11Z</updated-at>
    <url>Muffin2isLaunched</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;A major update of &lt;a href="http://www.getmuffin.com"&gt;Muffin&lt;/a&gt; is just around the corner&lt;!--more--&gt;. Well, I'm viewing it as more of a re-launch than a mere update. What started out as a simple project to add a couple of features has turned into a five-month, ground up, re-write.&lt;/p&gt;

&lt;h3&gt;So what's new?&lt;/h3&gt;

&lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&amp;nbsp;&lt;/span&gt;Fundamentally Muffin is still Muffin - a simple web app for making and tracking (household) budgets. While I wouldn't go as far as to call it all a mistake I do feel that while Muffin 1.0 was fine for me, it wasn't of a high enough standard to be released. I've started to think of 1.0 as being a beta, and the imminent launch of 2.0 as it's public debut. A lot of the code in Muffin 1.0 was brittle and prone to annoying bugs and errors so the code in 2.0 has been made stronger and more reliable. This in turn will make it more maintainable and extensible. In other words I've made it easier for my future self to add new features to Muffin and easier for the current you to use and enjoy.&lt;/p&gt;

&lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&amp;nbsp;&lt;/span&gt;Muffin 2.0 will launch with a new design which I think will make Muffin a little easier to use, as well as a little easier on the eye. The Muffin marketing/signup site (getmuffin.com) will also receive a facelift with updated tour videos.&lt;/p&gt;

&lt;div class="img_link"&gt;
  &lt;a href="http://www.flickr.com/photos/uhhuhyeah/sets/72157617264027799/detail/"&gt;&lt;img src="/images/apps/muffin.png" alt="Muffin" /&gt;&lt;/a&gt;
  &lt;p class="description"&gt;A preview of Muffin 2.0. &lt;a href="http://www.flickr.com/photos/uhhuhyeah/sets/72157617264027799/detail/"&gt;See more&lt;/a&gt;&lt;/p&gt;
&lt;/div&gt;

&lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&amp;nbsp;&lt;/span&gt;I try to make every feature as self-explanatory as possible but in Muffin 2.0 you'll find a lot more inline help and guidance.&lt;/p&gt;

&lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&lt;/span&gt;Bills take a more important role in Muffin 2.0. Bills in Muffin 1.0 started out as a list of, well, bills that I could refer to every month instead of wracking my brain trying to remember what bill was due when. In 2.0 bills also serve as a way to set up automatically recurring spending. This means that (if you want to) you can start off your monthly budget with all your regular spending in place. I think that this is a really exciting feature that'll save you a lot of time.&lt;/p&gt;

&lt;p&gt;&lt;span class="green"&gt;&amp;#9724;&amp;nbsp;&lt;/span&gt;There's also a bunch of little tweaks and niceties that you probably wouldn't really notice by themselves but together add up to a better experience.&lt;/p&gt;

&lt;h3&gt;So when's it out?&lt;/h3&gt;

&lt;p&gt;Truthful answer is that I don't quite know. I'd say that Muffin 2.0 is more than 95% done but I'm taking as much time as I need to be thoroughly satisfied that it's ready before I pull the trigger. Right now I'd say sometime in May-June this year. I'll pick a concrete date a little nearer the time. Check &lt;a href="http://www.getmuffin.com"&gt;getmuffin.com&lt;/a&gt; or &lt;a href="http://twitter.com/uhhuhyeah"&gt;uhhuhyeah on twitter&lt;/a&gt; for updates.&lt;/p&gt;

&lt;h3&gt;For the future&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;Some features I hope to have out sometime after launch include&lt;/li&gt;
  &lt;li&gt;- A referral system&lt;/li&gt;
  &lt;li&gt;- An iPhone App - codename Muffin Jr&lt;/li&gt;
  &lt;li&gt;- (Better) support for weekly paychecks&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;

&lt;p&gt;I'll talk more about each of these as I get closer to releasing them but I'll just touch on them briefly here.&lt;/p&gt;

&lt;p&gt;Muffin will soon have a referral system. The details are still being ironed out but essentially you'll be able to invite your friends and family to signup for Muffin and for each one who does signup, you'll get a month of Muffin for free. Like I said, the details are still being worked on but I'd like to have some way of thanking Muffin users who do my job for me in evangelising Muffin.&lt;/p&gt;

&lt;p&gt;Muffin Jr will be the Muffin we all know and love, but with a little twist. Much more on this later.&lt;/p&gt;

&lt;p&gt;Weekly paychecks will be the first feature to be added and will basically have Muffin show you your budget a week at a time (current week, last week and next week) instead of a month at a time. I hope to have this feature ready &lt;em&gt;very&lt;/em&gt; soon.&lt;/p&gt;

&lt;p&gt;I also have a wee &lt;a href="/subscribe?value=muffin"&gt;mailing list for Muffin&lt;/a&gt; which you're welcome to subscribe to if you don't want to miss out on Muffin news or offers.&lt;/p&gt;

&lt;p&gt;I'm very excited about Muffin 2.0 and I hope it's as much of a help to you as it has been for me.&lt;/p&gt;

&lt;h3&gt;&lt;span class="just_green"&gt;Update&lt;/span&gt; - May 4th 2009&lt;/h3&gt;
&lt;p&gt;I am officially calling Muffin 2.0 done. There are some loose ends to tie up and expecting that they'll be done over the next few weeks. I'm hopeful now for a June launch.&lt;/p&gt;
</body>
    <created-at type="datetime">2009-04-26T20:44:21Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/Muffin2Preview</guid>
    <id type="integer">36</id>
    <status>complete</status>
    <title>Muffin 2.0 Preview</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-09-10T00:36:28Z</updated-at>
    <url>Muffin2Preview</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;To anyone who has anything to do with designing or developing website it's no secret that Internet Explorer 6 is a huge pain in the ass&lt;!--more--&gt;. "Internet Explorer 6 is antiquated, doesn&#8217;t support key web standards, and should be phased out. This isn&#8217;t about being anti-Microsoft, it&#8217;s about Microsoft&#8217;s lack of development in the browser market." It's a minor annoyance to us designers that browser makers choose the interpret the HTML and CSS specifications differently but IE6 seems to never have heard that there were specs to follow! This means broken layouts in IE6 while every other browser out there renders pretty much what you had planned on.&lt;/p&gt;

&lt;p&gt;There usually comes a time in the development cycle were everything is ready to do, you have one last item on the to-do list: take a look at it in IE6 (usually while grimacing in anticipation). You usually have two solutions to this, one is do put in some disproportionate about of labour into making a second version of yor site solely for IE6, or live with a broken (to IE6 anyway) site.&lt;/p&gt;

&lt;p&gt;But there is a third option. A third option that seems to be gaining a lot of traction. &lt;strong&gt;Forget about IE6.&lt;/strong&gt; Starting today, this is the option Uh Huh Yeah will be taking. And here's why.&lt;/p&gt;

&lt;p&gt;Uh Huh Yeah makes programs that run inside of a web browser. There are many benefits to this, but also some drawbacks. One such drawback is that sometimes our apps will look different to different users. Most of the time these differences are superficial and only noticeable to me, or if you had two browsers open side-by-side and looked closely. That's fine by me. I work hard to ensure that these differences are small and not detrimental. But then there's IE6. IE6 has this great knack for getting things completely wrong. If you're designing for IE6 you're designing in a straight-jacket. With crayons.&lt;/p&gt;

&lt;p&gt;Designing for IE6 is holding us back. Both as an industry of designers and as a consumers. And the odd thing is, we only design for IE6, because people use IE6. People only use IE6 because we either don't give them a reason not to, or our users are stuck with choices made by their IT department. We don't (and probably never will) make products that will be used in an corporate/enterprise environment big enough to warrant and IT department evil enough to force all their users to make-do with IE6. We also shouldn't give our users any reason to stick with technology that didn't work right eight years ago when it was released. Our concern should be to make the best products we can and give our users the best experience we can. Not with supporting a broken browser that Microsoft has superseded. Twice!&lt;/p&gt;

&lt;p&gt;Henceforth Uh Huh Yeah will never look at our products in IE6. If you want to continue to use IE6 and our products work fine, then great. If they don't work then I hope that just serves as one more reason why you should ditch IE6. In fact, if you visit uhhuhyeah dot com in IE6 we just flat out &lt;a href="http://www.flickr.com/photos/uhhuhyeah/3477656242/"&gt;won't give you any styling&lt;/a&gt;. Yes this is a little extreme, but it's to make a statement. We don't envision doing this for all our products, but like I already mentioned, we won't be making any effort to make our sites work in IE6.&lt;/p&gt;

&lt;h3&gt;For more information on this please take a look at&lt;/h3&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;a href="http://www.bringdownie6.com/"&gt;Bring Down IE6&lt;/a&gt;&lt;li&gt;
  &lt;li&gt;&lt;a href="http://www.bringdownie6.com/bring-down-ie-6.html"&gt;Calling time on IE6&lt;/a&gt;&lt;li&gt;
  &lt;li&gt;&lt;a href="http://www.contrast.ie/blog/dear-ie6-i-hate-you/"&gt;Dear IE6, I hate you&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://37signals.blogs.com/products/2008/07/basecamp-phasin.html"&gt;37signals phases out support for IE6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.usabilitypost.com/2008/09/05/drop-ie6-support-give-people-a-reason-to-upgrade/"&gt;Drop IE6, give people a reason to upgrade&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://brunomiranda.com/past/2008/8/5/if_you_care_about_this/"&gt;If you care about this Earth, help us abolish IE6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.brendancullen.com/notebook/is-it-finally-time-to-ditch-ie-6"&gt;Is it finally time to ditch IE6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://simplebits.com/notebook/2009/02/13/iegone.html"&gt;How I might deal with IE6&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://www.simonclayson.co.uk/reportage/ie_6_text_only/"&gt;Feed IE6 a basic stylesheet&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a herf="http://flickr.com/photos/hicksdesign/2889837176/"&gt;Kill them with Comic-Sans&lt;/a&gt;&lt;/li&gt;
  &lt;li&gt;&lt;a href="http://iedeathmarch.org/"&gt;IE Death March&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;</body>
    <created-at type="datetime">2009-04-19T19:46:33Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/whyuhydoesntsupportie6</guid>
    <id type="integer">34</id>
    <status>complete</status>
    <title>Why UHY doesn't support IE6</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-04-26T20:36:40Z</updated-at>
    <url>whyuhydoesntsupportie6</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;My least favourite part of making web apps is usually dealing with billing&lt;!--more--&gt;. I can't excited about it. I usually put it off as long as possible not the least because I loathe payment gateway APIs as a whole. I'm coming to the end of a product release and I was running out of excuses to put &lt;em&gt;that&lt;/em&gt; part off any longer.&lt;/p&gt;

&lt;p&gt;I started off planning the different states or circumstances a user would be likely to find themselves in.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;- Signup&lt;/li&gt;
&lt;li&gt;- End of trial&lt;/li&gt;
&lt;li&gt;- Failed payments&lt;/li&gt;
&lt;li&gt;- Billing updates&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;All pretty simple stuff. Then I started to think about an edge case. The application gives new users a free trial and at the end of the trial period turns off their access until they provide their credit card details. Or of course, allows them to close their account without charging them. But then I thought "what's stopping them from having a free trial, closing the account and then opening a second account, having another free trial and so on". Crikey, I can't have that! So I went through a few scenarios where I track who's had a free trial and look out for that at signup. If they match someone who's already had a free trial I show them a different sign up page where I tell them that they're welcome to signup again, but they get no free trial and they have to hand over the moola right now.&lt;/p&gt;

&lt;p&gt;So like I said, I hate coding billing logic anyway but I was getting really stressed working on this because i) I didn't want to and ii) I figured it was nearly impossible to stop a particularly dedicated douche from signing up for multiple free trials under different aliases etc. I got really bummed out and it sapped my creativity for the rest of the day. I tried working on something else but it was nagging me all day.&lt;/p&gt;

&lt;p&gt;After a long and wasted day I sat down away from the code to think about what I was going to do. But then I started to ask myself if it was really worth it? No matter what I do, there'll be some way around it (I hadn't got as far as requiring retinal scans, but I wasn't far off). I started to think that the type of people who would do this wouldn't be the type of people who'd use the app. It's there in the terms of service, it stinks of dishonesty, that should be enough to discourage most people. Was all this extra complexity in the code going to be worth it?&lt;/p&gt;

&lt;p&gt;I had such a crappy day working on the app that I couldn't bear to even talk about the app, never mind pour any more of my heart into it. Then I had a light-bulb moment. I should be focusing my time and energy on persuading people to love this app and &lt;em&gt;want&lt;/em&gt; to pay for it, not trying to lay traps and webs of gotcha code. If anyone is dishonest enough to want to use the app but not want to pay a few dollars a month for it, then I&#8217;m never going to win them, no matter how smart I make the signup process. They&#8217;re a waste of my time.&lt;/p&gt;

&lt;p&gt;So I let it go and got back into thinking about what I could do to make my users happy and to build the best darn app I could. That is what matters most, that is what merits my attention and sweat. As far as anything else is concerned: what will be, will be.&lt;/p&gt;</body>
    <created-at type="datetime">2009-04-07T00:14:42Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/Realisingwhatreallymatters</guid>
    <id type="integer">33</id>
    <status>complete</status>
    <title>Realising what really matters</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-04-07T00:14:42Z</updated-at>
    <url>Realisingwhatreallymatters</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;This is part III of III. If you need to catch up, &lt;a href="http://www.uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartI"&gt;Part I is here&lt;/a&gt; and &lt;a href="http://www.uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartII"&gt;Part II is here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Passenger&lt;/h3&gt;
&lt;p&gt;Now for Passenger. Passenger is going to serve our Rails apps (and do a darn good job of it too)&lt;!--more--&gt;.&lt;/p&gt;

&lt;p&gt;Passenger has a very nice user-friendly installer that will guide you through the setup. But first lets check to make sure that Passenger's dependancies are installed.&lt;/p&gt;

&lt;p&gt;On your server run &lt;code class="code_span"&gt;apt-get install build essential&lt;/code&gt; and &lt;code class="code_span"&gt;sudo apt-get install apache2-prefork-dev&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;Okies, now lets install the passenger gem (which you can probably guess what that command will look like) &lt;code class="code_span"&gt;sudo gem install passenger&lt;/code&gt; then (and here's where you need to start paying attention a little because Passenger is going to give you some code to copy and paste) &lt;code class="code_span"&gt;sudo passenger-install-apache2-module&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;It's going to tell you to "add blah to httpd.conf". On my system the httpd.conf was empty and all the settings were being laid out in &lt;code class="code_span"&gt;/etc/apache2/apache2.conf&lt;/code&gt; instead, so that's where I put the &lt;code class="code_span"&gt;Include /etc/apache2/passenger.conf&lt;/code&gt; and &lt;code class="code_span"&gt;Include /etc/apache2/sites-enabled/&lt;/code&gt; instead of &lt;code class="code_span"&gt;Include /etc/apache2/passenger_vhosts.conf&lt;/code&gt; because I already had the &lt;code class="code_span"&gt;sites-enabled&lt;/code&gt; doodad setup and I just decided to stick with it. Which one you use makes no difference but I found that using &lt;code class="code_span"&gt;sites-enabled&lt;/code&gt; doodad (which I'll cover shortly) was a better fit for me, especially because it was an Apache virtual hosts doodad and not a Passenger virtual hosts doodad I could specify all my virtual hosts the same way even if they weren't a Rails apps using Passenger.
So anyway, add the &lt;code class="code_span"&gt;Include&lt;/code&gt; statements with &lt;code class="code_span"&gt;sudo pico /etc/apache2/apache2.conf&lt;/code&gt; and just paste (or type) them somewhere near the bottom. Once you've done that (including your save and exit) lets restart Apache &lt;code class="code_span"&gt;sudo apache2ctl graceful&lt;/code&gt; to load those changes.&lt;/p&gt;


&lt;h3&gt;Actually using it&lt;/h3&gt;
&lt;p&gt;We now have all the pieces in place to serve multiple Rails apps (or of course, just the one). Lets say we have an app deployed to our server. On my server, to keep things nice and straightforward I have my domains in &lt;code class="code_span"&gt;/home/deploy/public_html/nameOfDomain&lt;/code&gt; this is mainly because I have other stuff installed in my home directory that I want to keep separate from the folders housing the domains but this is purely personal preference. Just make sure to put your domains somewhere that you feel happy giving people access to. So back to our app. It's called testapp and it was deployed with &lt;a href="http://www.capify.org"&gt;Capistrano&lt;/a&gt; so it's located at &lt;code class="code_span"&gt;/home/deploy/public_html/testapp&lt;/code&gt; inside a "current" folder that's actually a symlink to a folder containing the most up to date code inside of a &lt;code class="code_span"&gt;/home/deploy/public_html/testapp/releases/some_date_stamp&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;So lets create a virtual host for our testapp.&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;On your server run &lt;code class="code_span"&gt;sudo nano /etc/apache2/sites-available/testapp&lt;/code&gt; which will create an empty file in that location and open up the Pico editor for us. This is where we tell Apache about our app. Add some code like this...&lt;/p&gt;
&lt;div class="code_span_bg"&gt;&lt;pre&gt;&lt;code class="code_span"&gt;
&amp;lt;VirtualHost *:80&amp;gt;

  ServerName www.testapp.com
  ServerAlias *.testapp.com

  DocumentRoot /home/deploy/public_html/testapp/current/public

&amp;lt;Directory "/home/deploy/public_html/testapp/current/public"&amp;gt;
  Options FollowSymLinks
  AllowOverride None
  Order allow,deny
  Allow from all
&amp;lt;/Directory&amp;gt;
&amp;lt;/VirtualHost&amp;gt;
&lt;/code&gt;
&lt;/pre&gt;
&lt;/div&gt;

&lt;p&gt;So lets pick this apart a bit so we both understand how this works. A virtual host (for our purposes) is basically how one server, with one IP address can serve multiple websites. Each of your websites is going to have it's own &lt;code class="code_span"&gt;&lt;VirtualHost&gt;&lt;/VirtualHost&gt;&lt;/code&gt; declaration. We're just putting it inside of &lt;code class="code_span"&gt;sites-available/testapp&lt;/code&gt; to make it easier on us. The &lt;code class="code_span"&gt;*:80&lt;/code&gt; tells Apache to listen out on Port 80 for requests for this virtual host. Port 80 is the standard door that http requests come to (Port 443 is the standard port that secure https connections use). Next we have &lt;code class="code_span"&gt;ServerName www.testapp.com&lt;/code&gt; which tells Apache which server it's going to pretend to be - this should match the domain name for the app. The &lt;code class="code_span"&gt;ServerAlias&lt;/code&gt; can be used to set an alias for your domain that you want to refer to the same app. The asterisk is a wildcard so any request with anything before the domain (eg, somesubdomain.testapp.com) gets treated just like it was www.testapp.com. It's important to realise that any alias you set inside of the &lt;code class="code_span"&gt;VirtualHost&lt;/code&gt; declaration will be treated by Apache just like it was a request to the &lt;code class="code_span"&gt;ServerName&lt;/code&gt; itself and that regardless of what you do here, you need to have the appropriate DNS records set up or this won't work anywho.&lt;/p&gt;

&lt;p&gt;Next is the &lt;code class="code_span"&gt;DocumentRoot&lt;/code&gt;. "Once I've received a request for www.testapp.com, what do I give 'em?" Well Apache, send them to &lt;code class="code_span"&gt;/home/deploy/public_html/testapp/current/public&lt;/code&gt; where the files and code for testapp actually lives. Now, because this is a Rails app we need a couple of other settings to make this work. Most of this is black box code I picked up from here and there but without it requests to your Rails app's URL goes all funny. And not good funny.&lt;/p&gt;

&lt;p&gt;&lt;code class="code_span"&gt;FollowSymLinks&lt;/code&gt; is needed because when we go to &lt;code class="code_span"&gt;/home/deploy/public_html/testapp/current&lt;/code&gt; the current directory is just a symlink (an alias) to the most recent release of your code which is in the neighbouring directory &lt;code class="code_span"&gt;releases&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;&lt;code class="code_span"&gt;AllowOverride None&lt;/code&gt; is about allowing &lt;code class="code_span"&gt;.htaccess&lt;/code&gt; overrides. I didn't need that so it's set to none.&lt;/p&gt;

&lt;p&gt;&lt;code class="code_span"&gt;Allow from all&lt;/code&gt; allows requests from any IP address (I think).&lt;/p&gt;

&lt;p&gt;&lt;code class="code_span"&gt;Order allow,deny&lt;/code&gt; sets, if I had to guess, the order of whether it checks the &lt;code class="code_span"&gt;Allow&lt;/code&gt; directive before the &lt;code class="code_span"&gt;Deny&lt;/code&gt; directive (which I haven't set here, but you may wish to). For example you might have&lt;/p&gt;
&lt;code class="code_span"&gt;
Order deny,allow&lt;br/ &gt;
Deny from all&lt;br/ &gt;
Allow from 123.45.67.890&lt;/code&gt;
&lt;p&gt;which will tell Apache to first, check the request against the &lt;code class="code_span"&gt;Deny&lt;/code&gt; directive, then the &lt;code class="code_span"&gt;Allow&lt;/code&gt; directive. But that's just a mildly educated guess. If you need this kind of routing, take a look in the Apache docs (&lt;a href="http://httpd.apache.org/docs/"&gt;link&lt;/a&gt;).&lt;/p&gt;

&lt;p&gt;So now that we have our virtual host configured, lets tell Apache we want to enable it by running &lt;code class="code_span"&gt;sudo a2ensite testapp&lt;/code&gt; (or &lt;code class="code_span"&gt;sudo a2dissite testapp&lt;/code&gt; in future to disable it) and then another apache restart &lt;code class="code_span"&gt;sudo apache2ctl graceful&lt;/code&gt; and you should see your Rails app waving back at you if you visit http://www.testapp.com&lt;/p&gt;

&lt;h3&gt;Yay!&lt;/h3&gt;
&lt;p&gt;When it comes to your next site you just need to repeat the virtual host steps outlined above and Bob's your Mother's brother, you've got another Rails app and domain happily coexisting. And it doesn't need to be a Rails app either. I'm using this exact same method to serve purely static sites too.&lt;/p&gt;

&lt;p&gt;So that should about cover the basics for the bare minimum you need to know to get your server up and running multiple sites.&lt;/p&gt;

&lt;p&gt;And just one more thing. In your &lt;code class="code_span"&gt;/etc/apache2/passenger.conf&lt;/code&gt; it's recommended to set some basic performance related settings (&lt;a href="http://www.modrails.com/documentation/Users%20guide.html#_resource_control_and_optimization_options"&gt;more info here&lt;/a&gt;) to keep Passenger running fast and lean.&lt;/p&gt;</body>
    <created-at type="datetime">2009-01-05T19:53:41Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartIII</guid>
    <id type="integer">30</id>
    <status>complete</status>
    <title>How to set up your server for Rails and Passenger - Part III</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-07-30T14:51:33Z</updated-at>
    <url>HowtosetupyourserverforRailsandPassengerPartIII</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;This is part II of III. If you need to catch up, &lt;a href="http://uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartI"&gt;Part I is here&lt;/a&gt;&lt;/p&gt;

&lt;h3&gt;Apache&lt;/h3&gt;
&lt;p&gt;Lets start by getting Apache installed. Apache is what's going to actually serve webpages to our visitors&lt;!--more--&gt;. This will be considerable quicker than the SSH stuff.&lt;/p&gt;

&lt;p&gt;Login to your server,&lt;br /&gt;
&lt;code class="code_span"&gt;ssh deploy@ipaddress&lt;/code&gt;,&lt;br /&gt;
and run&lt;br /&gt;
&lt;code class="code_span"&gt;sudo aptitude install apache2 apache2.2-common apache2-mpm-prefork apache2-utils libexpat1 ssl-cert&lt;/code&gt;&lt;br /&gt;
all as one line&lt;/p&gt;

&lt;p&gt;&lt;code class="code_span"&gt;sudo&lt;/code&gt; says to the server "do this as a Super User" so it'll ask you for your Super User password.&lt;/p&gt;

&lt;p&gt;You'll see a bunch of stuff happening that we don't need to worry about. You might however worry about the last line &lt;code class="code_span"&gt;apache2: Could not reliably determine the server's fully qualified domain name, using 127.0.0.1 for ServerName&lt;/code&gt;. All this means is that we haven't set the name of our Apache server. &lt;br /&gt;If you want to, do &lt;code class="code_span"&gt;sudo nano /etc/apache2/apache2.conf&lt;/code&gt; you'll find a very long Apache configuration file with lots of options and things to break (I recommend some google searching for more info) but adding&lt;br /&gt;
&lt;code class="code_span"&gt;ServerName aCatchyServerName&lt;/code&gt;&lt;br /&gt;
to the very last line is pretty innocuous and will get rid of that "error" message every time we restart Apache. Save and exit then&lt;br /&gt;
&lt;code class="code_span"&gt;sudo apache2ctl graceful&lt;/code&gt;&lt;br /&gt;
No errors, right?&lt;/p&gt;

&lt;p&gt;&lt;span class="code_span"&gt;apache2ctl&lt;/span&gt; is a way of starting, stopping or restarting the Apache server. &lt;span class="code_span"&gt;apache2ctl graceful&lt;/span&gt; is a restart that doesn't kill open connections.&lt;/p&gt;

&lt;p&gt;Now, to test that Apache is working and can serve webpages, open your favourite browser (or IE if that's all you have) and go to your IP address (http://123.45.67.890) and fingers crossed we'll see Apache's "It works!" screen.&lt;/p&gt;

&lt;p&gt;Just how frigging easy was that, eh?!&lt;/p&gt;

&lt;h3&gt;Ruby etc&lt;/h3&gt;
&lt;p&gt;Installing Ruby, Rails and all that is a little tedious so forgive me and I'll try to make this a simple as possible.&lt;/p&gt;

&lt;p&gt;SSH into your server if you're not there already. Lets install Ruby, sqlite3 (MySQL to follow later) and a bunch of other things you'll need littering your clean server. (Again, all this code goes on one line.)&lt;/p&gt;

&lt;code class="code_span"&gt;sudo aptitude install ruby1.8-dev ruby1.8 ri1.8 rdoc1.8 irb1.8 libreadline-ruby1.8 libruby1.8 libopenssl-ruby sqlite3 libsqlite3-ruby1.8&lt;/code&gt;

&lt;p&gt;This might take a wee while but there's nothing to do but sit and watch it do it's stuff. Once it's done we'll create some symlinks so that we can just refer to the location of Ruby as &lt;code class="code_span"&gt;/usr/bin/ruby&lt;/code&gt; not &lt;code class="code_span"&gt;/usr/bin/ruby1.8&lt;/code&gt; run&lt;/p&gt;

&lt;p&gt;&lt;pre&gt;&lt;code class="code_span"&gt;sudo ln -s /usr/bin/ruby1.8 /usr/bin/ruby&lt;/code&gt; then
&lt;code class="code_span"&gt;sudo ln -s /usr/bin/ri1.8 /usr/bin/ri&lt;/code&gt; then
&lt;code class="code_span"&gt;sudo ln -s /usr/bin/rdoc1.8 /usr/bin/rdoc&lt;/code&gt; then
&lt;code class="code_span"&gt;sudo ln -s /usr/bin/irb1.8 /usr/bin/irb&lt;/code&gt;&lt;/pre&gt;&lt;/p&gt;

&lt;p&gt;And then let's ask what version of Ruby we have installed (reason being, if it's OK we'll get a version number, if it's messed up it'll tell us that ruby is an unknown command).
&lt;code class="code_span"&gt;ruby -v&lt;/code&gt; should return something like&lt;br /&gt;
&lt;code class="code_span"&gt;ruby 1.8.6 (2007-06-07 patchlevel 36) [x86_64-linux]&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;Rails&lt;/h3&gt;
&lt;p&gt;In order to install Rails (and a whole load of other Rails related stuff later on), we need to install RubyGems. This bit is a little fiddly. First, go to &lt;a href="http://rubyforge.org/projects/rubygems/"&gt;http://rubyforge.org/projects/rubygems/&lt;/a&gt; and copy the link for the latest version (under "Latest File Releases" click download then copy the "rubygems-1.3.1.tgz" link where 1.3.1 is the latest version). As of today it's 1.3.1 so that's what I'll be using.&lt;/p&gt;

&lt;p&gt;Take a deep breath and (still on your server) run&lt;br /&gt;
&lt;code class="code_span"&gt;mkdir ~/sources &amp;&amp; cd ~/sources&lt;/code&gt; then&lt;br /&gt;
&lt;code class="code_span"&gt;wget http://rubyforge.org/frs/download.php/45905/rubygems-1.3.1.tgz&lt;/code&gt; to download it to our sources folder,&lt;br /&gt;
&lt;code class="code_span"&gt;tar xzvf rubygems-1.3.1.tgz &amp;&amp; cd rubygems1.3.1&lt;/code&gt; to unpack it and go to that unpacked folder,&lt;br /&gt;
&lt;code class="code_span"&gt;sudo ruby setup.rb&lt;/code&gt; to install it and&lt;br /&gt;
&lt;code class="code_span"&gt;sudo ln -s /usr/bin/gem1.8 /usr/bin/gem&lt;/code&gt; to set a symlink for it just like we did with Ruby and then test that it works with our patented version test &lt;code class="code_span"&gt;gem -v&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;And finally, to Rails itself &lt;code class="code_span"&gt;sudo gem install rails&lt;/code&gt; will to the trick or &lt;code class="code_span"&gt; sudo gem install rails -v 2.1.1&lt;/code&gt; if you want a specific older version of Rails installed.  While we're here feel free to install whatever gems you know you'll need just like you do on your development machine &lt;code class="code_span"&gt;sudo gem install gemName&lt;/code&gt;.&lt;/p&gt;

&lt;h3&gt;MySQL&lt;/h3&gt;
&lt;p&gt;Although sqlite3 is now the default database in Rails many people like using MySQL for the production db so I'll go through how to install that.&lt;/p&gt;

&lt;p&gt;On your server run &lt;code class="code_span"&gt;sudo aptitude install mysql-server mysql-client libmysqlclient15-dev libmysql-ruby1.8 -y&lt;/code&gt;. During installation it will ask you for a password. Read carefully. It's asking you to setup a password for the MySQL root user. You'll need this in just a mo...&lt;/p&gt;

&lt;p&gt;Lets setup a MySQL user for our Rails application to use.&lt;br /&gt;
&lt;code class="code_span"&gt;mysql -u root -p&lt;/code&gt; and when prompted enter that password I warned you that you would need. We're now inside the MySQL app.&lt;br /&gt;
&lt;code class="code_span"&gt;CREATE USER 'deploy'@'localhost' IDENTIFIED BY 'deploy_password';&lt;/code&gt; will create a mysql user called deploy and mysql will let deploy mess around with databases if it's a local connection and if he comes with the password of 'deploy_password'. These are the credentials that will need to go in your &lt;code class="code_span"&gt;config/database.yml&lt;/code&gt; file for your production db. And you'll also need to give your app the socket of MySQL which for me was &lt;code class="code_span"&gt;/var/run/mysqld/mysqld.sock&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Anytime you mess around with users in MySQL run &lt;code class="code_span"&gt;FLUSH PRIVILEGES;&lt;/code&gt; when you're done.&lt;/p&gt;

&lt;p&gt;In the future, once we have some Rails apps installed we'll come back here to create our dbs. But just incase I forget, once you've logged in to MySQL as root do something like &lt;code class="code_span"&gt;CREATE DATABASE testapp_production;&lt;/code&gt; where &lt;code class="code_span"&gt;testapp_production&lt;/code&gt; is the name of the production db set in &lt;code class="code_span"&gt;config/database.yml&lt;/code&gt;. Then run &lt;code class="code_span"&gt;GRANT ALL PRIVILEGES ON `testapp_production` . * TO 'deploy'@'localhost';&lt;/code&gt; to give our mysql user "deploy" privileges to access and update this database.&lt;/p&gt;

&lt;p&gt;And don't forget to type &lt;code class="code_span"&gt;exit&lt;/code&gt; to exit out of MySQL when you're done.&lt;/p&gt;

&lt;p&gt;Good work boys and girls! We're nearly there, I promise.&lt;/p&gt;

&lt;h3&gt;Come along now, this way to &lt;a href="http://www.uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartIII"&gt;Part III&lt;/a&gt; please.&lt;/h3&gt;
</body>
    <created-at type="datetime">2008-12-31T03:32:49Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartII</guid>
    <id type="integer">28</id>
    <status>complete</status>
    <title>How to set up your server for Rails and Passenger - Part II</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-01-05T19:55:18Z</updated-at>
    <url>HowtosetupyourserverforRailsandPassengerPartII</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>&lt;p&gt;Over the next few posts (weather permitting) I'm going to walk you through how I set up my server to run multiple Rails apps&lt;!--more--&gt;.&lt;/p&gt;

&lt;p&gt;Now bear in mind, I'm not a sys admin and if you're reading this I guess you aren't either. I'm a designer and programmer. Everything I've learnt has been pieced together from articles like this, forums and good old fashioned trial and error. So your milage may vary, use at your own risk et cetera et cetera.&lt;/p&gt;

&lt;ul&gt;By the end of the series we'll have a server running 
  &lt;li&gt;- Ubuntu for the OS (should be already installed by your hosting provider)&lt;/li&gt;
  &lt;li&gt;- Apache for the web server&lt;/li&gt;
  &lt;li&gt;- Passenger (aka mod_rails) for making it super easy to setup and serve our apps&lt;/li&gt;
  &lt;li&gt;- Ruby and Ruby on Rails of course&lt;/li&gt;
  &lt;li&gt;- MySQL for db stuff&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I'll warn you now that some of this is bound to be tedious and boring but stick with me and I'll show you how ridiculously easy setting up a multiple rails apps can be.&lt;/p&gt;

&lt;p&gt;My personal experience was with &lt;a href="http://slicehost.net"&gt;Slicehost VPS&lt;/a&gt; but all this should be pretty much the same no matter who your hosting is with &lt;em&gt;providing&lt;/em&gt; that they treat you like a grown up and give you root access. Root access basically means that you have the power to install anything you want and mess with any setting you want to on your little piece of interweb.&lt;p/&gt;

&lt;p&gt;Ok, so lets assume you have a clean slate and your admin login and password at hand. Most experts say to create a new user on your server to do all your work under and to not log in with your root user for security purposes. So lets do that first.&lt;/p&gt;

&lt;p&gt;In your welcome email you probably got an IP address and a password. Open up Terminal (or your command line interface) on your local machine (aka your computer) and use SSH to connect to your server.&lt;/p&gt;

&lt;p&gt;Run &lt;code class="code_span"&gt;ssh root@123.45.67.890&lt;/code&gt; where the string of numbers is the IP address you were given. Make sure to include all the dots in all the right places. Enter your password when prompted and you should now be connected to your server and everything you type in this window will be a command issued to your server. We should probably change root's password to something secure but memorable by typing &lt;code class="code_span"&gt;passwd&lt;/code&gt; and following the prompts.&lt;/p&gt;


&lt;p&gt;Now we'll add a user who'll we'll actually use to do all the work. I've chosen "deploy" but you can use anything you like. Just be sure to replace "deploy" with your username in future steps.&lt;/p&gt;

&lt;code class="code_block"&gt;adduser deploy&lt;/code&gt;

&lt;p&gt;Our user deploy is new 'round here and nobody is going to listen to him or do anything he says. Lets fix that by giving him "Super User" privileges. Being a Super User will enable deploy to do whatever he damn well pleases (as long as he asks nicely and has the password). &lt;code class="code_span"&gt;visudo&lt;/code&gt; will open a file that will tell the server who to listen to so go all the way to the bottom of the file and on its own line type &lt;code class="code_span"&gt;deploy ALL=(ALL) ALL&lt;/code&gt; then Ctrl-X to exit making sure to save your changes. Then &lt;code class="code_span"&gt;logout&lt;/code&gt; to close the connection.&lt;/p&gt;

&lt;p&gt;Now one more little security trick. As great as your cat's name is a secure password &lt;em&gt;if&lt;/em&gt; someone did somehow guess that was your password they could SSH into your server and do all sorts of nasty in there. That's where SSH keys come in. Basically we create a pair of keys (big long strings of characters) and put one (called the public key) on the server and the other (called the private key) you keep on your machine. When you try to login with your password, the server will look for the private key that matches it's public key before letting you in. So even if Dr Evil guesses your password, he still can't get into your server without they key on your machine. Lets set that up real quick.&lt;/p&gt;

&lt;p&gt;You need to keep your private key in a specific folder which we'll make now. You should be logged out of your server and back on your local machine, right? Right. Good because we need to do this locally. Run &lt;code class="code_span"&gt;mkdir ~/.ssh&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;&lt;code class="code_span"&gt;mkdir&lt;/code&gt; is a command to make a directory (or a folder - same thing) and the &lt;code class="code_span"&gt;~/&lt;/code&gt; is a shortcut to your home directory.&lt;p&gt; 

&lt;p&gt;Now run &lt;code class="code_span"&gt;ssh-keygen -t rsa&lt;/code&gt; - this will generate some SSH keys for us. To make them more unique (and therefore more secure) it'll prompt you for a passphrase. Once this is done you should see that it left you two files: &lt;code class="code_span"&gt;id_rsa&lt;/code&gt; and &lt;code class="code_span"&gt;id_rsa.pub&lt;/code&gt;. To check this type &lt;code class="code_span"&gt;cd ~/.ssh &amp;&amp; ls&lt;/code&gt; which will go to that .ssh folder and list all the files there. The &lt;code class="code_span"&gt;id_rsa.pub&lt;/code&gt; is your public key. The one without &lt;code class="code_span"&gt;.pub&lt;/code&gt; is your private key. For the love of all that is Holy do not let Dr Evil get ahold of your private key!!&lt;/p&gt;

&lt;p&gt;Lets get that public key up onto our server...&lt;br /&gt;
&lt;code class="code_span"&gt;scp ~/.ssh/id_rsa.pub deploy@123.45.67.890:/home/deploy/&lt;/code&gt;&lt;br /&gt;
(You'll need your deploy user's password for this.) ...log back into your server with&lt;br /&gt;
&lt;code class="code_span"&gt;ssh deploy@123.45.67.890&lt;/code&gt;&lt;br /&gt;
and create a good home for the precious public key with&lt;br /&gt;
&lt;code class="code_span"&gt;mkdir /home/deploy/.ssh&lt;/code&gt;&lt;br /&gt;
...and then move the public key to it's new home&lt;br /&gt;
&lt;code class="code_span"&gt;mv /home/deploy/id_rsa.pub /home/deploy/.ssh/authorized_keys&lt;/code&gt;&lt;/p&gt;

&lt;p&gt;We should probably set the correct permissions for the key while we're here (just as it sounds - permissions govern who has what kind of access to a given file or folder - only it has a tendency for being really confusing as you may discover one day yourself)&lt;/p&gt;

&lt;code class="code_block"&gt;&lt;pre&gt;chown -R deploy:deploy /home/deploy/.ssh
chmod 700 /home/deploy/.ssh
chmod 600 /home/deploy/.ssh/authorized_keys&lt;/pre&gt;&lt;/code&gt;

&lt;p&gt;This wouldn't be nearly as much fun if there wasn't some settings to mess with. We can mess with some SSH settings by &lt;code class="code_span"&gt;sudo nano /etc/ssh/sshd_config&lt;/code&gt;. You might want to follow what someone who knows what they're doing &lt;a href="http://articles.slicehost.com/assets/2007/9/4/sshd_config.txt"&gt;says to do&lt;/a&gt; but two things people say to watch out for is which port (for server ports, think doors) the server should listen for connections/users on. &lt;code class="code_span"&gt;Port 22&lt;/code&gt; is a default port so hackers often try getting in via that port so you may want to change it to some fairly high, fairly random number (eg &lt;code class="code_span"&gt;Port 28400&lt;/code&gt;) to make it harder for them to find the right door to knock on - just remember what port you set! The other thing to look out for is &lt;code class="code_span"&gt;AllowUsers deploy&lt;/code&gt;. Make sure your deploy user is listed otherwise you won't get in!&lt;/p&gt;

&lt;p&gt;Ok, so lets test that this all works. &lt;code class="code_span"&gt;/etc/init.d/ssh reload&lt;/code&gt; will reload SSH with your new settings. Open a new terminal window and try to open a second connection to your server with &lt;code class="code_span"&gt;ssh -p 28400 deploy@123.45.67.890&lt;/code&gt; where &lt;code class="code_span"&gt;-p 28400&lt;/code&gt; specifies the port we told the server to accept connections on. If this works, then we can move on. If not, use your original connection to re-edit your &lt;code class="code_span"&gt;sshd_config&lt;/code&gt; and see where you went wrong.&lt;/p&gt;

&lt;p&gt;Everything running fine? Good. That's the groundwork done. Have a breather, you deserve it!&lt;/p&gt;

&lt;h3&gt;Right. Enough rest. &lt;a href="http://uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartII"&gt;On to Part II&lt;/a&gt;!&lt;/h3&gt;
</body>
    <created-at type="datetime">2008-12-28T16:57:31Z</created-at>
    <guid>http://uhhuhyeah.com/distractions/HowtosetupyourserverforRailsandPassengerPartI</guid>
    <id type="integer">27</id>
    <status>complete</status>
    <title>How to set up your server for Rails and Passenger - Part I</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2008-12-31T03:34:12Z</updated-at>
    <url>HowtosetupyourserverforRailsandPassengerPartI</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>This past weekend I rolled out an iPhone optimised version of &lt;a href="http://www.getmuffin.com"&gt;Muffin&lt;/a&gt;. Muffin on the iPhone was useable before but it was always a bit fiddley and it didn't fit on the screen very gracefully. My main goal was to simplify and trim down the UI for iPhone users. I thought that it would be better if I designed a better way to do 80% of what Muffin does rather than try to squeeze an entire desktop UI into a 320px by 480px screen.&lt;!--more--&gt; But of course it isn't really 320px by 480px is it! In the iPhone's Safari you've got the status bar at the top (time, wireless strength, battery icon etc) which is 20px high and the button bar at the bottom (Back, Forward etc) which is 44px high. So that leaves the true visible area at 320px by 356px. Of course I had photoshoped a few mockups at 320px by 480px before I remembered that! These measurements came from Apple's "Safari Web Content Guide for iPhone OS" which has a ton of useful pointers and information about creating content for the iPhone.&lt;br/&gt;(&lt;a href="https://developer.apple.com/webapps/docs/documentation/AppleApplications/Reference/SafariWebContent/Introduction/chapter_1_section_1.html#//apple_ref/doc/uid/TP40002079-SW1"&gt;Link&lt;/a&gt;. &lt;a href="http://developer.apple.com/products/membership.html"&gt;Apple Developer Connection membership&lt;/a&gt; is required, but the Online membership is free.)
&lt;p&gt;&amp;nbsp;&lt;/p&gt;
&lt;p&gt;I started by looking at Muffin and deciding what bits were not &lt;em&gt;essential&lt;/em&gt; to an iPhone user and what bits could be abridged in order to reduce "clutter" and increase the amount of free space I could control. I decided that for any non-essential features or functions I would allow the user to use the desktop UI. I didn't want to shoehorn the whole app into a paired down UI and didn't feel that I needed to try.&lt;/p&gt;

&lt;p&gt;A couple of the changes I made (in regards to the HTML that's rendered) were removing the separate "Edit" and "Remove" buttons and made the item itself the edit button and moved the "Remove" button into the edit action. I did the same in the Bills screen but instead of "Add to my spending" button I changed it to a simple "+" and to help avoid any confusion I added a javascript confirm "Add to spending?" before calling that method.&lt;/p&gt;

&lt;h3&gt;How it's done&lt;/h3&gt;
&lt;p&gt;Rails, as of 2.1 (I think), allows you to specify your own (even arbitrary) MIME types and makes it ridiculously easy to use them!&lt;/p&gt;
&lt;p&gt;Go to &lt;span class="code_span"&gt;config/initializers&lt;/span&gt; and open &lt;span class="code_span"&gt;mime_types.rb&lt;/span&gt; and there just so happens to be one already made for iPhone that you can uncomment! &lt;span class="code_span"&gt;Mime::Type.register_alias "text/html", :iphone&lt;/span&gt; will correspond to the iPhone's User Agent string of "iphone". Now apparently (according to that same Apple document listed above) the iPod Touch has a User Agent string of "ipod" but in my own limited tests faking the User Agent of my browser (&lt;a href="http://cruzapp.com/"&gt;Cruz&lt;/a&gt;) Rails responds to "ipod" just as it does "iphone" but I haven't looked into this thoroughly so use at your own risk!&lt;/p&gt;

&lt;p&gt;Now the whole point of registering a new MIME type like this is that when someone with that "iphone" User Agent requests a page we can add to our &lt;span class="code_span"&gt;repsond_to&lt;/span&gt; block &lt;span class="code_span"&gt;format.iphone&lt;/span&gt; (just like you would &lt;span class="code_span"&gt;format.html&lt;/span&gt; or &lt;span class="code_span"&gt;format.xml&lt;/span&gt;) and if you have a corresponding view called &lt;span class="code_span"&gt;index.iphone.erb&lt;/span&gt; (just like you would have &lt;span class="code_span"&gt;index.html.erb&lt;/span&gt;) your app will render something different for an iPhone user as it would just with a regular HTML or XML request.&lt;/p&gt;
	
&lt;p&gt;You can then take that opportunity (as I did) to include a different CSS file in that &lt;span class="code_span"&gt;index.iphone.erb&lt;/span&gt; file and have complete freedom designing the iPhone page without in anyway effecting what the app renders to regular HTML requests.&lt;/p&gt;

&lt;h3&gt;Two possible gotchas.&lt;/h3&gt;
&lt;p&gt;Gotcha one. Remember you'll need to add the &lt;span class="code_span"&gt;format.iphone&lt;/span&gt; to &lt;em&gt;each&lt;/em&gt; &lt;span class="code_span"&gt;repsond_to&lt;/span&gt; block in &lt;em&gt;each&lt;/em&gt; action of &lt;em&gt;each&lt;/em&gt; controller in which you want to render something different for the iPhone.&lt;/p&gt;
&lt;p&gt;Gotcha two. It will still use that controller's default layout so you'll want to either make a new layout (eg &lt;span class="code_span"&gt;views/layouts/application.iphone.erb&lt;/span&gt;) or tell Rails not to issue the layout at all by putting &lt;span class="code_span"&gt;render :layout =&gt; false&lt;/span&gt; inside of a block &lt;em&gt;inside&lt;/em&gt; of the &lt;span class="code_span"&gt;respond_to&lt;/span&gt; block.
Like this...
&lt;code&gt;respond_to do |format| 
	format.html
	format.iphone do
		render :layout =&gt; false
	end
end
&lt;/code&gt;
(Hat tip to &lt;a href="http://www.slashdotdash.net/articles/2007/12/04/iphone-on-rails-creating-an-iphone-optimised-version-of-your-rails-site-using-iui-and-rails-2"&gt;Slash Dot Slash&lt;/a&gt; for that.)&lt;/p&gt;

&lt;p&gt;To make this work with iPhone users who want to use the original desktop UI (and there's cleaner way of doing this I'm sure, but it hasn't come to mind yet) I enclosed the &lt;span class="code_span"&gt;format.iphone&lt;/span&gt; line (in the &lt;span class="code_span"&gt;respond_to&lt;/span&gt; block) in a simple &lt;span class="code_span"&gt;if&lt;/span&gt; statement and used a session variable to set if this &lt;span class="code_span"&gt;format.iphone&lt;/span&gt; is called or skipped. If it's skipped the &lt;span class="code_span"&gt;format.html&lt;/span&gt; is called instead.&lt;/p&gt;

&lt;p&gt;And that was it really. Rails makes this kind of thing easy - once you know how it's done!&lt;/p&gt;

&lt;p&gt;And one quick tip to close on. If you're designing an icon solely for the iPhone, remember that the iPhone has an effective resolution of 160ppi (which has a lot to do with why everything on the iPhone looks to great, even at small scale). Most people (well me at least) tend to design for websites at 72ppi so maybe try it at 160ppi and see if it's worth it for your project.&lt;/p&gt;

&lt;p&gt;And another quick tip. If you're on Mac, &lt;a href="http://cruzapp.com/"&gt;Cruz&lt;/a&gt; is a free browser that allows you to use different User Agents in two clicks which made this whole process a heck of a lot easier for me! &lt;a href="http://cruzapp.com/"&gt;Check out Cruz at cruzapp.com&lt;/a&gt;.&lt;/p&gt;

&lt;p&gt;And just one more tip since I'm in the mood for giving free advice. I was using &lt;a href="http://marketcircle.com/iphoney/"&gt;iPhoney&lt;/a&gt; to simulate how my design would render on the iPhone but I'm not convinced it's 100% acurate. So what I did, since I was obviously working on my local machine and your iPhone can't load &lt;span class="code_span"&gt;http://localhost:3000&lt;/span&gt; if the localhost is your Mac not the phone, was I uploaded the CSS to a test domain online. I then took the rendered html from my app (view source, copy and paste) and uploaded a static .html file and loaded that in my real iPhone. Extremely useful when trying to gauge the right space to leave between links so users don't struggle to tap only the link they want, not the three other links next to it!&lt;/p&gt;

&lt;h3&gt;Was it worth it?&lt;/h3&gt;
&lt;p&gt;Designing for the iPhone was a lot of fun. The size limitations were extremely liberating for me! Designing a website that you know for sure the browser window size was enough in itself to get me giddy! Plus I love my iPhone but some things are just a thousand times easier to do on your laptop when you get home. I love using Muffin, but sometimes it felt a bit awkward to use on my iPhone. A very happy to say that's all a distant memory now!&lt;/p&gt;

&lt;h3&gt;Some before and after pictures&lt;/h3&gt;
&lt;p&gt;I've uploaded some screenshots to &lt;a href="http://www.flickr.com/photos/uhhuhyeah/sets/72157609243078577/"&gt;flickr&lt;/a&gt; - &lt;a href="http://www.flickr.com/photos/uhhuhyeah/sets/72157609243078577/"&gt;take a looksee here&lt;/a&gt; of the UI in normal mode and the UI in iPhone mode.&lt;/p&gt;
&lt;img src="http://farm4.static.flickr.com/3003/3035930951_4eaec37693.jpg?v=0" alt="Muffin on the iPhone" /&gt;

</body>
    <created-at type="datetime">2008-11-17T01:24:47Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/DevelopingRailsapplicationsfortheiPhone</guid>
    <id type="integer">7</id>
    <status>complete</status>
    <title>Developing Rails applications for the iPhone</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2008-11-17T01:41:04Z</updated-at>
    <url>DevelopingRailsapplicationsfortheiPhone</url>
  </distraction>
  <distraction>
    <author>David</author>
    <body>This weekend we quietly launched &lt;a href="http://www.duethisweek.com"&gt;Due This Week dot com&lt;/a&gt;. &lt;a href="http://www.duethisweek.com"&gt;Due This Week&lt;/a&gt; is a nifty little (and not to mention free) web app that sends you reminders by email of upcoming bills&lt;!--more--&gt;.
&lt;br/&gt;&lt;br/&gt;
I'm something of a minimalist so I hated the idea of filling my iCal with my bill's due dates. I'd leave myself sticky notes about the place, but they usually disappear before they remind me of what I needed to pay and when. When I need to make notes for myself I usually send them in an email to myself seeing as I read my email everyday, unlike my calendar or the post-it note stuck to the bottom of my shoe. 
&lt;br/&gt;&lt;br/&gt;
The idea of &lt;a href="http://www.duethisweek.com"&gt;Due This Week&lt;/a&gt; was to automate that completely as well as being able to get the reminders early enough to act on them.
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://www.duethisweek.com"&gt;Due This Week&lt;/a&gt; sends you a customised email a set number of days before the bill is due (1, 2, 3, 5, 7 or 10 days before) reminding you that your bill "XYZ" is due in 3 days (on the 12th).
&lt;br/&gt;&lt;br/&gt;
One thing that made this project a little different to work on is that I didn't want people to have to sign-up or log-in to create reminders but of course I wanted some privacy and protection in place. When you create a new reminder, whether it's your 1st or 101st you just give it the email address and details of the reminder. The catch is that it won't send you the reminder unless you activate it and you can only activate it by clicking on a unique link we send to your email address. 
&lt;br/&gt;&lt;br/&gt;
If it's the first reminder you've created we'll also setup an account for you so that you can edit or delete your reminders. But you still won't need to log-in to create a 2nd, 3rd, 4th (and so on...) reminder because we have the "activation link" protection in place.
&lt;br/&gt;&lt;br/&gt;
This was a fun project to work on, and now it's done I hope to never be late on that blasted credit card bill again! &lt;a href="http://www.duethisweek.com"&gt;Due This Week&lt;/a&gt; is free and &lt;em&gt;super&lt;/em&gt; easy to use, give it a try and never miss a due date again!
&lt;br/&gt;&lt;br/&gt;
&lt;a href="http://www.duethisweek.com"&gt;www.duethisweek.com&lt;/a&gt;</body>
    <created-at type="datetime">2008-11-11T04:31:02Z</created-at>
    <guid>http://www.uhhuhyeah.com/distractions/DueThisWeek</guid>
    <id type="integer">4</id>
    <status>complete</status>
    <title>Due This Week - Our Newest Web App</title>
    <tweet-number nil="true"></tweet-number>
    <updated-at type="datetime">2009-08-08T22:57:12Z</updated-at>
    <url>DueThisWeek</url>
  </distraction>
</distractions>
