<?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; Ideas</title>
	<atom:link href="http://jens.mooseyard.com/category/ideas/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>The Lost Lesson Of Instant Typing</title>
		<link>http://jens.mooseyard.com/2009/10/the-lost-lesson-of-instant-typing/</link>
		<comments>http://jens.mooseyard.com/2009/10/the-lost-lesson-of-instant-typing/#comments</comments>
		<pubDate>Wed, 14 Oct 2009 22:00:10 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Me]]></category>
		<category><![CDATA[Social Software]]></category>
		<category><![CDATA[iChat]]></category>
		<category><![CDATA[UI]]></category>

		<guid isPermaLink="false">http://jens.mooseyard.com/?p=351</guid>
		<description><![CDATA[	Farhad Manjoo writing in Slate about Google Wave:

	The trouble is, everything you type into Wave is transmitted live, in real time&#8212;every keystroke was getting sent to Zach just as I hit it. This made me too self-conscious to get my thoughts across.

	&#8230; Maybe I should just delete what I&#8217;d written and say, &#8220;Twitter works because it&#8217;s simple.&#8221; But I couldn&#8217;t do that, because Zach was watching me. He could see me struggling right now&#8212;he could see that I&#8217;d gotten myself stuck in a textual cul-de-sac and that I was desperately searching for a way out without looking foolish. Now I saw Zach beginning to type: &#8220;Don&#8217;t let the live-typing get you down!&#8221; The game was up; what was the point of making a point now? I ended my thought clumsily and then resolved never to attempt to say anything very deep on Wave.

	The same thing happened seven years ago with the live-typing feature that I implemented in iChat 1.0 (which was only supported for Bonjour chats.) I thought it was an awesome idea, and I&#8217;d wanted to have it in a chat program since about 1997. But it turned out that, in actual use, people hated it, for exactly the [...]]]></description>
			<content:encoded><![CDATA[	<p>Farhad Manjoo <a href="http://www.slate.com/id/2232311/pagenum/all" title="">writing in Slate</a> about Google Wave:</p>

	<blockquote>The trouble is, everything you type into Wave is transmitted live, in real time&#8212;every keystroke was getting sent to Zach just as I hit it. This made me too self-conscious to get my thoughts across.</blockquote>

	<blockquote>&#8230; Maybe I should just delete what I&#8217;d written and say, &#8220;Twitter works because it&#8217;s simple.&#8221; But I couldn&#8217;t do that, because Zach was watching me. He could see me struggling right now&#8212;he could see that I&#8217;d gotten myself stuck in a textual cul-de-sac and that I was desperately searching for a way out without looking foolish. Now I saw Zach beginning to type: &#8220;Don&#8217;t let the live-typing get you down!&#8221; The game was up; what was the point of making a point now? I ended my thought clumsily and then resolved never to attempt to say anything very deep on Wave.</blockquote>

	<p>The same thing happened seven years ago with the live-typing feature that I implemented in iChat 1.0 (which was only supported for Bonjour chats.) I thought it was an awesome idea, and I&#8217;d wanted to have it in a chat program since about 1997. But it turned out that, in actual use, people hated it, for exactly the reasons Manjoo describes: it makes you self-conscious. We took it out in the next release.</p>

	<p>(Interestingly, I hate video chat for a very similar reason. Somehow, the fact that my picture is being shown in real time to the remote person makes me horrifically self-conscious, even though it wouldn&#8217;t bother me at all to talk face-to-face with that person. I don&#8217;t know whether it&#8217;s the little preview on my screen, or the fact that the person is spookily both present and not-present, but the few times I&#8217;ve tried video-chat have been really unpleasant.)</p>

	<p>I&#8217;m usually on the side of more technology. I believe that our online communications tools are still horribly primitive and have only scratched the surface of what&#8217;s possible. But this was a case where more technology was bad.</p>

<pre>The low-tech alternative that lots of people use in IM,
is to write in short fragments,
each a separate message,
so the other person can see them one by one
without waiting for you to finish the whole sentence.</pre>

	<p>The difference is that you&#8217;re in control over when to send a partial message, and the other person knows you&#8217;re in control, and so on. I still think it might be possible to do this in a higher-tech way, like using a hot-key to send a partial message on demand without having the funky line-breaks, but the current approach isn&#8217;t so bad as long as you&#8217;re not embarrassed about unintentional free verse.</p>

	<p>I could have told the Wave people about what I&#8217;d learned, except I didn&#8217;t know Wave existed until April (shortly before the public announcement), and even then I was just some guy lost in the crowd at the demos&#8230;.</p>

	<p>Part of the problem, in both cases, is that live typing is one of those Cool Demo Features that looks really awesome when showing off the app. Features like that can be dangerous because they are legitimately very useful during the app&#8217;s gestation, when exciting demos are a key survival trait; but then they can&#8217;t be removed later on because they&#8217;re so well-known, even if they turn out to be useless. Sometimes these features aren&#8217;t actually harmful to the user experience, they just make the code more complex and harder to maintain. Instant typing is both, unfortunately. (The clever sync algorithms and rapid-fire network messages Wave uses would be needed even without live typing, but the fact that they have to run on every few keystrokes, not just every minute or so, pushes those things so much harder.)</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/10/the-lost-lesson-of-instant-typing/feed/</wfw:commentRss>
		<slash:comments>37</slash:comments>
		</item>
		<item>
		<title>Gossip For Lakitu</title>
		<link>http://jens.mooseyard.com/2009/08/gossip-for-lakitu/</link>
		<comments>http://jens.mooseyard.com/2009/08/gossip-for-lakitu/#comments</comments>
		<pubDate>Mon, 17 Aug 2009 02:52:43 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Social Software]]></category>
		<category><![CDATA[cloudy]]></category>
		<category><![CDATA[lakitu]]></category>
		<category><![CDATA[p2p]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/08/gossip-for-lakitu/</guid>
		<description><![CDATA[	Last year I wrote a series of blog posts about a peer-to-peer system called Cloudy that I was developing. I was going up the stack, from messaging to identity, but didn&#8217;t finish documenting all the layers I&#8217;d built. I mostly stopped working on Cloudy after I went back to gainful employment, but I keep thinking about this stuff.

	&#8220;Lakitu&#8221;?

	I&#8217;ve since heard about another unrelated project nicknamed Cloudy; and the whole term &#8220;cloud&#8221; has gotten so debased in the past year that it now stands for outsourcing to giant hidden server farms, which is the antithesis of what I stand for. So I&#8217;ve decided to use the name Lakitu instead. Nintendo fans will recognize Lakitu as a bit character in the Mario games&#8212;he&#8217;s a goggled turtle who rides a little one-seater cloud. This makes him an appropriate mascot for P2P technologies, I think.

	[I&#8217;m sure Nintendo has a trademark on the character, but they don&#8217;t appear to have copyrighted the word &#8220;Lakitu&#8221;. He&#8217;s not even known by that name in Japan, where he&#8217;s called &#8220;ジュゲム&#8221; or &#8220;Jugem&#8221;. I have been unable to find out what &#8220;Lakitu&#8221; means or why they decided to use it in the English translation. I could also note threateningly [...]]]></description>
			<content:encoded><![CDATA[	<p>Last year I wrote <a href="http://mooseyard.com/Jens/?s=cloudy" title="">a series of blog posts about a peer-to-peer system called Cloudy</a> that I was developing. I was going up the stack, from messaging to identity, but didn&#8217;t finish documenting all the layers I&#8217;d built. I mostly stopped working on Cloudy after I went back to gainful employment, but I keep thinking about this stuff.</p>

	<h2>&#8220;Lakitu&#8221;?</h2>

	<p>I&#8217;ve since heard about another unrelated project nicknamed Cloudy; and the whole term &#8220;cloud&#8221; has gotten so debased in the past year that it now stands for outsourcing to giant hidden server farms, which is the antithesis of what I stand for. So I&#8217;ve decided to use the name <strong>Lakitu</strong> instead. Nintendo fans will recognize <a href="http://www.mariowiki.com/Lakitu" title="">Lakitu</a> as a bit character in the Mario games&#8212;he&#8217;s a goggled turtle who rides a little one-seater cloud. This makes him an appropriate mascot for <span class="caps">P2P</span> technologies, I think.</p>

	<p>[I&#8217;m sure Nintendo has a trademark on the character, but they don&#8217;t appear to have copyrighted the <em>word</em> &#8220;Lakitu&#8221;. He&#8217;s not even known by that name in Japan, where he&#8217;s called &#8220;ジュゲム&#8221; or &#8220;Jugem&#8221;. I have been unable to find out what &#8220;Lakitu&#8221; means or why they decided to use it in the English translation. I could also note threateningly that I have some intellectual-property issues of my own with Nintendo&#8217;s depiction of Lakitu&#8217;s smiling cloud, which is <em>clearly infringing</em> on my son&#8217;s comic-strip character <a href="http://mooseyard.com/Jed/Cloudy/" title="">Cloudy</a>. So let&#8217;s call it a draw, Iwata-san?]</p>

	<p>My last Cloudy post was about <a href="http://mooseyard.com/Jens/2008/04/cloudy-verification/" title="">verifying people&#8217;s identities</a>, and the next one was going to be about gossip. I&#8217;ve become unhappy about the rather kludgy way I designed gossip in Cloudy, so yesterday I started designing a new protocol for it, which I&#8217;m going to write about.</p>

	<h2>&#8220;Gossip&#8221;?</h2>

	<p>A <a href="http://en.wikipedia.org/wiki/Gossip_protocol" title="">gossip protocol</a> is a means of broadcasting information in a distributed system. Pairs of computers periodically connect and swap new bits of information with each other; the result is that the information gets dispersed through the whole network (provided it&#8217;s a connected graph.) The tricky part is avoiding infinite loops and combinatorial explosions, and optimizing the way pairs of computers swap messages so it scales well.</p>

	<p>I started defining a protocol, based on stuff I&#8217;ve been thinking about for a while. I don&#8217;t think it&#8217;s as advanced as what&#8217;s reported in research papers, but I&#8217;m hoping it will work well enough when used in a socially-driven network&#8212;one where the connections between machines are driven by the social connections between their users. Social networks have short horizons, so any particular participant only &#8220;sees&#8221; a constrained number of near-neighbors even though the entire network may be huge.</p>

	<p>I&#8217;m making this protocol agnostic as to the type of messaging being used. <a href="http://bitbucket.org/snej/mynetwork/wiki/BLIP/Overview" title=""><span class="caps">BLIP</span></a> will work well, but it ought to be possible to use Jabber or even email; anything that can send messages between two participants. It&#8217;s also agnostic as to message content, beyond a few simple assumptions that a message has an author, a timestamp, and some arbitrary &#8220;topic&#8221; tags.</p>

	<p>For example, it ought to work fine at distributing tweet-like micro-blog posts.</p>

	<p>Right now I have the protocol written down as an outline in <a href="http://www.circusponies.com" title="">Notebook</a>. I&#8217;ll flatten it out, expand it and post it here in a day or two.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/08/gossip-for-lakitu/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Apple Never Promised Us It Wouldn&#8217;t Be Evil</title>
		<link>http://jens.mooseyard.com/2009/05/apple-never-promised-us-it-wouldnt-be-evil/</link>
		<comments>http://jens.mooseyard.com/2009/05/apple-never-promised-us-it-wouldnt-be-evil/#comments</comments>
		<pubDate>Fri, 22 May 2009 16:37:25 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Ideas]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/05/apple-never-promised-us-it-wouldnt-be-evil/</guid>
		<description><![CDATA[	Here is the latest absurdity to come out of Apple&#8217;s deeply, endemically fucked-up App Store approval process: Jamie Montgomerie&#8217;s Eucalyptus app, an e-book reader that can download public-domain books from Project Gutenberg&#8212;about the most innocuous thing you could imagine, right?&#8212;gets rejected not once but three times for containing &#8220;obscene, pornographic, offensive or defamatory content&#8221;.

	Leaving aside the issue of whether Apple has any business deciding what constitutes obscenity (a task that&#8217;s driven grown Supreme Court justices to drink)&#8212;
And leaving aside also the fact that Apple&#8217;s censors have three times now been too dim to comprehend that the application does not contain any books, obscene or otherwise, but downloads them from the Internet much like Safari&#8212;
No, the really outrageous issue is that the supposed obscenity here consists of a text-only English translation of the Kama Sutra. Apple specifically called out some pages of steamy advice for &#8220;when a man wishes to enlarge his lingam&#8220;. (No, really.) [1]

	Now, Richard Burton had to get his 1883 translation of this ancient text printed privately when no publishers would accept it, but that was in the Victorian era. The current authoritative translation is nowadays published by that infamous smut peddler, Oxford University Press. Much harder-core fare [...]]]></description>
			<content:encoded><![CDATA[	<p>Here is the latest absurdity to come out of Apple&#8217;s deeply, endemically fucked-up App Store approval process: Jamie Montgomerie&#8217;s <a href="http://th.ingsmadeoutofotherthin.gs/eucalyptus/" title="">Eucalyptus</a> app, an e-book reader that can download public-domain books from Project Gutenberg&#8212;about the most innocuous thing you could imagine, right?&#8212;<a href="http://www.blog.montgomerie.net/whither-eucalyptus" title="">gets rejected not once but <em>three times</em></a> for containing &#8220;obscene, pornographic, offensive or defamatory content&#8221;.</p>

	<p>Leaving aside the issue of whether Apple has any business deciding what constitutes obscenity (a task that&#8217;s driven grown Supreme Court justices to drink)&#8212;<br />
And leaving aside also the fact that Apple&#8217;s censors have three times now been too dim to comprehend that the application does not contain any books, obscene or otherwise, but downloads them from the Internet much like Safari&#8212;<br />
No, the really outrageous issue is that the supposed obscenity here consists of a text-only English translation of the <a href="http://en.wikipedia.org/wiki/Kama_sutra" title="">Kama Sutra</a>. Apple specifically called out some pages of steamy advice for &#8220;when a man wishes to enlarge his <em>lingam</em>&#8220;. (No, <a href="http://www.blog.montgomerie.net/user/files/Whither%20Eucalyptus/Rejection2-1.PNG" title="">really</a>.) [1]</p>

	<p>Now, Richard Burton had to get his 1883 translation of this ancient text <a href="http://en.wikipedia.org/wiki/Kama_sutra#Translations" title="">printed privately</a> when no publishers would accept it, but that was in the Victorian era. The current authoritative translation is nowadays published by that infamous smut peddler, Oxford University Press. Much harder-core fare like <em>Ulysses</em> and <em>Lady Chatterley&#8217;s Lover</em>&#8212;books which go so far as to use <em>recognizable English names</em> of the naughty bits&#8212;were judged after some controversy to be free of obscenity in the 1930s. By 1970 the obscenity statutes had been lifted from nearly all printed material, and nowadays anything goes&#8212;take a look at some of the e-books available for sale on the iTunes store.</p>

	<p>Montgomerie has now, humiliatingly, been driven to self-censorship: his latest message to Apple states &#8220;I have now submitted a new version that specifically blocks access to the Kama Sutra book you identified. Is this what you mean?&#8221;</p>

	<blockquote>[<b>Update, May 24:</b> <a href="http://www.blog.montgomerie.net/hither-eucalyptus" title="">Mongomerie reports</a> that on the 23rd he &#8220;received a phone call from an Apple representative. He was very complimentary about Eucalyptus.&#8221; The whole matter was, of course, resolved, and Eucalyptus is now <a href="http://tr.im/ptus" title="">available for purchase</a>.  A happy ending, certainly, and congratulations on the release! ...But I don&#8217;t believe it invalidates my argument below. After all, this isn&#8217;t the first time an outrageous rejection has been reversed after mass humiliation of Apple. It&#8217;s the overall default policies and behaviors, and their chilling effects, that I&#8217;m complaining about, and there&#8217;s still no sign of those changing.]</blockquote>

	<h2>The &#8220;E&#8221; word.</h2>

	<p>I don&#8217;t think anyone but a card-carrying member of the Christian Coalition or Taliban would disagree that this was a <em>stupid</em> decision on Apple&#8217;s part. (And it was a considered decision, not a &#8216;glitch in the approval process&#8217;, given that Apple repeated it twice.)</p>

	<p>I feel the need to step up to a stronger word. How does <strong>evil</strong> sound?</p>

	<p>Hear me out. I&#8217;m not talking &#8220;evil&#8221; as in killing babies or nuclear blackmail, rather in the sense it&#8217;s meant in Google&#8217;s corny motto &#8220;Don&#8217;t Be Evil&#8221;, or alluded to in the older proverb &#8220;With great power comes great responsibility&#8221;. But yes, I do mean &#8220;evil&#8221; as malign, the opposite of good, etc. etc.</p>

	<p>Last year Apple put itself into an ethically very delicate situation with the App Store, by creating a market in which it has the sole power to make 3rd party software available (or to take it away). As has been amply discussed before, iPhone developers have no choice (if they want to be iPhone developers) but to put tremendous effort into developing the product, only finding out at the very end whether or not Apple will let it be sold.[2]</p>

	<p>There are definitely some good reasons for such a model, primarily that it helps keep the platform secure from malware, and that by preventing piracy it allows developers to collect a lot more revenues per user, allowing them to set prices far lower than those in other software markets.</p>

	<p>But in return Apple had the obligation to be very, very careful to be ethical, upright and transparent in its dealings with developers and the public, to minimize the dangers (of censorship, of conflicts of interest, of stifling innovation) inherent in its position.</p>

	<p>And being Apple, it completely and utterly fucked it up. Because it&#8217;s in Apple&#8217;s genetic code to be about as transparent as a lead brick. This has always annoyed the press, and it has frequently enraged developers, who suffer from the consequences of blank silence from Apple in between carefully-scripted <span class="caps">WWDC</span> keynotes and PR-scrubbed announcements. But in the context of the App Store, Apple&#8217;s inscrutability and arbitrariness has become actively malign.</p>

	<h2>Evil is as evil does.</h2>

	<p>I&#8217;m not saying that Apple <em>is</em> evil; it isn&#8217;t run by bluestockings or monopolists or cackling supervillains. But evil is a result of what you <em>do</em> [3], and actions are not excused by good intentions; in the real world those who do evil (excepting psychopaths) uniformly believe they&#8217;re working for the good.</p>

	<p>Apple&#8217;s App Store approval process has, over the past year, shown that the company is:</p>

	<ul>
		<li>acting like a Victorian-era book censor;</li>
		<li>quashing competition by blocking apps that improve on Apple&#8217;s products;</li>
		<li>blocking innovation by denying 3rd party apps access to the user&#8217;s legally-owned data (such as MP3s);</li>
		<li>attempting to deny end-users the freedom to do what they want with the hardware they bought and paid for (viz. its current efforts to have jailbreaking declared illegal);</li>
		<li>and causing undue hardship to small developers by arbitrarily withholding their ability to sell the apps they&#8217;ve developed.</li>
	</ul>

	<p>Nor has Apple engaged in the slightest bit of dialog with its developers and users to work through any of these issues. The best that&#8217;s happened is that, after much public ridicule, Apple has without comment released some apps that it had previously blocked.</p>

	<p>Maybe you think &#8220;evil&#8221; is too strong or melodramatic or exaggerated a word for this. Then feel free to substitute something that has fewer loaded connotations to you&#8212;&#8220;unethical&#8221; or &#8220;anticompetitive&#8221; or whatever. But if you&#8217;re one of those who, like me, has applied the &#8220;e&#8221; word to the past actions of Microsoft, or to groups that try to ban books from libraries, then I think there&#8217;s really no option but to use the same blunt language here and now.</p>

	<p><hr /><font size="-1"></p>

	<p>[1] By these standards, Apple should have banned its own Mail app, too. It sends me these kind of <em>lingam</em>-enlargment messages all the time.</p>

	<p>[2] This is arguably worse than the console video-game industry&#8217;s similar monopoly on approving games, because those companies listen to developer pitches up-front before development. (Also, this kind of restraint is much nastier when applied to all types of software, including books, than just to games.)</p>

	<p>[3] This semantic distinction is one I&#8217;m not sure Google gets either. &#8220;Don&#8217;t <em>Do</em> Evil&#8221; would have been a better motto. But in its defense, Google does in practice seem to understand its responsibilities and is admirably open about its actions.</font></p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/05/apple-never-promised-us-it-wouldnt-be-evil/feed/</wfw:commentRss>
		<slash:comments>22</slash:comments>
		</item>
		<item>
		<title>Open Source Good, Giving Away Art Bad?</title>
		<link>http://jens.mooseyard.com/2009/05/open-source-good-giving-away-art-bad/</link>
		<comments>http://jens.mooseyard.com/2009/05/open-source-good-giving-away-art-bad/#comments</comments>
		<pubDate>Mon, 04 May 2009 06:05:38 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Ideas]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/05/open-source-good-giving-away-art-bad/</guid>
		<description><![CDATA[	I just discovered that a number of commercial artists are really insulted that Google approached them to create artwork, without offering to pay for it. This did seem unreasonable to me &#8230; until I read further and saw that this is for the Chrome browser.

	Now, Chrome is open source. (Technically the open source project is a separate thing called &#8220;Chromium&#8221;, but that&#8217;s mostly an organizational detail; the code is the same.) So when I compared this controversy to the rather different attitude of the many programmers who&#8217;ve gladly contributed to Chrome and WebKit (and thus also Safari) without pay &#8230; I went &#8220;hmm&#8221;.

	There&#8217;s a long comment thread about this on the LiveJournal of the talented cartoonist Rebecca Clements. The craziest comment I saw was by one &#8220;Anonymous&#8221;:

	&#8220;Good will never paid a bill or put shoes on my child. I admit there should be some caring people in the world. But Google being kind &#8230;so we all should be kind like them and give our work away? Come on give me a break. Someone in their executive chain of management has thought this through enough to realize it as a Public Relations &#8220;cool&#8221; thing to do to get more attention and [...]]]></description>
			<content:encoded><![CDATA[	<p>I just discovered that <a href="http://drawger.com/taxman/?section=articles&#038;article_id=7693" title="">a number of commercial artists are really insulted that Google approached them to create artwork, without offering to pay for it</a>. This did seem unreasonable to me &#8230; until I read further and saw that this is for the Chrome browser.</p>

	<p>Now, Chrome is open source. (Technically the open source project is a separate thing called &#8220;Chromium&#8221;, but that&#8217;s mostly an organizational detail; the code is the same.) So when I compared this controversy to the rather different attitude of the many programmers who&#8217;ve gladly contributed to Chrome and WebKit (and thus also Safari) without pay &#8230; I went &#8220;hmm&#8221;.</p>

	<p>There&#8217;s a long comment thread about this on <a href="http://kinokofry.livejournal.com/199482.html?view=1229114" title="">the LiveJournal of the talented cartoonist Rebecca Clements</a>. The craziest comment I saw was by one &#8220;Anonymous&#8221;:</p>

	<blockquote>&#8220;Good will never paid a bill or put shoes on my child. I admit there should be some caring people in the world. But Google being kind &#8230;so we all should be kind like them and give our work away? Come on give me a break. Someone in their executive chain of management has thought this through enough to realize it as a Public Relations &#8220;cool&#8221; thing to do to get more attention and drive people to Google as a source. It wasn&#8217;t because they feel like being kind and giving something away.&#8221; <a href="http://kinokofry.livejournal.com/199482.html?thread=1227578#t1227578" title="">*</a></blockquote>

	<p>Maybe I&#8217;m especially pissed off at this attitude because I just spent most of my weekend <a href="http://bitbucket.org/snej/murky/changesets/" title="">being kind and giving my work away</a> (as well as the work of several others). And I&#8217;m sure much of the software these complaining artists use was created for free by open-source programmers. Do they draw with The Gimp or Inkscape? Use Firefox or Chrome or Safari? Run Linux or <span class="caps">BSD</span>? Host their blogs with WordPress or LiveJournal? (Let&#8217;s just hope they&#8217;re not using pirated copies of Photoshop or CorelDraw&#8230;)</p>

	<p>So is there a double standard here, or am I missing something?</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/05/open-source-good-giving-away-art-bad/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>The Assassination of J.G. Ballard Considered As A Metafictional Homage</title>
		<link>http://jens.mooseyard.com/2009/04/the-assassination-of-jg-ballard-considered-as-a-metafictional-homage/</link>
		<comments>http://jens.mooseyard.com/2009/04/the-assassination-of-jg-ballard-considered-as-a-metafictional-homage/#comments</comments>
		<pubDate>Tue, 21 Apr 2009 20:55:54 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Ideas]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/04/the-assassination-of-jg-ballard-considered-as-a-metafictional-homage/</guid>
		<description><![CDATA[	&#8220;Some people have suggested that mental illness is a kind of adaptation to the sort of circumstances that will arise in the future. As we move towards a more and more psychotic landscape, the psychotic traits are signs of a kind of Darwinian adaptation.&#8221;&#8212;1998

	Abstract.

	Numerous studies have been conducted upon patients in terminal paresis (GPI), placing the author J.G. Ballard in a series of simulated auto crashes, e.g. multiple pileups, head-on collisions, motorcade attacks (fantasies of Presidential assassinations remained a continuing preoccupation, subjects showing a marked polymorphic fixation on windshields and rear trunk assemblies). Powerful erotic fantasies of an anal-sadistic nature surrounded the image of the award-winning novelist.

	J.G. Ballard And The Conceptual Auto-Disaster.

	J.G. Ballard died yesterday in his last car-crash. During his life he had rehearsed his death in many crashes, but this was his only true accident. Driven on a collision course towards the royal limousine, his car jumped the rails of the London Airport flyover and plunged through the roof of a bus filled with airline passengers. The crushed bodies of package tourists, like a h&#230;morrhage of the sun, still lay across the vinyl seats an hour later. Holding the arm of her chauffeur, the Princess Diana, with whom [...]]]></description>
			<content:encoded><![CDATA[	<p><i>&#8220;Some people have suggested that mental illness is a kind of adaptation to the sort of circumstances that will arise in the future. As we move towards a more and more psychotic landscape, the psychotic traits are signs of a kind of Darwinian adaptation.&#8221;</i>&#8212;1998</p>

	<h3>Abstract.</h3>

	<p>Numerous studies have been conducted upon patients in terminal paresis (GPI), placing the author J.G. Ballard in a series of simulated auto crashes, e.g. multiple pileups, head-on collisions, motorcade attacks (fantasies of Presidential assassinations remained a continuing preoccupation, subjects showing a marked polymorphic fixation on windshields and rear trunk assemblies). Powerful erotic fantasies of an anal-sadistic nature surrounded the image of the award-winning novelist.</p>

	<h3>J.G. Ballard And The Conceptual Auto-Disaster.</h3>

	<p>J.G. Ballard died yesterday in his last car-crash. During his life he had rehearsed his death in many crashes, but this was his only true accident. Driven on a collision course towards the royal limousine, his car jumped the rails of the London Airport flyover and plunged through the roof of a bus filled with airline passengers. The crushed bodies of package tourists, like a h&#230;morrhage of the sun, still lay across the vinyl seats an hour later. Holding the arm of her chauffeur, the Princess Diana, with whom Ballard had dreamed of dying for so many months, stood alone under the revolving ambulance lights, a gloved hand to her throat.</p>

	<p>Could she see, in Ballard&#8217;s posture, the formula of the death he had devised for her? During the last weeks of his life Ballard had thought of nothing else but her death, a coronation of wounds he had staged with the devotion of an Earl Marshal. The walls of his apartment near the film studios at Shepperton were covered with the photographs he had taken with his zoom lens each morning as she left her hotel in London, from the pedestrian bridges above the westbound motorways, and from the roof of the multi-storey car-park at the studios. The magnified details of her knees and hands, of the inner surface of her thighs and the left apex of her mouth, he matched at his apartment with the photographs of grotesque wounds in a textbook of plastic surgery.</p>

	<p>Yesterday his body lay under the police arc-lights at the foot of the flyover, veiled by a delicate lacework of blood. The broken postures of his legs and arms, the bloody geometry of his face, seemed to parody the photographs of crash injuries that covered the walls of his apartment. Twenty yards away, illuminated by the revolving lamps, the princess hovered on the arm of her chauffeur. Ballard had dreamed of dying at the moment of her orgasm.</p>

	<p>Before his death Ballard had taken part in many crashes. As I think of Ballard I see him in the stolen cars he drove and damaged, the surfaces of deformed metal and plastic that for ever embraced him.</p>

	<h3>The Voices Of Time.</h3>

	<p>You&#8217;re not alone, Ballard, don&#8217;t think you are. These are the voices of time, and they&#8217;re all saying goodbye to you.<br />
Every particle in your body, every grain of sand, every galaxy carries the same signature.<br />
You know what the time is now,<br />
so what does the rest matter?</p>

	<h3>References.</h3>

	<ul>
		<li>Ballard, J.G. <a href="http://en.wikipedia.org/wiki/The_Voices_of_Time" title="">&#8220;The Voices Of Time&#8221;</a> [1962]</li>
		<li>Ballard, J.G. <a href="http://info.interactivist.net/node/3244" title="">&#8220;Why I Want To Fuck Ronald Reagan&#8221;</a> [1967]</li>
		<li>Ballard, J.J. <i><a href="http://www.amazon.com/Atrocity-Exhibition-Flamingo-Modern-Classics/dp/0007116861" title="">The Atrocity Exhibition</a> </i> [1969]</li>
		<li>Ballard, J.G. <i><a href="http://www.amazon.com/Crash-Novel-J-G-Ballard/dp/0312420331" title="">Crash</a> </i> [1973]</li>
	</ul>

	<p><i>[For the perplexed or appalled: This is a pastiche assembled out of bits of Ballard&#8217;s best-known works, with the names changed around. I claim no ownership of these words nor personal identification with their opinions.]</i></p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/04/the-assassination-of-jg-ballard-considered-as-a-metafictional-homage/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Adding Value = Theft!</title>
		<link>http://jens.mooseyard.com/2009/02/adding-value-theft/</link>
		<comments>http://jens.mooseyard.com/2009/02/adding-value-theft/#comments</comments>
		<pubDate>Wed, 25 Feb 2009 22:56:45 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Ideas]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/02/adding-value-theft/</guid>
		<description><![CDATA[	Roy Blount, president of the Authors&#8217; Guild, writing in the New York Times, attempts to defend his groups assertion that the Amazon Kindle 2&#8217;s text-to-speech capability is cheating authors out of audio-book royalties:

	&#8220;What the guild is asserting is that authors have a right to a fair share of the value that audio adds to Kindle 2&#8217;s version of books.&#8221;

	And that assertion makes absolutely no sense. The creator of an item does not have a right to impose an arbitrary tax on anyone who adds value to the item. Otherwise we&#8217;d be open to all sorts of nonsensical scenarios, like:

	
The RIAA hits Apple with a lawsuit, claiming that the trippy visualizer component built into iTunes adds value to the music, and demands extra visual-performance royalties.

	
Movie studios take issue with the &#8220;up-scaling&#8221; feature built into current DVD players, which increases the resolution of the image to improve picture quality on HTDVs. They point out that the output resolution is comparable to Blu-Ray, making the consumers&#8217; DVDs roughly twice as valuable, and demand the DVD manufacturers cut them a share of that.

	
The CEO of Exxon-Mobil asserts that his company has a right to a share of the extra value that the Prius adds [...]]]></description>
			<content:encoded><![CDATA[	<p>Roy Blount, president of the Authors&#8217; Guild, writing in the New York Times, attempts to defend his groups assertion that the Amazon Kindle 2&#8217;s text-to-speech capability is cheating authors out of audio-book royalties:</p>

	<blockquote>&#8220;What the guild is asserting is that authors have a right to a fair share of the value that audio adds to Kindle 2&#8217;s version of books.&#8221;</blockquote>

	<p>And that assertion makes absolutely no sense. The creator of an item does <em>not</em> have a right to impose an arbitrary tax on anyone who adds value to the item. Otherwise we&#8217;d be open to all sorts of nonsensical scenarios, like:</p>

	<p><hr /><br />
The <span class="caps">RIAA</span> hits Apple with a lawsuit, claiming that the trippy visualizer component built into iTunes adds value to the music, and demands extra visual-performance royalties.</p>

	<p><hr /><br />
Movie studios take issue with the &#8220;up-scaling&#8221; feature built into current <span class="caps">DVD</span> players, which increases the resolution of the image to improve picture quality on <span class="caps">HTD</span>Vs. They point out that the output resolution is comparable to Blu-Ray, making the consumers&#8217; DVDs roughly twice as valuable, and demand the <span class="caps">DVD</span> manufacturers cut them a share of that.</p>

	<p><hr /><br />
The <span class="caps">CEO</span> of Exxon-Mobil asserts that his company has a right to a share of the extra value that the Prius adds to every gallon of gasoline. Prius owners are getting more mileage out of it, making the gas more valuable to them, so Toyota should be paying $1 a gallon in royalties to the oil companies.</p>

	<p><hr /><br />
International Paper Corp. demands a share of the extra value that book publishers are adding to the paper it produces by printing books out of it. &#8220;We sell them a ream of paper for a buck,&#8221; said a company spokesman, &#8220;and they put some ink on it and turn around and sell it as two hardback books for $25 each! All we&#8217;re asking for is our fair share, say 10% of that $24 markup.&#8221;</p>

	<p><hr /><br />
IPC&#8217;s gutsy move is being watched with interest by Universal Forest Products, which points out that its wood pulp is being used by paper manufactuers and resold at a higher price. It is seeking 10% of the &#8220;unconscionable, exploitative profit&#8221; that <span class="caps">IPC</span> and other paper companies make from the pulp they get from <span class="caps">UFP</span>.</p>

	<p><hr /><br />
In a hastily-arranged press conference, The Lorax&#8212;who speaks for the trees&#8212;demands massive overdue royalties from the forest products industry, the paper industry, book publishers, as well as Amazon and Apple. Analysts praise the bouncy meter and humorous rhyme scheme of the announcement&#8230;</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/02/adding-value-theft/feed/</wfw:commentRss>
		<slash:comments>9</slash:comments>
		</item>
		<item>
		<title>Music, Alone</title>
		<link>http://jens.mooseyard.com/2009/02/music-alone/</link>
		<comments>http://jens.mooseyard.com/2009/02/music-alone/#comments</comments>
		<pubDate>Tue, 24 Feb 2009 17:42:30 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Me]]></category>
		<category><![CDATA[Music]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/02/music-alone/</guid>
		<description><![CDATA[	The feelings created by music are so strong, for me, but so ineffable. The problem of perception is usually described using color &#8212; how can we know if the visual sensation I call &#8220;red&#8221; is anything like the one you call &#8220;red&#8221;? &#8212; but only gets worse as you ascend to higher order perceptions, where even names become harder to apply. What do you call the feeling incited by &#8220;Guernica&#8221;, and even if you find the same words I would, is it the same feeling? And yet vision is our strongest, highest-bandwidth, most describable sense. We struggle to describe sound without using the technical terms of musicians, or vague metaphors.

	It doesn&#8217;t help that so much of the music I like is so inward-focused: the guitarist gazing (not at shoes) at effect pedals, the producer sliding waveforms around a timeline, the listener bracketed in headphones like my picture above.

	Everyone wants their experience of music to be shared. To play an instrument or sing for others, to blast the song from car speakers. To identify with music meant to shock, and use it to shock others. To attend a concert and know that those around you are hearing and feeling the same [...]]]></description>
			<content:encoded><![CDATA[	<p>The feelings created by music are so strong, for me, but so ineffable. The problem of perception is usually described using color &#8212; how can we know if the visual sensation I call &#8220;red&#8221; is anything like the one you call &#8220;red&#8221;? &#8212; but only gets worse as you ascend to higher order perceptions, where even names become harder to apply. What do you call the feeling incited by &#8220;Guernica&#8221;, and even if you find the same words I would, is it the same feeling? And yet vision is our strongest, highest-bandwidth, most describable sense. We struggle to describe sound without using the technical terms of musicians, or vague metaphors.</p>

	<p>It doesn&#8217;t help that so much of the music I like is so inward-focused: the guitarist gazing (not at shoes) at effect pedals, the producer sliding waveforms around a timeline, the listener bracketed in headphones like my picture above.</p>

	<p>Everyone wants their experience of music to be shared. To play an instrument or sing for others, to blast the song from car speakers. To identify with music meant to shock, and use it to shock others. To attend a concert and know that those around you are hearing and feeling the same thing you are, right then: sitting following the intricacies of Bach, or exploding in a mosh pit. Drugs of many kinds help to collapse this emotional waveform, unite a group into a Bose-ian condensate, whether it&#8217;s alcohol to bring out desire and anger, or Ecstasy to turn arpeggios and filter sweeps into spinal shivers and universal love.</p>

	<p>Nowadays I experience music by myself, mostly on headphones, like right now on the bus to work. Little circuits inside them are actively removing the signs of the outside world, leaving a weird sibilant hush that I fill with the noise I choose. My eyes are on a screen where I sort my music into playlists, or read what other people say about the music they love, and sometimes reach out and listen to their music myself.</p>

	<p>I take little piles of songs and chain them together, finding the little hooks at the ends where they fit, making daisy chains to <a href="http://recordings.mooseyard.com/" title="">share with people</a>. Is this creation? I didn&#8217;t create the songs, but joining them can make something new, like a work of collage. I would love to use the songs as words given to me, and string them together to tell a story. In some of the mixes I&#8217;ve made I can hear some of that: abstract arcs of emotion flying across 80 minutes, or juxtapositions that change the sounds on either side into something new that reflects the other.</p>

	<p>The worst part about creation is finishing, and throwing the end product out the door into the sunlight where it blows away in sheets. Diana tells me the abalone are dying out because they reproduce by scattering their seed into the ocean and hoping the eggs and sperm will meet; and as their numbers decrease, so does the likelihood of this success. In some ways the progression of my musical tastes has been like that. The Internet has been a tremendous boon, but the distance involved always makes me doubt, as the notes and bytes fly away out of sight, that they&#8217;ll ever find a mate, or if they do, whether I&#8217;ll even know.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/02/music-alone/feed/</wfw:commentRss>
		<slash:comments>4</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>Doing application updates via version-control</title>
		<link>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/</link>
		<comments>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/#comments</comments>
		<pubDate>Fri, 04 Jul 2008 17:17:01 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Ideas]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/07/doing-application-updates-via-version-control/</guid>
		<description><![CDATA[	I just had an interesting idea, brought on by a post to an Apple developer list asking about software-update mechanisms for Mac applications. The library everyone uses for this is Sparkle, which is wonderful in all ways except bandwidth usage: it updates the app by downloading an entire zip archive of the new version. With many apps nowadays being 10MB or even 100MB downloads, that&#8217;s pretty significant.

	This could clearly be improved a lot by downloading a delta instead, then using that to patch the current copy of the app. In most cases, using a good algorithm like xdelta3 or zdelta, the data transmitted will be orders of magnitude smaller than the entire app. (Nothing new here; many app updaters already do this, especially for games, and Microsoft apparently has some sophisticated delta-based software update tools in Windows.)

	Of course, the delta to be downloaded is specific to which version of the program you already have, as well as which one you&#8217;re updating to. This means the server will need to keep a number of deltas on hand, and it and the client need to negotiate which one to use.

	An additional problem with using deltas for updating Mac applications is that, on [...]]]></description>
			<content:encoded><![CDATA[	<p>I just had an interesting idea, brought on by a post to an Apple developer list asking about software-update mechanisms for Mac applications. The library everyone uses for this is <a href="http://sparkle.andymatuschak.org/" title="">Sparkle</a>, which is wonderful in all ways <em>except</em> bandwidth usage: it updates the app by downloading an entire zip archive of the new version. With many apps nowadays being 10MB or even 100MB downloads, that&#8217;s pretty significant.</p>

	<p>This could clearly be improved a lot by downloading a <a href="http://en.wikipedia.org/wiki/Delta_encoding" title="">delta</a> instead, then using that to patch the current copy of the app. In most cases, using a good algorithm like <a href="http://xdelta.org" title="">xdelta3</a> or <a href="http://cis.poly.edu/zdelta/" title="">zdelta</a>, the data transmitted will be orders of magnitude smaller than the entire app. (Nothing new here; many app updaters already do this, especially for games, and Microsoft apparently has <a href="http://en.wikipedia.org/wiki/Remote_Differential_Compression" title="">some sophisticated delta-based software update tools</a> in Windows.)</p>

	<p>Of course, the delta to be downloaded is specific to which version of the program you already have, as well as which one you&#8217;re updating to. This means the server will need to keep a number of deltas on hand, and it and the client need to negotiate which one to use.</p>

	<p>An additional problem with using deltas for updating Mac applications is that, on <span class="caps">OS X</span>, an app isn&#8217;t a single file but a directory tree masquerading as a file. This means that a patch would have to consist of a tree of deltas, one per file.</p>

	<p>I started toying with ways of implementing this, but a minute later my brain chimed in with the observation <em>&#8220;Hey Jens! This is just like what a version-control system does when updating a working tree from a repository!&#8221;</em> That&#8217;s what I love about my brain: some fraction of the factoids I cram into it daily will percolate inside and pop out later on at some useful moment. Thanks, brain!</p>

	<h2>Here&#8217;s My Idea.</h2>

	<p>Release your application in the form of a working tree of a distributed version-control system [DVCS] like <a href="http://selenic.com/mercurial" title="">Mercurial</a> (or <a href="http://git.or.cz/" title="">Git</a>, if you must.) That is, the app bundle&#8217;s &#8220;Contents&#8221; directory has a &#8220;.hg&#8221; subdirectory containing the usual Mercurial metadata. This is sort of unusual in that you&#8217;ve checked in the compiled app rather than the source code; but modern <span class="caps">DVC</span>Ss work fine with binary files.</p>

	<p>You also maintain on your server a repository containing all the versions of the application. Whenever you release a new version, you simply check it into that repository as an update of the previous release.</p>

	<p>Now, when a copy of the app wants to update itself, it simply does an &#8220;hg pull&#8221; (or equivalent) of itself from the repository <span class="caps">URL</span>. This efficiently determines which files have changed and, for each file, which deltas to download an apply. And it does this without affecting the running app, because the deltas go into the metadata in the &#8220;.hg&#8221; directory. Then when the pull is complete, the app can prompt the user that it&#8217;s time to relaunch, then run &#8220;hg update&#8221; to patch the actual files and quit and re-launch itself.</p>

	<p>This has a number of really nice features:</p>

	<ol>
		<li>Checking whether an update is present is quick (DVCS&#8217;s are optimized for this).</li>
			<li>Downloading updates uses minimal bandwidth because only compressed deltas are sent.</li>
			<li>The <span class="caps">DVCS</span> automatically handles updating from any old version.</li>
			<li>Users can even <em>downgrade</em> easily to previous versions. (In fact, switching between previously-downloaded versions can be done offline, since the <span class="caps">DVCS</span> metadata retains all the necessary diffs!)</li>
			<li>This mechanism can easily handle beta versions. By treating a beta as a branch, betas can easily be made &#8220;opt-in&#8221;, with users able to switch between beta and stable mode.</li>
			<li>If one user has downloaded an update, another nearby user could efficiently apply the update by pulling directly from that user&#8217;s copy of the app over the <span class="caps">LAN</span>, instead of having to go back to the original server. (Or alternatively, the <span class="caps">DVCS</span> can package the update into a patch-file that can be sent to the other computer and applied there.)</li>
	</ol>

	<p>The only drawbacks I can see to this are:</p>

	<ol>
		<li>The <span class="caps">DVCS</span> software needs to be available on every user&#8217;s machine. Since none of these ship with the OS, it would probably have to be packaged inside the app as part of the software-update library. That&#8217;s a significant amount of code (Mercurial is about 2MB, and I think Git is a lot bigger.)</li>
			<li>The local app&#8217;s revision metadata is a full repository that includes prior versions. You clearly don&#8217;t want to ship it that way. I believe <span class="caps">DVC</span>Ss all support a way of pruning old revisions from a repository, though.</li>
	</ol>

	<p>I&#8217;m not promising to implement this, but it&#8217;s so cool that <em>someone</em> needs to give it a try. And if it&#8217;s been done already, I&#8217;d be interested to hear about how well it worked.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/07/doing-application-updates-via-version-control/feed/</wfw:commentRss>
		<slash:comments>38</slash:comments>
		</item>
		<item>
		<title>Cloudy Identity</title>
		<link>http://jens.mooseyard.com/2008/04/cloudy-identity/</link>
		<comments>http://jens.mooseyard.com/2008/04/cloudy-identity/#comments</comments>
		<pubDate>Wed, 16 Apr 2008 06:04:21 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Ideas]]></category>
		<category><![CDATA[Social Software]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2008/04/cloudy-identity/</guid>
		<description><![CDATA[	Continuing from the previous Cloudy post &#8230; 

	

	At the root of Cloudy is the means for creating and establishing identity. A lot of peer-to-peer systems treat the peers mostly as interchangeable anonymous nodes, often deliberately so, but Cloudy is a social system.

	Quick Crypto Recap.

	The identity and security layers of Cloudy are tightly intertwined, because identity without security is useless. And security is accomplished entirely through cryptography, because the centralized alternatives like locking all of your servers up in a closet don&#8217;t apply. Cloudy doesn&#8217;t do anything new cryptographically (wisely so), but for the benefit of those who aren&#8217;t familiar with it, here&#8217;s a superficial overview of the off-the-shelf tools I&#8217;m using:

	Cryptographic Hashes, or, Digests.

	Like any hash algorithm, a cryptographic hash converts a block of data of arbitrary length into a short fixed-length output; the same input always produces the same output; and even the slightest change to the input should produce an entirely different output. Unlike a regular hash, two different inputs should never result in the same hash output. (That&#8217;s &#8220;never&#8221; in the practical sense: collisions are mathematically inevitable, but it should impractically long, ideally millions of years, to find one.) And it should be infeasible to identify anything [...]]]></description>
			<content:encoded><![CDATA[	<p><i>Continuing from <a href="http://mooseyard.com/Jens/2008/04/cloudy-as-buzzwords/" title="">the previous Cloudy post</a> &#8230; </i></p>

	<p><img src="http://mooseyard.com/Jed/Cloudy/WhatAStrangePlace.jpg" alt="" border="0" /></p>

	<p>At the root of Cloudy is the means for creating and establishing identity. A lot of peer-to-peer systems treat the peers mostly as interchangeable anonymous nodes, often deliberately so, but Cloudy is a <em>social</em> system.</p>

	<h2>Quick Crypto Recap.</h2>

	<p>The identity and security layers of Cloudy are tightly intertwined, because identity <em>without</em> security is useless. And security is accomplished entirely through cryptography, because the centralized alternatives like locking all of your servers up in a closet don&#8217;t apply. Cloudy doesn&#8217;t do anything new cryptographically (wisely so), but for the benefit of those who aren&#8217;t familiar with it, here&#8217;s a superficial overview of the off-the-shelf tools I&#8217;m using:</p>

	<h3>Cryptographic Hashes, or, Digests.</h3>

	<p>Like any hash algorithm, a cryptographic hash converts a block of data of arbitrary length into a short fixed-length output; the same input always produces the same output; and even the slightest change to the input should produce an entirely different output. Unlike a regular hash, two different inputs should <em>never</em> result in the same hash output. (That&#8217;s &#8220;never&#8221; in the practical sense: collisions are mathematically inevitable, but it should impractically long, ideally millions of years, to find one.) And it should be infeasible to identify anything about the original data given only the hash.</p>

	<p>Cryptographic hashes are rather weird and neat. I&#8217;ve previously called them &#8220;the Dewey Decimal numbers for the Universal Library&#8221;. They also remind me of the scene in the old TV cartoon of &#8220;The Cat In The Hat&#8221;, where the Cat and kids are running around labeling every object in the house with cryptic identifiers like &#8220;QW-X12&#8221;. Digests are a bit longer than that (SHA-1 outputs 160 bits, i.e. 20 bytes) but it&#8217;s still very handy to have a compact label to identify any conceivable chunk of data.</p>

	<h3>Public/Private Key Pairs, or, Asymmetric Keys</h3>

	<p>A regular cipher uses what&#8217;s called a <em>symmetric key</em>. The sender and receiver choose a single key that they both have to know, but keep secret. The sender inserts the key into the encryption algorithm and feeds the message in, and out comes the encrypted form. The receiver then inserts the same key into the decryption algorithm, feeds the encrypted data into it, and out comes the original message. The point is that they use a single key, and the one who generates the key has to somehow convey it secretly to the other party before they can use it, leading to an obvious chicken-and-egg problem.</p>

	<p>Asymmetric encryption algorithms, the best known of which is <span class="caps">RSA</span>, use <em>two</em> keys. The keys are generated together in a matched pair. When one key is used by the sender to encrypt data, it takes the <em>other</em> key of the pair to decrypt it.</p>

	<p>The genius of this is that you only have to keep one of the keys secret. The other one can be given away freely and is called the &#8220;public key&#8221;. If someone else has a copy of your public key, s/he can use your public key to encrypt a message to you. Remember, it doesn&#8217;t matter how people get your key; you can read it to them over the phone, email it, print it on a billboard. The encrypted message still can&#8217;t be read by anyone else, because only you have the matching <em>private</em> key to decrypt it. In other words, it becomes possible to send secure messages without having to share a secret key in advance.</p>

	<h3>Digital Signatures.</h3>

	<p>There&#8217;s another use for key-pairs. You can use your private key to generate a <em>signature</em> of a message, a small block of data that can be attached to it. Anyone who has your public key can then use it to <em>verify</em> the signature, i.e. prove that you generated the signature of that message with your private key. No one else could have generated the signature. In other words, as the name &#8220;signature&#8221; implies, this is a way to unforgeably mark a document to show your authorship or approval.</p>

	<p>(A digital signature is really just a cryptographic hash of the document, which is then encrypted with the private key. To verify someone&#8217;s signature you just decrypt it using their public key, then compute your own hash of the document and compare the two results.)</p>

	<h3>Digital Certificates.</h3>

	<p>A <em>certificate</em> is, in general, just a signed document that attests to something. Usually it&#8217;s vouching for the identity of the owner of another key; something like &#8220;the owner of the public key 3FD8B640 is Joe-Bob Briggs, of Dallas TX, joebob@example.com. Signed, Verisign.com.&#8221; This is the standard way that trust gets spread around in a distributed system.</p>

	<h2>Back To Cloudy: Generating An Identity.</h2>

	<p>Your Cloudy identity is simply a public key, currently 2048-bit <span class="caps">RSA</span>, generated the first time you launch the program. (The matching private key is stored securely in the Mac <span class="caps">OS </span>Keychain.) From then on, that public key uniquely identifies you. It&#8217;s <em>unique</em> because it&#8217;s randomly picked from a space so large that the possibility of collisions is for all practical purposes zero. It <em>identifies</em> you because it can be used by others to verify anything you signed with the matching private key.</p>

	<p>[2048 bits (256 bytes) is somewhat bulky to use as an identifier; so a public key can be run through an <span class="caps">SHA</span>-1 hash and converted into a 160-bit (20-byte) digest form that&#8217;s, for all intents and purposes, equally unique. (2<sup>160</sup> is about 10<sup>48</sup>, nearly the number of atoms in the Earth.) The digest, however, has no cryptographic value to a recipient who doesn&#8217;t already have the public key, so it&#8217;s not a <em>secure</em> identifier by itself.]</p>

	<p>The first thing the new key is used for is to mint an <span class="caps">SSL</span> certificate, which will be used for identification when you communicate with other peers over <span class="caps">SSL</span> sockets. It&#8217;s a &#8220;self-signed&#8221; certificate because it doesn&#8217;t contain a signature from any trusted higher authority (there aren&#8217;t any). But that&#8217;s OK: when Cloudy peers connect, they only need to make sure of the identities they&#8217;re contacting, which are literally just the public keys in the certificates.</p>

	<h2>Cloudy Certificates.</h2>

	<p><span class="caps">SSL</span> unfortunately uses an awkward and complex certificate format called X.509, which is one of two evolutionary relics left over from a long-dead overly-ambitious network architecture called X.500. (The other one is the <span class="caps">LDAP</span> directory protocol; the fact that the L stands for &#8220;Lightweight&#8221; gives you an idea of how comparatively elephantine X.500 must have been.) Most cryptographic experts seem to hate X.509: Ferguson and Schneier&#8217;s <a href="http://www.amazon.com/Practical-Cryptography-Niels-Ferguson/dp/0471223573/ref=pd_bbs_sr_1?ie=UTF8&#038;s=books&#038;qid=1208239300&#038;sr=8-1" title="">Practical Cryptography</a> flatly recommends avoiding it if possible, and Peter Gutmann&#8217;s <a href="http://www.cs.auckland.ac.nz/~pgut001/pubs/pkitutorial.pdf" title="">overview</a> is a masterful takedown, with sarcasm worthy of Doug Piranha.</p>

	<p>After spending a week painfully figuring out how to generate a goddamn trivial self-signed cert, even with the help of state-of-the-art system APIs, I could understand what the experts meant. I didn&#8217;t want to use X.509 anymore. And it wasn&#8217;t flexible enough anyway, since it was designed around the idea of hierarchical authorities. Unfortunately I didn&#8217;t have a choice for <span class="caps">SSL</span>, but I went with an alternate approach for all the other certs Cloudy peer use when talking to each other.</p>

	<p>I really liked the approach taken by <a href="http://people.csail.mit.edu/rivest/sdsi11.html" title=""><span class="caps">SDSI</span></a>, a distributed identity system from about 10 years ago that never took off. It defined a simple textual syntax for certificates. <span class="caps">SDSI</span> used <span class="caps">LISP</span>-like S-expressions as the syntax, but the details aren&#8217;t important&#8212;I took the abstract concepts and went with something I found more readable. I tried <a href="http://json.org" title=""><span class="caps">JSON</span></a> first, but found it too limiting, so I ended up using <a href="http://yaml.org" title=""><span class="caps">YAML</span></a>.</p>

	<p>[YAML is a data serialization syntax; it&#8217;s language-agnostic, but most popular in the Ruby community. Its main advantages over <span class="caps">JSON </span>(or <span class="caps">OS X</span> property lists) are a richer set of data types, custom typing for collections (i.e. you can say &#8220;this array is a Rectangle&#8221; or &#8220;this dictionary is a Person&#8221;), and the ability to represent arbitrary object graphs, not just trees. You can think of it as being like a pretty syntax for Cocoa object archives or Java object serialization.]</p>

	<p>All I had to do (aside from writing a good Cocoa wrapper <span class="caps">API</span> for <span class="caps">YAML</span>) was define a schema for representing things like keys and signatures in <span class="caps">YAML</span>. Then I could use those to define my own signed certificate objects.</p>

	<h3><span class="caps">A YAML </span>Certificate Example.</h3>

<code><pre>
.  --- !cloudy/CallingCard
.  host: 76.191.199.123
.  prof: 229474364
.  port: 60507
.  stat: 4
.  signature: !cloudy/Signature
.    signed: !binary |-
.      oVCuVVlXPEdRPR+gy1k/UNOXtwvcN7LNpK6xTcA/hmlKh6uIT56E19LxWzA7POxm
.      nhc351NVdoKC9XaUVsaZYDOnp2wWEWLUtdYYA8I++NZZIVlCHOjHCHr7mcfNcceD
.      v+15RE9vguQ/PO1yaOU4DlviYt75y7xKMRs5REbZss6E/mr+0r1KE+f73dpHCVoD
.      SW0azTD43pug2Pyh2Kar0GHXQcS4Iq/Y2nRFv7wyLUUmyVA7XI665a8QjMCiec2w
.      0PqQ32FwGBYkH/iR/cfmaKjuwjAbW/qo7NoTH6WSFQy2ua/PVQs9B+dyjnZ5Z30E
.      rnl9UTCVwjUmCc8J4hoaTQ==
.    digest: !cloudy/Digest pFCzUK7yuO0dWtm0oATB7ag6vj0=
.    date: 2008-04-15 21:55:46.830 -07:00
.    expires: 21600
.    signer: !cloudy/Person
.      nickname: snej
.      publicKey: !cloudy/PublicKey
.        algorithm: 42
.        format: 1
.        bits: 2048
.        data: !binary |-
.          MIIBCgKCAQEApP6/D5aZm7nYfGwSMD3xQCCWw+XeU1NmZE7N/7eHvQlCUHMS8Aac
.          Wh+s/PlPd1o7k+YePhoHnc1vR9uAfWm8iowiUU0RluUNxY0dRkTauRqeYM6//s+5
.          ZXuh27pDDq2BgQYPL6EOp2UtWSQ/ojQjqX2/sGMkZ3k+uYiu1ZGQS2s0xTHPkgtu
.          VI+Kg2TBY/28zAG4H/seUHNAP+frlpX+fizSC2oYNdREpEcVcVacHMQGwrj3mAr7
.          g/LpJTnWgZhiJYvp7c4MkAYfHOIbKIXeXrF8oOz0EwgwSp0ZWkezuIYa4BMAns52
.          WYK3LooQ+GttPIdVhSzzhLlY3psLeOf6nQIDAQAB
</pre></code>

	<p>This represents a &#8220;CallingCard&#8221; object, which a peer broadcasts in order to tell other peers that it&#8217;s online, and where it is on the network and what it&#8217;s current state is. (One of the places a CallingCard appears is in the <span class="caps">TXT</span> record of Cloudy&#8217;s Bonjour service.)</p>

	<p>The syntax is more complex than <span class="caps">JSON</span>, but still pretty easy to read:</p>

	<ul>
		<li>The first line says this is a dictionary structure whose higher-level type is &#8220;cloudy/CallingCard&#8221; (this gets mapped to the CallingCard class in my code.)</li>
		<li>The next four lines describe four key/value pairs in the dictionary. In a CallingCard these represent the IP address, port number, timestamp of the user&#8217;s current &#8220;profile&#8221;, and online status (4 = &#8220;Available&#8221;). The keys are four letters long just to save some room and because I get nostalgic for OSTypes sometimes.</li>
		<li>Line 6 assigns the &#8220;signature&#8221; key to a nested dictionary of type &#8220;cloudy/Signature&#8221;. This dictionary is the digital signature of the enclosing object.</li>
		<li>The &#8220;signed&#8221; attribute of the signature is the raw <span class="caps">RSA</span> signature data.</li>
		<li>The &#8220;digest&#8221; attribute is the <span class="caps">SHA</span>-1 digest of the object being signed, in this case the enclosing CallingCard, <em>ignoring the &#8220;signature&#8221; attribute</em>.</li>
		<li>The &#8220;date&#8221; attribute is the timestamp of the moment the signature was generated.</li>
		<li>The &#8220;expires&#8221; attribute is the lifetime of the signature, in seconds, starting from the &#8220;date&#8221;. After this interval the signature expires, and the signed object loses its validity and will generally be deleted, or at least not passed on to other peers anymore.</li>
		<li>The &#8220;signer&#8221; attribute is a cloudy/Person object, the identity who generated the signature.</li>
		<li>&#8220;nickname&#8221; is a brief human-readable name for this identity. It doesn&#8217;t really mean anything; it&#8217;s just useful as a default name to display (like an <span class="caps">AIM</span> handle in a buddy list) if the local user hasn&#8217;t set up a customized name.</li>
		<li>&#8220;publicKey&#8221; is the identity&#8217;s public key, the actual unique identifier.</li>
		<li>&#8220;algorithm&#8221; identifies the type of key (RSA), &#8220;format&#8221; identifies the format of the key data (PEM, I think), &#8220;bits&#8221; is the number of bits in the key, and &#8220;data&#8221; is the key data itself.</li>
	</ul>

	<p>This does look a bit verbose when written out, but of course usually you&#8217;d never see this unless you were debugging something. (And it compresses well, by about 50% using gzip.) One space-saving feature that doesn&#8217;t show up here is that, if the same object appears more than once, it&#8217;s only written out once; after that it appears as a short reference back to the definition. So if <span class="caps">I YAML</span>-encode an array of signed objects (which is very common), my cloudy/Person data only appears once.</p>

	<h3>A Nasty Detail: Canonical Form</h3>

	<p>I glossed over an important detail: to sign an object you have to compute a digest of it, and to compute a digest you have to be able to express the object as raw data. Clearly the raw data in this case is the <span class="caps">YAML</span> encoding of the object, right?</p>

	<p>The catch is that in <span class="caps">YAML</span>, as with any human-readable syntax, there are many different ways to write out the same object. I can change the indentation, I can change the line breaks, I can list dictionary attributes in a different order. Any of those changes causes the resulting digest to look completely different.</p>

	<p>This is a real problem because, if I read a signed object from <span class="caps">YAML</span> into a native object and then write it back out to <span class="caps">YAML</span>, it&#8217;s likely to come out slightly differently. For example, if I write it as part of an array, then as a nested element its lines will be indented. Also, the ways dictionaries are stored in hashtables mean that their keys come out in unpredictable orders when iterated. But if that happens, the digest changes, which invalidates the signature.</p>

	<p>So any certificate syntax has to define a single standard (&#8220;canonical&#8221;) encoding of an object into binary data. In my <span class="caps">YAML</span> code I had to enable a &#8220;canonical mode&#8221; that, when turned on, causes a specific set of spacing rules to be used, dictionary and set entries to be written in alphabetical order, et cetera. This mode isn&#8217;t normally used, but it has to be turned on when computing the digest of an object, in order to sign it or to verify a signature.</p>

	<p>[Incidentally, one of the reasons that digital signatures aren&#8217;t being used much in the various trendy <span class="caps">XML</span>-based data formats, like <span class="caps">RSS</span> and Atom, is that <span class="caps">XML</span> is much more difficult to canonicalize. I don&#8217;t understand all of the details, but they looked nasty enough that I was glad enough to rule out using <span class="caps">XML</span>.]</p>

	<h3>Verifying A Signed Object.</h3>

	<p>When you verify the signature of a block of <span class="caps">YAML</span> like the above, you have to do this:</p>

	<ol>
		<li>Parse the <span class="caps">YAML</span> into a graph of native objects.</li>
			<li>Take the root Signed object, remove the &#8220;signature&#8221; attribute, and write it back into <span class="caps">YAML</span> in &#8220;canonical mode&#8221;.</li>
			<li>Compute the digest of that canonical <span class="caps">YAML</span>.</li>
			<li>Compare the digest with the &#8220;digest&#8221; attribute of the Signature. If it doesn&#8217;t match, the object&#8217;s been tampered with (or damaged) and should be ignored.</li>
			<li>Otherwise, write the &#8220;Signature&#8221; object back into canonical <span class="caps">YAML</span> and compute the digest.</li>
			<li>Encrypt that digest using the public key in the &#8220;signer.publicKey&#8221; attribute.</li>
			<li>Compare the result with the &#8220;signed&#8221; attribute. If it doesn&#8217;t match, the signature was forged (or damaged.)</li>
			<li>Otherwise, the signature is valid and the outer Signed object can be treated as being definitively created by the Person listed in the Signature.</li>
	</ol>

	<h2>Whew.</h2>

	<p>OK, so we can create secure identities, encrypt stuff, and sign arbitrary objects. Now what do we do with them? The CallingCard example above should give you some ideas, but I&#8217;ll go into more detail in the next &#8216;thrilling&#8217; installment.</p>

	<p><strong>Next: <a href="http://mooseyard.com/Jens/2008/04/cloudy-networking/" title="">Networking</a>.</strong></p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/04/cloudy-identity/feed/</wfw:commentRss>
		<slash:comments>8</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! -->