<?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/"
	xmlns:slash="http://purl.org/rss/1.0/modules/slash/"
	>

<channel>
	<title>Thought Palace &#187; Web</title>
	<atom:link href="http://jens.mooseyard.com/category/web/feed/" rel="self" type="application/rss+xml" />
	<link>http://jens.mooseyard.com</link>
	<description>Little boxes made of words, by Jens Alfke</description>
	<lastBuildDate>Tue, 09 Feb 2010 17:58:43 +0000</lastBuildDate>
	<generator>http://wordpress.org/?v=2.9.2</generator>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
			<item>
		<title>Re: Idea for alternative RSS syncing system</title>
		<link>http://jens.mooseyard.com/2010/02/re-idea-for-alternative-rss-syncing-system/</link>
		<comments>http://jens.mooseyard.com/2010/02/re-idea-for-alternative-rss-syncing-system/#comments</comments>
		<pubDate>Tue, 09 Feb 2010 17:57:10 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Peer-to-Peer]]></category>
		<category><![CDATA[Social Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jens.mooseyard.com/?p=392</guid>
		<description><![CDATA[Brent "NetNewsWire" Simmons raises the idea of "an open protocol (and open source server) for syncing RSS/Atom subscriptions":http://inessential.com/2010/02/08/idea_for_alternative_rss_syncing_system, that is, a way of keeping multiple local newsreader apps (like on a Mac and an iPhone) in sync with each other, so that they share the same set of subscribed feeds, and remember which articles have already been read. You can think of it as "IMAP for RSS".

NetNewsWire already does this using Google Reader, and Apple's PubSub framework (which is what Safari and Mail use) shares the read/unread state using MobileMe. But it would be nice to have an open protocol.

I have some experience with this, having implemented the sync system used by PubSub. It's an interesting problem -- you might think I would have just used Apple's SyncServices, and it's true that it would have worked great for the subscription list, but it doesn't scale well to huge numbers of rapidly-changing "read/unread" flags.

I have two suggestions (which I would have made on Brent's blog, except he doesn't allow comments anymore.)]]></description>
			<content:encoded><![CDATA[	<p>Brent &#8220;NetNewsWire&#8221; Simmons raises the idea of <a href="http://inessential.com/2010/02/08/idea_for_alternative_rss_syncing_system" title="">an open protocol for syncing <span class="caps">RSS</span>/Atom subscriptions</a>, that is, a way of keeping multiple local newsreader apps (like on a Mac and an iPhone) in sync with each other, so that they share the same set of subscribed feeds, and remember which articles have already been read. You can think of it as &#8220;IMAP for <span class="caps">RSS</span>&#8221;.</p>

	<p>NetNewsWire already does this using Google Reader as an intermediary, and Apple&#8217;s PubSub framework (which is what Safari and Mail use) shares the read/unread state using MobileMe. But it would be nice to have an open protocol.</p>

	<p>I have some experience with this, having implemented the sync system used by PubSub. It&#8217;s an interesting problem&#8212;you might think I would have just used Apple&#8217;s SyncServices, and it&#8217;s true that it would have worked great for the subscription list, but it doesn&#8217;t scale well to huge numbers of rapidly-changing &#8220;read/unread&#8221; flags.</p>

	<p>I have two suggestions (which I would have made on Brent&#8217;s blog, except he doesn&#8217;t allow comments anymore.)</p>

	<h2>CouchDB</h2>

	<p><a href="http://couchdb.apache.org" title="">CouchDB</a> is an awesome web-centric database engine. It doesn&#8217;t use <span class="caps">SQL</span>; instead, it&#8217;s a glorified key-value store whose values are arbitrary <span class="caps">JSON</span> objects, and which uses map-reduce for efficient querying. The basic <span class="caps">API</span> is pure <span class="caps">REST</span>, though glue libraries for many languages exist.</p>

	<p>CouchDB natively supports syncing data through distributed groups of servers. It&#8217;s sort of like the way distributed version-control systems like Git or Mercurial work: multiple CouchDB instances each store a replica of the same data set, but can &#8220;pull&#8221; changes from each other over <span class="caps">HTTP</span> to stay in sync.</p>

	<p>CouchDB is pretty lightweight and is already being used on the desktop by client apps: <span class="caps">GNOME</span> has been <a href="https://launchpad.net/desktopcouch" title="">integrating it into the Linux desktop</a> to use as a shared store for user data like contacts and bookmarks. It plays a similar role to SyncServices on Mac OS, but it&#8217;s all open source and any two instances can sync with each other instead of requiring a proprietary server. I hear this is already shipping in the latest Ubuntu releases.</p>

	<p>It doesn&#8217;t look as though anyone&#8217;s designed a schema for storing <span class="caps">RSS</span> subscriptions this way, but it would be pretty easy to define one. You then need a local agent running CouchDB (it can be stripped down to be pretty small), a client library for Cocoa apps, and an upstream CouchDB server to sync to.</p>

	<h2><span class="caps">REST</span>-Logging</h2>

	<p>This protocol is similar to what I came up with for PubSub. It&#8217;s a simple extension of <a href="http://en.wikipedia.org/wiki/Representational_State_Transfer" title=""><span class="caps">REST</span></a>, but I haven&#8217;t heard of it being used elsewhere. The idea is that you model an append-only log file as an <span class="caps">HTTP</span> resource. The items that are logged are &#8216;events&#8217; describing changes in the data model, in this case the subscriptions and articles.</p>

	<p>The sync algorithm looks like this:</p>

	<ol>
		<li>Download all the data that&#8217;s been added to the remote log file since your last sync. Remember the file&#8217;s ETag.</li>
			<li>Parse that data into a sequence of log entries, and process them in order. Each entry names a model object (feed or article) and an action (subscribe, unsubscribe, mark read, mark unread). Apply those changes to the local data store.</li>
			<li>Query your local data store to find all the changes that have been made since your last sync. <em>Ignore</em> the remote changes you just applied in the previous step, and also any earlier local changes that duplicate a remote change (like marking the same article as read.)</li>
			<li>Generate a series of log entries for those changes and concatenate them into a data blob.</li>
			<li>Upload that blob, appending it to the remote log file. Remember the resulting ETag. In case of a conflict (someone else has changed the remote file since step 1), toss out the blob and return to step 1.</li>
	</ol>

	<p>You can think of the log file as a queue or message stream that&#8217;s being collaboratively read and written by all of the clients. This sounds like something you&#8217;d need a fancy web-app to manage, but it turns out that all it takes is a typical <span class="caps">HTTP 1</span>.1 server and a trivial server-side script.</p>

	<p>The download is a conditional <span class="caps">GET</span>, as used for fetching feeds themselves. The difference is that you use a &#8220;Range:&#8221; header to request <em>only the bytes past the last known <span class="caps">EOF</span></em>. For example, if the last time you read the log it was 123456 bytes long, you add the header &#8220;Range: 123456-&#8221; to the request. This ensures that you only get back the new bytes that were added to the end. (And since this is a conditional <span class="caps">GET</span>, if the file hasn&#8217;t changed at all you just get back an empty 304 response.)</p>

	<p>That&#8217;s all you need to do to track changes. Since the file is append-only, the only bytes you need to read are the ones added to the end. This request efficiently sends you just those bytes.</p>

	<p>What&#8217;s cool is that this require <em>no server-side software</em>. If the log is a static file, any regular <span class="caps">HTTP</span> server like Apache will automatically handle <span class="caps">GET</span> requests for it, even byte-range ones. (Ranges are already used by browsers to resume interrupted downloads.) And it sends the response at high speed, since the server&#8217;s just streaming from a file, without multiple back-and-forth requests and without expensive database queries.</p>

	<p>How about writing? Ideally you&#8217;d use the same approach, with a byte-range <span class="caps">PUT</span> that specifies that the request body should go at the end of the file. Unfortunately most servers don&#8217;t support this for static files, even though it&#8217;s basically just <span class="caps">HTTP 1</span>.1. But it&#8217;s really easy to implement. Any <span class="caps">PHP</span> crufter should be able to whip up a one-page script that simply responds to a <span class="caps">POST</span> by reading the request body and appending it to a local file (while doing the necessary ETag and range verification.) The great thing is that this script doesn&#8217;t have to know anything at all about <span class="caps">RSS</span> or subscriptions or unread counts; it&#8217;s completely generic. You can upgrade the data model without having to touch the script, and you could use the same script to sync anything, not just <span class="caps">RSS</span>.</p>

	<p>(Yes, there is a semi-obvious drawback to this protocol: the file grows without limit. Surprisingly, this is not a problem most of the time, since clients only upload or download new data; the only real limit is the maximum file size or disk quota allowed by the server. But it does present a problem for a new client, whose first-time sync would download the entire file. This can be worked around by having new clients ignore very old data (only download the latest 10MB, say) or by periodically writing a compact subscription list to a separate <span class="caps">URL</span>.)</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2010/02/re-idea-for-alternative-rss-syncing-system/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Dogfooding Chrome</title>
		<link>http://jens.mooseyard.com/2009/11/dogfooding-chrome/</link>
		<comments>http://jens.mooseyard.com/2009/11/dogfooding-chrome/#comments</comments>
		<pubDate>Sat, 07 Nov 2009 17:21:40 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://jens.mooseyard.com/?p=382</guid>
		<description><![CDATA[As everyone knows who works in the pet-food industry (or computer software for that matter), it can be hard to start eating your own dogfood. Case in point: I just this week set Chrome to be my default browser, though I've been working on it for four months now.

Partly that's because when I started in July the Mac version of Chrome was too immature; and partly it's because a web browser is something you need to have running and working all the time -- especially since the Chrome project's bug tracker and code-review tool are web-based.

But Mac Chrome is quite stable enough to use now, and as I haven't been doing much Chrome development on this MacBook Pro lately (it takes too long to compile compared to my souped-up Mac Pro) I've installed the latest dev-channel build and replaced Safari with it.]]></description>
			<content:encoded><![CDATA[	<p>As everyone knows who works in the pet-food industry (or computer software for that matter), it can be hard to start eating your own dogfood. Case in point: I just this week set Chrome to be my default browser, though I&#8217;ve been working on it for four months now.</p>

	<p>Partly that&#8217;s because when I started in July the Mac version of Chrome was too immature; and partly it&#8217;s because a web browser is something you need to have running and working all the time&#8212;especially since the Chrome project&#8217;s bug tracker and code-review tool are web-based.</p>

	<p>But Mac Chrome is quite stable enough to use now, and as I haven&#8217;t been doing much Chrome development on this MacBook Pro lately (it takes too long to compile compared to my souped-up Mac Pro) I&#8217;ve installed the latest <a href="http://dev.chromium.org/getting-involved/dev-channel" title="">dev-channel build</a> and replaced Safari with it in my Dock and as my default browser.</p>

	<p>It&#8217;s hard to get used to a new browser, after all these years. I remember that I dropped <span class="caps">IE 5</span> like a hot rock as soon as Safari became useable, but that&#8217;s because IE sucked so badly on <span class="caps">OS X </span>(as you youngsters may not remember.) But Safari is a great browser. Chrome&#8217;s great too, but in different ways, and the Mac version&#8217;s not finished yet so there are some missing bits.</p>

	<p>I should note that I generally don&#8217;t work on the user-visible parts of Chrome, rather the underlying WebKit engine; so I haven&#8217;t been focusing on the UI much, or noticing the features being added, until experiencing them as an end-user.</p>

	<p>In Chrome&#8217;s favor:</p>

	<ul>
		<li>It definitely feels faster. At work I&#8217;ve been obsessing over some micro-benchmarks, but in regular use what I notice is simply that pages come up more quickly. I think a lot of this has to do with <span class="caps">DNS</span> pre-fetching, because <span class="caps">DNS</span> query times here at home can often be slow.</li>
		<li>The UI of the tabs is better than Safari&#8217;s. I like that they take up less room (though without eliminating the title bar the way the Safari 4 beta did), and the transition animations when opening/closing/detaching tabs are extremely slick, definitely Apple-quality.</li>
		<li>The downloads shelf at the bottom of the window is more visible than Safari&#8217;s little Downloads window, which always gets hidden behind the browser.</li>
		<li>The list of recently-closed tabs at the bottom of the new-tab page is very thoughtful and handy. In general I find the new-tab page more useful than Safari&#8217;s, if less flashy.</li>
	</ul>

	<p>Rough edges (remember, this is a pre-beta build):</p>

	<ul>
		<li><span class="caps">PDF</span> display doesn&#8217;t work well. There&#8217;s no way to switch pages yet (making multi-page documents unusable), there&#8217;s no zooming, the Save command doesn&#8217;t work, and often the renderer process starts redrawing constantly and eating up <span class="caps">CPU</span> time.</li>
		<li>The only indication you have that a page is loading is the little 16&#215;16-pixel spinning circle that replaces the tab&#8217;s icon. I like the visual design of this, but it&#8217;s too hard to find. I still miss the big progress bar in the address bar from Safari 1-3. (Cursor feedback would be nice&#8212;wasn&#8217;t there a browser once that put a little wristwatch badge on the arrow cursor?)</li>
		<li>The bookmarking UI is still unfinished and unpolished. In particular, there&#8217;s no way to edit/move/delete bookmarks yet. I love the idea of being able to quickly bookmark by clicking a Google-y star icon, but in practice it pops up a floating panel for choosing a folder, which makes me think about where to put it just like Safari&#8217;s bookmark sheet does. I&#8217;d rather the star button just added it to an &#8220;Unsorted&#8221; folder that I could open and organize later.</li>
		<li>Autofill doesn&#8217;t seem to work as well as in Safari. For example, it won&#8217;t autofill login forms until I type in the username; I think this may be a security feature, but I find it annoying.</li>
	</ul>

	<p>I&#8217;ve been impressed by Chrome&#8217;s stability too, for a pre-beta development build. The app hasn&#8217;t crashed once, and I haven&#8217;t even gotten the &#8220;Oh, snap!&#8221; page that shows that a renderer process crashed. (I&#8217;ve seen plugins crash a few times, but that&#8217;s probably Flash&#8217;s fault, and as in Safari on 10.6, this doesn&#8217;t affect the browser or even the rest of the page.)</p>

	<p>One thing I&#8217;m really looking forward to is <a href="http://blog.chromium.org/2009/09/extensions-status-on-runway-getting.html" title="">extensions</a>. Safari&#8217;s a closed system, and I&#8217;ve long been envious of the plethora of cool plug-ins available for Firefox. I&#8217;m looking forward to using, and maybe <a href="http://code.google.com/chrome/extensions/index.html" title="">developing</a>, extensions for Chrome. (In the current dev channel Mac release, extensions can be installed, but the ones I&#8217;ve tried don&#8217;t do anything yet.)</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/11/dogfooding-chrome/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Career Update, Part ++n</title>
		<link>http://jens.mooseyard.com/2009/07/career-update-part-n/</link>
		<comments>http://jens.mooseyard.com/2009/07/career-update-part-n/#comments</comments>
		<pubDate>Sat, 04 Jul 2009 01:31:24 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Me]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/07/career-update-part-n/</guid>
		<description><![CDATA[	I&#8217;ve been working at Google since last August. The Big G&#8217;s hiring process is rather weird&#8212;when you interview, it&#8217;s not for any specific team. It&#8217;s only after you get an offer that you decide which team to join, of the ones with open positions.

	I decided on Google Sites, which I knew and liked from its days as JotSpot, a hosted wiki with some powerful features. It ended up not being the right place for me, for a couple of reasons:

	
		Currently, Sites&#8217; priorities are in website publishing, as a replacement for Google Page Creator (which is being phased out soon.) It&#8217;s quite good at it, but I&#8217;m less interested in that than in collaboration features.
		Google&#8217;s server-side infrastructure is really, really, really huge and complex. There is an endless landscape of internal technologies and tools&#8212;the few that have been described in public (MapReduce, BigTable, Chubby, etc.) are just the tip of the iceberg. I have discovered that I am not very interested in this kind of stuff, and I quickly became frustrated by the deluge of technologies I needed to learn to get things done.
		Running a large web service is like running a nuclear power plant or an electric power grid. It [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;ve been working at Google since last August. The Big G&#8217;s hiring process is rather weird&#8212;when you interview, it&#8217;s not for any specific team. It&#8217;s only after you get an offer that you decide which team to join, of the ones with open positions.</p>

	<p>I decided on <a href="http://sites.google.com" title="">Google Sites</a>, which I knew and liked from its days as JotSpot, a hosted wiki with some powerful features. It ended up not being the right place for me, for a couple of reasons:</p>

	<ul>
		<li>Currently, Sites&#8217; priorities are in website publishing, as a replacement for Google Page Creator (which is being phased out soon.) It&#8217;s quite good at it, but I&#8217;m less interested in that than in collaboration features.</li>
		<li>Google&#8217;s server-side infrastructure is really, really, <em>really</em> huge and complex. There is an endless landscape of internal technologies and tools&#8212;the few that have been described in public (MapReduce, BigTable, Chubby, etc.) are just the tip of the iceberg. I have discovered that I am not very interested in this kind of stuff, and I quickly became frustrated by the deluge of technologies I needed to learn to get things done.</li>
		<li>Running a large web service is like running a nuclear power plant or an electric power grid. It requires 24/7/365 monitoring, and at that scale, anything that can go wrong will go wrong, and frequently does. I do not have the right temperament for working with this, especially not when it comes to taking turns carrying a pager that wakes me up at 4AM because some service&#8217;s latency has gone above 300ms.</li>
		<li>I&#8217;ve been vocal about my frustration with centralized systems; Google&#8217;s websites are kind of the ultimate in that (even though, ironically, they&#8217;re implemented as <span class="caps">P2P</span>-like networks internally, as I believe all large web operations are today.)</li>
	</ul>

	<p>The good news is that Google encourages transfers between teams, and makes it easy to do so. The near-total transparancy inside the company makes it easy to find out everything that&#8217;s going on, and there&#8217;s a well-designed website for engineering transfers that helps you find teams that need people. I even went to an internal job fair.</p>

	<p>I&#8217;ve now ended up working on <a href="http://www.google.com/chrome" title="">Chrome</a>, Google&#8217;s web browser. The team I&#8217;m on is responsible for implementing <a href="http://www.whatwg.org/specs/web-apps/current-work/multipage/" title=""><span class="caps">HTML 5</span></a> features, as well as designing and implementing other new features (for standardization) that will help web apps become as powerful as native apps. Much of what we do will go into the WebKit source tree, where it will also directly benefit Safari, Android, the Palm Pre, and other WebKit-based browsers.</p>

	<p>In fact, everything I work on (more or less) is going to be open source. Both the WebKit and Chromium source trees are public. You can view, if you care to, <a href="http://codereview.chromium.org/151095" title="">the one patch I&#8217;ve contributed so far</a> and <a href="http://codereview.chromium.org/150188" title="">the one that&#8217;s currently out for review</a>. That&#8217;s kind of mind-blowing, in a good way, to me, steeped as I am in the secrecy of Apple.</p>

	<p>I&#8217;m pretty excited by this. There are quite a lot of things I&#8217;m interested in working on&#8212;client-side storage, local apps, drag-and-drop, better font support, menus, even far-out stuff like peer-to-peer networking. Forward in all directions!</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/07/career-update-part-n/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>What will Web 3.0 be?</title>
		<link>http://jens.mooseyard.com/2009/02/what-will-web-30-be/</link>
		<comments>http://jens.mooseyard.com/2009/02/what-will-web-30-be/#comments</comments>
		<pubDate>Mon, 16 Feb 2009 00:50:59 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Social Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/02/what-will-web-30-be/</guid>
		<description><![CDATA[	So, Web 2.0&#8217;s heyday is over, and somewhere out there, Web 3.0 is slouching toward us waiting to be born. What will it be?

	There&#8217;s really no such single thing as &#8220;Web x&#8220;, of course. And all predictions are really just wishes. That being said, my wish is that Web 3.0 will be about distributed systems. To oversimplify:

	Web 1.0 built up big brand-name websites with their own content&#8212;things written by them, or repurposed from the media companies that owned them, or stuff to buy.

	Web 2.0 embraced &#8220;user-created content&#8221; and interaction between users. The content creation has become less centralized, outsourced to whomever wants to register an account and post stuff, but the sites managing, storing and serving the content are still centralized.

	Web 3.0, I hope, will take the decentralization to the software, and the storage. Monolithic web apps run by huge server farms&#8212;Facebook, Blogger, Twitter, Flickr, etc.&#8212;will be at least in part supplanted by apps that users run locally (or at least &#8216;nearby&#8217;) and which share data among each other.

	Why is this important?

	
		Centralization creates concentrations of power, and that&#8217;s dangerous. The people who run the servers have total control over your (and everyone&#8217;s) data. They can snoop at it (however private [...]]]></description>
			<content:encoded><![CDATA[	<p>So, Web 2.0&#8217;s heyday is over, and somewhere out there, Web 3.0 is slouching toward us waiting to be born. What will it be?</p>

	<p>There&#8217;s really no such single thing as &#8220;Web <em>x</em>&#8220;, of course. And all predictions are really just wishes. That being said, my wish is that Web 3.0 will be about <em>distributed</em> systems. To oversimplify:</p>

	<p>Web 1.0 built up big brand-name websites with their own content&#8212;things written by them, or repurposed from the media companies that owned them, or stuff to buy.</p>

	<p>Web 2.0 embraced &#8220;user-created content&#8221; and interaction between users. The content creation has become less centralized, outsourced to whomever wants to register an account and post stuff, but the sites managing, storing and serving the content are still centralized.</p>

	<p>Web 3.0, I hope, will take the decentralization to the software, and the storage. Monolithic web apps run by huge server farms&#8212;Facebook, Blogger, Twitter, Flickr, etc.&#8212;will be at least in part supplanted by apps that users run locally (or at least &#8216;nearby&#8217;) and which share data among each other.</p>

	<h3>Why is this important?</h3>

	<ul>
		<li>Centralization creates concentrations of power, and that&#8217;s dangerous. The people who run the servers have total control over your (and everyone&#8217;s) data. They can snoop at it (however private it&#8217;s supposed to be), they can sell it to advertisers, they can accidentally lose it, they can accidentally expose it to hackers.</li>
	</ul>

	<ul>
		<li>Centralization leads to walled gardens. Your data on each service is intrinsically disjoint. It can be linked together, through hyperlinks and feeds and APIs and mashups, but only to the degree each service allows, and it&#8217;s never seamless.</li>
	</ul>

	<ul>
		<li>Centralized services are hard to run. The more popular they get, the heavier the demands on the servers, and the worse the problems of abuse. (I see this every day in my job, even though the service I work on is one of the smallest Google runs.) This acts as a tax on innovation. Modern frameworks like Rails and Django make it easy to create a site, but to take it beyond just you and your friends, you have to get expensive hosting and deal with server clusters, database replication and so on. The early days of 3rd-party Facebook apps were a great example of this: no sooner would an app come online, than it&#8217;d drown under the load of its users and have to be resurrected by panicked owners upgrading their servers to more-expensive hosting plans.</li>
	</ul>

	<ul>
		<li>Centralized services are usually closed-source. I&#8217;m not an open-source zealot, and I&#8217;ve spent my career working on closed-source software, but I don&#8217;t think it&#8217;s healthy for [nearly] all large web apps to keep their source code locked away. It discourages innovation and it makes it hard for open alternatives to compete (especially when you consider the huge intrinsic network effects that discourage switching.)</li>
	</ul>

	<h3>What do we need?</h3>

	<p>Decentralized systems need well-defined protocols and data formats for communicating. We&#8217;ve been making headway with that as part of Web 2.0&#8212;there&#8217;s an arsenal of technologies like <span class="caps">REST</span>, Atom, AtomPub, OpenID, OAuth, <span class="caps">RDF</span>, JSON and so on&#8212;but they&#8217;re not well integrated with each other. And we need higher level abstractions.</p>

	<p>I&#8217;ve been researching <a href="http://couchdb.apache.org" title="">CouchDB</a> this week, and I&#8217;m getting more and more excited by it the more I learn. It combines data storage, <span class="caps">REST</span>-based APIs, scalability and data propagation through replication, and even application hosting. It&#8217;s actually a lot like Google&#8217;s internal infrastructure, but in an open and modular form.</p>

	<p>You can use CouchDB as the back end of a traditional web service, glomming more and more instances of the server together for scalability; that&#8217;s the kind of architecture that Google and Amazon use. But you can also run instances independently from each other, and have them pull data from each other, very much like the way distributed version control systems like Git and Mercurial operate. As I&#8217;ve said before, once you have a decentralized system, you can easily design centralized systems of any form as special cases.</p>

	<p>Since each CouchDB instance also runs as a web server, that means I can run my social network from my machine, and you can run yours from yours, and yet they can be the <em>same</em> social network. But I can keep my private data private, and I can hack on my software if I want, and the load on my server only scales with the size of <em>my</em> friend list, no matter how big the entire global network grows.</p>

	<p>These are things I&#8217;ve been thinking of for a while (and my unfinished Cloudy app includes some of them), but CouchDB comes closer than any other software platform I&#8217;ve seen to making them implementable. It&#8217;s still unfinished (nearing version 0.9 right now), and some of the authentication and replication features that would be needed for this aren&#8217;t ready yet, but it really sounds like the people developing CouchDB Get It, and are working to make this vision of Web 3.0 come true.</p>

	<blockquote>[If this sounds interesting to you, go and read the preliminary draft of the <a href="http://books.couchdb.org/relax/" title="">upcoming O&#8217;Reilly book on CouchDB</a>. Only the first few chapters exist yet, but they&#8217;re well-written and lay out the basics pretty well.]</blockquote>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/02/what-will-web-30-be/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Lazyweb: Is there a Ruby template engine like Genshi or Kid?</title>
		<link>http://jens.mooseyard.com/2008/12/lazyweb-is-there-a-ruby-template-engine-like-genshi-or-kid/</link>
		<comments>http://jens.mooseyard.com/2008/12/lazyweb-is-there-a-ruby-template-engine-like-genshi-or-kid/#comments</comments>
		<pubDate>Sat, 20 Dec 2008 18:44:10 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/12/lazyweb-is-there-a-ruby-template-engine-like-genshi-or-kid/</guid>
		<description><![CDATA[	Ruby has a wide variety of HTML/XML templating engines, but none of the ones I&#8217;ve found work the way I&#8217;d like. It&#8217;s quite possible I&#8217;ve overlooked some, though.

	My current gold standard for templaters is the Python library Genshi (which was inspired by Kid)&#8212;what I like about these is that your templates are valid XML: the parameters and control structures are expressed as special XML attributes and tags. This makes it easy to edit your templates in syntax-checking XML editors, and guarantees that your app serves valid XML or HTML.

	But as I said, none of the Ruby template engines I&#8217;ve seen work this way. They&#8217;re all either generic macro systems that intermix markup and Ruby (like ERB), or they&#8217;re ruby APIs that output markup (like Builder, HAML and Markaby). I don&#8217;t really like either approach.

	If you&#8217;ve got a good suggestion, I&#8217;ve got a gold star ready to stick on your forehead!
 ]]></description>
			<content:encoded><![CDATA[	<p>Ruby has a wide variety of <span class="caps">HTML</span>/XML templating engines, but none of the ones I&#8217;ve found work the way I&#8217;d like. It&#8217;s quite possible I&#8217;ve overlooked some, though.</p>

	<p>My current gold standard for templaters is the Python library <a href="http://genshi.edgewall.org/" title="">Genshi</a> (which was inspired by <a href="http://kid-templating.org/" title="">Kid</a>)&#8212;what I like about these is that <em>your templates are valid <span class="caps">XML</span>:</em> the parameters and control structures are expressed as special <span class="caps">XML</span> attributes and tags. This makes it easy to edit your templates in syntax-checking <span class="caps">XML</span> editors, and guarantees that your app serves valid <span class="caps">XML</span> or <span class="caps">HTML</span>.</p>

	<p>But as I said, none of the Ruby template engines I&#8217;ve seen work this way. They&#8217;re all either generic macro systems that intermix markup and Ruby (like <span class="caps">ERB</span>), or they&#8217;re ruby APIs that output markup (like Builder, <span class="caps">HAML</span> and Markaby). I don&#8217;t really like either approach.</p>

	<p>If you&#8217;ve got a good suggestion, I&#8217;ve got a gold star ready to stick on your forehead!</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/12/lazyweb-is-there-a-ruby-template-engine-like-genshi-or-kid/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Web Apps Need More UI, Not Less</title>
		<link>http://jens.mooseyard.com/2008/09/web-apps-need-more-ui-not-less/</link>
		<comments>http://jens.mooseyard.com/2008/09/web-apps-need-more-ui-not-less/#comments</comments>
		<pubDate>Wed, 03 Sep 2008 17:27:11 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/09/web-apps-need-more-ui-not-less/</guid>
		<description><![CDATA[	I haven&#8217;t used Chrome yet, though I know people who work on it, and it looks like a good browser with some good new ideas. But I&#8217;m unsure of the benefits of one of its main talking points: that what web applications really need is to have less browser &#8220;chrome&#8221; around them. As I put it in an IM to Julian Missig yesterday:

	I think the problem isn&#8217;t that the browser chrome has too much [UI], it&#8217;s that the apps inside have too little.

	Too little what? What are the web apps lacking? Since you ask:

	A menu bar. Despite today&#8217;s fashion to get rid of them, menu bars are really useful. They&#8217;re a great interface for discovering the capabilities of an app, and for accessing rarely-used but important features. That&#8217;s why they were invented. Denied standard menus, web apps have tended either to splatter buttons all over the screen, or implement their own menus out of DHTML (usually doing a terrible job of even basic usability.) Keyboard shortcuts, if present, are divorced from menus so they&#8217;re not discoverable; and on the Mac at least, they awkwardly use a different modifier key (Ctrl, vs. Cmd) than &#8220;real&#8221; shortcuts.

	A filing system. Web apps let [...]]]></description>
			<content:encoded><![CDATA[	<p>I haven&#8217;t used Chrome yet, though I know people who work on it, and it looks like a good browser with some good new ideas. But I&#8217;m unsure of the benefits of one of its main talking points: that what web applications really need is to have less browser &#8220;chrome&#8221; around them. As I put it in an IM to Julian Missig yesterday:</p>

	<blockquote>I think the problem isn&#8217;t that the browser chrome has too much [UI], it&#8217;s that the apps inside have <em>too little</em>.</blockquote>

	<p>Too little what? What are the web apps lacking? Since you ask:</p>

	<p><strong>A menu bar.</strong> Despite today&#8217;s fashion to get rid of them, menu bars are really useful. They&#8217;re a great interface for discovering the capabilities of an app, and for accessing rarely-used but important features. That&#8217;s why they were invented. Denied standard menus, web apps have tended either to splatter buttons all over the screen, or implement their own menus out of <span class="caps">DHTML </span>(usually doing a terrible job of even basic usability.) Keyboard shortcuts, if present, are divorced from menus so they&#8217;re not discoverable; and on the Mac at least, they awkwardly use a different modifier key (Ctrl, vs. Cmd) than &#8220;real&#8221; shortcuts.</p>

	<p><strong>A filing system.</strong> Web apps let you manage content, which often takes the form of documents, aka files (word processing, pictures, etc.), but there&#8217;s no standard mechanism to manage these files&#8212;the whole document model introduced by the <a href="http://www.digibarn.com/friends/curbow/star/retrospect/" title="">Xerox Star</a> and popularized by the Mac&#8217;s Finder doesn&#8217;t exist. Instead each such web-app has its own incompatible (and mostly lame) way to list, rename, copy or delete documents. If you&#8217;re lucky, it will support some modern conveniences like direct manipulation or a trash. What none of them give you is interoperability: if you want to take a document from one web-app, like Flickr, and manipulate it using a different app, like GMail or Photoshop Express, you can&#8217;t drag it across, or even use a standard file picker dialog box. Your only options are to copy and paste a long cryptic <span class="caps">URL </span>(and deal with cross-site authentication), or to take the document on a scenic detour through your computer&#8217;s <em>real</em> filesystem, downloading it from one app and uploading it to the other.</p>

	<p><strong>Offline access.</strong> There are in fact still times when your computer doesn&#8217;t have access to a network. (Even at &#252;ber-connected Google, the commuter buses are prone to WiFi outages.) Or the network might just be infuriatingly slow or laggy. Losing access to your data in those situations is bad. Particularly in the case of email, I&#8217;ve been spoiled by <span class="caps">IMAP</span>, and Mail.app&#8217;s excellent offline support, long enough that the idea of using webmail is a complete non-starter for me. (This problem, fortunately, <em>is</em> being addressed, both in the form of Google Gears and in the parallel, but hopefully converging, offline-storage functionality being drafted for <span class="caps">HTML 5</span>.)</p>

	<p><strong>More than four fonts.</strong> The last time I had only four fonts available for documents was in 1985, before the LaserWriter Plus arrived. Currently on my computer I have an embarrassing overabundance, several hundred. Too bad web apps can&#8217;t actually discover what fonts are installed; instead they fall back on the deathly dull overused set of &#8220;safe&#8221; fonts like Times and Arial.</p>

	<p>I&#8217;m sure there&#8217;s more to add to this list, but I&#8217;ll stop now. Suffice it to say that in too many ways web-apps are still like the Emperor&#8217;s new clothes, or like Samuel Johnson&#8217;s dog walking on its hind legs (&#8220;it is not done well; but you are surprised to find it done at all&#8221;), and the enthusiasm for them often seems to be proportional to the shittiness of the native UI of the enthusiast&#8217;s OS platform of choice. (I first noticed this during my brief stint at Sun, whose workstations all ran <a href="http://en.wikipedia.org/wiki/Image:Openmotif_screenshot.png" title="">Motif</a>, which made even Web 1.0 UIs look like a lovely opium dream by comparison.)</p>

	<p>Don&#8217;t get me wrong, some web apps are great, and they all have a lot of potential, but taking away features from the browser wasn&#8217;t high on my list of what they chiefly need.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/09/web-apps-need-more-ui-not-less/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Career update</title>
		<link>http://jens.mooseyard.com/2008/08/career-update/</link>
		<comments>http://jens.mooseyard.com/2008/08/career-update/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 05:38:03 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Me]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/08/career-update/</guid>
		<description><![CDATA[	FYI, I ended up taking the position at Google. I started two weeks ago, and it&#8217;s been quite exciting, despite (or because of) the &#8220;drinking from a fire-hose&#8221; aspect of learning my way around the big G.

	I&#8217;m on the Google Sites team. I&#8217;ve been interested in wikis for years, and now I get to actually work on one. (Although Sites, n&#233;e JotSpot, is not a typical wiki.)

	I could write a lot about my experience of Google so far. It&#8217;s quite an interesting place. Merely learning about how some of their internal systems operate has been jaw-dropping. (Do you have any idea how much hard disk space Google has? Or how many CPUs? Or how many search queries they handle? Unfortunately I don&#8217;t think I&#8217;m allowed to tell&#8230;)

	For now I just wanted to say that I&#8217;m not in the job market anymore. Also, that I really like all the free food :-d
 ]]></description>
			<content:encoded><![CDATA[	<p><span class="caps">FYI</span>, I ended up taking the position at Google. I started two weeks ago, and it&#8217;s been quite exciting, despite (or because of) the &#8220;drinking from a fire-hose&#8221; aspect of learning my way around the big G.</p>

	<p>I&#8217;m on the <a href="http://sites.google.com" title="">Google Sites</a> team. I&#8217;ve been interested in wikis for years, and now I get to actually work on one. (Although Sites, n&#233;e JotSpot, is not a typical wiki.)</p>

	<p>I could write a lot about my experience of Google so far. It&#8217;s quite an interesting place. Merely learning about how some of their internal systems operate has been jaw-dropping. (Do you have any idea how much hard disk space Google has? Or how many CPUs? Or how many search queries they handle? Unfortunately I don&#8217;t think I&#8217;m allowed to tell&#8230;)</p>

	<p>For now I just wanted to say that I&#8217;m not in the job market anymore. Also, that I really like all the free food :-d</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/08/career-update/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Re: MobileMe Webmail Security &#8212; There Is None</title>
		<link>http://jens.mooseyard.com/2008/08/re-mobileme-webmail-security-there-is-none/</link>
		<comments>http://jens.mooseyard.com/2008/08/re-mobileme-webmail-security-there-is-none/#comments</comments>
		<pubDate>Mon, 18 Aug 2008 03:24:05 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/08/re-mobileme-webmail-security-there-is-none/</guid>
		<description><![CDATA[	&#8216;Prince McLean&#8217;, writing for AppleInsider:

	Data transaction security in MobileMe&#8217;s web apps is based upon authenticated handling of JSON data exchanges between the self contained JavaScript client apps and Apple&#8217;s cloud, rather than the SSL web page encryption used by HTTPS. The only real web pages MobileMe exchanges with the server are the HTML, JavaScript, and CSS files that make up the application, which have no need for SSL encryption following the initial user authentication. This has caused some unnecessary panic among web users who have equated their browser&#8217;s SSL lock icon with web security. And of course, Internet email is not a secured medium anyway once it leaves your server.

	If Apple applied SSL encryption in the browser, it would only slow down every data exchange without really improving security, and instead only provide pundits with a false sense of security that distracts from real security threats.

	It&#8217;s pretty clear to me from this description that (a) McLean doesn&#8217;t know much about data security or HTTP, and (b) the system he&#8217;s describing would be patently insecure. And unfortunately, the actual system is just as insecure as I was afraid it was.

	The most glaring problem is that, since the main page resources (HTML [...]]]></description>
			<content:encoded><![CDATA[	<p>&#8216;Prince McLean&#8217;, <a href="http://www.appleinsider.com/articles/08/08/15/inside_mobileme_web_3_and_web_client_server_apps.html&#038;page=2" title="">writing for AppleInsider</a>:</p>

	<blockquote>Data transaction security in MobileMe&#8217;s web apps is based upon authenticated handling of <span class="caps">JSON</span> data exchanges between the self contained JavaScript client apps and Apple&#8217;s cloud, rather than the <span class="caps">SSL</span> web page encryption used by <span class="caps">HTTPS</span>. The only real web pages MobileMe exchanges with the server are the <span class="caps">HTML</span>, JavaScript, and <span class="caps">CSS</span> files that make up the application, which have no need for <span class="caps">SSL</span> encryption following the initial user authentication. This has caused some unnecessary panic among web users who have equated their browser&#8217;s <span class="caps">SSL</span> lock icon with web security. And of course, Internet email is not a secured medium anyway once it leaves your server.</blockquote>

	<blockquote>If Apple applied <span class="caps">SSL</span> encryption in the browser, it would only slow down every data exchange without really improving security, and instead only provide pundits with a false sense of security that distracts from real security threats.</blockquote>

	<p>It&#8217;s pretty clear to me from this description that (a) McLean doesn&#8217;t know much about data security or <span class="caps">HTTP</span>, and (b) the system he&#8217;s describing would be patently insecure. And unfortunately, the actual system is just as insecure as I was afraid it was.</p>

	<p>The most glaring problem is that, since the main page resources (HTML and JavaScript) aren&#8217;t loaded over <span class="caps">SSL</span>, there&#8217;s no way to tell whether they&#8217;re genuine. By now <a href="http://www.schneier.com/blog/archives/2008/07/the_dns_vulnera.html" title="">everyone ought to be aware of <span class="caps">DNS</span> forgery attacks</a> ; if the coffeeshop where you&#8217;ve gone online has an infected WiFi router, it would be nice to know whether its <span class="caps">DNS</span> record for &#8220;me.com&#8221; points to Apple&#8217;s servers or to a phishing site. <em>But without <span class="caps">SSL</span> there&#8217;s no way to tell.</em> Obviously, if you&#8217;ve loaded a hacked forgery of me.com&#8217;s web-app, any assurances made about &#8220;authenticated handling of <span class="caps">JSON</span> exchanges&#8221; are completely pointless, because your <span class="caps">JSON</span> exchanges are probably going straight to a pwned server in Uzbekistan.</p>

	<p>(You may object that the initial login page is <span class="caps">SSL</span>-protected. It is, but unfortunately it&#8217;s at a completely different domain, auth.apple.com. <span class="caps">A DNS</span> attack on MobileMe would operate by leaving auth.apple.com alone, so you&#8217;d be handed off to the fake server <em>after</em> logging in.)</p>

	<p>After writing the above, I got curious enough to dissect the traffic myself. So I used <a href="http://tuffcode.com" title=""><span class="caps">HTTP</span>Scoop</a> to sniff while I viewed a couple of emails. <em>Not only is there no <span class="caps">SSL</span> authentication, but the requests and responses aren&#8217;t even encrypted at all.</em> I could easily read the plaintext of the email messages right in <span class="caps">HTTP</span>Scoop, which means anyone else on my <span class="caps">LAN </span>(or any admin at my <span class="caps">ISP</span> or workplace) could easily have read them too. Oops.</p>

	<p>The takeaway from this is that MobileMe&#8217;s web apps (at least email) are quite insecure &#8212; they won&#8217;t protect you against <span class="caps">DNS</span> forgery or phishing attacks, and they leave your email traffic wide open for others to read. I would avoid them if at all possible and access your MobileMe content via good old <span class="caps">SSL</span> in real desktop mail and calendar clients (such as Mail.app and iCal), rather than blindly trusting Apple&#8217;s pretty-looking web apps.</p>

	<p>(You may raise a second objection, that most email traffic is sent across the Internet unencrypted anyway. But even with unencrypted email, it is much, much easier to eavesdrop on (or alter) traffic over a <span class="caps">LAN</span>, especially wireless, than it is to intercept Internet backbone traffic between ISPs. It&#8217;s the difference between attacking weak, easily accessible infrastructure plugged in by some baristas with little computer experience, vs. hacking into large commercial routers secured in data centers and run by experts.)</p>

	<p><i>[Disclaimer: I am not a security guru. But I&#8217;ve spent quite a bit of time over the past year studying data security and cryptography, and implementing some of the techniques; and honestly, it doesn&#8217;t take a <a href="http://www.schneier.com" title="">Bruce Schneier</a> to simply run a packet sniffer and notice plaintext email traffic.]</i><i></i></p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/08/re-mobileme-webmail-security-there-is-none/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Beautiful snej soup, yum</title>
		<link>http://jens.mooseyard.com/2008/08/beautiful-snej-soup-yum/</link>
		<comments>http://jens.mooseyard.com/2008/08/beautiful-snej-soup-yum/#comments</comments>
		<pubDate>Sat, 09 Aug 2008 20:15:31 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Me]]></category>
		<category><![CDATA[Social Software]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/08/beautiful-snej-soup-yum/</guid>
		<description><![CDATA[	I&#8217;m fooling around with Soup, a newish micro-blogging service I just discovered. I&#8217;ve never signed up for tumblr or its other clones, but I&#8217;m kind of smitten with Soup, so I set up my own:

	beautiful snej soup, yum 

	I&#8217;ve got it aggregating stuff from my del.icio.us, flickr and last.fm accounts, as well as this blog. And I&#8217;m directly posting some things I&#8217;ve run across today, via its very nice bookmarklet.

	Part of the reason I got sucked in is that Soup has the single best new-user experience I&#8217;ve ever seen on the web. You just click the &#8220;try it&#8221; button on the home page, and you get your own soup blog. No signup, no registration, just instant gratification. Then you can slide open the control panel (that slider itself is a beautiful piece of UI), import from your other social sites, and fool with the settings, all in privacy. Only after you&#8217;re hooked do you need to press the Create button and choose a username and password, whereupon your soup goes live. It&#8217;s brilliant &#8212; the web equivalent of the &#8220;untitled document&#8221; UI introduced in the &#8216;70s by the Xerox Star.

	Anyway, please take a look and join me! (It&#8217;s not obvious [...]]]></description>
			<content:encoded><![CDATA[	<p>I&#8217;m fooling around with <a href="http://www.soup.io" title=""><strong>Soup</strong></a>, a newish micro-blogging service I just discovered. I&#8217;ve never signed up for tumblr or its other clones, but I&#8217;m kind of smitten with Soup, so I set up my own:</p>

	<p><b><a href="http://snej.soup.io" title="">beautiful snej soup, yum</a> </b></p>

	<p>I&#8217;ve got it aggregating stuff from my del.icio.us, flickr and last.fm accounts, as well as this blog. And I&#8217;m directly posting some things I&#8217;ve run across today, via its very nice bookmarklet.</p>

	<p>Part of the reason I got sucked in is that <strong>Soup has the single best new-user experience I&#8217;ve ever seen on the web.</strong> You just click the &#8220;try it&#8221; button on the home page, and you get your own soup blog. No signup, no registration, just instant gratification. Then you can slide open the control panel (that slider itself is a beautiful piece of UI), import from your other social sites, and fool with the settings, all in privacy. Only after you&#8217;re hooked do you need to press the Create button and choose a username and password, whereupon your soup goes live. It&#8217;s brilliant &#8212; the web equivalent of the &#8220;untitled document&#8221; UI introduced in the &#8216;70s by the Xerox Star.</p>

	<p>Anyway, <a href="http://snej.soup.io" title=""><strong>please take a look and join me!</strong></a> (It&#8217;s not obvious from the untitled-blog experience, but Soup has friends and groups like other social networks.)</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/08/beautiful-snej-soup-yum/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>JavaScript 2.0, aka ECMAScript 4</title>
		<link>http://jens.mooseyard.com/2008/06/javascript-20-aka-ecmascript-4/</link>
		<comments>http://jens.mooseyard.com/2008/06/javascript-20-aka-ecmascript-4/#comments</comments>
		<pubDate>Wed, 18 Jun 2008 01:09:30 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Languages]]></category>
		<category><![CDATA[Web]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/06/javascript-20-aka-ecmascript-4/</guid>
		<description><![CDATA[	I just discovered that there is an ECMAScript 4&#8212;better known as JavaScript 2.0&#8212;in development. As a shameless language slut, I immediately dove into the language overview, and it&#8217;s pretty neat.

	This turns JavaScript into a much more useable language, that I could see doing serious development in. I&#8217;m well aware that today&#8217;s JS isn&#8217;t a &#8220;toy&#8221;, that it&#8217;s got an interesting prototype-based object model under the hood; but I&#8217;ve found the language so loose as to be difficult to use. This new version adds a full class model, much better support for iteration, a form of generators/coroutines, and more.

	Intriguingly, it also offers type-checking, which has been absent from most mainstream dynamic languages. I know it&#8217;s trendy to use &#8220;duck typing&#8221;, but I find that languages with no compile-time type-checking frustrate me because I make so damn many mistakes that aren&#8217;t caught until runtime; which means things I could have fixed in two minutes in C++ or Objective-C take half an hour to fix as I run the program over, and over, and over, discovering and fixing one problem at a time.

	Given the concurrent developments in Apple&#8217;s JavaScript interpreter, I&#8217;m getting pretty excited for JavaScript. I hope that in addition to making [...]]]></description>
			<content:encoded><![CDATA[	<p>I just discovered that there is an <a href="http://www.ecmascript.org/" title=""><span class="caps">ECMA</span>Script 4</a>&#8212;better known as JavaScript 2.0&#8212;in development. As a shameless language slut, I immediately dove into the <a href="http://www.ecmascript.org/es4/spec/overview.pdf" title="">language overview</a>, and it&#8217;s pretty neat.</p>

	<p>This turns JavaScript into a much more useable language, that I could see doing serious development in. I&#8217;m well aware that today&#8217;s JS isn&#8217;t a &#8220;toy&#8221;, that it&#8217;s got an interesting prototype-based object model under the hood; but I&#8217;ve found the language so loose as to be difficult to use. This new version adds a full class model, much better support for iteration, a form of generators/coroutines, and more.</p>

	<p>Intriguingly, it also offers type-checking, which has been absent from most mainstream dynamic languages. I know it&#8217;s trendy to use &#8220;duck typing&#8221;, but I find that languages with no compile-time type-checking frustrate me because I make so damn many mistakes that aren&#8217;t caught until runtime; which means things I could have fixed in two minutes in C++ or Objective-C take half an hour to fix as I run the program over, and over, and over, discovering and fixing one problem at a time.</p>

	<p>Given the concurrent <a href="http://webkit.org/blog/189/announcing-squirrelfish/" title="">developments in Apple&#8217;s JavaScript interpreter</a>, I&#8217;m getting pretty excited for JavaScript. I hope that in addition to making it blindingly fast, Apple will also add <span class="caps">ECMA</span>Script 4 support, and make it easy to access the language outside of a WebView.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/06/javascript-20-aka-ecmascript-4/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>
<!-- WP Super Cache is installed but broken. The path to wp-cache-phase1.php in wp-content/advanced-cache.php must be fixed! -->