<?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; Social Software</title>
	<atom:link href="http://jens.mooseyard.com/category/social-software/feed/" rel="self" type="application/rss+xml" />
	<link>http://jens.mooseyard.com</link>
	<description>Little boxes made of words, by Jens Alfke</description>
	<lastBuildDate>Thu, 08 Jul 2010 06:30:02 +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>Social Networks Personified</title>
		<link>http://jens.mooseyard.com/2010/07/social-networks-personified/</link>
		<comments>http://jens.mooseyard.com/2010/07/social-networks-personified/#comments</comments>
		<pubDate>Thu, 08 Jul 2010 05:46:32 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Humor]]></category>
		<category><![CDATA[Social Software]]></category>

		<guid isPermaLink="false">http://jens.mooseyard.com/?p=406</guid>
		<description><![CDATA[	Twitter: Charming in brief doses, he tells you little one-liner jokes, then wanders off after two sentences to go talk at somebody else. He absolutely will not shut up for an instant, and namedrops shamelessly about his famous friends. When he&#8217;s outworn his welcome he passes out drunk on the floor and has to be dragged home.

	MySpace: Who? Oh, right, this anorexic high-school girl who threw herself at you at a party once in 2005. She kept bragging about all the bands she knew (and which you could overhear on the tinny earbuds she wore.) After one too many J&#228;germeister Jell-O shots she barfed Day-Glo all over your shoes. Last you&#8217;ve heard, she&#8217;s found some 80-year-old media mogul to be her sugar daddy.

	Facebook: You vaguely remember him from high school. He was a nonentity then and he&#8217;s equally uninteresting now, but he&#8217;s somehow infiltrated your circle of friends and shows up at every social event you go to, telling boring anecdotes about last night&#8217;s game and what he bought at Wal*Mart. Worse, it seems he&#8217;s joined some cult and wants you to join too so he can go up a level.

	Tumblr: She&#8217;s got impeccable taste, a lovely apartment and fascinating [...]]]></description>
			<content:encoded><![CDATA[	<p><strong>Twitter:</strong> Charming in brief doses, he tells you little one-liner jokes, then wanders off after two sentences to go talk at somebody else. He absolutely will not shut up for an instant, and namedrops shamelessly about his famous friends. When he&#8217;s outworn his welcome he passes out drunk on the floor and has to be dragged home.</p>

	<p><strong>MySpace:</strong> Who? Oh, right, this anorexic high-school girl who threw herself at you at a party once in 2005. She kept bragging about all the bands she knew (and which you could overhear on the tinny earbuds she wore.) After one too many J&#228;germeister Jell-O shots she barfed Day-Glo all over your shoes. Last you&#8217;ve heard, she&#8217;s found some 80-year-old media mogul to be her sugar daddy.</p>

	<p><strong>Facebook:</strong> You vaguely remember him from high school. He was a nonentity then and he&#8217;s equally uninteresting now, but he&#8217;s somehow infiltrated your circle of friends and shows up at every social event you go to, telling boring anecdotes about last night&#8217;s game and what he bought at Wal*Mart. Worse, it seems he&#8217;s joined some cult and wants you to join too so he can go up a level.</p>

	<p><strong>Tumblr:</strong> She&#8217;s got impeccable taste, a lovely apartment and fascinating stories, but after a while you realize she only talks about what <em>other</em> people have done; she doesn&#8217;t have an original thought in her head. She won&#8217;t carry on a conversation, either, so the only way to get her to pay attention to you is to repeat back something she&#8217;s already told you.</p>

	<p><strong>Soup.io:</strong> Similar to Tumblr, but with a cute Austrian accent. She&#8217;s more conversational, but on the downside she sometimes insists on talking to you in German.</p>

	<p><strong>LiveJournal:</strong> A mysterious Goth chick you were introduced to at a club. After you strike up a friendship with her, she starts telling you all her innermost secrets whenever you see her. This is terribly alluring at first, enough so that you can overlook her appallingly bad fanfic, but after a while you begin to realize how seriously disturbed she is. Around then she abruptly stops showing up, and you&#8217;re never sure whether she killed herself or just moved to a more elite social circle. You never learn her real name.</p>

	<p><em>[Update: I&#8217;ve changed two of them to male. I wanted to be consistent in the personification, but in retrospect that leaves me open to charges of sexism, which absolutely wasn&#8217;t intended. They all have male counterparts, of course, whom I&#8217;d love to hear about if you want to write about them.]</em></p>

 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2010/07/social-networks-personified/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<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>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>iTunes 9 Deja Vu</title>
		<link>http://jens.mooseyard.com/2009/08/itunes-9-deja-vu/</link>
		<comments>http://jens.mooseyard.com/2009/08/itunes-9-deja-vu/#comments</comments>
		<pubDate>Tue, 11 Aug 2009 17:30:33 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Me]]></category>
		<category><![CDATA[Music]]></category>
		<category><![CDATA[Social Software]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/08/itunes-9-deja-vu/</guid>
		<description><![CDATA[	AppleInsider reports on the iTunes 9 rumors:

	&#8220;The social networking integration that we reported iTunes 9 would have seems to be part of a bigger social networking push by Apple,&#8221; the report states. &#8220;We&#8217;ve been informed that Apple has plans to tie iTunes 9 into a &#8220;Social&#8221; application that they plan to release in the future.&#8221;

	This sounds like the kind of app (though separate from iTunes) that Jessica Kahn and I kept trying in vain to get Apple to build, circa 2003-2005. Maybe they&#8217;ll get some use out of our abandoned prototypes.

	The report goes on to say that the new application would allow users to share their listening habits with friends [and] send music to friends&#8221;

	Mike Estee and I had actually prototyped this in iChat in 2003, but the feature never got approved since there were so many more important things to add, like 3-way video conferencing. (Plus the fact that Apple execs turned white as a sheet if you said the words &#8220;send music&#8221; near them.)

	Anyway, personal bitterness aside, I think it&#8217;s really amusing that Apple keeps shoving the kitchen sink into iTunes, since that has to be the single nastiest, hardest-to-extend codebase they have &#8212; it&#8217;s their last remaining [...]]]></description>
			<content:encoded><![CDATA[	<p><a href="http://www.appleinsider.com/articles/09/08/11/apple_rumored_to_create_social_media_consolidation_client.html" title="">AppleInsider reports on the iTunes 9 rumors</a>:</p>

	<blockquote>&#8220;The social networking integration that we reported iTunes 9 would have seems to be part of a bigger social networking push by Apple,&#8221; the report states. &#8220;We&#8217;ve been informed that Apple has plans to tie iTunes 9 into a &#8220;Social&#8221; application that they plan to release in the future.&#8221;</blockquote>

	<p>This sounds like the kind of app (though separate from iTunes) that Jessica Kahn and I kept trying in vain to get Apple to build, circa 2003-2005. Maybe they&#8217;ll get some use out of our abandoned prototypes.</p>

	<blockquote>The report goes on to say that the new application would allow users to share their listening habits with friends [and] send music to friends&#8221;</blockquote>

	<p>Mike Estee and I had actually prototyped this in iChat in 2003, but the feature never got approved since there were so many more <em>important</em> things to add, like 3-way video conferencing. (Plus the fact that Apple execs turned white as a sheet if you said the words &#8220;send music&#8221; near them.)</p>

	<p>Anyway, personal bitterness aside, I think it&#8217;s really amusing that Apple keeps shoving the kitchen sink into iTunes, since that has to be the single nastiest, hardest-to-extend codebase they have &#8212; it&#8217;s their last remaining Carbon app, with a foundation that dates back to Casady &#038; Greene&#8217;s SoundJam, circa 1998.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/08/itunes-9-deja-vu/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Plugging a hole in GameKit</title>
		<link>http://jens.mooseyard.com/2009/03/plugging-a-hole-in-gamekit/</link>
		<comments>http://jens.mooseyard.com/2009/03/plugging-a-hole-in-gamekit/#comments</comments>
		<pubDate>Wed, 18 Mar 2009 16:26:33 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Games]]></category>
		<category><![CDATA[Social Software]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/03/plugging-a-hole-in-gamekit/</guid>
		<description><![CDATA[	The GameKit framework in iPhone OS 3.0 is very interesting to a Bonjour / P2P head like yrs truly. It basically provides a very easy-to-use API for ad-hoc group formation and many-to-many messaging on a local network. Great for games, of course, but also for many other types of social apps. (I just saw a report on a dev forum that somebody had whipped up a basic chat app in about 15 minutes.)

	GameKit uses BlueTooth networking; that lets it work where there&#8217;s no WiFi, but it also limits the range. BlueTooth covers just a few meters, whereas a WiFi network connected to an Ethernet subnet can easily cover a whole floor of a building.

	My MYNetwork framework seems like a good way to bridge that gap. The TCP connection classes provide the Bonjour discovery and makes point-to-point connections, and the BLIP protocol lets you send data blobs over those connections.

	It should be pretty straightforward to build some classes that are plug-compatible with the GameKit network classes but use MYNetwork. Then iPhone apps could easily support both protocols, and compatible Mac apps could be developed. Anyone want to try it?

	[Note: I&#8217;m only referring to information that was publicly discussed at Apple&#8217;s press [...]]]></description>
			<content:encoded><![CDATA[	<p>The GameKit framework in iPhone <span class="caps">OS 3</span>.0 is very interesting to a Bonjour / <span class="caps">P2P</span> head <a href="http://mooseyard.com/Jens/2008/04/cloudy-as-buzzwords/" title="">like yrs truly</a>. It basically provides a very easy-to-use <span class="caps">API</span> for ad-hoc group formation and many-to-many messaging on a local network. Great for games, of course, but also for many other types of social apps. (I just saw a report on a dev forum that somebody had <a href="http://www.iphonedevsdk.com/forum/iphone-sdk-development-iphone-os-3-0/13601-using-new-iphone-os-3-0-a.html#post61710" title="">whipped up a basic chat app in about 15 minutes</a>.)</p>

	<p>GameKit uses BlueTooth networking; that lets it work where there&#8217;s no WiFi, but it also limits the range. BlueTooth covers just a few meters, whereas a WiFi network connected to an Ethernet subnet can easily cover a whole floor of a building.</p>

	<p>My <a href="http://mooseyard.com/projects/MYNetwork/" title="">MYNetwork</a> framework seems like a good way to bridge that gap. The <span class="caps">TCP</span> connection classes provide the Bonjour discovery and makes point-to-point connections, and the <a href="http://mooseyard.com/Jens/2008/05/blip-come-n-get-it/" title=""><span class="caps">BLIP</span></a> protocol lets you send data blobs over those connections.</p>

	<p>It should be pretty straightforward to build some classes that are plug-compatible with the GameKit network classes but use MYNetwork. Then iPhone apps could easily support both protocols, and compatible Mac apps could be developed. Anyone want to try it?</p>

	<p><i>[Note: I&#8217;m only referring to information that was publicly discussed at <a href="http://events.apple.com.edgesuite.net/0903lajkszg/event/index.html" title="">Apple&#8217;s press event yesterday</a>. I&#8217;ve read through the APIs, but I won&#8217;t go into details about them here in public.]</i></p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/03/plugging-a-hole-in-gamekit/feed/</wfw:commentRss>
		<slash:comments>3</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>Security hole in Safari RSS</title>
		<link>http://jens.mooseyard.com/2009/01/security-hole-in-safari-rss/</link>
		<comments>http://jens.mooseyard.com/2009/01/security-hole-in-safari-rss/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 00:24:49 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Me]]></category>
		<category><![CDATA[Social Software]]></category>

		<guid isPermaLink="false">http://mooseyard.com/Jens/2009/01/security-hole-in-safari-rss/</guid>
		<description><![CDATA[	Brian Mastenbrook has discovered a really bad security hole in Safari RSS:

	I have discovered that Apple&#8217;s Safari browser is vulnerable to an attack that allows a malicious web site to read files on a user&#8217;s hard drive without user intervention. This can be used to gain access to sensitive information stored on the user&#8217;s computer, such as emails, passwords, or cookies that could be used to gain access to the user&#8217;s accounts on some web sites. The vulnerability has been acknowledged by Apple.

	All users of Mac OS X 10.5 Leopard who have not who have not performed the workaround steps listed below are affected, regardless of whether they use any RSS feeds. Users of previous versions of Mac OS X are not affected.

	He hasn&#8217;t released details yet, presumably to give Apple time to release a patch, so I don&#8217;t know what the bug is. But it&#8217;s my fault, since I either wrote the bad code myself, or at least didn&#8217;t notice a mistake a co-worker made. And since I&#8217;m not at Apple anymore I can&#8217;t help fix it.

	Shit. I&#8217;m sorry, everyone.
 ]]></description>
			<content:encoded><![CDATA[	<p>Brian Mastenbrook has discovered <a href="http://brian.mastenbrook.net/display/27" title="">a really bad security hole in Safari <span class="caps">RSS</span></a>:</p>

	<blockquote>I have discovered that Apple&#8217;s Safari browser is vulnerable to an attack that allows a malicious web site to read files on a user&#8217;s hard drive without user intervention. This can be used to gain access to sensitive information stored on the user&#8217;s computer, such as emails, passwords, or cookies that could be used to gain access to the user&#8217;s accounts on some web sites. The vulnerability has been acknowledged by Apple.</blockquote>

	<blockquote>All users of Mac <span class="caps">OS X 10</span>.5 Leopard who have not who have not performed the workaround steps listed below are affected, regardless of whether they use any <span class="caps">RSS</span> feeds. Users of previous versions of Mac <span class="caps">OS X</span> are not affected.</blockquote>

	<p>He hasn&#8217;t released details yet, presumably to give Apple time to release a patch, so I don&#8217;t know what the bug is. But it&#8217;s my fault, since I either wrote the bad code myself, or at least didn&#8217;t notice a mistake a co-worker made. And since I&#8217;m not at Apple anymore I can&#8217;t help fix it.</p>

	<p>Shit. I&#8217;m sorry, everyone.</p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2009/01/security-hole-in-safari-rss/feed/</wfw:commentRss>
		<slash:comments>7</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>Cloudy Verification</title>
		<link>http://jens.mooseyard.com/2008/04/cloudy-verification/</link>
		<comments>http://jens.mooseyard.com/2008/04/cloudy-verification/#comments</comments>
		<pubDate>Sat, 26 Apr 2008 22:04:54 +0000</pubDate>
		<dc:creator>jens</dc:creator>
				<category><![CDATA[Computers]]></category>
		<category><![CDATA[Social Software]]></category>

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

	

	The first time you connect to someone, how do you establish that digital identifier you&#8217;re communicating with is the human being you think it is? This is surprisingly difficult to do, because it&#8217;s prone to what cryptographers call the &#8220;man-in-the-middle attack&#8221;.

	(Those of you already wearing tinfoil hats can skip past the general explanation, down to &#8220;What Cloudy Does&#8221;.)

	1. A Quick Overview Of Verification Attacks.

	First, consider the most obvious attack: simple spoofing.

	Spoofing.

	Let&#8217;s suppose there&#8217;s an instant-messaging UI, and while working at home you receive a message from someone with an unknown key, whose nickname is &#8220;AliceLiddell&#8221;, which happens to be the name of a co-worker.

	&#8220;AliceLiddell&#8221;: yo, this is alice
You: hi alice, what&#8217;s up?
You add this identity to your friends-list.
Alice: i need the admin password to the web server to fix a template
You: oh ok, it&#8217;s wend4743kt
Alice: kthxbye


	Fifteen minutes later your company&#8217;s website is pwned by the hacker who posed as Alice. All he had to do was create a new identity with her name as the nickname, and pretend to be her.

	How do we get around this? You might think that asking questions before accepting someone&#8217;s claimed identity would help, and it does help [...]]]></description>
			<content:encoded><![CDATA[	<p><i>Continuing from <a href="http://mooseyard.com/Jens/2008/04/cloudy-networking/" title="">the previous Cloudy post</a> &#8230; </i></p>

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

	<p>The <em>first</em> time you connect to someone, how do you establish that digital identifier you&#8217;re communicating with is the human being you think it is? This is surprisingly difficult to do, because it&#8217;s prone to what cryptographers call the &#8220;man-in-the-middle attack&#8221;.</p>

	<p>(Those of you already wearing tinfoil hats can skip past the general explanation, down to &#8220;What Cloudy Does&#8221;.)</p>

	<h2>1. A Quick Overview Of Verification Attacks.</h2>

	<p>First, consider the most obvious attack: simple spoofing.</p>

	<h3>Spoofing.</h3>

	<p>Let&#8217;s suppose there&#8217;s an instant-messaging UI, and while working at home you receive a message from someone with an unknown key, whose nickname is &#8220;AliceLiddell&#8221;, which happens to be the name of a co-worker.</p>

	<blockquote>&#8220;AliceLiddell&#8221;: yo, this is alice<br />
You: hi alice, what&#8217;s up?<br />
<em>You add this identity to your friends-list.</em><br />
Alice: i need the admin password to the web server to fix a template<br />
You: oh ok, it&#8217;s wend4743kt<br />
Alice: kthxbye</blockquote>


	<p>Fifteen minutes later your company&#8217;s website is pwned by the hacker who posed as Alice. All he had to do was create a new identity with her name as the nickname, and pretend to be her.</p>

	<p>How do we get around this? You might think that asking questions before accepting someone&#8217;s claimed identity would help, and it does help with spoofing, but there are nastier attacks.</p>

	<h3>Man-In-The-Middle</h3>

	<blockquote>&#8220;AliceLiddell&#8221;: yo, this is alice<br />
You: You haven&#8217;t contacted me before &#8230; how do I know you?<br />
&#8220;AliceLiddell&#8221;: i&#8217;m down the hall next door to brad. i need to ask you a question but you&#8217;re not in the office today.<br />
You: yeah, i&#8217;m working from home. sorry to be paranoid, but what&#8217;s the poster on your wall say?<br />
&#8220;AliceLiddell&#8221;: it used to say &#8220;hang in there baby&#8221; but i took it down when lolcats started getting too popular =)<br />
<em>You add this identity to your friends-list.</em><br />
You: cool &#8230; hi alice, what&#8217;s up?<br />
&#8230;</blockquote>

	<p>Having established that this is really Alice, you go on to give her the password &#8230; and fifteen minutes later your company&#8217;s website gets pwned anyway. What went wrong? Well, it really <em>was</em> Alice you were talking with; but the hacker was able to listen in and read the password. Wasn&#8217;t the industrial-strength 2048-bit <span class="caps">RSA</span> encryption supposed to prevent this?</p>

	<p>The problem is that you and Alice were <em>talking</em> with each other; but you weren&#8217;t directly <em>connected</em> to each other. Instead each of you was connected to the hacker, who was relaying your messages back and forth. In this scenario what probably happened was that Alice tried to look you up by your name, found the hacker&#8217;s fake account instead, and the hacker&#8217;s computer then quickly created an identity with the same nickname as Alice, connected to the real you using that identity, and started forwarding your messages to each other while recording them itself.</p>

	<p>What&#8217;s even worse: That identity you added to your friend-list as Alice? It&#8217;s really the hacker&#8217;s identity. From now on the hacker can talk directly to you and you&#8217;ll probably assume it&#8217;s Alice.</p>

	<h3>How Do We Solve This?</h3>

	<p>The man-in-the-middle attack is resistant to nearly any kind of <em>in-band</em> verification. You can ask Alice any personal questions you want, but it won&#8217;t reveal that you&#8217;re not connected directly to Alice. You can ask Alice to type in her public key, but the hacker can edit her reply and substitute the key he&#8217;s connected to you by.</p>

	<p>About the only practical way to solve this, unfortunately, is to use an <em>out-of-band</em> channel. You need to talk with the real Alice and compare notes, before you can trust that her digital identity belongs to her. All you have to do, really, is get her <em>real</em> public key and compare it to the key you&#8217;re communicating with. (And she has to do likewise, of course.)</p>

	<p>The canonical way to do this is to meet Alice in person and swap public keys. (PGP users call this a &#8220;key-signing ceremony&#8221;.) Or you and Alice can read your keys to each other over the phone (or Skype, or an iChat video conference.) Sending the keys over IM is somewhat less reliable, but enough so for many purposes, since forging centralized IMs is a fairly involved task.</p>

	<p>Of course, we don&#8217;t want to read 512 hexadecimal digits to each other! One optimization is to compare secure hashes of the keys (as <span class="caps">PGP</span> does), but that&#8217;s still 40 digits. And those &#8220;B&#8221;s and &#8220;D&#8221;s are so easy to mix up over the phone.</p>

	<h2>2. What Cloudy Does.</h2>

	<p><div style="text-align:center;"><img src="http://jens.mooseyard.com/wp-content/uploads/2008/04//CloudyAlert.png" alt="CloudyAlert.png" border="0" width="500" height="306" /></div></p>

	<p>Cloudy&#8217;s verification scheme is blatantly stolen from the one used in Bryan Ford <em>et al</em>&#8217;s <a href="http://pdos.csail.mit.edu/papers/uia:osdi06/#SECTION00021000000000000000" title="">Unmanaged Internet Architecture</a>. Instead of making you read a number as a string of digits, Cloudy converts it into a three-word phrase by mapping consecutive chunks of bits into words in an English dictionary, moreover a dictionary that&#8217;s been <a href="http://tothink.com/mnemonic/wordlist.html" title="">specially constructed</a> of words that are easy to recognize and hard to mix up.</p>

	<p>And instead of making you listen to the words and type them in, Cloudy (like <span class="caps">UIA</span>) presents a short list of phrases with radio buttons, for you to pick from. One of them is the one that will be correct if the connection is genuine, the others are chosen at random, and there&#8217;s a catch-all &#8220;None of the above&#8221; at the end. If the user didn&#8217;t select the expected phrase, something&#8217;s wrong.</p>

	<p><div style="text-align:center;"><img src="http://jens.mooseyard.com/wp-content/uploads/2008/04//CloudyVerification.png" alt="CloudyVerification.png" border="0" width="495" height="364" /></div></p>

	<p>(An aside: the phrase only encodes 32 bits, which is far less than even the <span class="caps">SHA</span>-1 hash. Just hashing the key down to 32 bits would not be secure enough; instead Cloudy creates a one-time 32-bit key by combining the public key with a randomly-chosen integer that&#8217;s sent to the other peer at the time of verification.)</p>

	<p>Ford points out another benefit of this interface: &#8220;its multiple-choice design prevents users from just clicking &#8216;OK&#8217; without actually comparing the keys&#8221;, which defeats the user&#8217;s damnable tendency to just <a href="http://www.macworld.com/article/132910/2008/04/pubsubagent.html" title="">dismiss all security-related alerts</a>.</p>

	<p>Once this is done, and the user chose the right verification phrase, Cloudy adds the other person&#8217;s public key/identity to your &#8220;contact list&#8221; in its persistent storage. You can then decide to associate that key with an entry in your Address Book. Cloudy also mints a &#8220;relationship&#8221; certificate attesting that you have verified the other person&#8217;s identity; you can choose to annotate the relationship with <a href="http://gmpg.org/xfn/11" title=""><span class="caps">XFN</span></a> tags like &#8220;friend&#8221; or &#8220;co-worker&#8221;. These certs can be passed to other friends to transitively extend trust.</p>

	<p>How well does this user interface work? Cloudy hasn&#8217;t seen much real-world use yet, but I&#8217;ve gone through the initial setup with a half-dozen people, and the verification (once I debugged it!) is quite easy to follow and takes only ten seconds or so.</p>

	<h2>3. Is This Too Paranoid?</h2>

	<p>One of the unpleasant side effects of learning too much about computer security is that you start to become paranoid. You <a href="http://www.arrod.co.uk/essays/matrix.php" title="">swallow the red pill</a> of the Internet and discover how much we take for granted, how much trust we implicitly place in things that are not trustworthy: domain names, centralized databases, passwords, emails. In severe cases, you start to self-identify as a cypherpunk and refuse to connect to any server through fewer than three anonymizing proxies. It&#8217;s a bit like <a href="http://en.wikipedia.org/wiki/Medical_students_disease" title="">Medical Student Syndrome</a>.</p>

	<p>On the other hand, I think a lot of this paranoia is justified. I remember the old days, when &#8220;spam&#8221; was just a Monty Python sketch and you could trust the &#8220;From:&#8221; line of an email. Nowadays most of the emails we get have forged senders, and even a message that <em>sounds</em> like it came from a friend might have been sent by <a href="http://www.djchuang.com/2008/blubet-sent-you-a-special-gift-too/" title="">some shady social-networking site he foolishly uploaded his address book to</a>. Not too many people worry about domain names yet, but <span class="caps">DNS</span> is <a href="http://en.wikipedia.org/wiki/DNS_cache_poisoning" title="">not hard to mess with</a>, either by <a href="http://www.pcworld.com/article/id,140465-pg,1/article.html" title="">hackers</a> or by <a href="http://blog.wired.com/27bstroke6/2008/04/isps-error-page.html" title="">profit-motivated ISPs</a>.</p>

	<p>Eventually, anything that can be subverted, will. And since peer-to-peer software can&#8217;t use the standard brute-force obstacles (centralized authority, locked-down servers) to delay attacks, it has to rely on <em>actually being secure</em>. And that means public keys, encryption, webs of trust. As many have pointed out, if you make security an optional add-on to a product, hardly anyone will use it. (How many people you know sign or encrypt their email?) It needs to be built in by default. And the more our privacy is invaded by advertisers, ISPs, search engines, phishers, monopolistic content owners and the like, the more that <a href="http://www.shirky.com/writings/riaa_encryption.html" title="">drives the adoption of actually-secure software</a> by end-users.</p>

	<p>Having to go out-of-band and swap three-word verification codes with your buddies is an inconvenience. But you only have to do it once with any particular person; after that, Cloudy remembers their key. And I will probably, in the future, put in some form of transitive trust: if I haven&#8217;t verified you, but I verified Jean-Claude and he&#8217;s verified you [and signed a cert to that effect] then I&#8217;ll decide to trust you too.</p>

	<p><strong>Next: Cloudy Gossip.</strong></p>
 ]]></content:encoded>
			<wfw:commentRss>http://jens.mooseyard.com/2008/04/cloudy-verification/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
	</channel>
</rss>
