<?xml version="1.0" encoding="utf-8"?>
<feed xmlns="http://www.w3.org/2005/Atom">
    <title>JD Huntington</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/" />
    <link rel="self" type="application/atom+xml" href="http://blog.jdhuntington.com/atom.xml" />
    <id>tag:blog.jdhuntington.com,2008-03-19://1</id>
    <updated>2011-03-09T01:15:47Z</updated>
    <subtitle>writings and such.</subtitle>
    <generator uri="http://www.sixapart.com/movabletype/">Movable Type Open Source 4.1</generator>

<entry>
    <title>Emacs Major Mode: LESS CSS</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2011/03/emacs-major-mode-less-css.html" />
    <id>tag:blog.jdhuntington.com,2011://1.30</id>

    <published>2011-03-09T01:11:35Z</published>
    <updated>2011-03-09T01:15:47Z</updated>

    <summary>I&apos;m a big fan of LESS, so naturally I decided to write an emacs major mode to support it. It&apos;s rather rudimentary at this point, but it&apos;s far better than working in fundamental-mode. If you&apos;re a user of both LESS...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Emacs" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="emacslesscss" label="emacs lesscss" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>I'm a big fan of <a href="http://lesscss.org">LESS</a>, so naturally I decided to write an emacs major mode to support it. It's rather rudimentary at this point, but it's far better than working in fundamental-mode. If you're a user of both LESS and emacs, give it a shot and let me know what you think.</p>

<p><a href="http://jdhuntington.com/emacs/less-css-mode.el">http://jdhuntington.com/emacs/less-css-mode.el</a></p>
]]>
        

    </content>
</entry>

<entry>
    <title>Emacs elisp snippet: jlh-join-lines</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2011/01/emacs-elisp-snipped-jlhjoinlin.html" />
    <id>tag:blog.jdhuntington.com,2011://1.29</id>

    <published>2011-01-29T00:22:25Z</published>
    <updated>2011-01-29T00:31:07Z</updated>

    <summary>I frequently find myself using join-lines in emacs (usually bound to C-x ^), which is a handy function that will merge a line with the line before it. A few times this week, I&apos;ve found myself needing to join more...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Emacs" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="elisp" label="elisp" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<div>I frequently find myself using <em>join-lines</em> in emacs (usually bound to C-x ^), which is a handy function that will merge a line with the line before it. A few times this week, I've found myself needing to join more than one line in this manner. Hitting C-x ^ multiple times is pretty tedious, so I wrote this quick bit of elisp to make this process faster. It's not complicated, but it does serve my goal of reminding myself that I should be writing elisp more often to make my life easier.</div>

<pre>
(defun jlh-join-lines (arg)
  "Join this line to the line above n times
Running this command with an argument of 1 is equivalent
to running 'delete-indentation (aka 'join-line)."
  (interactive "NHow many lines to join?: ")
  (while (> arg 0)
    (join-line)
    (setq arg (- arg 1))))
</pre>]]>
        
    </content>
</entry>

<entry>
    <title>Wallpapr - Yet Another Android Wallpaper Application</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2011/01/wallpapr-yet-another-android-w.html" />
    <id>tag:blog.jdhuntington.com,2011://1.28</id>

    <published>2011-01-19T17:56:54Z</published>
    <updated>2011-01-19T18:04:49Z</updated>

    <summary>It occurred to me that there weren&apos;t enough wallpaper applications for the Android platform, so I decided to create another one. Mine is called &quot;Wallpapr&quot;, a not too clever play on &quot;Flickr&quot;, which is the source of all images available...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Android" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[It occurred to me that there weren't enough wallpaper applications for the Android platform, so I decided to create another one. Mine is called "Wallpapr", a not too clever play on "Flickr", which is the source of all images available in the application.<br /><br /><div>What [hopefully]&nbsp;distinguishes&nbsp;this application is the workflow; "interesting" images are pulled from Flickr automatically and can be used as the system wallpaper with only two taps. A user's favorite photos are also readily available.</div><div><br /></div><div>Have a look: <a href="http://jdhuntington.com/mobile/wallpapr/">jdhuntington.com/mobile/wallpapr</a></div>]]>
        
    </content>
</entry>

<entry>
    <title>Adventures in home roastng</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2010/01/adventures-in-home-roastng.html" />
    <id>tag:blog.jdhuntington.com,2010://1.27</id>

    <published>2010-01-08T20:13:41Z</published>
    <updated>2010-01-08T20:13:31Z</updated>

    <summary>For years, I&apos;ve wanted to try my hand at roasting my own coffee. Hoping to do it cheaply, I&apos;ve always been looking for a very specific type of popcorn popper that will work for this purpose. However, given the trend...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>For years, I've wanted to try my hand at roasting my own coffee. Hoping to do it cheaply, I've always been looking for a very specific type of popcorn popper that will work for this purpose. However, given the trend that popcorn poppers seem to have taken, I'd more or less given up on the idea.</p>
<p>A few months ago, <a href="http://digitalleafblower.com/">Matt</a> was kind enough to let me borrow his <a href="http://www.sweetmarias.com/prod.freshroast.php">Fresh Roast Plus</a> that he had since replaced. It's a great little roaster, and given what I now know, I'm glad this was the first roaster I've used. It does have its drawbacks, but it's a great roaster to learn on. Most notably, the build of the unit let me see what was happening to the beans throughout the roast, and also let me hear the audible cracks of the coffee beans. Now that I've done a little bit of roasting, I'm planning on moving up to a unit that can roast a half-pound or a full pound at a time. The Fresh Roast can accommodate only 3 ounces at a time, which means that to have fresh coffee consistently, one would have to roast nearly every day, depending on coffee consumption.</p>
<p>I started by ordering a sampler from <a href="http://www.sweetmarias.com/">Sweet Maria's</a>, which gave me 8 different types of coffee to try roasting. I've liked them all, and it's amazing to taste the vast differences in flavor. Up until very recently, I had been letting beans sit for 12-24 after roasting before grinding and brewing, which I'm now realizing likely contributed to too much acidity. My most recent batch rested for about a week, and the flavor is much more apparent.</p>
<p>The roasting process itself is drop-dead simple. All it takes is putting the beans in the roaster, turning it on, then waiting for the appropriate signals to know when to stop. I used a <a href="http://www.sweetmarias.com/roasting-VisualGuideV2.php">guide</a> from Sweet Maria's which has plenty of information on the roasting process.</p>
<p>I can tell I've got a ways to go before the beans rival those of my favorite local roaster, but they're a heck of a lot better than any of the national chains.</p>
<p><br />
<img src="http://blog.jdhuntington.com/IMG_2768.jpg" width="480" height="360" alt="IMG_2768" /></p>

<div class="posttagsblock"><a href="http://technorati.com/tag/coffee" rel="tag">coffee</a></div>]]>
        
    </content>
</entry>

<entry>
    <title>Bugflow - A lighthouse/github workflow</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2009/02/bugflow-a-lighthousegithub-wor.html" />
    <id>tag:blog.jdhuntington.com,2009://1.20</id>

    <published>2009-02-26T19:50:24Z</published>
    <updated>2009-02-26T19:56:41Z</updated>

    <summary>I love the integration between github and lighthouse. (If you&apos;re not familiar with this, have a look.) However, I always found myself forgetting which ticket I was working on when writing commit messages. At first, I wrote this script just...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>I love the integration between github and lighthouse. (If you're not
familiar with this, <a href="http://github.com/blog/41-service-integration">have a look</a>.)
However, I always found myself forgetting which ticket I was working
on when writing commit messages. At first, I wrote this script just to
add the ticket number in the git commit message, but it quickly
evolved to help throughout the workflow.</p>
<p>When starting on a new ticket, this script helps by</p>
<ul>
  <li>Assigning a ticket to when starting work</li>
  <li>Creating a local branch with an intelligent name</li>
</ul>
<p>On completion it will</p>
<ul>
  <li>Set the state of the ticket to a user-defined value (through the git commit msg)</li>
  <li>Clear the active user (also through the git commit msg)</li>
</ul>
<h3>Workflow</h3>
<p>Here&#8217;s an example of the workflow&#8230;</p>
<script src="http://gist.github.com/71032.js"></script>

<h3>Setup</h3>
<h4>Install Bugflow</h4>

<p>Just grab <strong><a href="http://gist.github.com/14625">this script</a></strong> and put it wherever you like. (I prefer ~/bin) </p>

<h4>Install Gem</h4>
<p>Grab the lighthouse gem from github:
<pre>
$ gem sources -a http://gems.github.com
$ sudo gem install Caged-lighthouse-api
</pre></p>
<h4>Project Config</h4>
<p>Finally, create a file in the root of your project called .bugflow.yml and add the following data:</p>
<script src="http://gist.github.com/71026.js"></script>

<p>Also, it&#8217;s a good idea to add this file to your .gitignore.</p>
<pre>
$ echo ".bugflow.yml" &gt;&gt; .gitignore
</pre>

<p>Happy hacking!</p>
]]>
        
    </content>
</entry>

<entry>
    <title>Emacs color theme: Blackboard</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/11/emacs-color-theme-blackboard.html" />
    <id>tag:blog.jdhuntington.com,2008://1.10</id>

    <published>2008-11-27T20:01:04Z</published>
    <updated>2008-12-01T17:18:44Z</updated>

    <summary>After pairing with a coworker using Textmate&apos;s Blackboard theme, I decided I wanted it for emacs. The font lock I&apos;m using in emacs for ruby didn&apos;t let me recreate it perfectly, but it&apos;s certainly close enough for me. Here&apos;s my...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Computing" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="emacs" label="emacs" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>After pairing with a coworker using Textmate's Blackboard theme, I decided I wanted it for emacs. The font lock I'm using in emacs for ruby didn't let me recreate it perfectly, but it's certainly close enough for me.</p>
<p>Here's my first crack at it: <a href="http://jdhuntington.com/paste/color-theme-blackboard.el.html" title="Blackboard color theme for emacs">color-theme-blackboard.el</a></p>
<p><strong>Update:</strong> Screenshot.</p>

<div class="thumbnail"><a href="http://skitch.com/jedediah/7geu/pprojects-autumn-libs-speciator.rb"><img src="http://img.skitch.com/20081201-k4cdpw63y1xd45nkhqgxx9kmii.preview.jpg" alt="~/pprojects/autumn/libs/speciator.rb" /></a></div>
]]>
        
    </content>
</entry>

<entry>
    <title>A Different Kind of Experience</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/07/a-different-kind-of-experience.html" />
    <id>tag:blog.jdhuntington.com,2008://1.9</id>

    <published>2008-07-09T18:09:42Z</published>
    <updated>2008-07-09T18:18:42Z</updated>

    <summary>Very few people like going to the doctor, myself included. So you can imagine my frustration when I found myself needing to making a doctor&apos;s appointment this week. I expected to have an appointment at an inconvenient time, sit in...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="General" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="doctor" label="doctor" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[Very few people like going to the doctor, myself included. So you can imagine my frustration when I found myself needing to making a doctor's appointment this week. I expected to have an appointment at an inconvenient time, sit in a stuffy waiting room with old magazines for an hour, only to be followed by sitting in a stuffy exam room for another hour. We've all been there.<div><br /></div><div>Thankfully, I happened to look into <a href="http://www.zoomcare.com/">Zoomcare</a>'s website, mostly on a whim. It sounded good, so I figured I'd make an appointment and see how it went. Turns out it went well. Very well. I made an appointment at 9:30am for 11am, and got an email back almost immediately that I was confirmed for said time. I showed up at 10:55am, waited for literally 1 minute, and left with a prescription in hand by 11:07am. </div><div><br /></div><div>They have earned themselves a happy new customer.</div><div><br /></div>]]>
        
    </content>
</entry>

<entry>
    <title>gem install punch for drop-dead easy time tracking</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/07/gem-install-punch-for-dropdead.html" />
    <id>tag:blog.jdhuntington.com,2008://1.8</id>

    <published>2008-07-09T06:35:51Z</published>
    <updated>2008-07-09T06:35:53Z</updated>

    <summary>While at cabooseconf last month, I found out about one of the coolest time tracking tools ever: punch. (Thanks to cardiod from OG) According to its own description, it&apos;s a k.i.s.s. tool for tracking the hours spent on various projects....</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>While at cabooseconf last month, I found out about one of the coolest time tracking tools ever: <strong>punch</strong>. (Thanks to cardiod from <a href="http://b.logi.cx" title="OG">OG</a>)</p>
<p>According to its own description, it's a</p>
<blockquote>
  <p>k.i.s.s. tool for tracking the hours spent on various projects. it supports logging hours under a project name, adding notes about work done during that period, and several very simple reporting tools that operate over a window of time.</p>
</blockquote>I find this to be a much easier method of tracking time than many alternatives, including the zillions of time tracking/billing web 2.0 sites. In fact, an hour or two of hacking could leave someone with a pretty decent time tracking AND invoicing tool.<br />
<br />
And wouldn't ya know it, it's as simple as <strong>gem install punch</strong>.
]]>
        
    </content>
</entry>

<entry>
    <title>OmniFocus Hack - the mobile list</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/07/omnifocus-hack-the-mobile-list.html" />
    <id>tag:blog.jdhuntington.com,2008://1.7</id>

    <published>2008-07-09T06:30:36Z</published>
    <updated>2008-07-09T06:30:45Z</updated>

    <summary>For those of you who use OmniFocus and won&apos;t be getting an iphone, this one could really come in handy. It&apos;s a ruby script that talks to OmniFocus via OSA, grabs all the items in a given context, then writes...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Computing" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>For those of you who use OmniFocus and won't be getting an iphone, this one could really come in handy. It's a ruby script that talks to OmniFocus via OSA, grabs all the items in a given context, then writes them as poorly-formed html over ssh to a predefined destination. Cheap and dirty, but it's the quickest way I've found to get stuff like this available anywhere, especially in a mobile phone browser.</p>
<blockquote>
  <p>#!/usr/bin/ruby</p>

  <p>require 'rubygems'</p>

  <p>require 'rbosa'</p>

  <p>require 'net/ssh'</p>

  <p>of = OSA.app 'OmniFocus'</p>

  <p>shopping_list = of.default_document.contexts.collect { |x| x if x.name == 'Errands' }.compact.first.contexts.collect { |x| x if x.name == 'Shopping' }.compact.first</p>

  <p>items = shopping_list.tasks.collect { |x| x.name unless x.completed? }.compact</p>

  <p>def post_file( shell, file, datum )</p>

  <p>shell.touch(file)</p>

  <p>shell.send_command("echo \"#{datum}\" &gt; #{file}")</p>

  <p>end</p>

  <p>def build_html(items)</p>

  <p>"&lt;ul&gt;#{items.collect{|item| '&lt;li&gt;' + item + '&lt;/li&gt;' }}&lt;/ul&gt;"</p>

  <p>end</p>

  <p>Net::SSH.start( 'myserver.dreamhost.com' ) do |session|</p>

  <p>shell = session.shell.sync</p>

  <p>post_file shell, "~/shoppinglist.mydomain.com/index.html", build_html(items)</p>

  <p>shell.exit</p>

  <p># session.loop</p>

  <p>end</p><br />
</blockquote>
]]>
        
    </content>
</entry>

<entry>
    <title>RailsConf and CabooseConf &apos;08 Recap</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/06/railsconf-and-cabooseconf-08-r.html" />
    <id>tag:blog.jdhuntington.com,2008://1.6</id>

    <published>2008-06-02T06:12:48Z</published>
    <updated>2008-06-02T06:39:35Z</updated>

    <summary>RailsConf 2008 is now over. It was a great conference, and here are a few of the highlights:Avi Bryant demonstrated MagLev, a ruby vm written on top of the smalltalk gemstone architecture. Summary: Code and data in the global namespace of one...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Events" scheme="http://www.sixapart.com/ns/types#category" />
    
        <category term="Ruby" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="cabooseconf" label="cabooseconf" scheme="http://www.sixapart.com/ns/types#tag" />
    <category term="railsconf" label="railsconf" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<div>RailsConf 2008 is now over. It was a great conference, and here are a few of the highlights:</div><div><br /></div>Avi Bryant demonstrated <a href="http://www.avibryant.com/2008/06/maglev-recap.html">MagLev</a>, a ruby vm written on top of the smalltalk gemstone architecture. Summary: Code and data in the global namespace of one ruby process is available in another ruby process. Oh, and if that's not enough, there's transactional memory too.<div><br /></div><div>On the theme of distributed processing, there was a great demo of <a href="http://skynet.rubyforge.org/">Skynet</a>, a map/reduce style processing framework. The Rails plugin for skynet gives some great features with a slick API. For example, the 'distributed_find' for ActiveRecord models will let workers each handle a small slice of any given model.find and process the data accordingly.</div><div><br /></div><div>David Chelimsky gave a great run through of what <a href="http://rspec.info/">rSpec's story runner looks</a> like, a tool which I'll be using as much as I can justify. Integration with <a href="http://agilewebdevelopment.com/plugins/webrat">webrat</a> makes it even more useful, as now stories can be tested using the full rails stack.</div><div><br /></div><div>The highlight of the weekend was hanging out with <a href="http://technomancy.us/">Phil</a> and working on <a href="http://github.com/technomancy/bus-scheme/tree/master">Bus Scheme</a>. My first real pair-programming experience was hugely insightful, and now I've decided that it's essential that I find some time to work closely with some great programmers on a more regular basis. Aside from learning some excellent emacs tips (<a href="http://www.emacswiki.org/cgi-bin/wiki/CategoryEshell">eshell</a>, for instance), we got lots of TODOs knocked off and made some important structure changes in bus-scheme's AST.</div><div><br /></div><div>Now I've just got to digest all the new code I've seen and the 20 new RSS feeds I now subscribe to.</div>]]>
        
    </content>
</entry>

<entry>
    <title>Why Automate?</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/04/why-automate.html" />
    <id>tag:blog.jdhuntington.com,2008://1.5</id>

    <published>2008-04-23T19:08:40Z</published>
    <updated>2008-04-23T19:43:55Z</updated>

    <summary>The latest post at Rands in Response started a bit of a heated discussion with a group of friends, and I thought I&apos;d touch on a few of the reasons I think it is absolutely imperative to automate, even if...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Computing" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p><a href="http://www.randsinrepose.com/archives/2008/04/21/saving_seconds.html">The latest post at Rands in Response</a> started a bit of a heated discussion with a group of friends, and I thought I'd touch on a few of the reasons I think it is absolutely imperative to automate, even if the automation only saves a second.</p>

<p>The concept of automation is an old one. In fact, automation is the reason computers were built in the first place. They were used to automate processes that were too complex or laborious for humans to tackle themselves. In early days, these complex tasks were simple by today's standards; "discover the trajectory of a bomb" or "calculate one plus two". However, as computers have become cheaper they've started to automate everyday things. This is painfully obvious to anyone who lives in the 21st century, but it's a fact that programmers shouldn't forget. A good programmer is someone who's always looking for redundant tasks that can be automated; both to save time and to reduce human error.</p>

<p>Saving time, however, is a concept that carries with it many externalities. The day of writing this post, I have been working on a fairly complex shell script with many moving parts.  This itself is not a problem, but the fact that I've been asked to respond to a few emails at random times during the morning provides a significant complication. As "sufferers" of <a href="http://www.randsinrepose.com/archives/2003/07/10/nadd.html">N.A.D.D.</a> will understand, taking 60 seconds to send off an email may well torpedo 30 minutes' worth of productivity. Extrapolate that to 3 separate yet short tasks, and I've lost about half of my morning. This is an important measure to bring into the cost/benefit ratio when discussing automation. Typically, the equation used to calculate a processes' automated value is the following:
<pre>a = Amount of time for task (un-automated)
    * Number of times task performed
b = Amount of time for task (automated)
    * Number of times task performed
    + Amount of time to automate the task</pre>
If b is less than a, then the task should be automated.</p>

<p>However, this simplistic equation misses the issue entirely. If my automated task is short enough to keep me from getting sidetracked by any of the hundreds of windows on my desktop, then it's paid for itself after two uses.</p>
]]>
        

    </content>
</entry>

<entry>
    <title>Round 1 with AppEngine</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/04/round-1-with-appengine.html" />
    <id>tag:blog.jdhuntington.com,2008://1.4</id>

    <published>2008-04-16T06:25:45Z</published>
    <updated>2008-04-23T19:06:10Z</updated>

    <summary>I was one of the lucky few to get an account in the first round of AppEngine signups, and today I started in on my first app. I recently found Edward O&apos;Connor&apos;s backpackit entry on Personal Unit Tests, and I...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Programming" scheme="http://www.sixapart.com/ns/types#category" />
    
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>I was one of the lucky few to get an account in the first round of AppEngine signups, and today I started in on my first app.</p>
<p>I recently found Edward O'Connor's backpackit entry on <a href="http://hober.backpackit.com/pub/1233865">Personal Unit Tests</a>, and I thought this would make a great little app to get started with. It's like a daily goals tracker, but with a very slightly different focus. More on that tomorrow.</p>
<p>Overall, I was very impressed with the amount of minor annoyances google has removed with this new setup. Having worked with these types of webapps for a number of years now, I know that they're rarely easy to host and deploy, but google has certainly taken the grunt work out of the equation.</p>
<p>I was most impressed on the user account tie-in they've built. It's absolutely trivial to let people use their own google accounts [gmail accounts] instead of creating a new account on each site. Effectively, they've built their own OpenID implementation into the framework.</p>
<p>At the end of the day, I'm reminded a bit of GeoCities and Tripod, who brought static webpages to the unwashed masses. With AppEngine, all that's needed for a small app is a handful of yaml, some html, and a few hundred lines of python.<br /></p>

<div class="posttagsblock"><a href="http://technorati.com/tag/programming" rel="tag">programming</a></div>]]>
        
    </content>
</entry>

<entry>
    <title>Scheme on the bus, and a little on a train</title>
    <link rel="alternate" type="text/html" href="http://blog.jdhuntington.com/2008/03/scheme-on-the-bus-and-a-little.html" />
    <id>tag:blog.jdhuntington.com,2008://1.3</id>

    <published>2008-03-20T04:57:01Z</published>
    <updated>2008-03-20T05:21:45Z</updated>

    <summary>Ever since reading &quot;The Little Schemer&quot;, I knew I had to write my own implementation of scheme. I started, and I didn&apos;t get very far before I noticed someone else had the same idea, and a better implemented one at...</summary>
    <author>
        <name>JD Huntington</name>
        
    </author>
    
        <category term="Scheme" scheme="http://www.sixapart.com/ns/types#category" />
    
    <category term="busscheme" label="bus-scheme" scheme="http://www.sixapart.com/ns/types#tag" />
    
    <content type="html" xml:lang="en-US" xml:base="http://blog.jdhuntington.com/">
        <![CDATA[<p>Ever since reading "The Little Schemer", I knew I had to write my own implementation of scheme. I started, and I didn't get very far before I noticed someone else had the same idea, and a better implemented one at that.</p>
<p>"<a href="http://github.com/technomancy/bus-scheme/tree/master">bus-scheme</a>" is the name, and I'm loving working with it [on the MAX]. Definitely worth checking out if you're interested in compilers, languages, scheme, or any combination thereof.</p>
<p>(In case you're curious, <a href="http://github.com/jdhuntington/ssiriaba/tree/master">here's the version that I started</a>.)</p>

<div class="posttagsblock"><a href="http://technorati.com/tag/bus-scheme" rel="tag">bus-scheme</a>, <a href="http://technorati.com/tag/programming" rel="tag">programming</a>, <a href="http://technorati.com/tag/scheme" rel="tag">scheme</a></div>]]>
        
    </content>
</entry>

</feed>
