<?xml version="1.0" encoding="UTF-8"?>
<rss version="2.0"
	xmlns:content="http://purl.org/rss/1.0/modules/content/"
	xmlns:wfw="http://wellformedweb.org/CommentAPI/"
	xmlns:dc="http://purl.org/dc/elements/1.1/"
	xmlns:atom="http://www.w3.org/2005/Atom"
	xmlns:sy="http://purl.org/rss/1.0/modules/syndication/"
	>

<channel>
	<title>davepeck.org</title>
	<atom:link href="http://davepeck.org/feed/" rel="self" type="application/rss+xml" />
	<link>http://davepeck.org</link>
	<description>atomcraft &#60;span class="ampersand"&#62;&#38;&#60;/span&#62; atomcraft accessories</description>
	<pubDate>Mon, 29 Jun 2009 17:55:35 +0000</pubDate>
	<generator>http://wordpress.org/?v=2.7.1</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>AppEngine Nitty Gritty</title>
		<link>http://davepeck.org/2009/06/15/appengine-nitty-gritty/</link>
		<comments>http://davepeck.org/2009/06/15/appengine-nitty-gritty/#comments</comments>
		<pubDate>Mon, 15 Jun 2009 16:00:19 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[appengine]]></category>

		<category><![CDATA[cloud]]></category>

		<category><![CDATA[cloud computing]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[google IO]]></category>

		<category><![CDATA[presentation]]></category>

		<category><![CDATA[talks]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=727</guid>
		<description><![CDATA[Jesse, Josh, and I gave a talk at this year&#8217;s Google I&#124;O conference.
The title was AppEngine Nitty Gritty: Scalability, Fault-Tolerance, and Integrating With Amazon EC2. We gave high-level advice about how to design an application for high loads and how to architect an application that makes use of multiple cloud computing environments. We also went [...]]]></description>
			<content:encoded><![CDATA[<p><a title="Since he doesn't have a home page, but does have Twitter presence." href="http://twitter.com/jesseko">Jesse</a>, <a title="GIS Expert and all-around software maverick." href="http://umbrellaconsulting.com/">Josh</a>, and I gave a talk at this year&#8217;s <a title="IO 2009: Awesome!" href="http://code.google.com/events/io/">Google I|O</a> conference.</p>
<p>The title was <strong>AppEngine Nitty Gritty: Scalability, Fault-Tolerance, and Integrating With Amazon EC2</strong>. We gave high-level advice about how to design an application for high loads and how to architect an application that makes use of multiple cloud computing environments. We also went straight to the dirty grime and shed light on some issues we encountered while building the Walk Score API &#8212; issues like unpredictable data store contention and the failure of basic sharding techniques for certain high-scale features.</p>
<p>You can <a title="Josh and I look a little thug-like in their freeze frame!" href="http://code.google.com/events/io/sessions/AppEngineNittyGritty.html">watch our presentation</a> via YouTube. I hope you enjoy it!</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/06/15/appengine-nitty-gritty/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Thoughts About GWT</title>
		<link>http://davepeck.org/2009/05/28/thoughts-about-gwt/</link>
		<comments>http://davepeck.org/2009/05/28/thoughts-about-gwt/#comments</comments>
		<pubDate>Fri, 29 May 2009 05:33:52 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[ajax]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[gwt]]></category>

		<category><![CDATA[languages]]></category>

		<category><![CDATA[rants]]></category>

		<category><![CDATA[web programming]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=709</guid>
		<description><![CDATA[I find myself repeating myself when I write AJAX web applications. 
First I write back-end code to define and manage my models. Then I write front-end code to do the same. The back-end code is in Python, or Ruby, or sometimes PHP. The front-end code is in JavaScript.
It seems absurd to have to define my [...]]]></description>
			<content:encoded><![CDATA[<p>I find myself <a href="http://davepeck.org/2009/04/17/javascript-needs-batteries/">repeating myself</a> when I write AJAX web applications. </p>
<p>First I write back-end code to define and manage my models. Then I write front-end code to do the same. The back-end code is in Python, or Ruby, or sometimes PHP. The front-end code is in JavaScript.</p>
<p>It seems absurd to have to define my models in two distinct languages. Worse, after I&#8217;ve done so, I have to write substantial glue code to round-trip changes from browser to server and back again. </p>
<p>Perhaps <a href="http://code.google.com/webtoolkit/">Google Web Toolkit</a> (GWT) solves this problem for me? I haven&#8217;t dug deeply at all, but it seems as though I could simply define everything in Java and then let GWT handle the RPC work for me? </p>
<p>That would certainly be a plus in GWT&#8217;s favor. I&#8217;m not convinced it&#8217;s enough to balance out the two negatives I currently see: (1) you often have to &#8220;drop down&#8221; to HTML and JavaScript when tackling performance issues, and (2) you still have to use CSS; you still have to worry about cross-browser compatibility. </p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/05/28/thoughts-about-gwt/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Dear OSX Editor Gods</title>
		<link>http://davepeck.org/2009/05/14/dear-osx-editor-gods/</link>
		<comments>http://davepeck.org/2009/05/14/dear-osx-editor-gods/#comments</comments>
		<pubDate>Thu, 14 May 2009 22:42:59 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[editors]]></category>

		<category><![CDATA[emacs]]></category>

		<category><![CDATA[osx]]></category>

		<category><![CDATA[rants]]></category>

		<category><![CDATA[software]]></category>

		<category><![CDATA[textmate]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=405</guid>
		<description><![CDATA[Deliver us from TextMate, vi, and emacs.
Some years ago, we would have followed TextMate to whatever end. Now, however, we see that TextMate was a false prophet. He led us down a garden path but abandoned us before we reached the promised land. In our desperation, we turned to the elder sages: vi and emacs. Alas, they [...]]]></description>
			<content:encoded><![CDATA[<p>Deliver us from TextMate, vi, and emacs.</p>
<p>Some years ago, we would have followed TextMate to whatever end. Now, however, we see that TextMate was a false prophet. He led us down a garden path but abandoned us before we reached the promised land. In our desperation, we turned to the elder sages: vi and emacs. Alas, they seem curiously unaware that it&#8217;s 2009. You know: 2009. The year before the year we make contact.</p>
<p>Editor Gods, we don&#8217;t ask for much. We just want an editor that makes us stand up and shout: &#8220;Hey! The future is here, and I&#8217;ve got a text editor to prove it!&#8221;</p>
<p>While we&#8217;re praying, we might as well let you know exactly what our hearts yearn for.</p>
<p><span id="more-405"></span></p>
<p>We want an application designed from the ground up to be a <strong>r</strong><strong>eal OSX application</strong>. We don&#8217;t want a complex port of code that was born three decades ago. We don&#8217;t want funny keyboard chording systems. We <em>do</em> want elegant control of windows and splits. We <em>do</em> want full-screen. We <em>do </em>want sane selection and clipboard behavior.</p>
<p>We want <strong>b</strong><strong>atteries included</strong>. We expect the most popular languages and source control systems to &#8220;just work&#8221; from minute zero. We care about dynamic scripting languages and promising new functional languages, and we care about distributed source control systems.</p>
<p>We want <strong>carefully designed</strong><strong> extensibility</strong>. We want to write code to change much of the interactive behavior of the editor. Moreover, we want to write that code in a language of <em>our</em> choosing &#8212; not yours, so we&#8217;re probably looking for IPC rather than in-process extensibility. All this said, we don&#8217;t need too much extensibility. Our purpose is to edit code, not to surf the web or psychoanalyze-pinhead.</p>
<p>We want <strong>instant </strong><strong>access to relevant documentation</strong>, regardless of the language or library we are using. Take us to the right web page and let us easily search our documentation sets.</p>
<p>We want <strong>true grammar-based language tools</strong>. Naive syntax highlighting can only take us so far. If we hover over an identifier, our editor should know that it is the name of a class and not just an arbitrary blob of text to color blue. We want an editor that gracefully handles files that contain PHP, JavaScript, CSS, and HTML all in one. We want intellisense that is aware both of our language and our libraries in context.</p>
<p>We want <strong>a navigation superstar</strong>. With deep language support comes potential for radical new navigation strategies. We want to bounce around our code with reckless abandon. How code is spread across files should not be important to us; file structure could potentially be a matter of policy.</p>
<p>We want <strong>large and remote file support</strong>. We work with enormous log files. We work with remote installations. Why is this so difficult in 2009? We want overall network awareness in our editor.</p>
<p>We want it to be <strong>open source</strong>, because we never again want to be abandoned by a false prophet.</p>
<p>Dear Editor Gods: that is all we ask. Is it so much? Will you hear our prayer?</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/05/14/dear-osx-editor-gods/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Cocoa, Sync, and AppEngine</title>
		<link>http://davepeck.org/2009/05/06/cocoa-sync-and-appengine/</link>
		<comments>http://davepeck.org/2009/05/06/cocoa-sync-and-appengine/#comments</comments>
		<pubDate>Thu, 07 May 2009 01:53:10 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[appengine]]></category>

		<category><![CDATA[cocoa]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[osx]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=637</guid>
		<description><![CDATA[The latest edition of Daniel Jalkut and Manton Reece&#8217;s excellent Core Intuition podcast discusses &#8220;sync&#8221; as a general infrastructure problem.
Apple has a great sync story called MobileMe. It allows mail, calendar appointments, contacts, and a few other things to automatically sync via the cloud. Alas, Apple offers no public synchronization API. Apple&#8217;s home-grown apps sync up over [...]]]></description>
			<content:encoded><![CDATA[<p>The latest edition of <a href="http://www.red-sweater.com/blog/">Daniel Jalkut</a> and <a href="http://www.manton.org/">Manton Reece</a>&#8217;s excellent <a href="http://www.coreint.org/">Core Intuition podcast</a> discusses &#8220;sync&#8221; as a general infrastructure problem.</p>
<p>Apple has a great sync story called <a href="http://me.com/">MobileMe</a>. It allows mail, calendar appointments, contacts, and a few other things to automatically sync via the cloud. Alas, Apple offers no public synchronization API. Apple&#8217;s home-grown apps sync up over MobileMe; Cocoa developers are left stranded, forced to &#8220;roll their own&#8221; sync solution.</p>
<p><span id="more-637"></span></p>
<h3>Many Sync, Much Headache</h3>
<p>As a result, the Mac software world is littered with disjoint sync strategies. Often, these hand-rolled strategies aren&#8217;t so great. To pick one example: <a href="http://culturedcode.com/">Cultured Code</a> makes a beautiful task management tool called <a href="http://culturedcode.com/things/">Things</a> which runs on both OSX and the iPhone. I use Things every day to manage my tasks and its sync behavior is my nemesis. In order to sync, I&#8217;ve got to remember to open up Things Touch before I leave home. Only if my phone and laptop are on the same network &#8212; and only if they&#8217;re both powered up and running Things &#8212; will my data get synchronized. If I run out the door for a meeting and forget to synchronize, I&#8217;m sunk.</p>
<p>I can understand why Cultured Code designed their sync system this way. It makes elegant use of Apple&#8217;s local area networking technologies and side-steps the problem of needing to maintain an intermediate service to pass data between app instances.</p>
<p>If you&#8217;re a die-hard Cocoa developer, the thought of building a scalable and reliable web back-end might just be daunting &#8212; daunting enough to cut it out entirely. I&#8217;ve noticed a strong resistance in the Cocoa community to building such things.<br />
<h3>Think About Money</h3>
<p>Enter <a href="http://appengine.google.com/">AppEngine</a>. AppEngine makes scalable + reliable back-end development extremely cost effective. You write some code; you deploy it in Google&#8217;s data centers; with little to no work on your part, you get a back-end that can handle far more traffic than you&#8217;ll ever see, and which will exhibit far better uptime than you could likely arrange for elsewhere.</p>
<p>Maintaining AppEngine applications is nothing at all like maintaining custom web deployments. You upload your code and check the AppEngine dashboard every once in a while to see how things are running. There is no need to play system administrator; no need to patch systems or tweak network configurations, etc.</p>
<p>Best of all, AppEngine has a <a href="http://code.google.com/appengine/docs/billing.html">freemium pricing model</a>. Below a certain amount of usage, AppEngine is entirely free. After that, you pay as you go. For an indie OSX developer, this means that when you&#8217;ve just launched your product, your back-end fees will be $0 &#8212; a price that&#8217;s hard to argue with. My guess is that for many products &#8212; even moderately successful products &#8212; the monthly cost will remain $0. </p>
<p>If your product really takes off, back-end fees will scale with your user base. If you price your product carefully, you should have no problem covering your monthly AppEngine costs for many years to come. For example, let&#8217;s say Cultured Code stored <strong>all</strong> of my task data inside an AppEngine instance. My data weighs in at a hefty 13MB, which would cost Cultured Code exactly $0.02 <strong>per year</strong> to host. I think they can recover those costs, even if I remain a user for the next decade!</p>
<h3>Think About Features</h3>
<p>It&#8217;s not just economics: from a feature and technology standpoint, AppEngine dovetails well with the Cocoa sync problem.</p>
<p>In order to make scalability as simple as possible, AppEngine is a severely restrictive platform. Your AppEngine code must be strictly request/response. Individual responses must happen rapidly. You can&#8217;t use a relational database, but you can use a highly scalable property-value store. All transactions must run over HTTP.</p>
<p>It turns out that these restrictions are no obstacle to building a solid sync service; if anything, they&#8217;ll help you design it right the first time. It makes sense, especially in the iPhone world, to communicate with your back-end via HTTP (and in all probability, <a href="http://developer.apple.com/documentation/Cocoa/Conceptual/URLLoadingSystem/Tasks/UsingNSURLConnection.html">NSURLConnection</a>.) It&#8217;s simple in both Python and Objective-C to work with JSON, so it should be simple to get your data transported across with a minimum of fuss. Once your data reaches AppEngine, you can dump it into the property store as a blob. There&#8217;s probably no reason for your back-end to need to know about the structure and format of that data.</p>
<p>What&#8217;s best is that your AppEngine back-end will always be there, ready to sync user content as soon as your front-end software requests it. And when iPhone OS 3.0 and push notification go mainstream, AppEngine will be the perfect environment from which to manage them, too.</p>
<h3>The Missing Piece</h3>
<p>All that&#8217;s missing, of course, is a library to actually perform the synchronization. This seems like an Open Source effort just waiting to happen. There would have to be three pieces:</p>
<ol class="actual_list">
<li>A Python/AppEngine back-end that developers can easily deploy with little or no configuration on their part</li>
<li>A Objective-C front-end that would make it extremely easy to communicate NSData and various NSCollection objects with the AppEngine back-end. You would of course want to tag this data with unique IDs and you&#8217;ll need hooks for performing custom conflict resolution, but it&#8217;s probably not a terribly complex API.</li>
<li>A one-time-only mechanism for pairing disparate instances of the application together. An easy solution would be to let this take place over the user&#8217;s LAN, round-tripping the necessary tokens through the back-end service after pairing is complete. A more involved solution would be to actually have user accounts on your back-end service. I imagine the easy solution is good for 85% of the applications out there &#8212; it would certainly be sufficient for Things!</li>
</ol>
<p>So there you have it. I admit this is nowhere near fully baked yet, but I believe that if you let your back-end have no knowledge of your data (beyond &#8220;here it is&#8221;) you can go a long way without too much complexity. It seems that Cocoa+AppEngine+sync is a beautiful world indeed. Anyone up for rolling up their sleeves and writing some code?</p>
<hr />
<p><em>With apologies to Cultured Code, who make great products that I use every day and heartily recommend!</em></p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/05/06/cocoa-sync-and-appengine/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Speaking At Google I&#124;O</title>
		<link>http://davepeck.org/2009/04/29/speaking-at-google-io/</link>
		<comments>http://davepeck.org/2009/04/29/speaking-at-google-io/#comments</comments>
		<pubDate>Wed, 29 Apr 2009 20:11:07 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[conference]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[IO]]></category>

		<category><![CDATA[speaking]]></category>

		<category><![CDATA[Walk Score]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=633</guid>
		<description><![CDATA[I&#8217;m speaking this year at Google I&#124;O in San Francisco.
I&#8217;ll be there with my friends Jesse and Josh; we&#8217;re going to talk about building highly scalable applications using Google AppEngine and Amazon&#8217;s Web Services. Jesse, Josh, and I built the Walk Score API using AppEngine, EC2, and S3. The API gets tens of millions of [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m speaking this year at <a title="Our talk is &quot;AppEngine Nitty Gritty&quot;" href="http://code.google.com/events/io/speakers.html">Google I|O</a> in San Francisco.</p>
<p>I&#8217;ll be there with my friends <a title="Under Construction!" href="http://www.kersploosh.com/">Jesse</a> and <a title="Umbrella Consulting was a much more appropriate name when Josh lived in Seattle." href="http://umbrellaconsulting.com/">Josh</a>; we&#8217;re going to talk about building highly scalable applications using Google AppEngine and Amazon&#8217;s Web Services. Jesse, Josh, and I built the <a title="Promoting Urban Walkability Since 2008!" href="http://walkscore.com/">Walk Score</a> API using AppEngine, EC2, and S3. The API gets tens of millions of daily hits from big-name customers like <a title="Awesome integration." href="http://www.zillow.com/">Zillow</a> and <a title="Cool integration too, but hard to find..." href="http://www.redfin.com/">Redfin</a>. Best of all, it costs pennies to maintain.</p>
<p>We&#8217;re looking forward to meeting you there. We promise fireworks and/or leprechauns at our talk!</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/04/29/speaking-at-google-io/feed/</wfw:commentRss>
		</item>
		<item>
		<title>iPhone Scrolling Dynamics</title>
		<link>http://davepeck.org/2009/04/23/iphone-scrolling-dynamics/</link>
		<comments>http://davepeck.org/2009/04/23/iphone-scrolling-dynamics/#comments</comments>
		<pubDate>Fri, 24 Apr 2009 00:47:10 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[code]]></category>

		<category><![CDATA[hacks]]></category>

		<category><![CDATA[iphone]]></category>

		<category><![CDATA[opensource]]></category>

		<guid isPermaLink="false">http://davepeck.org/2009/04/23/iphone-scrolling-dynamics/</guid>
		<description><![CDATA[I&#8217;ve written some code that reproduces the flick-to-scroll dynamics that you typically find on the iPhone. What&#8217;s useful about this code is that it is independent of coordinate system and can easily be nested in a custom view class of your choosing. 
The iPhone&#8217;s default flick-to-scroll behavior is interesting. If you hold your finger down [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve written some code that reproduces the flick-to-scroll dynamics that you typically find on the iPhone. What&#8217;s useful about this code is that it is independent of coordinate system and can easily be nested in a custom view class of your choosing. </p>
<p>The iPhone&#8217;s default flick-to-scroll behavior is interesting. If you hold your finger down for a long time and move it in a variety of directions, you&#8217;ll see that only the very last direction is used to compute the scrolling motion. </p>
<p>If you try to build this code yourself, however, you&#8217;ll quickly discover that simply using the last two points to compute the direction of motion isn&#8217;t going to cut it. Instead, my code keeps a short history of touches and uses linear interpolation to determine where the touch &#8220;would have been&#8221; some small amount of time ago. This interpolated point is used as the basis for computing the motion vector. This leads to a very pleasing interaction.</p>
<p>The code is available on github, here: <a href="http://gist.github.com/100855">http://gist.github.com/100855</a>. It is released under the BSD license.</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/04/23/iphone-scrolling-dynamics/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Javascript Needs Batteries</title>
		<link>http://davepeck.org/2009/04/17/javascript-needs-batteries/</link>
		<comments>http://davepeck.org/2009/04/17/javascript-needs-batteries/#comments</comments>
		<pubDate>Fri, 17 Apr 2009 23:51:28 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[coding]]></category>

		<category><![CDATA[javascript]]></category>

		<category><![CDATA[languages]]></category>

		<category><![CDATA[rants]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=607</guid>
		<description><![CDATA[I&#8217;ve been building rich web applications for quite some time now. These days, my back-end code is written in Python or Ruby and my front-end code is written in JavaScript.
As I build more sites, two important patterns have come to light:
1. I implement model classes on both the front and back ends. This allows me [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;ve been building rich web applications for quite some time now. These days, my back-end code is written in Python or Ruby and my front-end code is written in JavaScript.</p>
<p>As I build more sites, two important patterns have come to light:</p>
<p>1. I implement model classes on both the front and back ends. This allows me to manipulate my models wherever it&#8217;s most appropriate; for cool AJAX features, this is usually on the front-end.</p>
<p>As a result, I am forced to implement the same class &#8212; for example, a class that represents a user or the state of a game &#8212; in two different languages. I then have to do the work of marshalling model data between the back-end and front-end. Right now my marshalling is often one-off, but it occurs to me that this really shouldn&#8217;t be the case. It also occurs to me that it would be a lot more desirable to just implement each model once, in JavaScript.</p>
<p>2. Much the same: sometimes I generate large blobs of HTML on the server side; sometimes I need to generate the same blobs of HTML dynamically on the client side. </p>
<p>A typical example is a contact list. Depending on the size, it might be desirable to generate HTML for known contacts on the server side. But when you add a contact you probably do so via AJAX calls, which means you need to dynamically generate that same HTML blob via JavaScript. There are plenty of approaches to this problem, of course &#8212; you might decide to always dynamically generate on the client side, or you might have the server return some HTML in response to an AJAX call (yuck!) &#8212; but the cleanest approach would certainly be: write the generating code once and use it everywhere.</p>
<h3>Batteries</h3>
<p>I am aware of some template languages that approximate a solution to my second problem. Most recently, the <a title="Pretty clever, that." href="http://json-template.googlecode.com/svn/trunk/doc/Introducing-JSON-Template.html">json-template library</a> made a bit of a splash. None of the libraries I&#8217;ve evaluated so far seem to capture the full problem.</p>
<p>And my first and frankly more pressing problem? I&#8217;ve seen no solutions whatsoever.</p>
<p>These thoughts have led me to believe that JavaScript <em>should</em> be the next big language. The obstacle, of course, is that while JavaScript works pretty well inside a browser, outside of a browser it is largely a naked language. What is a scripting language without the ability to talk to a database, fetch a URL, access files on disk, or interoperate with web servers? Heck, what is a scripting language without a basic system for defining and importing modules?</p>
<p>For these reasons, JavaScript is currently a non-starter on the back-end. I&#8217;m hopeful that someone will take up the mantle and build both the batteries &#8212; the APIs that server-side JavaScript so desperately needs &#8212; and the standards for those batteries so that we have one language with one library, rather than many.</p>
<p>I should mention that I don&#8217;t think server-side JavaScript APIs need to look anything like client-side JavaScript APIs, though there would certainly be some crossover &#8212; DOM APIs belong on both sides, for example. I would look to the Python and Ruby worlds for inspiration about what sorts of APIs JavaScript needs before it can become the one language to rule them all.</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/04/17/javascript-needs-batteries/feed/</wfw:commentRss>
		</item>
		<item>
		<title>In Memoriam</title>
		<link>http://davepeck.org/2009/04/08/in-memoriam/</link>
		<comments>http://davepeck.org/2009/04/08/in-memoriam/#comments</comments>
		<pubDate>Wed, 08 Apr 2009 22:11:21 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[erik hunter]]></category>

		<category><![CDATA[friends]]></category>

		<category><![CDATA[memento mori]]></category>

		<category><![CDATA[memoriam]]></category>

		<category><![CDATA[RIP]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=566</guid>
		<description><![CDATA[It has been a year since my good friend Erik Hunter died of cancer. 
Erik played the trombone with my jazz quintet &#8212; now, alas, a quartet. He also directed the Cascadia Jazz Big Band, an extremely talented and fun group of musicians here in the Seattle area. I miss his trombone&#8217;s sorrowful tones and his somewhat [...]]]></description>
			<content:encoded><![CDATA[<p>It has been a year since my good friend Erik Hunter died of cancer. </p>
<p>Erik played the trombone with my jazz quintet &#8212; now, alas, a quartet. He also directed the Cascadia Jazz Big Band, an extremely talented and fun group of musicians here in the Seattle area. I miss his trombone&#8217;s sorrowful tones and his somewhat embarrassing taste for cheesy Bossa Novas.</p>
<p>If music was half of Erik&#8217;s life, biking was the other. In 2006, when I undertook the Seattle to Portland bike ride, it was Erik more than anyone else who encouraged (okay, forced) me to keep up with my training. I can&#8217;t count the number of Saturday mornings he called at 6AM and said &#8220;dammit, if you&#8217;re not on the trail yet, how are you and I going to to get 100 miles done in time for drinks?&#8221;</p>
<p><img style="border: 0.4em solid #383838" title="Erik, Me, Brent, Andrew, and Ian -- after a cold and wet bike ride around Bainbridge Island" src="/files/images/chilly-hilly-good.jpg" alt="Erik, Me, Brent, Andrew, and Ian -- after a cold and wet bike ride around Bainbridge Island" /></p>
<p style="font-size: x-small; font-weight: bold">Erik, Me, Brent, Andrew, and Ian after a cold and wet bike ride around Bainbridge Island</p>
<p>In addition to being downright disrespectful of my weekend sleeping habits, Erik had a knack for mooching food whenever possible. If I brought dinner to Wednesday night jazz practice, Erik generally yoinked half of it while I wasn&#8217;t looking &#8212; unless, of course, it was fast food. He held his nose up at that.</p>
<p><span id="more-566"></span></p>
<p>One Wednesday night in early 2008, Erik came to jazz practice but sat it out. He said he was unusually short of breath. A week later, Erik said he had coughed up a little blood and didn&#8217;t feel terribly well. We encouraged (okay, forced) him to go see a doctor. Two weeks after that, Erik returned with the news: he had an unusual form of cancer that had already reached Stage IV. It had metastasized and spread just about everywhere in his body. There was apparently nothing that modern medicine could do.</p>
<p>Things moved quickly after that. The next time I saw Erik, he had to use portable oxygen tanks. I drove him to the Safeway to pick up a few things. When he caught a woman staring at him and his tanks in the checkout line, he turned around and barked in the sarcastic way that only he could muster: &#8220;What, you&#8217;ve never seen a dead man before?&#8221; </p>
<p>A few weeks later when I visited, Erik was bed-ridden. He had good care in his house and friends were visiting round-the-clock. But he was already clearly weak. We listened to his favorite latin jazz recordings and he told me something I&#8217;ll never forget, so out of character was it for him: &#8220;I&#8217;m okay with it now. I&#8217;m going to die. The world won&#8217;t miss me and it will get along just fine without me. In fact, I guess that&#8217;s the tragic secret to life. Each of us dies in turn, and it doesn&#8217;t matter. But somehow the whole game of life keeps moving forward.&#8221; Later he added: &#8220;Oh, if you see any religious types heading my way &#8212; turn &#8216;em back. I&#8217;ve got no need for that bullshit.&#8221;</p>
<p>Two weeks later I saw Erik for the last time. He didn&#8217;t answer when I knocked so I walked in to find him sleeping. I woke him up to say hi. He looked confused. We talked for a minute or two until his nurse arrived. Erik immediately sat up, pointed at me, and shouted. &#8220;This man has been in my house. He keeps talking to me. I don&#8217;t know him. Get him out. Get him out!&#8221; He looked terrified. The heavy dose of pain-relieving drugs he was taking had made him disoriented. At the nurse&#8217;s request, I left &#8212; a little shaken.</p>
<p>Erik&#8217;s funeral was exactly as it should have been. We gathered at the local church where his big band practiced. After saying a few words about Erik, most of them sarcastic, his band played for several hours. Our quintet also played his favorite tunes. After the service, many of the musicians stayed on to hold a late-night jam session.</p>
<p>This Saturday we&#8217;re going to get everyone together again to remember Erik. There will be music, food mooching, and Alaskan Ambers. I only wish he would be there to help us keep the party going.</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/04/08/in-memoriam/feed/</wfw:commentRss>
		</item>
		<item>
		<title>Finding Our Roots, Again</title>
		<link>http://davepeck.org/2009/03/01/forgetting-our-roots-again/</link>
		<comments>http://davepeck.org/2009/03/01/forgetting-our-roots-again/#comments</comments>
		<pubDate>Sun, 01 Mar 2009 19:56:17 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[bubbles]]></category>

		<category><![CDATA[civic good]]></category>

		<category><![CDATA[gold rushes]]></category>

		<category><![CDATA[history]]></category>

		<category><![CDATA[rants]]></category>

		<category><![CDATA[roots]]></category>

		<category><![CDATA[social progress]]></category>

		<category><![CDATA[software]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=423</guid>
		<description><![CDATA[The early days of the personal computer revolution were littered with countercultural thinkers.
By name, they were Ted Nelson, who penned and hand-published the still-prescient Computer Lib/Dream Machines; Mitch Kapor, who named his startup Lotus and later founded the Electronic Frontier Foundation; Ray Ozzie and Dan Bricklin, who saw artistry in software and conceived of the [...]]]></description>
			<content:encoded><![CDATA[<p>The early days of the personal computer revolution were littered with countercultural thinkers.</p>
<p>By name, they were <a title="A luminary, but it must be stated that he's just this side of insane. See also: Xanadu." href="http://en.wikipedia.org/wiki/Ted_Nelson">Ted Nelson</a>, who penned and hand-published the still-prescient <a title="Every time I open my copy, I find another new gem. Nelson was the Nostradamus of the computer age, only his predictions were a twinge more concrete." href="http://www.digibarn.com/collections/books/computer-lib/">Computer Lib/Dream Machines</a>; <a title="In which New Age meets Ones and Zeros" href="http://en.wikipedia.org/wiki/Mitch_Kapor">Mitch Kapor</a>, who named his startup <a title="Rest In Peace" href="http://en.wikipedia.org/wiki/Lotus_Software">Lotus</a> and later founded the <a title="Not that I agree with all of their positions or politics, but it's good to know they're out there." href="http://www.eff.org/">Electronic Frontier Foundation</a>; <a title="At the 2006 Microsoft company meeting, Ray put the covers of &quot;Computer Lib/Dream Machines&quot; up on the big screen at SafeCo Field. Until that moment, my co-workers seemed to think I was crazy for making those the only two books sitting on my office bookshelf." href="http://www.microsoft.com/presspass/exec/ozzie/">Ray Ozzie</a> and <a title="Still &quot;the guy who invented visicalc.&quot;" href="http://www.bricklin.com/">Dan Bricklin</a>, who saw <a title="A cool name that could only have been spawned in the People's Republic Of Cambridge" href="http://en.wikipedia.org/wiki/Software_Arts">artistry in software</a> and conceived of the <a title="You can actually still download the VisiCal binary from Bricklin's website. As it turns out, VisiCalc 2.0 was 21k in size. That's smaller than an ICON today!" href="http://en.wikipedia.org/wiki/VisiCalc">spreadsheet</a>; <a title="His Long Now Foundation makes me think that perhaps humanity has reached its early 30s. I hope Brand also takes up digital longevity as a cause. It's a rather difficult one, and if nothing else knowing that my online presense could survive after my death would sooth my mortal ego." href="http://en.wikipedia.org/wiki/Stewart_Brand">Stewart Brand</a>, who dazzled with his <a title="Stay Hungry. Stay Foolish." href="http://en.wikipedia.org/wiki/Whole_Earth_Catalog">Whole Earth Catalog</a>; <a title="Seriously cool hardware, dude." href="http://en.wikipedia.org/wiki/Danny_Hillis">Danny Hillis</a>, who dreamed of <a title="I just tried to telnet to quake.think.com. Alas, no such luck in 2009." href="http://en.wikipedia.org/wiki/Thinking_Machines">Thinking Machines</a>; <a title="Well, he grasped the perils of intellectual property, but I'm not convinced he reached the right conclusions. That said, I still picture him dancing a waltz with CmdrTaco at the 2000 LinuxWorld Slashdot afterparty. It's an image burned into my retinas, and not necessarily in a pleasant way." href="http://www.stallman.org/">Richard Stallman</a>, who grasped the perils of intellectual property long before others; and perhaps even <a title="I did say *perhaps*, did I not? It's never clear that Jobs has anyone but himself at heart." href="http://en.wikipedia.org/wiki/Steve_Jobs">Steve Jobs</a>, who drew inspiration from Buddhist philosophy and calligraphy.</p>
<p>These bohemians shared an excitement that software and inexpensive computer hardware could liberate the masses &#8212; that it could free the oppressed from tyranny, provide education and opportunity for the underprivileged, and connect disparate peoples as never before.</p>
<p>Fast forward to today. The industry grew up, and so did its bohemians. Through their work, many became luminaries and titans of industry. They crafted a new, nearly trillion dollar market sector. Along the way, a new generation &#8212; mine &#8212; arrived, born at a lucky time when software was young but <em>some</em> trails had been blazed. When we left college, money grew on trees. In early 2000, we started dot com after countless dot com. The bubble burst; we forgot the lessons; we created a new bubble with Web 2.0. Things are even harder now, but at least there&#8217;s iFart.</p>
<p>Have we forgotten our roots? This thing isn&#8217;t about get-rich-quick; it isn&#8217;t even about get-rich-slowly. [1] It&#8217;s about empowering people and improving their lives. It&#8217;s okay, of course, to do this in a small incremental fashion. But our progenitors in this industry weren&#8217;t interested in incrementalism. They saw the potential for a radical break from the past. In many ways, it doesn&#8217;t seem that their original vision has been met. Perhaps most sadly, some of the best of them ended up hawking beautiful but ultimately unimportant gadgets &#8212; selling sugar water when they wanted to make a dent in the universe.</p>
<p>This is why I&#8217;ve been excited to learn, lately, of a handful of startups in Seattle whose goal appears to be &#8220;improve people&#8217;s lives.&#8221; Some even have unusual corporate structures that combine the advantages of for-profit and non-profit organizations under one umbrella. One of my clients, <a title="Just down the street from me." href="http://www.frontseat.org/">Front Seat</a>, has the stated goal of building Civic Software: software that enables or enhances aspects of neighborly life. Startups like Front Seat are not strictly green, but they&#8217;re qualitatively similar. They have an abiding belief, as did many of the industry&#8217;s original bohemians, that many of the problems we think of as social are in fact amenable to software solutions. With <a title="More cool stuff coming. See github/bmanders" href="http://www.walkscore.com/">Walk Score</a>, we learned that you don&#8217;t have to be an urban planner to have a positive impact on urban planning. Imagine what change might be unleashed if the hordes of &#8220;crap app&#8221; developers saw their industry and their world in this light.</p>
<p>&#8212;&#8212;</p>
<p>[1] I do not have a problem with getting rich quick. I do, however, worry when vast numbers of people devote their time to getting rich quick who could otherwise have solved pressing problems and engendered positive long-term change. We&#8217;ve had gold rushes before, of course, and we&#8217;ll have them again. But, on average, the people who benefit most from a gold rush are the merchants who sell shovels.</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/03/01/forgetting-our-roots-again/feed/</wfw:commentRss>
		</item>
		<item>
		<title>A &#8220;Go&#8221; Update</title>
		<link>http://davepeck.org/2009/02/20/a-go-update/</link>
		<comments>http://davepeck.org/2009/02/20/a-go-update/#comments</comments>
		<pubDate>Sat, 21 Feb 2009 02:09:17 +0000</pubDate>
		<dc:creator>Dave Peck</dc:creator>
		
		<category><![CDATA[blog]]></category>

		<category><![CDATA[appengine]]></category>

		<category><![CDATA[github]]></category>

		<category><![CDATA[go]]></category>

		<category><![CDATA[google]]></category>

		<category><![CDATA[hacks]]></category>

		<guid isPermaLink="false">http://davepeck.org/?p=529</guid>
		<description><![CDATA[My game of go for AppEngine is now open-source and available on GitHub.
I wrote the game partly for fun, and partly so that I&#8217;d have some meaty AppEngine example code to show people during my talk. It was a &#8220;weekend hack,&#8221; although I&#8217;ve tacked another ~12 hours onto that weekend to add support for chat [...]]]></description>
			<content:encoded><![CDATA[<p>My <a title="Dave Peck's Go" href="http://go.davepeck.org/">game of go</a> for AppEngine is now open-source and <a title="Source code for Dave Peck's Game of Go" href="http://github.com/davepeck/appengine-go/">available on GitHub</a>.</p>
<p>I wrote the game partly for fun, and partly so that I&#8217;d have some meaty AppEngine example code to show people during my talk. It was a &#8220;weekend hack,&#8221; although I&#8217;ve tacked another ~12 hours onto that weekend to add support for chat and history views.</p>
<p>I chose a very restrictive license, the <a title="GNU Affero GPL v3" href="http://www.fsf.org/licensing/licenses/agpl-3.0.html">GNU Affero GPLv3</a>. It turns out that my service is being used &#8212; a lot &#8212; and I want to make sure all similar services are forced to share their improvements with the world. I&#8217;m hoping that <a title="Dave Peck's Go" href="http://go.davepeck.org/">http://go.davepeck.org/</a> will remain the definitive version of the site. With a little work, perhaps it could become the definitive place to play Go on the Internet.</p>
]]></content:encoded>
			<wfw:commentRss>http://davepeck.org/2009/02/20/a-go-update/feed/</wfw:commentRss>
		</item>
	</channel>
</rss>
