<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/rss2full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><rss xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" version="2.0">
  <channel>
    <title>Garbage Burrito! - Latest Blog Entries</title>
    <description>Garbage Burrito! - Latest Blog Entries</description>
    <link>http://garbageburrito.com/blog</link>
    <language>en-us</language>
    <atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="self" type="application/rss+xml" href="http://feeds.feedburner.com/garbageburrito-blog" /><feedburner:info uri="garbageburrito-blog" /><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com/" /><item>
      <title>Custom Editor Stylesheet for YUI RTE</title>
      <description>&lt;img  alt="" style="margin: 3px;" src="http://garbageburrito.com/media/AA/AA/ben/images/2908321/editor-css.png" align="right" /&gt;One of the first things I wanted to get working with YUI's Rich Text Editor was to make the editor area styled appropriately.&amp;nbsp; There is an example out there that basically waits for the editor to finish loading and then dynamically adds a link tag to the head of the iframe.&amp;nbsp; It works, but there's a moment where you can see the un-styled content then it switches.&amp;nbsp; &lt;br /&gt;&lt;br /&gt;Then I found that you can set the initial HTML that's loaded into the iframe, so I figured why not just load it there?&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;var html = "&amp;lt;html&amp;gt;\n&amp;lt;head&amp;gt;\n&amp;lt;title&amp;gt;{TITLE}&amp;lt;/title&amp;gt;\n&amp;lt;meta http-equiv=\"Content-Type\" content=\"text/html; charset=UTF-8\" /&amp;gt;\n" +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;base href=\"http://" + document.domain + "/\"&amp;gt;\n" +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;style&amp;gt;\n{CSS}\n&amp;lt;/style&amp;gt;\n" +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;style&amp;gt;\n{HIDDEN_CSS}\n&amp;lt;/style&amp;gt;\n" + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;style&amp;gt;\n {EXTRA_CSS}\n&amp;lt;/style&amp;gt;\n" +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;link rel=\"stylesheet\" type=\"text/css\" href=\"/assets/editor_css\"&amp;gt;\n" +&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;/head&amp;gt;\n" + &lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; "&amp;lt;body onload=\"document.body._rteLoaded = true;\"&amp;gt;\n{CONTENT}\n&amp;lt;/body&amp;gt;\n&amp;lt;/html&amp;gt;\n";&lt;br /&gt;&lt;br /&gt;&lt;/pre&gt;&lt;pre&gt;editor = new YAHOO.widget.Editor(container, {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; animate: true,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; collapse: false,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; markup: 'xhtml',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; css: '',&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; html: html,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; toolbar: {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; buttons: button_config&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;});&lt;br /&gt;&lt;/pre&gt;Working great so far.&amp;nbsp; &lt;br /&gt;&lt;div firebugversion="1.5.4" style="display: none;" id="_firebugConsole"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=q5B_WQAsv2E:lR8uDGvmfE4:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=q5B_WQAsv2E:lR8uDGvmfE4:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=q5B_WQAsv2E:lR8uDGvmfE4:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=q5B_WQAsv2E:lR8uDGvmfE4:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=q5B_WQAsv2E:lR8uDGvmfE4:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=q5B_WQAsv2E:lR8uDGvmfE4:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=q5B_WQAsv2E:lR8uDGvmfE4:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/q5B_WQAsv2E" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 07 Jun 2010 09:11:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/q5B_WQAsv2E/custom-editor-stylesheet-for-yui-rte</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/730571/custom-editor-stylesheet-for-yui-rte</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/730571/custom-editor-stylesheet-for-yui-rte</feedburner:origLink></item>
    <item>
      <title>Bitchin: Easy Key/Value Fields for Rails Using Bit Fields or Hashes</title>
      <description>Document databases are definitely hot right now, and for good reason.&amp;nbsp; I've thought relational databases were wasted on most web apps for a long time and I'm seriously considering switching &lt;a href="http://doodlekit.com"&gt;Doodlekit &lt;/a&gt;to something like MongoDB.&lt;br /&gt;&lt;br /&gt;In the meantime (ie. while I get my ass caught up) I wrote a simple plugin to make it super easy to add properties to your ActiveRecord models without needing table columns for all of them. &lt;br /&gt;&lt;br /&gt;Nothing earth-shattering, just a cool little plugin I wanted to share.&lt;br /&gt;&lt;br /&gt;&lt;strong&gt;I call it &lt;a href="http://github.com/bgkittrell/bitchin"&gt;Bitchin&lt;/a&gt;.&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;There are two parts to it, &lt;strong&gt;Bitchin &lt;/strong&gt;and &lt;strong&gt;Hashed&lt;/strong&gt;.&amp;nbsp; The only difference is that &lt;strong&gt;Bitchin&lt;/strong&gt; uses a Bit Field so it can only store boolean fields which means it's much faster.&amp;nbsp; As long as you have an Integer called bit_flag in your table you just need to do this...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;class User &amp;lt; ActiveRecord::Base
 &lt;br /&gt;&amp;nbsp; bitchin :active, :banned, :stupid&lt;/code&gt;&lt;br /&gt;&lt;/pre&gt;&lt;br /&gt;And the accessors are automatically created for you...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;&lt;code&gt;user.stupid = true
&lt;br /&gt;user.stupid? #=&amp;gt; true
&lt;br /&gt;user.stupid #=&amp;gt; true
&lt;/code&gt;&lt;/pre&gt;&lt;strong&gt;Hashed&lt;/strong&gt; works the same way but it relies on ActiveRecord's built-in hash serialization so you can basically store any scalar value.&lt;br /&gt;&lt;br /&gt;More about configuration options and how to use &lt;a href="http://github.com/bgkittrell/bitchin"&gt;in the README&lt;/a&gt;.&lt;br /&gt;&lt;br /&gt;This plugin is under the Do Whatever The Fuck You Want With It License (WTFYWL)&lt;br /&gt;&lt;br /&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=zRXllNqdRNA:nK9O4edbr08:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=zRXllNqdRNA:nK9O4edbr08:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=zRXllNqdRNA:nK9O4edbr08:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=zRXllNqdRNA:nK9O4edbr08:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=zRXllNqdRNA:nK9O4edbr08:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=zRXllNqdRNA:nK9O4edbr08:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=zRXllNqdRNA:nK9O4edbr08:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/zRXllNqdRNA" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 05 Jun 2010 23:38:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/zRXllNqdRNA/bitchin-easy-keyvalue-fields-for-rails-using-bit-fields-or-hashes</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/727781/bitchin-easy-keyvalue-fields-for-rails-using-bit-fields-or-hashes</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/727781/bitchin-easy-keyvalue-fields-for-rails-using-bit-fields-or-hashes</feedburner:origLink></item>
    <item>
      <title>YUI Editor Spell Checker with Rails</title>
      <description>Dav Glass has a &lt;a href="http://blog.davglass.com/files/yui/editor42/"&gt;great spell checker example&lt;/a&gt; on his blog, and it's pretty easy to get it working with Ruby on Rails and Aspell.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;Rails&lt;br /&gt;&lt;/h3&gt;First you'll need to &lt;a href="http://blog.evanweaver.com/files/doc/fauna/raspell/files/README.html"&gt;install Raspell and it's dependencies&lt;/a&gt;. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;Next you'll need an action to call this.&amp;nbsp; I already had an Editor controller for other stuff like image browsing, so I just added this action.&lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;def spellcheck&lt;br /&gt;&amp;nbsp; spell = Aspell.new&lt;br /&gt;&amp;nbsp; spell.set_option("mode", "html")&lt;br /&gt;&amp;nbsp; words = spell.list_misspelled([params[:text]])&lt;br /&gt;&lt;br /&gt;&amp;nbsp; checked = { :check =&amp;gt; :spelling,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; :data =&amp;gt; words.map { |word|&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :word =&amp;gt; word,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; :suggestions =&amp;gt; spell.suggest(word)&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; }&lt;br /&gt;&amp;nbsp; render :json =&amp;gt; checked.to_json&lt;br /&gt;end
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;Fairly straightforward.&amp;nbsp; It looks for misspelled words and returns a JSON object with the results.&amp;nbsp; The set_option("mode", "html") is important because it makes Aspell ignore text that's part of an HTML tag.&lt;br /&gt;&lt;br /&gt;&lt;h3&gt;JavaScript&lt;/h3&gt;I modified Dav's script slightly, you can &lt;a href="/media/AA/AA/ben/downloads/65071/spellcheck.js"&gt;grab my version here&lt;/a&gt;.&amp;nbsp; There are three main differences.&amp;nbsp; First I made the script a function of the Editor object, so that it could be initialized on command.&amp;nbsp; I'll show how to do that later.&lt;br /&gt;&lt;br /&gt;Then I changed the Ajax request to POST the HTML back to the action for checking.&lt;br /&gt;&lt;br /&gt;
&lt;pre&gt;this._conn = YAHOO.util.Connect.asyncRequest('POST', '/editor/spellcheck', {&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; success: this._checkSpelling,&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; failure: function() {},&lt;br /&gt;&amp;nbsp;&amp;nbsp;&amp;nbsp; scope: this&lt;br /&gt;}, 'text=' + escape(this.getEditorHTML())); 
&lt;/pre&gt;
&lt;br /&gt;&lt;br /&gt;Finally I changed the replacement regular expression to ingore text inside HTML tags and to look for word boundaries. &amp;nbsp;&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;html = html.replace(new RegExp('\\b' + data.data[i].word + '(?![^&amp;lt;]*&amp;gt;)\\b', 'g'), '&amp;lt;span class="yui-spellcheck"&amp;gt;' + data.data[i].word + '&amp;lt;/span&amp;gt;');&lt;/pre&gt;&lt;br /&gt;So to get the Javascript side working just copy my script into a .js file and load that in the HTML.&amp;nbsp; Some time after the editor is initialized call...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;editor.initSpellChecker();&lt;/pre&gt;&lt;br /&gt;Make sure to add a button...&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;{ type: 'push', label: 'Check Spelling', value: 'spellcheck' }&lt;/pre&gt;&amp;nbsp;&lt;br /&gt;... and add the Highlight CSS to your main editor config ....&lt;br /&gt;&lt;br /&gt;&lt;pre&gt;extracss: '.yui-spellcheck { background-color: yellow; }'&lt;/pre&gt;&amp;nbsp;&lt;div firebugversion="1.5.4" style="display: none;" id="_firebugConsole"&gt;&lt;/div&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=PKnmGL5emCw:WHF1cr5Szyk:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=PKnmGL5emCw:WHF1cr5Szyk:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=PKnmGL5emCw:WHF1cr5Szyk:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=PKnmGL5emCw:WHF1cr5Szyk:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=PKnmGL5emCw:WHF1cr5Szyk:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=PKnmGL5emCw:WHF1cr5Szyk:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=PKnmGL5emCw:WHF1cr5Szyk:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/PKnmGL5emCw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 01 Jun 2010 12:34:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/PKnmGL5emCw/yui-editor-spell-checker-with-rails</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/718091/yui-editor-spell-checker-with-rails</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/718091/yui-editor-spell-checker-with-rails</feedburner:origLink></item>
    <item>
      <title>Moving Towards a More Segmented Internet</title>
      <description>&lt;p&gt;I've been feeling a lot of anxiety about the Web recently and I just figured out why. The iPad, Facebook and the aging platform that is web development are all pointing to big changes for the Internet. Read on for my semi-coherent ramblings.&lt;/p&gt;

&lt;p&gt;The iPad has been hugely successful in just a few weeks. I'm holding out for a 3g but I knew from the keynote that it is a "Magical" device. However to me as a web developer the iPad, iPhone and the App Store represent a shift away from technologies I've been specializing in for over a decade. Yes it still has a browser and you can make awesome web apps for the iPhone platform, but in reality the native apps are so much better. This presents a dilemma for me. The notion of developing a app that works on only one platform seems so limiting and constraining to me, but it's so hot right now.&lt;/p&gt;

&lt;p&gt;Last night my wife and I were chatting. I was telling her about the Facebook hubub and how I think everyone is blowing it out of proportion. People like Jeffery Zeldman are saying "But most of us, if we think about it, have seen Big Things like this come and go on the web". That's how I want to feel, but as I was talking I could tell that I really felt like this time is different. The fact is that that Facebook has almost 500 million users. There are only 230 million Internet users in the US, and &lt;a href="http://www.google.com/publicdata?ds=wb-wdi&amp;met=it_net_user&amp;idim=country:USA&amp;dl=en&amp;hl=en&amp;q=Internet+Users#met=it_net_user&amp;idim=country:USA&amp;tdim=true"&gt;1.6 billion on the planet&lt;/a&gt;. That's 30% of the Net. You can keep saying "I've seen this come and go" but that at some point something is going to stick.&lt;/p&gt;

&lt;p&gt;If it does stick it represents a fundamental change in how we interact with the Web. If everyone thinks they need a Facebook account to get around on the Web that means you do too. As a business you need to make sure you're Facebook compatible, just like we bend over for Google Page Rank. Google has been a discovery engine to an existing web of sites. Facebook wants to be the web. This sort of corporate controlled web, however you feel about it, will be rejected by large amounts of Internet users. It already has been.&lt;/p&gt;

&lt;p&gt;This left me thinking what's next? What comes after the Web? Until now I couldn't imagine the Web not being the go-to platform for information sharing, communication and entertainment. &lt;/p&gt;

&lt;p&gt;When I learned HTML I read HTML4, A Visual Quickstart Guide from the Peachpit Press. HTML4, 13 years ago. HTML5 is only just now looking like we may get to use it sometime soon. IE9 is the big question, and it's still being developed. In other words the fundamental tools we use as web developers are stagnant. Every once in a while we find a gem that's supported by all like Ajax, dragndrop, etc. By and large I feel like the solutions we're coming up with to take it to the next level, while extremely clever, are hackish. We now have 5 browsers to contend with, Firefox, Safari, IE, Chrome and Opera. I can imagine how much of a relief it must be to go to a single platform like iPhone or Android.&lt;/p&gt;

&lt;p&gt;All of these things, the Facebook Web, the success of App Stores and the stagnation of web development represent a split in the way people will use the Internet in the future. Computing in general is moving away from a single desktop sitting under your desk to a multitude of devices that have their own specific purpose. Cars are getting Net connections, appliances have WiFi, hell my treadmill has an Ethernet port. As beautiful and elegant as the Web Browser as a single platform is, it's holding us back. &lt;/p&gt;

&lt;p&gt;As this story unfolds more segments will be created. More devices, more platforms, more markets. This is a good thing. Niche markets will thrive and individuals will be able to create profitable businesses. But it does mean that I'm probably going to have to learn Objective-C.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aJlZRFM3mdQ:YiYpstNYlUc:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aJlZRFM3mdQ:YiYpstNYlUc:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=aJlZRFM3mdQ:YiYpstNYlUc:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aJlZRFM3mdQ:YiYpstNYlUc:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=aJlZRFM3mdQ:YiYpstNYlUc:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aJlZRFM3mdQ:YiYpstNYlUc:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aJlZRFM3mdQ:YiYpstNYlUc:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/aJlZRFM3mdQ" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 27 Apr 2010 07:46:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/aJlZRFM3mdQ/moving-towards-a-more-segmented-internet</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/645201/moving-towards-a-more-segmented-internet</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/645201/moving-towards-a-more-segmented-internet</feedburner:origLink></item>
    <item>
      <title>Custom Captcha System Using Static Images</title>
      <description>&lt;p&gt;For awhile I had a Javascript bot blocker that did a good job keeping spammers from flinging crap at our blogs, but apparently they got smarter. Go Figure. Even though I hate them, I figured the best option would be to add a Captcha system. I looked into systems like Snook and Askimet and really didn't think they were right for our customers at this point. At least not for a first line of defense.&lt;/p&gt;&lt;p&gt;Before you get much further, this is not a plugin, and I'm not even going to provide full examples. One of the chief benefits of a custom system is the obscurity. However, I do think the general approach is sound and worth sharing. IMO, creating a captcha plugin is kind of like selling every lock with the same key.&lt;/p&gt;&lt;p&gt;I looked at hosted solutions like Re-Captcha, but didn't want to be reliant on a third party. I also looked at the Simple Captcha Rails plugin. The problem I had with it is that it generated the images on the fly, which seemed like it could turn into a resource nightmare with all the requests we get.&lt;/p&gt;&lt;p&gt;I wanted to create a system that used static pre-generated images so it would be super fast.&lt;/p&gt;&lt;h2 class="header2"&gt;The Gist of It&lt;/h2&gt;&lt;p&gt;I generated a set of images using ImageMagick. Here's an example of the code I used to do that...&lt;/p&gt;&lt;pre&gt;
words = %w{ sack river space }&lt;br /&gt;for word in words&lt;br /&gt;    `convert xc:#FFF -resize 110x35! -frame '1x1' -family Helvetica -pointsize 13 -gravity &amp;quot;Center&amp;quot; -draw &amp;quot;text 0,0 '#{word}'&amp;quot; #{word}.jpg`&lt;br /&gt;end
&lt;/pre&gt;&lt;p&gt;Notice the text is the name of the file. I put those images in a directory in my app. Then I created a table with a key, filename, and created date.&lt;/p&gt;&lt;p&gt;Here's some psuedo code.&lt;/p&gt;&lt;pre&gt;
image = getRandomCaptchaFile()

captcha = findCaptcha(filename = image, createdDate &amp;gt; expireInterval)
&lt;br /&gt;if captcha == nil&lt;br /&gt;    captcha = new Captcha&lt;br /&gt;    captcha.filename = image&lt;br /&gt;    captcha.key = getRandomKey()&lt;br /&gt;    captcha.created_date = now()&lt;br /&gt;    captcha.save&lt;br /&gt;end

deleteAllCaptchas(created_date &amp;lt; 1.day.ago)

return captcha
&lt;/pre&gt;&lt;p&gt;This is the crux of the system. Basically I get a random image file, check to see if a captcha record has been created within a set interval, if not create a new one with a new key (such as a GUID), and delete all the old captchas. For doodlekit I also have some code to take into account the multi-site environment.&lt;/p&gt;&lt;p&gt;Once you have this you can create a controller or action to accept the random key. This will look up the image from the captcha table and return the image data. The random key breaks the link between the URL and the actual image.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=t99yn2q6eQw:IvMFEIhb4to:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=t99yn2q6eQw:IvMFEIhb4to:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=t99yn2q6eQw:IvMFEIhb4to:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=t99yn2q6eQw:IvMFEIhb4to:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=t99yn2q6eQw:IvMFEIhb4to:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=t99yn2q6eQw:IvMFEIhb4to:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=t99yn2q6eQw:IvMFEIhb4to:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/t99yn2q6eQw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 19 Jan 2010 22:05:00 -0600</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/t99yn2q6eQw/custom-captcha-system-using-static-images</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/449991/custom-captcha-system-using-static-images</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/449991/custom-captcha-system-using-static-images</feedburner:origLink></item>
    <item>
      <title>Adding Pagination to Twitter API Calls with will_paginate</title>
      <description>&lt;p&gt;First of all, if you're not using &lt;a href="http://wiki.github.com/mislav/will_paginate"&gt;will_paginate&lt;/a&gt; for all of your pagination then you should be. It's well known that the built in pagination in Rails is slow and clunky. &lt;a href="http://wiki.github.com/mislav/will_paginate"&gt;will_paginate&lt;/a&gt; will easily replace your ActiveRecord pagination, but it can paginate just about anything else.&lt;/p&gt;&lt;p&gt;&lt;a href="http://twitter.rubyforge.org/"&gt;John Nunemaker's Twitter Plugin&lt;/a&gt; makes short work of hooking your app up to the Twitter API. With a few strokes of code you can be pulling statuses down like mad. Now if you want to list a bunch of statuses you'll likely want to have some kind of pagination.&lt;/p&gt;&lt;p&gt;First there's the standard Auth&lt;/p&gt;&lt;pre&gt;
httpauth = Twitter::HTTPAuth.new(username, password)&lt;br /&gt;client = Twitter::Base.new(httpauth)
&lt;/pre&gt;&lt;p&gt;Then setup some pagination defaults, and grab some tweets.&lt;/p&gt;&lt;pre&gt;
current_page = params[:page] || 1&lt;br /&gt;per_page = 100&lt;br /&gt;tweets = client.user_timeline(:count =&amp;gt; per_page, :page =&amp;gt; current_page)
&lt;/pre&gt;&lt;p&gt;Then just wrap the paginator around your collection and the deed is done.&lt;/p&gt;&lt;pre&gt;
if !tweets.empty?&lt;br /&gt;  @tweets = WillPaginate::Collection.create(current_page, per_page, tweets.first.user.statuses_count) do |pager|&lt;br /&gt;    pager.replace(tweets)&lt;br /&gt;  end&lt;br /&gt;end
&lt;/pre&gt;&lt;p&gt;Finally, insert the pagination links in the view.&lt;/p&gt;&lt;pre&gt;
&amp;lt;%= will_paginate @tweets %&amp;gt;
&lt;/pre&gt;&lt;p&gt;That's it. A marriage of two great plugins indeed.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=QVPPxP3hNUk:_HM0aCVPR-c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=QVPPxP3hNUk:_HM0aCVPR-c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=QVPPxP3hNUk:_HM0aCVPR-c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=QVPPxP3hNUk:_HM0aCVPR-c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=QVPPxP3hNUk:_HM0aCVPR-c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=QVPPxP3hNUk:_HM0aCVPR-c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=QVPPxP3hNUk:_HM0aCVPR-c:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/QVPPxP3hNUk" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 17 Sep 2009 21:54:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/QVPPxP3hNUk/adding-pagination-to-twitter-api-calls-with-will_paginate</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/261661/adding-pagination-to-twitter-api-calls-with-will_paginate</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/261661/adding-pagination-to-twitter-api-calls-with-will_paginate</feedburner:origLink></item>
    <item>
      <title>Lessons From Home Renovation - Nothing is That Complicated</title>
      <description>&lt;p&gt;&lt;img alt="Plumber or Serial Killer?  You decide." class="right" height="400" src="http://garbageburrito.com/media/AA/AA/ben/images/1021591/main/5299490-800x358.jpg" width="179" /&gt;When people find out I've been renovating my house for 7 years they always ask, &amp;quot;where did you learn how to do all that stuff?&amp;quot; &amp;#160;The truth is that I learned it all as I was doing it. &amp;#160;I've replaced copper and PVC plumbing, run gas lines, rebuilt door and window frames, installed kitchen cabinets, sinks and countertops, dry walled, floored, painted, electrified as well as many other things I had no idea how to do before we moved in. &amp;#160;It's not because I'm a super awesome dude, it's because I shed my fear of learning new things. &lt;/p&gt;&lt;p&gt;When you think about it, companies make products that are easy to use. &amp;#160;Just because you're a professional plumber doesn't mean you want to spend hours putting together an unnecessarily complex system. &amp;#160;&amp;#160;Sure there are things best left to the professionals. &amp;#160;I wasn't about to rent a backhoe and dig up my own sewer line, or get up on 30 foot scaffolding to hang siding.&lt;/p&gt;&lt;p&gt;I constantly think about this in my career. &amp;#160;Sometimes I avoid adding a new feature, or trying a new tool because I'm afraid that it will be too complicated or take too much time. &amp;#160;This reminds me of when XML was just a buzzword. &amp;#160;For a long time I just heard descriptions of it and I was so afraid that it was some crazy complex system that I would never understand. &amp;#160;Then when I actually saw what they were talking about I was like &amp;quot;That's it?!&amp;quot;.&lt;/p&gt;&lt;p&gt;Most things in this world are much more simple than they look from the outside. &amp;#160;If you just jump in, it's really not too bad.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=CqjRUJ3LWzA:PGNw0XF2kjM:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=CqjRUJ3LWzA:PGNw0XF2kjM:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=CqjRUJ3LWzA:PGNw0XF2kjM:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=CqjRUJ3LWzA:PGNw0XF2kjM:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=CqjRUJ3LWzA:PGNw0XF2kjM:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=CqjRUJ3LWzA:PGNw0XF2kjM:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=CqjRUJ3LWzA:PGNw0XF2kjM:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/CqjRUJ3LWzA" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 03 Sep 2009 10:44:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/CqjRUJ3LWzA/lessons-from-home-renovation-nothing-is-that-complicated</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/240451/lessons-from-home-renovation-nothing-is-that-complicated</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/240451/lessons-from-home-renovation-nothing-is-that-complicated</feedburner:origLink></item>
    <item>
      <title>Outsource Your E-Mail Notifications With MadMimi's Mailer API</title>
      <description>&lt;p&gt;I recently got the E-Mail Marketing itch. I realized we have a great email list that we haven't tapped into at all. The thing is I don't want to just blast the same email to everyone, I want the email to be semi-intelligent, ie. 2 days after someone signs up they get an email with helpful tips.&lt;/p&gt;&lt;p&gt;Enter &lt;a href="http://developer.madmimi.com/"&gt;Mad Mimi's new Mailer API&lt;/a&gt;. This is just brilliant IMO, exactly what I was looking for. Basically they have a simple API to send out one-off or "Transactional" emails through their system. What are the benefits?&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Create Beautiful E-Mails through their awesome promotion builder&lt;/li&gt;&lt;li&gt;Track Views, Clicks, Bounces, etc.&lt;/li&gt;&lt;li&gt;Automatically adds new E-Mails to your audience for other promotions&lt;/li&gt;&lt;li&gt;Ability to change your emails live, without deploying&lt;/li&gt;&lt;li&gt;Offload Mail Server resources to their systems&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Now when a customer signs up, or their credit card is declined or whatever, instead of getting dry ugly text they get a rich friendly looking email. Plus I can track what's happening and improve the emails as time goes by.&lt;/p&gt;&lt;p&gt;I can also create a system where I choose when to send other promotions based on the user's behavior. This sort of personalized response is the best way to get through with E-Mail Marketing these days.&lt;/p&gt;&lt;p&gt;It's not necessary to go into a full-tutorial here, simply because Mad Mimi's developer center covers it well, and it's not that complicated in the first place. But I will cover the basics.&lt;/p&gt;&lt;p&gt;First install the gem. Make sure you've added github to your list of gem repositories.&lt;/p&gt;&lt;pre&gt;$ gem sources -a http://gems.github.com (you only have to do this once)&lt;br /&gt;$ sudo gem install mad_mimi_mailer
&lt;/pre&gt;&lt;p&gt;I had a version conflict with ActiveSupport so I froze the gem, but that's up to you.&lt;/p&gt;&lt;p&gt;What they've done is extend ActionMailer, so changing your emails to Mad Mimi is stupid simple. Essentially you put in your api creds, change the base class and add mimi_ to the front of all the methods. You'll also need to specify the name of the promotion.&lt;/p&gt;&lt;pre&gt;MadMimiMailer.api_settings = {&lt;br /&gt; :username =&amp;gt; 'ben@doodlekit.com',&lt;br /&gt; :api_key =&amp;gt; 'XXXXXXXXXXXXXXXXXXXXXXXXXXXXXX'&lt;br /&gt;}

class BillerMailer &amp;lt; MadMimiMailer
def mimi_suspended(customer_site)&lt;br /&gt; settings = SystemSetting.find(:first)&lt;br /&gt; promotion "Account Suspended"&lt;br /&gt; @subject = 'Doodlekit Alert - Your Website Has Been Suspended'&lt;br /&gt; @body = {}&lt;br /&gt; @recipients = customer_site.email_address&lt;br /&gt; @from = settings.admin_email

 @body[:customer_name] = customer_site.full_name&lt;br /&gt; @body[:site_title] = customer_site.site_name&lt;br /&gt; @body[:site_url] = customer_site.url &lt;br /&gt;end
&lt;/pre&gt;&lt;p&gt;This mailer is using a promotion called "Account Suspended", so there must be a promotion with that name in my Mad Mimi account. The elements in the @body hash are mapped to variables in your Mad Mimi Promotion. :customer_name maps to {customer_name}.&lt;/p&gt;&lt;p&gt;Then just change your deliver call to include mimi_&lt;/p&gt;&lt;pre&gt;BillerMailer.deliver_mimi_suspended(customer_site)
&lt;/pre&gt;&lt;p&gt;That's it!&lt;/p&gt;&lt;p&gt;One quick helpful tip. If your having issues and would like to see what's going on between you and the API you can enable HTTP debugging by adding the following line in the post_request method in mad_mimi_mailer.rb.&lt;/p&gt;&lt;pre&gt;http.set_debug_output $stdout
&lt;/pre&gt;&lt;p&gt;Kind of Hackish, but good if you're in a bind.&lt;/p&gt;&lt;p&gt;I'm super happy about how this turned out, and plan to explore the other area's of &lt;a href="http://developer.madmimi.com/developer/api"&gt;Mad Mimi's API&lt;/a&gt;. And of course it's always great for sending out regular promotions to your email list.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=_KJkbjVVoGA:Mwb4oL_UkfI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=_KJkbjVVoGA:Mwb4oL_UkfI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=_KJkbjVVoGA:Mwb4oL_UkfI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=_KJkbjVVoGA:Mwb4oL_UkfI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=_KJkbjVVoGA:Mwb4oL_UkfI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=_KJkbjVVoGA:Mwb4oL_UkfI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=_KJkbjVVoGA:Mwb4oL_UkfI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/_KJkbjVVoGA" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 31 Aug 2009 08:36:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/_KJkbjVVoGA/outsource-your-email-notifications-with-madmimis-mailer-api</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/235921/outsource-your-email-notifications-with-madmimis-mailer-api</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/235921/outsource-your-email-notifications-with-madmimis-mailer-api</feedburner:origLink></item>
    <item>
      <title>Rails, Mysql and Snow Leopard Issues - Missing Ruby Headers</title>
      <description>&lt;p&gt;Tried starting my development environement after installing Snow Leopard and got this error about the MySql gem not being included with Rails anymore.&lt;/p&gt;&lt;pre&gt;
!!! The bundled mysql.rb driver has been removed from Rails 2.2. Please install the mysql gem and try again: gem install mysql.
&lt;/pre&gt;&lt;p&gt;Tried to install the gem and got this.&lt;/p&gt;&lt;pre&gt;
ERROR: Error installing mysql:&lt;br /&gt;   ERROR: Failed to build gem native extension.
&lt;br /&gt;/System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/bin/ruby extconf.rb install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config&lt;br /&gt;mkmf.rb can't find header files for ruby at /System/Library/Frameworks/Ruby.framework/Versions/1.8/usr/lib/ruby/ruby.h
&lt;/pre&gt;&lt;p&gt;Found a post that said to install the latest 64-bit MySql, got the same error. Found &lt;a href="http://groups.google.com/group/comp.lang.ruby/browse_thread/thread/c80246746b73989d/58ed8255599a3a15?lnk=raot"&gt;this thread&lt;/a&gt; that said to install XCode from the Snow Leopard disk and run this command and we're back in business.&lt;/p&gt;&lt;pre&gt;
sudo env ARCHFLAGS=&amp;quot;-arch x86_64&amp;quot; gem install mysql -- --with-mysql-config=/usr/local/mysql/bin/mysql_config
&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=5r_aYHtRPKE:rlWeuDk-RWY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=5r_aYHtRPKE:rlWeuDk-RWY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=5r_aYHtRPKE:rlWeuDk-RWY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=5r_aYHtRPKE:rlWeuDk-RWY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=5r_aYHtRPKE:rlWeuDk-RWY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=5r_aYHtRPKE:rlWeuDk-RWY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=5r_aYHtRPKE:rlWeuDk-RWY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/5r_aYHtRPKE" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 28 Aug 2009 23:04:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/5r_aYHtRPKE/rails-mysql-and-snow-leopard-issues-missing-ruby-headers</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/232001/rails-mysql-and-snow-leopard-issues-missing-ruby-headers</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/232001/rails-mysql-and-snow-leopard-issues-missing-ruby-headers</feedburner:origLink></item>
    <item>
      <title>Lessons From Home Renovation: The Right Tool</title>
      <description>&lt;p&gt;One of the earlier projects we did was replacing the old cast iron sewer stack. For those not familiar, this is a 4&amp;quot; diameter cast iron pipe. My Dad came up to help with this one. &lt;/p&gt;&lt;p&gt;The first question was, how are we going to cut through this stuff? After deciding a hacksaw wasn't going to work we went to the Home Depot rental department so see what we could find. We came looking for a sawzall, but thankfully the guy there asked what we needed it for. After we told him he said &amp;quot;No no, I have what you need&amp;quot;. He brought out what looked like a giant bicycle chain attached to a handle. He explained how you wrap the chain around the pipe, which had little sharp disks on it, and tightened it until the pipe snapped.&lt;/p&gt;&lt;p&gt;It worked beautifully. Aside from the pipe being heavy as crap, the job was super easy thanks to this tool. That's all the tool was made for, that one specific purpose.&lt;/p&gt;&lt;p&gt;That's when I realized how incredibly important it is to have the right tool for the right job. It can save you time, money, effort and most importantly sanity. Time and time again I've found ways to make projects easier just by looking for a better tool.&lt;/p&gt;&lt;p&gt;I've carried this over into my professional career as well. Java and Ruby both have their place in my toolbox, as well as many other tools I find make my job easier.&lt;/p&gt;&lt;p&gt;If you find yourself beating your head against the wall, take a step back and make sure you're using the right tool.&lt;br /&gt;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=xuxw10PSrOQ:PNZa3yrJR4Q:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=xuxw10PSrOQ:PNZa3yrJR4Q:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=xuxw10PSrOQ:PNZa3yrJR4Q:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=xuxw10PSrOQ:PNZa3yrJR4Q:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=xuxw10PSrOQ:PNZa3yrJR4Q:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=xuxw10PSrOQ:PNZa3yrJR4Q:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=xuxw10PSrOQ:PNZa3yrJR4Q:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/xuxw10PSrOQ" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 28 Aug 2009 16:43:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/xuxw10PSrOQ/lessons-from-home-renovation-the-right-tool</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/231251/lessons-from-home-renovation-the-right-tool</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/231251/lessons-from-home-renovation-the-right-tool</feedburner:origLink></item>
    <item>
      <title>New Doodlekit Billing System Upgrade Complete</title>
      <description>&lt;p&gt;Yesterday we pushed out the new Doodlekit Billing System that consolidated our user accounts. Before we had one user account for every website. Now a user account can have multiple websites. This allows them to use a single credit card for all their websites, or to use multiple cards to separate charges (if they had a business website and a personal website for example). Read more about Doodlekit's &lt;a href="http://doodlekit.com/blog/entry/220091/user-consolidation-project-complete" onclick="window.open(this.href);return false;" onkeypress="window.open(this.href);return false;"&gt;User Consolidation Project&lt;/a&gt; on our blog.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=KU8TCFJBVz0:9iWlFdCYPfY:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=KU8TCFJBVz0:9iWlFdCYPfY:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=KU8TCFJBVz0:9iWlFdCYPfY:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=KU8TCFJBVz0:9iWlFdCYPfY:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=KU8TCFJBVz0:9iWlFdCYPfY:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=KU8TCFJBVz0:9iWlFdCYPfY:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=KU8TCFJBVz0:9iWlFdCYPfY:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/KU8TCFJBVz0" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 25 Aug 2009 10:43:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/KU8TCFJBVz0/new-doodlekit-billing-system-upgrade-complete</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/224261/new-doodlekit-billing-system-upgrade-complete</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/224261/new-doodlekit-billing-system-upgrade-complete</feedburner:origLink></item>
    <item>
      <title>Google, Please Implement Plugins in Gmail Too...</title>
      <description>&lt;p&gt;Google Wave looks awesome. If you haven't seen the demo, &lt;a href="http://wave.google.com/"&gt;check it out&lt;/a&gt;, this is definitely the future of Internet communication. The operative word being Future. Most people that come across this blog may be ready, but the general public is not. This is to be expected of course.&lt;/p&gt;&lt;p&gt;When I was watching the demo and they showed the Google Search plugin, a &amp;quot;wave&amp;quot; of ideas hit me. I thought of all the things I could do, especially for Doodlekit. But the thing is all of these things could be helpful in GMail too.&lt;/p&gt;&lt;p&gt;The problem is that I don't expect that 90% of our customer base will know what Wave is for at least a year. This plugin functionality could be so powerful in GMail.&lt;/p&gt;&lt;p&gt;I'm excited about the possibilities with Wave, but I hope it doesn't draw attention away from the best email client on the Net.&lt;/p&gt;&lt;p&gt; &lt;span class="wrappedobject"&gt;
  &lt;script type="text/javascript"&gt;&lt;!--
  document.write(" \n\n &lt;object width=\"425\" height=\"344\"&gt;&lt;param name=\"movie\" value=\"http:\/\/www.youtube.com\/v\/v_UyVmITiYQ&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1\"&gt;&lt;\/param&gt;&lt;param name=\"allowFullScreen\" value=\"true\"&gt;&lt;\/param&gt;&lt;param name=\"allowScriptAccess\" value=\"always\"&gt;&lt;\/param&gt;&lt;embed src=\"http:\/\/www.youtube.com\/v\/v_UyVmITiYQ&amp;rel=0&amp;color1=0xb1b1b1&amp;color2=0xcfcfcf&amp;hl=en&amp;feature=player_embedded&amp;fs=1\" type=\"application\/x-shockwave-flash\" allowfullscreen=\"true\" allowScriptAccess=\"always\" width=\"425\" height=\"344\"&gt;&lt;\/embed&gt;&lt;\/object&gt; ");
  //--&gt;&lt;/script&gt;&lt;/span&gt; &lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=mJKumD2wxho:e2TTzY_LqWg:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=mJKumD2wxho:e2TTzY_LqWg:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=mJKumD2wxho:e2TTzY_LqWg:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=mJKumD2wxho:e2TTzY_LqWg:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=mJKumD2wxho:e2TTzY_LqWg:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=mJKumD2wxho:e2TTzY_LqWg:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=mJKumD2wxho:e2TTzY_LqWg:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/mJKumD2wxho" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 24 Aug 2009 12:45:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/mJKumD2wxho/google-please-implement-plugins-in-gmail-too</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/220271/google-please-implement-plugins-in-gmail-too</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/220271/google-please-implement-plugins-in-gmail-too</feedburner:origLink></item>
    <item>
      <title>Paypal Website Payments Pro on Rails - Take 2</title>
      <description>&lt;h2 class="header2"&gt;Problem&lt;/h2&gt;&lt;p&gt;We've been using Paypal's Website Payments Pro for a few years and the ROR::Paypal has been working just fine for our purposes, until I changed things up a bit. I wanted to make the signup more atomic in case of a failure but had trouble when I tried to use the DoCapture method. Looking at the code it actually says in the comments that they couldn't get it to work, awesome right?&lt;/p&gt;&lt;p&gt;First I tried out &lt;a href="http://www.activemerchant.org/"&gt;ActiveMerchant&lt;/a&gt;. It looked great and was super easy to implement. Unfortunately it did not work in my app for reasons that are too embarrassing to publicly admit.&lt;/p&gt;&lt;h2 class="header2"&gt;Solution&lt;/h2&gt;&lt;p&gt;After effin around for awhile I found an alternate solution. Apparently there's a &lt;a href="https://cms.paypal.com/us/cgi-bin/?cmd=_render-content&amp;amp;content_ID=developer/library_download_sdks"&gt;Paypal Ruby SDK&lt;/a&gt; that uses their NVP or Name Value Pair protocol. I didn't even know the used NVP until now. What a relief, SOAP is so crappy.&lt;/p&gt;&lt;p&gt;The best part is it's super easy to implement. The SDK download is a sample Rails app. To use it yourself all you need to do is copy the PayPalSDK plugin from the vendor directory and paypal.yml from config.&lt;/p&gt;&lt;p&gt;If your currently using a certificate you'll want to switch to a signature, another welcome change. The signature is just a string you pass to the web service, instead of a stupid cert file you have to load up. You can get the signature from the API Settings in your Paypal account. Once you have that info copy the API Username, Password and Signature into the paypal.yml file.&lt;/p&gt;&lt;p&gt;Then look at the controllers in the sample app for examples of how to call it. The basic gist is something like this.&lt;/p&gt;&lt;pre&gt;
require 'caller'
caller =  PayPalSDKCallers::Caller.new
transaction = caller.call(
  {&lt;br /&gt;    :method          =&amp;gt; 'DoDirectPayment',&lt;br /&gt;    :amt             =&amp;gt; total.to_s,&lt;br /&gt;    :currencycode    =&amp;gt; 'USD',&lt;br /&gt;    :paymentaction   =&amp;gt; 'Authorization',&lt;br /&gt;    :creditcardtype  =&amp;gt; card.type_code,&lt;br /&gt;    :acct            =&amp;gt; card.card_number,&lt;br /&gt;    :firstname       =&amp;gt; name[0],&lt;br /&gt;    :lastname        =&amp;gt; name[1],&lt;br /&gt;    :street          =&amp;gt; address.address1,&lt;br /&gt;    :city            =&amp;gt; address.city,&lt;br /&gt;    :state           =&amp;gt; address.state,&lt;br /&gt;    :zip             =&amp;gt; address.zipcode.to_s,&lt;br /&gt;    :countrycode     =&amp;gt; address.country,&lt;br /&gt;    :expdate         =&amp;gt; card.card_expiration.strftime(&amp;quot;%m%Y&amp;quot;),&lt;br /&gt;    :cvv2            =&amp;gt; TEST_MODE ? &amp;quot;000&amp;quot; : card.security_code&lt;br /&gt;  }&lt;br /&gt;)       &lt;br /&gt;if transaction.success?       &lt;br /&gt;  return transaction.response[&amp;quot;TRANSACTIONID&amp;quot;]&lt;br /&gt;else&lt;br /&gt;  raise PaymentException, transaction.response[&amp;quot;L_LONGMESSAGE0&amp;quot;]&lt;br /&gt;end
&lt;/pre&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;I really like this approach because it's a super thin layer that just does what it needs.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=8AhHegtOdqM:M1BeJrzJU8c:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=8AhHegtOdqM:M1BeJrzJU8c:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=8AhHegtOdqM:M1BeJrzJU8c:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=8AhHegtOdqM:M1BeJrzJU8c:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=8AhHegtOdqM:M1BeJrzJU8c:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=8AhHegtOdqM:M1BeJrzJU8c:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=8AhHegtOdqM:M1BeJrzJU8c:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/8AhHegtOdqM" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 18 Aug 2009 13:47:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/8AhHegtOdqM/paypal-website-payments-pro-on-rails-take-2</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/212901/paypal-website-payments-pro-on-rails-take-2</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/212901/paypal-website-payments-pro-on-rails-take-2</feedburner:origLink></item>
    <item>
      <title>Book Reviews: Permission Marketing &amp; Reality Check</title>
      <description>&lt;h2 class="header2"&gt;Permission Marketing - Seth Godin&lt;/h2&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/Permission-Marketing-Turning-Strangers-Customers/dp/0684856360"&gt;&lt;img alt="Permission Marketing" class="left" height="127" src="http://garbageburrito.com/media/AA/AA/ben/images/859131/main/images-1.jpg" width="93" /&gt;&lt;/a&gt;So much marketing today is wasted on trying to interrupt a consumer's busy day and shove something they don't need in their face. Of course we're all victims of name brands. We've all purchased one product over another because of some subconscious opinion formed by too many ads thrown our way. That works great for Coke and Nike, but it's not going to work for the small business trying to sell a product based on quality and good customer service.&lt;/p&gt;&lt;p&gt;Permission Marketing talks about how to establish a more personal relationship with your prospects and getting their permission before you start talking business. Seth talks about offering incentives over time to keep attention, gaining trust, and ultimately turning an stranger into a friend, and a friend into a customer. He also covers how to leverage existing customers by offering them more services to purchase.&lt;/p&gt;&lt;p&gt;Halfway into this quick read I had to grab some paper and start writing down ideas. These are things I can implement very easily and will turn into a solid increase in sales. Best of all they are not cheap tricks. This is real, down to earth marketing that you can feel good about.&lt;/p&gt;&lt;p&gt;Simply put, anyone that is interested in marketing what-so-ever should read this book.&lt;/p&gt;&lt;h2 class="header2"&gt;Reality Check - Guy Kawasaki&lt;/h2&gt;&lt;p&gt;&lt;a href="http://www.amazon.com/Reality-Check-Outsmarting-Outmanaging-Outmarketing/dp/1591842239"&gt;&lt;img alt="Reality Check" class="left" height="114" src="http://garbageburrito.com/media/AA/AA/ben/images/859161/main/images-2.jpg" width="76" /&gt;&lt;/a&gt;Honestly I was disappointed by this book. It's not that it wasn't well written or that it didn't have good information. In my opinion this book is meant for people that are starting at zero. More specifically people that want to move to the Valley, get funded and be the next Facebook. I didn't find any specific strategies or new ideas that would help somebody that's been in the trenches for a few years. It did however have a funny Foreward by Fake Steve Jobs.&lt;/p&gt;&lt;p&gt;Heath and I have worked hard for a long time to build Doodlekit. Not that VC's are knocking down our door, but we've stayed away from the idea because we want to be in control and we want to reap the full rewards of our work. Now we're in a great position, we have a solid product with a great customer base that belongs to the two of us.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=V32dKpd-Fbo:xL8Soqg7hqs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=V32dKpd-Fbo:xL8Soqg7hqs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=V32dKpd-Fbo:xL8Soqg7hqs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=V32dKpd-Fbo:xL8Soqg7hqs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=V32dKpd-Fbo:xL8Soqg7hqs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=V32dKpd-Fbo:xL8Soqg7hqs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=V32dKpd-Fbo:xL8Soqg7hqs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/V32dKpd-Fbo" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 07 Aug 2009 16:36:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/V32dKpd-Fbo/book-reviews-permission-marketing-reality-check</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/199451/book-reviews-permission-marketing-reality-check</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/199451/book-reviews-permission-marketing-reality-check</feedburner:origLink></item>
    <item>
      <title>Why I Gave Up on JavaFX</title>
      <description>&lt;p&gt;&lt;img alt="JavaFX" class="right" height="84" src="http://garbageburrito.com/media/AA/AA/ben/images/276070/main/Picture_1.png" width="191" /&gt;Let me preface this by saying that even though this blog has been primarily about Rails, I am still an active Java developer. After my honeymoon with Rails I came to appreciate Java again and enjoy a healthy relationship with both. In other words, I'm not just a Rubyist dogging on Java.&lt;/p&gt;&lt;p&gt;I've never been a big plugin based RIA proponent, I still think HTML can get you a long way. In the late 90's my friend said to me &amp;quot;There's this new technology that's going to make HTML obsolete in a year, it's called Flash!&amp;quot;. Flash certainly has a place, but people tend to overreact about stuff like this. Simplicity always reigns, cause we're simple people.&lt;/p&gt;&lt;p&gt;However, I'm always curious about new things. When my friend wanted a Dice Roller for his DnD site, I thought it was a good excuse to dabble. JavaFX had just hit 1.0 and since I had Java exp I figured I'd give it a try. My hope was that I would end up with an architecture to support uploadable plugins for &lt;a href="http://www.doodlekit.com"&gt;Doodlekit&lt;/a&gt;. I've wanted to do this for awhile, but I'm sure as heck not going to let anybody upload Ruby code. I figured an applet would be secure and atomic.&lt;/p&gt;&lt;p&gt;The app is pretty simple, here's the &lt;a href="http://garbageburrito.com/home/dice_roller"&gt;Rails version&lt;/a&gt; I ended up with. The JavaFX version was almost the same. My intention was to start simple and then add some more dynamic components like 3d dice.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What I liked about JavaFX&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The declarative syntax was pretty cool and I liked that it was similar to JavaScript. There's no reason to invent a completely new syntax. Syntax-wize, the level of entry was pretty low (relative to other Java technologies), however I could tell it would extend gracefully. I was also pretty happy with the NetBeans support. That's about it.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;What I didn't like&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;The first thing I noticed was how incredibly slow it was. This was about as simple as it could be. The data was stored in &lt;a href="http://www.doodlekit.com"&gt;Doodlekit's&lt;/a&gt; form builder database, and the app connected through a RESTful Web Service. It took way too long to load and way too long to run. I didn't spend any time trying optimize it. I don't think I should have to with an app this simple. I guess there's the argument that weight of my app didn't warrant the use of something this heavy. I just can't figure out how Sun hasn't been able to make small simple applets really fast yet. I guess I'll wait another decade.&lt;/p&gt;&lt;p&gt;Being new to JavaFX, I had to look up a lot of stuff. Unfortunately there wasn't a lot of stuff to be found. There's a not so useful JavaDoc kind of thingy and a handful of blog posts. The problem is that half the snippets I found in blog posts were no longer valid, I'm assuming because they'd been removed during the Beta. I believe there's one published book and a few in the pipeline. I realize it just hit 1.0 but come on, how's it going to get any traction if you can't figure out how it works?&lt;/p&gt;&lt;p&gt;Finally, the lack of cool components was pretty frustrating. You had the standard Swing stuff like textboxes and such, but with a hot new technology like JavaFX, I guess I expected more. Instead of just a JList, how about sortable grid components? What's the point of a slider without a label? And no I shouldn't have to make my own.&lt;/p&gt;&lt;p&gt;I'm sure if I looked a little harder I could find answers to a lot of these issues, but I guess that's my point. If you want a technology to catch on you have to be ready for this. Good documentation is an absolute minimum, followed by lucrative features, and maybe good performance if you are so inclined.&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=fxaRCe-nh6E:JHhBU4Ait5g:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=fxaRCe-nh6E:JHhBU4Ait5g:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=fxaRCe-nh6E:JHhBU4Ait5g:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=fxaRCe-nh6E:JHhBU4Ait5g:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=fxaRCe-nh6E:JHhBU4Ait5g:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=fxaRCe-nh6E:JHhBU4Ait5g:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=fxaRCe-nh6E:JHhBU4Ait5g:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/fxaRCe-nh6E" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 26 Jan 2009 22:00:00 -0600</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/fxaRCe-nh6E/why-i-gave-up-on-javafx</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/53043/why-i-gave-up-on-javafx</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/53043/why-i-gave-up-on-javafx</feedburner:origLink></item>
    <item>
      <title>My Dream Desk</title>
      <description>&lt;p&gt;I plan on working at home more now that &lt;a href="http://www.securepassage.com"&gt;Secure Passage&lt;/a&gt; is moving south, so I setup a desk at home. It's also going to be nice to have a dedicated area to work on Doodlekit. Here's what I put together.&lt;/p&gt;&lt;p class="center_image"&gt;&lt;a href="/media/AA/AA/ben/images/248133/huge/desk.jpg" onclick="window.open(this.href);return false;" onkeypress="window.open(this.href);return false;"&gt;&lt;img alt="My Dream Desk" height="353" src="http://garbageburrito.com/media/AA/AA/ben/images/248133/main/desk.jpg" width="450" /&gt;&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Seriously, this is my dream setup, I almost can't believe it's all mine. Here's what I've got.&lt;/p&gt;&lt;ul&gt;&lt;li&gt;Eames Desk Unit by Herman Miller&lt;/li&gt;&lt;li&gt;Eames Aluminum Group Task Chair by Herman Miller&lt;/li&gt;&lt;li&gt;Some cat toys on the floor&lt;/li&gt;&lt;li&gt;Macbook Pro&lt;/li&gt;&lt;li&gt;Apple 23&amp;quot; Cinema Display&lt;/li&gt;&lt;li&gt;Apple Wireless Keyboard and Mighty Mouse&lt;/li&gt;&lt;li&gt;iPhone 3G&lt;/li&gt;&lt;/ul&gt;&lt;p&gt;Ahahaha!&lt;/p&gt;&lt;p&gt;I mounted all the wires, power bricks and power strip to the underside of the desk, so all you can see is the power cord coming out the back.&lt;/p&gt;&lt;p&gt;Sorry, just had to show off a little. Now to get busy.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=lUoZ2WMtbKc:AlGSLvVUlNs:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=lUoZ2WMtbKc:AlGSLvVUlNs:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=lUoZ2WMtbKc:AlGSLvVUlNs:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=lUoZ2WMtbKc:AlGSLvVUlNs:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=lUoZ2WMtbKc:AlGSLvVUlNs:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=lUoZ2WMtbKc:AlGSLvVUlNs:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=lUoZ2WMtbKc:AlGSLvVUlNs:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/lUoZ2WMtbKc" height="1" width="1"/&gt;</description>
      <pubDate>Mon, 24 Nov 2008 23:01:00 -0600</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/lUoZ2WMtbKc/my-dream-desk</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/46659/my-dream-desk</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/46659/my-dream-desk</feedburner:origLink></item>
    <item>
      <title>Kitchen Renovation - Round Two</title>
      <description>&lt;p&gt;When we first bought our house, the kitchen was unusable. For quite a while we had a fridge full of Hot Pockets and a microwave. I'll never eat another hot pocket again.&lt;/p&gt;&lt;p&gt;The first renovation was a get something in cheap and quick. It worked, but just didn't have that finished feel to it. So last winter we bought some IKEA cabinets on eBay, and this is the fruit of our labor.&lt;/p&gt;&lt;p class="center_image"&gt;&lt;a href="/album/album/8933"&gt;&lt;img alt="Kitchen" height="338" src="http://garbageburrito.com/media/AA/AA/ben/images/145578/main/IMG_0048.jpg" width="450" /&gt;&amp;#160;&lt;/a&gt;&lt;/p&gt;&lt;p class="center_image"&gt;&lt;a href="/album/album/8933"&gt;Click for more pics&lt;/a&gt;&lt;/p&gt;&lt;p&gt;Still some work to do, but for the most part we're very happy with the results.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=Os3tgMzizvE:8X1Hte0vETU:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=Os3tgMzizvE:8X1Hte0vETU:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=Os3tgMzizvE:8X1Hte0vETU:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=Os3tgMzizvE:8X1Hte0vETU:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=Os3tgMzizvE:8X1Hte0vETU:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=Os3tgMzizvE:8X1Hte0vETU:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=Os3tgMzizvE:8X1Hte0vETU:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/Os3tgMzizvE" height="1" width="1"/&gt;</description>
      <pubDate>Thu, 12 Jun 2008 15:39:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/Os3tgMzizvE/kitchen-renovation-round-two</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/29424/kitchen-renovation-round-two</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/29424/kitchen-renovation-round-two</feedburner:origLink></item>
    <item>
      <title>Lessons learned from the iPhone</title>
      <description>&lt;p&gt;&lt;img alt="iPhone" class="right" height="227" src="http://garbageburrito.com/media/image/image/37150/main/iphone.jpg" width="200" /&gt;So I bought an iPhone a month ago, and needless to say I'm very impressed by it. I knew since that day when I was spastically refreshing engadget as they posted Job's keynote, that this device was a game changer. Though my natural disdain for Apple's pretentious commercials swayed my opinion back to skeptic. &amp;quot;Yeah, I can check my email and surf the web on my Windows Mobile phone too, so WHAT?!&amp;quot; But I couldn't resist for long, and as usual I bought myself the thing that my wife was planning on buying me for Christmas.&lt;/p&gt;&lt;p&gt;I have to say that this is a revolutionary device. I know I'm late to the party on iPhone praise, but there are a couple interesting things I realized while I tried to find excuses to use it every hour of every day.&lt;/p&gt;&lt;p&gt;The first is a sort of reassurance I get through the similarities I see to Doodlekit. The design philosophies are very much the same, and it's good to see that such an opinionated device can be so widely accepted.&lt;/p&gt;&lt;p&gt;More importantly however, it's finally allow me to quantify why simple is better. Before I could sit down and explain examples of why simplicity is key, but it was never so clear cut.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Distraction&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;My old Windows Mobile device had a lot of features and applications, more than the iPhone. But here's the thing, I never used them. However I find myself using every single application on my iPhone. The problem with the WinMo phone is that I was distracted by choices. For example if I wanted to write down a note, I could create a Word document, Excel Spreadsheet, or one of the scribble pad notes. My mind would weigh the pros and cons, then I'd finally just decide to write it down on paper. On my iPhone I just have Notes, and I use them all the time now.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Cut the Unnecessary&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;I was kind of surprised that the iPhone didn't come with a Todo list. This seems like such an essential smartphone application. Yet I realized that wait a minute, I never used the Todo list on my old phone. My problem was that I would put things on my Todo list that were hard to remember, but I could never remember to look at my Todo list. I tried a few web based Todo lists, but ended up with a much better solution. Now when I need to remember to do something like get new tags for my car, I put it in my Calendar. This way I set a date and time that I need to do it and it reminds me that I need to do it. Not only that, but now I have a history of when I did things.&lt;/p&gt;&lt;p&gt;The iPhone engineers were able to step back and look at how people will really use this phone, and didn't dilute it with the unecessary 10%. So many software companies are afraid to think for their customers, when in the end, that's what the customers are paying for.&lt;/p&gt;&lt;p&gt;Simplicity gives way to fluid and natural actions by eliminating distractions and only focusing on what you really need. I couldn't put it into words like that before.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=LaI3uadiaak:rk9uH_Vh3hI:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=LaI3uadiaak:rk9uH_Vh3hI:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=LaI3uadiaak:rk9uH_Vh3hI:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=LaI3uadiaak:rk9uH_Vh3hI:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=LaI3uadiaak:rk9uH_Vh3hI:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=LaI3uadiaak:rk9uH_Vh3hI:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=LaI3uadiaak:rk9uH_Vh3hI:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/LaI3uadiaak" height="1" width="1"/&gt;</description>
      <pubDate>Fri, 28 Dec 2007 19:38:00 -0600</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/LaI3uadiaak/lessons-learned-from-the-iphone</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/9190/lessons-learned-from-the-iphone</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/9190/lessons-learned-from-the-iphone</feedburner:origLink></item>
    <item>
      <title>Doodlekit gets TechCrunched</title>
      <description>&lt;p&gt;Yesterday TechCrunch did a &lt;a href="http://www.techcrunch.com/2007/11/30/doodlekit-brings-advanced-functionality-to-easy-website-creation/"&gt;writeup on Doodlekit&lt;/a&gt;.  The article focused on how our advanced features set us apart from our competitors.&lt;/p&gt;&lt;p&gt;My only complaint was the misnomer that &lt;a href="http://doodlekit.com"&gt;Doodlekit&lt;/a&gt; is late to the party.  According to some of the comments, you don't actually exist until you've been posted on TC.  The fact is that we started on DK almost 2 years ago, and did our first major release last year.  Blah blah, I know this sounds like pathetic drivel, but hey, I needed to get it out there.&lt;/p&gt;&lt;p&gt;Of course it doesn't bother me too much, because I'll be laughing all the way to the bank!  HA!  I expected a lot of traffic, but I didn't expect that over 600 sites would be created since the article was posted.  As the article rolled to the bottom of the TC homepage, it showed up on the del.icio.us home page.&lt;/p&gt;&lt;p&gt;This was also a good test of the server.  Everything held up quite well.&lt;/p&gt;&lt;p&gt;This has been a fun 24 hours.  I hope it continues.&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=X_Qlet6VRzc:F1StlbT6jds:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=X_Qlet6VRzc:F1StlbT6jds:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=X_Qlet6VRzc:F1StlbT6jds:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=X_Qlet6VRzc:F1StlbT6jds:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=X_Qlet6VRzc:F1StlbT6jds:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=X_Qlet6VRzc:F1StlbT6jds:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=X_Qlet6VRzc:F1StlbT6jds:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/X_Qlet6VRzc" height="1" width="1"/&gt;</description>
      <pubDate>Sat, 01 Dec 2007 15:56:00 -0600</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/X_Qlet6VRzc/doodlekit-gets-techcrunched</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/3762/doodlekit-gets-techcrunched</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/3762/doodlekit-gets-techcrunched</feedburner:origLink></item>
    <item>
      <title>Doodlekit is now more Awesomer than ever</title>
      <description>&lt;p&gt;Last Saturday we finally deployed the latest &lt;a href="http://doodlekit.com" onclick="window.open(this.href);return false;" onkeypress="window.open(this.href);return false;"&gt;Doodlekit&lt;/a&gt; release. So far I'm really happy with how things are going. Our signups have already quintupled, and everything is running smooth as usual.&lt;/p&gt;&lt;p&gt;Here's what I'm excited about.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Free as in Beer&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;We now have a completely free &lt;a href="http://doodlekit.com" onclick="window.open(this.href);return false;" onkeypress="window.open(this.href);return false;"&gt;Doodlekit&lt;/a&gt; plan that still has lots of great features like a Blog, Photo Album, and Content Pages. Hear that Railers? You can have a &lt;a href="http://doodlekit.com" onclick="window.open(this.href);return false;" onkeypress="window.open(this.href);return false;"&gt;Ruby on Rails hosted Blog for free&lt;/a&gt;!&lt;/p&gt;&lt;p&gt;&lt;strong&gt;New Editor - XStandard&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;If you've done any research into online WYSIWYG editors, you should know that &lt;a href="http://xstandard.com" onclick="window.open(this.href);return false;" onkeypress="window.open(this.href);return false;"&gt;XStandard&lt;/a&gt; is the cream of the crop. It spits out completely W3C compliant HTML, and uses styles instead of fonts. Since it's a browser plugin, and doesn't use the browsers built in content editor, it's a lot more stable and predictable. &lt;br /&gt; &lt;br /&gt;Not only that, but we made it a lot better. The editor is not only aware of what color theme you're using, but also what you're editing. So if I start editing a notes box on my sidebar, the width of the editable area will be the same, and the background color will match.&lt;/p&gt;&lt;p&gt;I also built out all the backend services, so when you're inserting an image, you can browse your Doodlekit Photo Albums, or upload directly from your computer. Sorry to ramble, but I'm really psyched about this.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Shopping Cart&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;In true DK style, the new &lt;a href="http://doodlekit.com"&gt;Shopping Cart&lt;/a&gt; is really simple, yet slick as all hell. It takes just a few minutes to setup, and integrates directly with Paypal. &lt;a href="/shop/2"&gt;Check out my demo&lt;/a&gt;.&lt;/p&gt;&lt;p&gt;&lt;strong&gt;Performance&lt;/strong&gt;&lt;/p&gt;&lt;p&gt;Dude, you don't even know.....&lt;/p&gt;&lt;p&gt;I almost crapped my pants when I checked the logs and saw 200+ requests per second. Then I did crap my pants when I started up memcached, and saw 300+ requests per second. And that's per process across 4 processes. More on that to come...&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;p&gt;&amp;#160;&lt;/p&gt;&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aDRIVNpSbqw:JT4rVUL7z04:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aDRIVNpSbqw:JT4rVUL7z04:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=aDRIVNpSbqw:JT4rVUL7z04:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aDRIVNpSbqw:JT4rVUL7z04:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?i=aDRIVNpSbqw:JT4rVUL7z04:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aDRIVNpSbqw:JT4rVUL7z04:qj6IDK7rITs"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=qj6IDK7rITs" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/garbageburrito-blog?a=aDRIVNpSbqw:JT4rVUL7z04:I9og5sOYxJI"&gt;&lt;img src="http://feeds.feedburner.com/~ff/garbageburrito-blog?d=I9og5sOYxJI" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/garbageburrito-blog/~4/aDRIVNpSbqw" height="1" width="1"/&gt;</description>
      <pubDate>Tue, 16 Oct 2007 16:31:00 -0500</pubDate>
      <link>http://feedproxy.google.com/~r/garbageburrito-blog/~3/aDRIVNpSbqw/doodlekit-is-now-more-awesomer-than-ever</link>
      <guid isPermaLink="false">http://garbageburrito.com/blog/entry/1046/doodlekit-is-now-more-awesomer-than-ever</guid>
    <feedburner:origLink>http://garbageburrito.com/blog/entry/1046/doodlekit-is-now-more-awesomer-than-ever</feedburner:origLink></item>
  </channel>
</rss>
