<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet type="text/xsl" media="screen" href="/~d/styles/atom10full.xsl"?><?xml-stylesheet type="text/css" media="screen" href="http://feeds.feedburner.com/~d/styles/itemcontent.css"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:thr="http://purl.org/syndication/thread/1.0" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0" xml:lang="en" xml:base="http://blog.unto.net/wp-atom.php">
	<title type="text">DeWitt Clinton</title>
	<subtitle type="text">indeterminate things</subtitle>

	<updated>2009-02-27T19:47:11Z</updated>
	<generator uri="http://wordpress.org/" version="2.9-rare">WordPress</generator>

	<link rel="alternate" type="text/html" href="http://blog.unto.net" />
	<id>http://blog.unto.net/feed/</id>
	

			<geo:lat>37.770937</geo:lat><geo:long>-122.442763</geo:long><link rel="license" type="text/html" href="http://creativecommons.org/licenses/by-sa/2.0/" /><link rel="self" href="http://feeds.feedburner.com/untonet" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><atom10:link xmlns:atom10="http://www.w3.org/2005/Atom" rel="hub" href="http://pubsubhubbub.appspot.com" /><entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Notes on O&#8217;Reilly Radar&#8217;s State of the Computer Book Market]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/I_X7yee5QNo/" />
		<id>http://blog.unto.net/?p=778</id>
		<updated>2009-02-27T19:47:11Z</updated>
		<published>2009-02-27T19:47:11Z</published>
		<category scheme="http://blog.unto.net" term="programming" />		<summary type="html"><![CDATA[For the past several years one of my favorite places to track programming language trends has been the &#8220;State of the Computer Book Market&#8221; series on O&#8217;Reilly Radar.

O&#8217;Reilly&#8217;s Mike Hendrickson dives deep again this year into the statistics and details of the computer book market in a 5-part series:


    State of the [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/programming/notes-on-oreilly-radars-state-of-the-computer-book-market/">&lt;p&gt;For the past several years one of my favorite places to track programming language trends has been the &amp;#8220;&lt;a href="http://blogs.oreilly.com/cgi-bin/mt/mt-search.cgi?IncludeBlogs=57&amp;#038;search=%22State+of+the+Computer+Book+Market%22"&gt;State of the Computer Book Market&lt;/a&gt;&amp;#8221; series on O&amp;#8217;Reilly Radar.&lt;/p&gt;

&lt;p&gt;O&amp;#8217;Reilly&amp;#8217;s &lt;a href="http://radar.oreilly.com/mikeh/"&gt;Mike Hendrickson&lt;/a&gt; dives deep again this year into the statistics and details of the computer book market in a 5-part series:&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;&lt;a href="http://radar.oreilly.com/2009/02/state-of-the-computer-book-mar-17.html"&gt;State of the Computer Book Market 2008, Part 1: The Market&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://radar.oreilly.com/2009/02/state-of-the-computer-book-mar-18.html"&gt;State of the Computer Book Market 2008, Part 2: The Technologies&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://radar.oreilly.com/2009/02/state-of-the-computer-book-mar-16.html"&gt;State of the Computer Book Market 2008, Part 3: The Publishers&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://radar.oreilly.com/2009/02/state-of-the-computer-book-mar-22.html"&gt;State of the Computer Book Market 2008, part 4: The Languages&lt;/a&gt;&lt;/li&gt;
    &lt;li&gt;&lt;a href="http://radar.oreilly.com/2009/02/state-of-the-computer-book-mar-24.html"&gt;State of the Computer Book Market 2008, part 5: eBooks and Summary&lt;/a&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;My high level summary:&lt;/p&gt;

&lt;ul&gt;
        &lt;li&gt;While general book sales were up YoY in 2008 (+30%), computer book sales were down (-8%) with a weak Q3 and Q4.&lt;/li&gt;
        &lt;li&gt;The only computer book category to grow in 2008 was Consumer Operating Systems, driven by sales of Mac OS X and iPhone books.&lt;/li&gt;
        &lt;li&gt;The top sellers in the Systems and Programming category were in C#, Mac Programming, and Virtualization.  Software Project Management, Windows Administration, and Software Design books were all down.&lt;/li&gt;
        &lt;li&gt;C# book sales continued to grow for the 4th straight year, passing sales of Java books for the first time (which have been sliding for 5 straight years).&lt;/li&gt;
        &lt;li&gt;C/C++ and Visual Basic book sales both posted their 5th and 4th straight declines, respectively.&lt;/li&gt;
        &lt;li&gt;Python rose for the 5th straight year, as did ActionScript (4th straight gain), whereas JavaScript book sales fell for the 3rd straight year.&lt;/li&gt;
        &lt;li&gt;Online e-book sales (often direct to consumer) are growing strong relative to the overall market&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;Languages ranked by 2008 book sales (%market share, relative to 2007 rank):&lt;/p&gt;

&lt;ol&gt;
    &lt;li&gt;C# &amp;#8211; 15.58% (↑)&lt;/li&gt;
    &lt;li&gt;Java &amp;#8211; 12.09% (↓)&lt;/li&gt;
    &lt;li&gt;PHP &amp;#8211; 9.93% (⇈)&lt;/li&gt;
    &lt;li&gt;JavaScript &amp;#8211; 9.89% (↓)&lt;/li&gt;
    &lt;li&gt;C/C++ &amp;#8211; 8.36% (↓)&lt;/li&gt;
    &lt;li&gt;ActionScript &amp;#8211; 5.76% (⇈)&lt;/li&gt;
    &lt;li&gt;.NET Languages &amp;#8211; 5.40% (↓)&lt;/li&gt;
    &lt;li&gt;VisualBasic &amp;#8211; 5.04% (↓)&lt;/li&gt;
    &lt;li&gt;SQL &amp;#8211; 4.57% (↓)&lt;/li&gt;
    &lt;li&gt;Ruby &amp;#8211; 3.51% (↓)&lt;/li&gt;
    &lt;li&gt;Python &amp;#8211; 3.41% (↑)&lt;/li&gt;
    &lt;li&gt;VBA &amp;#8211; 3.18% (↓)&lt;/li&gt;
    &lt;li&gt;Objective-C &amp;#8211; 2.56% (⇈)&lt;/li&gt;
    &lt;li&gt;Perl &amp;#8211; 2.14% (↓)&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;The most telling charts from the series:&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;2008 Market Share by Language:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static.unto.net/languages_all_5yrs.png"&gt;&lt;img src="http://static.unto.net/languages_all_5yrs-tm.jpg" alt="2008 Market Share by Language" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;A Treemap view of the Programming Languages:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static.unto.net/TM_qtr_py_Prog_Lang.jpg"&gt;&lt;img src="http://static.unto.net/TM_qtr_py_Prog_Lang-thumb-486x351.jpg" alt="A Treemap view of the Programming Languages" /&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;
&lt;strong&gt;Percentage of 5 Year Sales Per Quarter by Media Type:&lt;/strong&gt;
&lt;/p&gt;

&lt;p&gt;&lt;a href="http://static.unto.net/percent_eBook_Print_5YR.png"&gt;&lt;img src="http://static.unto.net/percent_eBook_Print_5YR-tm.jpg" alt="Percentage of Lifetime Sales Per Quarter by Media Type"/&gt;&lt;/a&gt;&lt;/p&gt;

&lt;p&gt;(Images copyright O&amp;#8217;Reilly Media, and used without asking permission first &amp;#8212; will definitely take them down if necessary.)&lt;/p&gt;

&lt;p&gt;Mike goes into far more detail on each topic over on Radar.  Start reading the series &lt;a href="http://radar.oreilly.com/2009/02/state-of-the-computer-book-mar-17.html"&gt;here&lt;/a&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~ff/untonet?a=I_X7yee5QNo:ErHDVpZuvGw:yIl2AUoC8zA"&gt;&lt;img src="http://feeds.feedburner.com/~ff/untonet?d=yIl2AUoC8zA" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/untonet?a=I_X7yee5QNo:ErHDVpZuvGw:F7zBnMyn0Lo"&gt;&lt;img src="http://feeds.feedburner.com/~ff/untonet?i=I_X7yee5QNo:ErHDVpZuvGw:F7zBnMyn0Lo" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~ff/untonet?a=I_X7yee5QNo:ErHDVpZuvGw:V_sGLiPBpWU"&gt;&lt;img src="http://feeds.feedburner.com/~ff/untonet?i=I_X7yee5QNo:ErHDVpZuvGw:V_sGLiPBpWU" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/I_X7yee5QNo" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/programming/notes-on-oreilly-radars-state-of-the-computer-book-market/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/programming/notes-on-oreilly-radars-state-of-the-computer-book-market/feed/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.unto.net/programming/notes-on-oreilly-radars-state-of-the-computer-book-market/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[A Survey of Rel Values on the Web]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/ToT7cd08tn0/" />
		<id>http://blog.unto.net/?p=734</id>
		<updated>2009-02-17T06:19:25Z</updated>
		<published>2009-02-17T03:34:31Z</published>
		<category scheme="http://blog.unto.net" term="html" /><category scheme="http://blog.unto.net" term="web" />		<summary type="html"><![CDATA[One of the interesting things about sharing an office
with Jyri is that our
free-association stream-of-consciousness conversations often lead to places worth exploring further.

On Friday Jyri and I started wondering about
the link
rel values documented in
the XFN 1.1 profile, which
include not only the relatively commonplace me and friend values,
but also such unconventional values such as colleague, muse, and
spouse. [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/web/a-survey-of-rel-values-on-the-web/">&lt;p&gt;One of the interesting things about sharing an office
with &lt;a href="http://www.zengestrom.com/"&gt;Jyri&lt;/a&gt; is that our
free-association stream-of-consciousness conversations often lead to places worth exploring further.&lt;/p&gt;

&lt;p&gt;On Friday Jyri and I started wondering about
the &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/#linkTypes"&gt;link
rel values&lt;/a&gt; documented in
the &lt;a href="http://www.gmpg.org/xfn/11"&gt;XFN 1.1 profile&lt;/a&gt;, which
include not only the relatively commonplace &lt;code&gt;me&lt;/code&gt; and &lt;code&gt;friend&lt;/code&gt; values,
but also such unconventional values such as &lt;code&gt;colleague&lt;/code&gt;, &lt;code&gt;muse&lt;/code&gt;, and
&lt;code&gt;spouse&lt;/code&gt;.  But how frequently are the lesser known rel values really used?  Rather
than speculate blindly, I wrote a simple mapreduce to check the web and find out for sure.&lt;/p&gt;

&lt;p&gt;The mapreduce scanned approximately 177 million recently crawled HTML
documents, parsing and counting &lt;code&gt;rel&lt;/code&gt; values in link and
anchor tags along the way.  In those 177M documents, I found just over
19 billion &amp;lt;a&amp;gt; and &amp;lt;link&amp;gt; tags in total.  And of those 19B
tags, 1.8 billion of them contained a non-empty &lt;code&gt;rel&lt;/code&gt;
attribute.&lt;/p&gt;

&lt;p&gt;Following the HTML5 rules
for &lt;a href="http://www.whatwg.org/specs/web-apps/current-work/#set-of-space-separated-tokens"&gt;space
separated tokens&lt;/a&gt; I split each rel value
on &lt;code&gt;[\s\t\n\r\f]&lt;/code&gt; and extracted each individual value.  In
total, over 1.9B instances of rel values were found, or an average of just over 10 per HTML document (with some tags having more than one
rel value).&lt;/p&gt;

&lt;p&gt;I found a staggering 1.8M &lt;em&gt;unique&lt;/em&gt; rel value strings in use, with many used only once or twice across all the web. In fact, the top 6 most-frequently-used rel values accounted for
80% of all usage, and the top 11 alone were responsible for 90% of all
usage.  In fact, less than 1000 of the most frequently unique rel values are
sufficient to represent the 99th percentile of all usage.  In other
words, the tail is long indeed, with the remainder of those 1.8M
unique rel values accounting for less than 1% of the total usage.&lt;/p&gt;

&lt;p&gt;In passing, I noticed that approximately 3 million rel value strings also
contained a comma character; presumably cases where the author may mistakenly
have thought that the &lt;code&gt;","&lt;/code&gt; character would be used as a
delimiter.  However, since these cases account for just 0.18% of all
rel value strings, they have little impact in the overall totals.&lt;/p&gt;

&lt;p&gt;Here are the top 25 rel values found in &amp;lt;a&amp;gt; and &amp;lt;link&amp;gt;
tags in a moderately sized sample of the web today:&lt;/p&gt;

&lt;table class="tabular"&gt;
 &lt;thead&gt;
  &lt;tr&gt;&lt;td&gt;&lt;b&gt;Rank&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Value&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Count&lt;/b&gt;&lt;/td&gt;&lt;td&gt;&lt;b&gt;Relative Frequency&lt;/b&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;/thead&gt;
 &lt;tbody&gt;
  &lt;tr&gt;&lt;td&gt;1&lt;/td&gt;&lt;td&gt;nofollow&lt;/td&gt;&lt;td&gt;832980014&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="300"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;2&lt;/td&gt;&lt;td&gt;stylesheet&lt;/td&gt;&lt;td&gt;338648161&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="121"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;3&lt;/td&gt;&lt;td&gt;tag&lt;/td&gt;&lt;td&gt;168764800&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="60"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;4&lt;/td&gt;&lt;td&gt;alternate&lt;/td&gt;&lt;td&gt;109150404&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="39"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;5&lt;/td&gt;&lt;td&gt;icon&lt;/td&gt;&lt;td&gt;69183607&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="24"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;6&lt;/td&gt;&lt;td&gt;chapter&lt;/td&gt;&lt;td&gt;56395793&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="20"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;7&lt;/td&gt;&lt;td&gt;forum&lt;/td&gt;&lt;td&gt;55920646&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="20"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;8&lt;/td&gt;&lt;td&gt;shortcut&lt;/td&gt;&lt;td&gt;53906964&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="19"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;9&lt;/td&gt;&lt;td&gt;bookmark&lt;/td&gt;&lt;td&gt;30683701&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="11"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;10&lt;/td&gt;&lt;td&gt;archives&lt;/td&gt;&lt;td&gt;25381711&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="9"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;11&lt;/td&gt;&lt;td&gt;category&lt;/td&gt;&lt;td&gt;24361195&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="8"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;12&lt;/td&gt;&lt;td&gt;external&lt;/td&gt;&lt;td&gt;19181232&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="6"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;13&lt;/td&gt;&lt;td&gt;search&lt;/td&gt;&lt;td&gt;14227485&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="5"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;14&lt;/td&gt;&lt;td&gt;edituri&lt;/td&gt;&lt;td&gt;8109835&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="2"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;15&lt;/td&gt;&lt;td&gt;apple-touch-icon&lt;/td&gt;&lt;td&gt;6753583&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="2"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;16&lt;/td&gt;&lt;td&gt;help&lt;/td&gt;&lt;td&gt;4842211&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;17&lt;/td&gt;&lt;td&gt;prev&lt;/td&gt;&lt;td&gt;4537344&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;18&lt;/td&gt;&lt;td&gt;next&lt;/td&gt;&lt;td&gt;4390373&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;19&lt;/td&gt;&lt;td&gt;pingback&lt;/td&gt;&lt;td&gt;4302068&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;20&lt;/td&gt;&lt;td&gt;wlwmanifest&lt;/td&gt;&lt;td&gt;4125573&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;21&lt;/td&gt;&lt;td&gt;contents&lt;/td&gt;&lt;td&gt;3959350&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;22&lt;/td&gt;&lt;td&gt;contact&lt;/td&gt;&lt;td&gt;3504587&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="1"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;23&lt;/td&gt;&lt;td&gt;service.post&lt;/td&gt;&lt;td&gt;2678873&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="0"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;24&lt;/td&gt;&lt;td&gt;top&lt;/td&gt;&lt;td&gt;2502015&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="0"/&gt;&lt;/td&gt;&lt;/tr&gt;
  &lt;tr&gt;&lt;td&gt;25&lt;/td&gt;&lt;td&gt;me&lt;/td&gt;&lt;td&gt;2501273&lt;/td&gt;&lt;td&gt;&lt;img src="http://static.unto.net/bluedot.png" height="15" width="0"/&gt;&lt;/td&gt;&lt;/tr&gt;
 &lt;/tbody&gt;
&lt;/table&gt;

&lt;p&gt;The most frequently used values are not surprising at all.
The &lt;code&gt;nofollow&lt;/code&gt; value is used as a hint to search engines
that the target of an &amp;lt;a&amp;gt; tag should not be used in ranking
calculations.  The &lt;code&gt;stylesheet&lt;/code&gt; value is used on
&amp;lt;link&amp;gt; tags to indicate that the target is an external CSS
document.  The &lt;code&gt;tag&lt;/code&gt; is a microformat used to indicate
a &lt;a href="http://microformats.org/wiki/rel-tag"&gt;category for the
page&lt;/a&gt;, as popularized by sites such
as &lt;a href="http://technorati.com/"&gt;Technorati&lt;/a&gt;
and &lt;a href="http://delicious.com/"&gt;Delicious&lt;/a&gt;.
And &lt;code&gt;alternate&lt;/code&gt; is frequently used to facilitate the
autodiscovery of an RSS or Atom feed for a given site.&lt;/p&gt;

&lt;p&gt;Further down we learn that as OpenID continues to gain in adoption the &lt;code&gt;openid.server&lt;/code&gt; and &lt;code&gt;openid.delegate&lt;/code&gt;
rel values come in at #35 and #43 respectively &amp;#8212; impressive, since
each are only needed once per-page.  And even the newer OpenID2-style tags not far
behind, with &lt;code&gt;openid2.provider&lt;/code&gt;
and &lt;code&gt;openid2.local_id&lt;/code&gt; reaching #51 and #837
respectively.&lt;/p&gt;

&lt;p&gt;Near and dear to my heart, I was pleased to see
the &lt;code&gt;search&lt;/code&gt; rel value,
the &lt;a href="http://www.opensearch.org/"&gt;OpenSearch&lt;/a&gt; discovery
mechanism, ranked so high at #13.  Again these discovery links are only needed once per page; a sign of strong adoption.  Admittedly, not all
&lt;code&gt;rel="search"&lt;/code&gt; links are OpenSearch related, but I have
another more comprehensive analysis of OpenSearch documents that shows similarly pervasive adoption rates.&lt;/p&gt;

&lt;p&gt;Even the &lt;a href="http://googlewebmastercentral.blogspot.com/2009/02/specify-your-canonical.html"&gt;newly
agreed-upon&lt;/a&gt; &lt;code&gt;canonical&lt;/code&gt; rel value makes a
showing at #271, and will surely rise to the top 25 or so over the next year
or two.&lt;/p&gt;

&lt;p&gt;And the XFN rel values?  The &lt;code&gt;contact&lt;/code&gt; rel value is the
most common at #22, with &lt;code&gt;me&lt;/code&gt; and &lt;code&gt;friend&lt;/code&gt;
just behind at #25 and #28 respectively.  Filling out the list
are &lt;code&gt;acquaintance&lt;/code&gt; (#58), &lt;code&gt;met&lt;/code&gt;
(#68), &lt;code&gt;colleague&lt;/code&gt; (#84), &lt;code&gt;co-worker&lt;/code&gt;
(#126), &lt;code&gt;neighbor&lt;/code&gt; (#180), &lt;code&gt;muse&lt;/code&gt;
(#196), &lt;code&gt;co-resident&lt;/code&gt; (#232), &lt;code&gt;parent&lt;/code&gt;
(#255), &lt;code&gt;sibling&lt;/code&gt; (#414), &lt;code&gt;sweetheart&lt;/code&gt;
(#446), &lt;code&gt;spouse&lt;/code&gt; (#570), &lt;code&gt;crush&lt;/code&gt;
(#794), &lt;code&gt;kin&lt;/code&gt; (#834), &lt;code&gt;child&lt;/code&gt; (#879),
with &lt;code&gt;date&lt;/code&gt; bringing up the rear at #1086.&lt;/p&gt;

&lt;p&gt;This survey indicates that rel values are both widely and meaningfully
used, with adoption being driven by a wide array of needs, such as
semantic markup, search engine hints, client-side rendering, discovery
and identity protocols, blogging, and/or content that can be later edited.&lt;/p&gt;

&lt;p&gt;But more importantly, we learned that a full 0.0003% of all the links have declared, for all the world to see, that some URI out there is their source of inspiration, their Calliope, their Erato, their &lt;em&gt;muse&lt;/em&gt;.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=OGoKNDcE"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=HrvMVYVC"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=HrvMVYVC" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=Uux2Pq39"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=Uux2Pq39" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/ToT7cd08tn0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/web/a-survey-of-rel-values-on-the-web/#comments" thr:count="8" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/web/a-survey-of-rel-values-on-the-web/feed/" thr:count="8" />
		<thr:total>8</thr:total>
	<feedburner:origLink>http://blog.unto.net/web/a-survey-of-rel-values-on-the-web/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Unbelievable Mental Lapse]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/0aqvD1qksGU/" />
		<id>http://blog.unto.net/?p=718</id>
		<updated>2009-01-26T18:44:27Z</updated>
		<published>2009-01-26T18:44:27Z</published>
		<category scheme="http://blog.unto.net" term="security" />		<summary type="html"><![CDATA[I receive a fair bit of misaddressed mail at my gmail.com addresses.  Sometimes it is the result of a typo on the part of the sender.  But with surprising frequency it is the result of a real person accidentally entering my email address into a web form instead of their own.  I&#8217;ve [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/security/unbelievable-mental-lapse/">&lt;p&gt;I receive a fair bit of misaddressed mail at my gmail.com addresses.  Sometimes it is the result of a typo on the part of the sender.  But with surprising frequency it is the result of a real person accidentally entering my email address into a web form instead of their own.  I&amp;#8217;ve seen shipping confirmations, subscriptions to mailing lists, responses to job applications, new account notices on sites like Facebook and Twitter, etc.  How someone could enter the wrong email address into one of these forms is beyond me.&lt;/p&gt;

&lt;p&gt;But nothing, nothing will ever top the mental lapses responsible for this email I just received:&lt;/p&gt;

&lt;blockquote&gt;&lt;pre&gt;Internal Revenue Service &amp;lt;refunds@irs.gov&amp;gt;
Date: Mon, Jan 26, 2009 at 9:46 AM
To: DClinton@gmail.com
Dear Dianne Clinton,

Your Stimulus Payment request has beed submited.

A Stimulus Payment can be delayed for a variety of reasons.
For example submitting invalid records or applying after the deadline.

Stimulus Payment request issuer:

Name: Dianne Clinton
Address: [redacted]
City:  [redacted]
State: [redacted]
Postal Code:  [redacted]
Phone: [redacted]
Date of birth:  [redacted]/ [redacted]  (mmddyyyy)
Social Security Number:  [redacted]
Mother name:  [redacted]
Credit card Number:  [redacted]
Credit card expiration:  [redacted]/ [redacted]  (mm/yyyy)
CVV:  [redacted]

Note: For security reasons, we recorded your ip-address, the date and
time.
Deliberate wrong inputs are criminally pursued.
IP:  [redacted]
Date: Mon Jan 26, 2009 6:46 pm

Regards,
Internal Revenue Service&lt;/pre&gt;&lt;/blockquote&gt;

&lt;p&gt;Yes, every single one of those [redacted] fields was filled out completely.  Social security #, credit card #, mother&amp;#8217;s maiden name.  The works.  An identity thief could clear out her accounts and bankrupt her by morning.&lt;/p&gt;

&lt;p&gt;&lt;center&gt;&lt;img src="http://static.unto.net/irslogo.png"/&gt;&lt;/center&gt;&lt;/p&gt;

&lt;p&gt;Want to know the saddest part? &lt;/p&gt;

&lt;p&gt;It &lt;em&gt;was&lt;/em&gt; an identity thief.  (The grammar and spelling errors were a bit of a dead giveaway.  Besides, I can&amp;#8217;t imagine the real IRS would be so stupid as to send your private details back to you over plain-text email.)&lt;/p&gt;

&lt;p&gt;A ten-second perusal of the address headers showed that, not-surprisingly, this message did &lt;em&gt;not&lt;/em&gt; originate from irs.gov.&lt;/p&gt;

&lt;p&gt;Rather, the mail originated from this site: (And needless to say, don&amp;#8217;t &lt;em&gt;you&lt;/em&gt; go filling it out!)&lt;/p&gt;

&lt;blockquote&gt;http://www.ieaf.es/bbdd/apps/news/stimulus.refund/stimulus.php&lt;/blockquote&gt;

&lt;p&gt;This woman was the victim of a phishing scam; she probably thought she was entering her very personal data into a legitimate United States government website, and she may never realize how wrong she was.  She didn&amp;#8217;t notice the lack of https, or that the domain was ieaf.es, a &lt;a href="http://www.phishtank.com/target_search.php?target_id=62&amp;#038;valid=All&amp;#038;active=All&amp;#038;Search=Search"&gt;known IRS phishing site&lt;/a&gt;, hosted on a Spanish top-level domain.&lt;/p&gt;

&lt;p&gt;I will submit the site to the various phish-tracking websites and make the appropriate notifications at work.  That said, I&amp;#8217;m on the fence about trying to contact her directly.  Morally it would be the right thing to do.  However, in this litigious era, it might be exactly the wrong thing to do.  Needless to say the email itself will be permanently deleted from my inbox.&lt;/p&gt;

&lt;p&gt;This whole episode makes me very, very sad.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=LQYN5iWr"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=lBMrOfIl"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=lBMrOfIl" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=QAkpqPQl"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=QAkpqPQl" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/0aqvD1qksGU" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/security/unbelievable-mental-lapse/#comments" thr:count="8" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/security/unbelievable-mental-lapse/feed/" thr:count="8" />
		<thr:total>8</thr:total>
	<feedburner:origLink>http://blog.unto.net/security/unbelievable-mental-lapse/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Sampling Twitter]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/7q-ihlD1lW0/" />
		<id>http://blog.unto.net/?p=660</id>
		<updated>2009-01-03T03:37:40Z</updated>
		<published>2009-01-02T16:07:25Z</published>
		<category scheme="http://blog.unto.net" term="twitter" />		<summary type="html"><![CDATA[Update: I had made a mistake in gathering the samples and took this post down temporarily to fetch new data.  A typo I made in one of my scripts radically under-counted the number of friends each account had.  Mea culpa, and the lesson I learned is that if a number seems counter-intuitive, then [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/twitter/sampling-twitter/">&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt; I had made a mistake in gathering the samples and took this post down temporarily to fetch new data.  A typo I made in one of my scripts radically under-counted the number of friends each account had.  Mea culpa, and the lesson I learned is that if a number seems counter-intuitive, then it likely is.  I apologize for the mistake!&lt;/p&gt;

&lt;p&gt;&amp;#8230;&lt;/p&gt;

&lt;p&gt;Most of the surveys that have attempted to study Twitter usage do so by scraping the public stream of tweets.  This provides reasonable data about how people are publicly using Twitter but it suffers from sample bias insofar as only active Twitter accounts are counted while private accounts and accounts that go dormant are overlooked.&lt;/p&gt;

&lt;p&gt;After &lt;a href="http://twitter.com/dalmaer/status/1087079286"&gt;Dion posted&lt;/a&gt; that I was the first person he subscribed to on Twitter, &lt;a href="http://friendfeed.com/e/4dcb73f8-8cde-e56a-a5e2-fd9513824396/The-first-person-I-followed-on-Twitter-was-dewitt/"&gt;a conversation started&lt;/a&gt; in which we speculated about the distribution of used vs. unused user IDs on Twitter. Specifically, I became curious as to how Dion, who signed up for Twitter less than three months after I did, could have a user id 3.5 million higher than mine. Was Twitter really signing up users at a rate of more than one million a month this time last year? Doubtful, but the only way to find out was to gather some hard data.&lt;/p&gt;

&lt;p&gt;Instead of mining data from the public feed, I wrote a short script to query a sample across of all the possible Twitter ids.  I first created a &lt;a href="http://twitter.com/dewitttest"&gt;a test Twitter account&lt;/a&gt;, which was assigned a new user ID of &lt;code&gt;&lt;a href="http://json-indent.appspot.com/indent?url=http://twitter.com/users/show/18496098.json"&gt;18496098&lt;/a&gt;&lt;/code&gt;.  Using this id as an upper bound on the population of all Twitter IDs, I selected samples at &lt;a href="http://docs.python.org/library/random.html"&gt;random&lt;/a&gt; from the range &lt;code&gt;(0, 18496098)&lt;/code&gt; (exclusive), and queried the Twitter API at a metered rate from several machines over the course of a day.&lt;/p&gt;

&lt;p&gt;After rerunning the script on queries that returned transient server-side or client-side errors (&lt;code&gt;"502 Bad Gateway"&lt;/code&gt;, &lt;code&gt;"503 Service Temporarily Unavailable"&lt;/code&gt;, etc), I arrived at an clean, unbiased sample pool of 4414 ids.&lt;/p&gt;

&lt;p&gt;Of the 4414 sampled ids, 1270 ids have been assigned (returned &lt;code&gt;"200 OK"&lt;/code&gt;) and 3144 are not in use (returned &lt;code&gt;"404 Not Found"&lt;/code&gt;).  Of the 3144 unassigned ids, 3120 of those were &amp;#8220;Not found&amp;#8221; (and presumably were never used), and 24 were &amp;#8220;User has been suspended&amp;#8221;.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:1270,24,3120&amp;amp;chds=0,4414&amp;amp;chl=Assigned|Suspended|Unassigned&amp;amp;chco=0000FF&amp;amp;chtt=All Possible IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;By this ratio, we can infer that approximately &lt;strong&gt;5,000,000-5,500,000 accounts have been created&lt;/strong&gt; since Twitter&amp;#8217;s private launch in early 2006.&lt;/p&gt;

&lt;p&gt;Of the 1270 sampled ids that have been assigned to a user, 847 accounts have posted at least one update, 759 are being followed, and 735 are following another user.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:847,423&amp;amp;chds=0,1270&amp;amp;chl=Have Posted|Have Not Posted&amp;amp;chco=0000FF&amp;amp;chtt=Assigned Twitter IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:759,511&amp;amp;chds=0,1270&amp;amp;chl=Have Followers|Do Not Have Followers&amp;amp;chco=0000FF&amp;amp;chtt=Assigned Twitter IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:735,535&amp;amp;chds=0,1270&amp;amp;chl=Following Someone|Not Following Anyone&amp;amp;chco=0000FF&amp;amp;chtt=Assigned Twitter IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;Further breaking down the 1270 assigned ids, we find that 635 ids are both being followed and follow someone else, 574 ids have posted a status and are being followed, and another 541 have posted a status and follow someone else.  And 501 have posted a status, follow someone else, and are being followed.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=v&amp;amp;chs=460x150&amp;amp;chd=t:847,735,759,541,574,635,501&amp;amp;chds=0,1270&amp;amp;chdl=Have Posted|Follow Someone|Have Followers&amp;amp;chtt=Twitter IDs in Use" /&gt;
&lt;/p&gt;

&lt;p&gt;Of the 1270 ids that have been assigned, 97 have protected their status updates, and 1173 have left their status updates public (the default).&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:1173,97&amp;amp;chds=0,1270&amp;amp;chl=Public|Protected&amp;amp;chco=0000FF&amp;amp;chtt=Assigned Twitter IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;Of the 1173 public ids, 1048 of the accounts were created more than 30 days ago.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:1048,125&amp;amp;chds=0,1173&amp;amp;chl=More Than 30 Days Old|Less Than 30 Days Old&amp;amp;chco=0000FF&amp;amp;chtt=Public Twitter IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;Of the 1048 more-than-30-day-old public ids, 691 have posted a status message at least once.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:691,357&amp;amp;chds=0,1048&amp;amp;chl=Have Posted|Have Not Posted&amp;amp;chco=0000FF&amp;amp;chtt=Public Twitter IDs Over 30 Days Old" /&gt;
&lt;/p&gt;

&lt;p&gt;And of those 691 sampled public ids that are over 30 days old and have posted at least one status message, 305 of those accounts have returned to post an update more than 30 days after their account was first created.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:305,386&amp;amp;chds=0,691&amp;amp;chl=Posted Again|Did Not Post Again&amp;amp;chco=0000FF&amp;amp;chtt=Public Twitter IDs Over 30 Days Old That Have Statuses" /&gt;
&lt;/p&gt;

&lt;p&gt;This last metric &amp;#8212; users that have returned to post again more than 30 days after creating their account &amp;#8212; is the best metric I can come up with for a return user on Twitter.  Extrapolating this ratio of return vs non-return users back across the segment of users too new to test and the private accounts, we estimate that 29.1% of assigned ids, and thus roughly 8.3% of all possible ids, are assigned to someone that has returned at least to post something more than 30 days their account was initially created.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:370,900&amp;amp;chds=0,1270&amp;amp;chl=Return User|Abandoned User&amp;amp;chco=0000FF&amp;amp;chtt=Assigned Twitter IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;
Given an potential max population of 18,496,098, this ratio implies that there are up to &lt;strong&gt;1,500,000-1,600,000 users that have returned to Twitter to post again after first creating their account&lt;/strong&gt;, which is a respectable number, and is consistent with the estimates made by others observing the pattern of public status updates.
&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:370,900,3144&amp;amp;chds=0,4414&amp;amp;chl=Return Users|Abandoned Accounts|Unassigned&amp;amp;chco=0000FF&amp;amp;chtt=All Possible IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;
Of the 305 return accounts, 249 are both following at least one other account and have at least one follower.
&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:249,56&amp;amp;chds=0,305&amp;amp;chl=Have Friends and Followers|Lack Friends and/or Followers&amp;amp;chco=0000FF&amp;amp;chtt=Return Users" /&gt;
&lt;/p&gt;

&lt;p&gt;
Again extrapolating for accounts too new to test and private accounts, this suggests that 23% of all assigned ids, and thus 6.8% of all potential user ids, are assigned to someone who is posting regularly, is following other users, and is being followed by at least one other user. This implies that there there are up to &lt;strong&gt;1,200,000-1,300,000 active, connected users on Twitter&lt;/strong&gt;.
&lt;/p&gt; 

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=p&amp;amp;chs=460x150&amp;amp;chd=t:302,68,900,3144&amp;amp;chds=0,4414&amp;amp;chl=Active, Connected Users|Disconnected Users|Abandoned Accounts|Unassigned&amp;amp;chco=0000FF&amp;amp;chtt=All Possible IDs" /&gt;
&lt;/p&gt;

&lt;p&gt;Of the public users sampled, 470 are followed by no one, 524 are followed by between 1 and 10 people, 159 are followed by 11 to 100 people, and 20 are followed by more than 100.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=bhs&amp;amp;chs=460x150&amp;amp;chd=t:470,524,159,20&amp;amp;chds=0,524&amp;amp;chco=4D89F9&amp;amp;chxt=y&amp;amp;chxl=0:|&amp;gt;100|11-100|1-10|0|&amp;amp;chtt=Followed By (Histogram)"/&gt;
&lt;/p&gt;

&lt;p&gt;Of the public users sampled, 499 are following no one, 514 are following between 1 and 10 people, and 139 are following 11 to 100 people, 20 are following more than 101-1000 people, and 1 is following more than 1000.&lt;/p&gt;

&lt;p&gt;
&lt;img height="200" width="460" src="http://chart.apis.google.com/chart?cht=bhs&amp;amp;chs=460x200&amp;amp;chd=t:499,514,139,20,1&amp;amp;chds=0,514&amp;amp;chco=4D89F9&amp;amp;chxt=y&amp;amp;chxl=0:|&amp;gt;1000|1000-101|11-100|1-10|0|&amp;amp;chtt=Following (Histogram)" /&gt;
&lt;/p&gt;

&lt;p&gt;Of the public users sampled, 403 have no status updates, 535 have posted between 1 and 10 status updates, 141 have posted between 11-100 status updates, 87 have posted between 101-1000 status updates, 6 have posted between 1001-10000 status updates, and 1 has posted more than 10,000 status updates. (The outlier with 10000+ updates is a bot.)&lt;/p&gt;

&lt;p&gt;
&lt;img height="200" width="460" src="http://chart.apis.google.com/chart?cht=bhs&amp;amp;chs=460x200&amp;amp;chd=t:403,535,141,87,6,1&amp;amp;chds=0,535&amp;amp;chco=4D89F9&amp;amp;chxt=y&amp;amp;chxl=0:|&amp;gt;10000|1001-10000|101-1000|11-100|1-10|0|&amp;amp;chtt=Status Updates (Histogram)" /&gt;
&lt;/p&gt;

&lt;p&gt;And to return to the question that started the experiment, there is indeed both an upward trend to the number of users created per month, and a sharp transition in early 2008 when huge blocks of ids no longer went unassigned between the creation of each account.&lt;/p&gt;

&lt;p&gt;
&lt;img height="150" width="460" src="http://chart.apis.google.com/chart?cht=bvs&amp;amp;chs=460x150&amp;amp;chd=t:5,8,11,19,20,20,18,12,9,15,19,22,34,38,49,69,83,69,107,104,107,130,155,146|86,19,553,561,173,144,131,195,114,163,187,219,276,222,2,1,5,2,3,3,8,17,50,5&amp;amp;chco=4D89F9,C6D9FD&amp;amp;chds=0,580&amp;amp;chbh=a&amp;amp;chxt=x&amp;amp;chxl=0:||2007||||||||||||2008&amp;amp;chtt=Twitter IDs By Month&amp;amp;chdl=Assigned|Unassigned or Suspended" /&gt;
&lt;/p&gt;

&lt;p&gt;These numbers, while not perfect, should be a reasonably accurate ballpark estimate &amp;#8212; &amp;plusmn;2% within 2&amp;sigma; over the total population, and &amp;plusmn;3% over population of assigned ids &amp;#8212; and the numbers likely wouldn&amp;#8217;t change significantly with a larger sample.  However, there&amp;#8217;s always the chance of mistakes, so please feel free to &lt;a href="http://static.unto.net/new_samples-2009-01-02-12-05-54.csv"&gt;download the data set&lt;/a&gt; to confirm.  Or if you work at Twitter and would like to verify these numbers, even privately, I&amp;#8217;d love to hear how close the sampled numbers come to reality.
&lt;/p&gt;

&lt;p&gt;&lt;img src="http://static.unto.net/dot.gif" height="1" width="1"/&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=9pcYkMpH"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=hxEXqAAf"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=hxEXqAAf" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=rSd3eScD"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=rSd3eScD" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/7q-ihlD1lW0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/twitter/sampling-twitter/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/twitter/sampling-twitter/feed/" thr:count="5" />
		<thr:total>5</thr:total>
	<feedburner:origLink>http://blog.unto.net/twitter/sampling-twitter/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Sunsetting Delancey]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/uqZ3ikHQRz0/" />
		<id>http://blog.unto.net/?p=634</id>
		<updated>2008-12-28T22:42:55Z</updated>
		<published>2008-12-28T22:26:33Z</published>
		<category scheme="http://blog.unto.net" term="programming" />		<summary type="html"><![CDATA[Three years ago I launched a little service called Delancey.  Delancey was an early del.icio.us mashup that kept track of how many times you clicked on each bookmark.  This usage metadata was valuable because with it you could sort your bookmarks in order of how often they were used, making for a simple [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/programming/sunsetting-delancey/">&lt;p&gt;&lt;a href="http://blog.unto.net/work/delancey/"&gt;Three years ago&lt;/a&gt; I launched a little service called &lt;a href="http://delancey.unto.net/" title="Delancey"&gt;Delancey&lt;/a&gt;.  Delancey was an early &lt;a href="http://del.icio.us/" title="del.icio.us"&gt;del.icio.us&lt;/a&gt; mashup that kept track of how many times you clicked on each bookmark.  This usage metadata was valuable because with it you could sort your bookmarks in order of how often they were used, making for a simple but powerful default browser homepage that learned from your behavior.&lt;/p&gt;

&lt;p&gt;In designing Delancey I made several decisions that I knew might eventually cause a maintenance challenge, but I felt that they were justified at the time because of the benefit that they offered.&lt;/p&gt;

&lt;p&gt;The first design decision was that users of Delancey would be able to &amp;#8220;claim&amp;#8221; their del.icio.us account so that they, and only they, would be able to access or update their personal click data.  Given that a standard mechanism for claiming external identities was &lt;a href="http://community.livejournal.com/lj_dev/684200.html"&gt;still in its infancy&lt;/a&gt;, I hacked together a technique by which a signed-in del.icio.us user would automatically bookmark a secret claim URL that the Delancey application would verify and then delete.  It was a surprisingly effective approach that created a strong verifiable claim over a del.icio.us identity without the Delancey application ever requesting the del.icio.us user&amp;#8217;s password.  However, it took advantage of how the del.icio.us front-end was implemented at that particular moment, and hence it was unlikely to remain stable forever.&lt;/p&gt;

&lt;p&gt;The second design decision was that the Delancey application would never store a user&amp;#8217;s del.icio.us username or the URLs of the bookmarks the user accessed.  This wasn&amp;#8217;t strong security, as both were stored as simple one-way md5 hashes of the plaintext data, however it prevented casual abuse as reversing the associations would require a complete dictionary of del.icio.us usernames and the bookmarked URLs.   (A truly secure system would require a secret key for each Delancey user and a mechanism to encrypt the data on the client side &amp;#8212; a reasonable exercise, but overkill for this type of application.)  This kept your data private (even from Delancey itself), but it meant that exporting it would be more difficult down the road.&lt;/p&gt;

&lt;p&gt;Then del.icio.us relaunched as delicious.com this fall.  I suspected that Delancey would break during the transition, but I couldn&amp;#8217;t find a migration guide for del.icio.us developers so I wasn&amp;#8217;t exactly sure what to be on the lookout for.  So I shelved the project for a while longer and hoped that nothing serious was broken.&lt;/p&gt;

&lt;p&gt;This weekend I had the opportunity to investigate, and sure enough, a few of the features that made Delancey possible were no longer supported.  Most critically, the automatic bookmarking trick that Delancey used for claim verification was rendered ineffective because the new delicious.com front-end signs (with a key or nonce) the form used to post new URLs, thus blocking Delancey&amp;#8217;s attempt to mimic the POST request via an external page.   This is a perfectly reasonable decision on the part of of the delicious team, but without it Delancey would need a new mechanism for account verification.&lt;/p&gt;

&lt;p&gt;The &lt;a href="http://delicious.com/help/api"&gt;Delicious API&lt;/a&gt; does provide a way of posting new bookmarks, and hence a backdoor mechanism for account verification.  However, the official API relies on HTTP Basic auth, which would mean the user would be presented with an unexpected browser-based interstitial login box if Delancey were to use it. Or worse, Delancey application could itself request and proxy credentials for the del.icio.us user &amp;#8212; exactly what I was trying to avoid.  The latter technique is a form of the &lt;a href="http://adactio.com/journal/1357"&gt;password anti-pattern&lt;/a&gt;, and I couldn&amp;#8217;t in good faith implement that anti-pattern myself.  Fortunately, either (or both) of &lt;a href="http://openid.net/"&gt;OpenID&lt;/a&gt; and &lt;a href="http://oauth.net/"&gt;OAuth&lt;/a&gt; would be sufficient for verifying the account claim if delicious supported them.  Unfortunately, Delicious currently supports neither OpenID nor OAuth as far as I can tell.  While I&amp;#8217;m reasonably confident that I could come with some other hacked-together solution on top of the current delicious.com front-end, I don&amp;#8217;t feel comfortable again investing in a solution that isn&amp;#8217;t officially supported.&lt;/p&gt;

&lt;p&gt;So with that as background, I&amp;#8217;ve decided to sunset Delancey.  I don&amp;#8217;t have a hard date as to when I&amp;#8217;ll shut it down, but I won&amp;#8217;t be adding new features, nor will I be fixing any bugs beyond those that I fixed today.  I promise not to take it down for another 90 days (through the end of March, 2009), but after that I may turn it off completely to save bandwidth.    However, before I take it down I will provide links to export your existing click data.  That said, since the bookmark URLs are stored as hashes only, you will need to do some work on your end to associate the underlying URL with the click counts.  (This is possible because you know your own username and you can easily retrieve a list of all of your bookmarks from delicious.)&lt;/p&gt;

&lt;p&gt;For those that want to start extracting their data now, you can play around with the auto-documented &lt;a href="http://delancey.unto.net/delancey/api/"&gt;Delancey API&lt;/a&gt;.  For example, to see a list of your tags, you can use the /delancey/tags/{username} method (e.g., &lt;a href="http://delancey.unto.net/delancey/tags/delancey"&gt;as YAML&lt;/a&gt; or &lt;a href="http://delancey.unto.net/delancey/tags/delancey?format=json"&gt;as JSON&lt;/a&gt;).  And you can retrieve your click counts via the /delancey/bookmarks/{username}/{tag}/ method (eg.  &lt;a href="http://delancey.unto.net/delancey/bookmarks/delancey/delancey"&gt;as YAML&lt;/a&gt; or &lt;a href="http://delancey.unto.net/delancey/bookmarks/delancey/delancey?format=json"&gt;as JSON&lt;/a&gt;).  (You&amp;#8217;ll note that the latter API call automatically does the hash association with the public bookmark data &amp;#8212; if the del.icio.us account is private, or if the bookmarks are deeply buried, then the titles and the URLs are unavailable.  The full Delancey export will contain on the (hash, count) tuple.)&lt;/p&gt;

&lt;p&gt;Going forward, if Delicious implements OAuth or OpenID in the next month or two I may change my mind and get this running again, perhaps by porting it over to Python and App Engine in the process (a port I started a while back but never completed).  If not, then I hope people understand my reasons for shutting down this service.  It was a fun app to build, and if you used it I hope you found it valuable for what it did.  I still believe that there is great opportunity in the social bookmarking space, and whether it is to be found the relaunched delicious.com, at a site like digg.com, or at a site yet unseen, I look forward to whomever pushes the technology forward next.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=bwcoDi31"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=CAQc6sZ0"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=CAQc6sZ0" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=it7qaf3n"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=it7qaf3n" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/uqZ3ikHQRz0" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/programming/sunsetting-delancey/#comments" thr:count="0" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/programming/sunsetting-delancey/feed/" thr:count="0" />
		<thr:total>0</thr:total>
	<feedburner:origLink>http://blog.unto.net/programming/sunsetting-delancey/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Mobile devices as development machines]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/EoTz48KxxI4/" />
		<id>http://blog.unto.net/?p=611</id>
		<updated>2008-11-17T20:29:05Z</updated>
		<published>2008-11-17T19:51:56Z</published>
		<category scheme="http://blog.unto.net" term="mobile" /><category scheme="http://blog.unto.net" term="technology" />		<summary type="html"><![CDATA[Tim O&#8217;Reilly tells the story of how Vic Gundotra, my manager at Google, came to the conclusion that the future of software lies somewhere in the intersection of mobile and cloud.  Indeed it does, but I jokingly twittered back that we still need PCs &#8212; how else are we going to write our mobile [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/technology/mobile-devices-as-development-machines/">&lt;p&gt;Tim O&amp;#8217;Reilly &lt;a href="http://radar.oreilly.com/2008/11/daddy-wheres-your-phone.html"&gt;tells the story&lt;/a&gt; of how Vic Gundotra, my manager at Google, came to the conclusion that &lt;strong&gt;the future of software lies somewhere in the intersection of mobile and cloud&lt;/strong&gt;.  Indeed it &lt;a href="http://twitter.com/dewitt/status/1009940600"&gt;does&lt;/a&gt;, but I jokingly &lt;a href="http://twitter.com/dewitt/status/1009895484"&gt;twittered back&lt;/a&gt; that we still need PCs &amp;#8212; how else are we going to write our mobile and cloud apps?&lt;/p&gt;

&lt;p&gt;But in truth we hardly need the heavyweight hardware under our desks to develop software even today.  If anything, with a ubiquitous network connection (wifi where available, 3G where it is not), most of the heavy lifting can and should be run on compiler farms, not the desktop.  My own development workflow typically involves ssh&amp;#8217;ing into a virtual instance from whatever client I&amp;#8217;m on (a desktop, a laptop, etc) and running on a distributed compute cluster.  Depending on the task at hand even a full graphical IDE can be run remotely over technologies like NX.  Or if you&amp;#8217;re like me, ssh, screen, and emacs are all you need.  And I believe we may even be headed for an era when the IDEs themselves are hosted applications, following the pattern established by email, text editors, and other traditional desktop applications.&lt;/p&gt;

&lt;p&gt;So will this mean you can forgo the PC even for software development?  Perhaps it does.  Looking back, here were the specs on my first personal Linux box, as pieced together in 1994:&lt;/p&gt;

&lt;p style="margin-left: 2em"&gt;
  Dell Dimension
  Intel Pentium @ 133 MHz
  256MB RAM
  1GB HDD
  28.8 kbps modem 
  Slackware 2.0
  Linux kernel 1.1.18
  17&amp;#8243; Dell Trinitron CRT Monitor @ 1024&amp;#215;768&lt;/p&gt;

&lt;p&gt;I used this machine throughout my time as a CS undergrad, including the time off I took to write software for one of the first web companies (tripod.com).&lt;/p&gt;

&lt;p&gt;By way of comparison, I now carry a &lt;a href="http://www.htc.com/www/product/g1/specification.html"&gt;HTC G1&lt;/a&gt; device running &lt;a href="http://code.google.com/android/"&gt;Android&lt;/a&gt;:&lt;/p&gt;

&lt;p style="margin-left: 2em"&gt;
  HTC G1
  Qualcomm MSM7201A @ 528 MHz
  192 MB RAM / 256 MB ROM
  1GB SSD
  3G HSPA/WCDMA, GSM/GPRS/EDGE
  802.11b/g, Bluetooth 2.0, USB 2.0
  Android RC30
  Linux kernel 2.6.25
  3.2&amp;#8243; screen @ 320 x 480&lt;/p&gt;

&lt;p&gt;These stats are telling: &lt;strong&gt;The mobile devices in our pockets are more powerful and more connected in every way than the desktop machines we used to build the first generation of the web.&lt;/strong&gt;  If we can just bridge the peripheral gap and get high resolution external displays, then there is truly nothing stopping us from forgoing the desktop completely in favor of a completely distributed development environment.&lt;/p&gt;

&lt;p&gt;Along those lines, I recently purchased an Asus EEE PC 1000 and installed Ubuntu on it.  With a 1.6 GHz Intel Atom processor, 2GB RAM, and a 40GB SSD, that little netbook is already faster and more powerful than the desktop PCs we ran just several years ago.  As we can expect to see that caliber of hardware in cellphone-sized mobile devices before long, I suspect it is only a short matter of time before we stop thinking in terms of &amp;#8220;developer workstations&amp;#8221; at all, and instead start thinking in terms of mobile devices as access points to a limitless development environment.&lt;/p&gt;

&lt;p align="center"&gt;&lt;img src="http://static.unto.net/g1_small.png"/&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=pYMyIZ3Z"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=paUWaz58"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=paUWaz58" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=oZ1AGjCn"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=oZ1AGjCn" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/EoTz48KxxI4" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/technology/mobile-devices-as-development-machines/#comments" thr:count="15" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/technology/mobile-devices-as-development-machines/feed/" thr:count="15" />
		<thr:total>15</thr:total>
	<feedburner:origLink>http://blog.unto.net/technology/mobile-devices-as-development-machines/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[User-Agent headers are out of control]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/XtGueJWImao/" />
		<id>http://blog.unto.net/?p=584</id>
		<updated>2008-11-09T07:49:16Z</updated>
		<published>2008-11-09T06:48:49Z</published>
		<category scheme="http://blog.unto.net" term="programming" />		<summary type="html"><![CDATA[Here&#8217;s an actual User-Agent header from my logs:

Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; 
  .NET CLR 2.0.50727; Tablet PC 2.0; .NET CLR 3.5.21022; 
  Media Center PC 5.1; Zune 3.0; OfficeLiveConnector.1.2; 
  .NET CLR 3.5.30729; .NET CLR 3.0.30618)

This is absurd.  

And it doesn&#8217;t help.  My server does [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/programming/user-agent-headers-are-out-of-control/">&lt;p&gt;Here&amp;#8217;s an actual User-Agent header from my logs:&lt;/p&gt;

&lt;pre&gt;&lt;code&gt;Mozilla/4.0 (compatible; MSIE 8.0; Windows NT 6.0; Trident/4.0; SLCC1; 
  .NET CLR 2.0.50727; Tablet PC 2.0; .NET CLR 3.5.21022; 
  Media Center PC 5.1; Zune 3.0; OfficeLiveConnector.1.2; 
  .NET CLR 3.5.30729; .NET CLR 3.0.30618)&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;This is absurd.  &lt;/p&gt;

&lt;p&gt;And it doesn&amp;#8217;t help.  My server does not care if you own a Zune or have OfficeLiveConnector 1.2 installed.  Most servers don&amp;#8217;t.  And if they do care, there are &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec12.html"&gt;better mechanisms&lt;/a&gt; for negotiating content.&lt;/p&gt;

&lt;p&gt;Starting with the next version of every major browser, the User-Agent should simply read:&lt;/p&gt;

&lt;pre&gt;&lt;em&gt;browser&lt;/em&gt; &lt;em&gt;version&lt;/em&gt;&lt;/pre&gt;

&lt;p&gt;For example:&lt;/p&gt;

&lt;pre&gt;Internet Explorer 8.0
Firefox 3.2
Chrome 0.4
Safari 4.0
Opera 10.0&lt;/pre&gt;

&lt;p&gt;And that&amp;#8217;s it. &lt;/p&gt;

&lt;p&gt;None of this &amp;#8220;compatible&amp;#8221; nonsense (all lies anyway), no more details about the rendering engine.  Don&amp;#8217;t even include a hint about the platform (Windows, OSX, Linux, etc).  If the browser supports multiple operating systems, then it should support them all equally well enough that the server doesn&amp;#8217;t need to know.&lt;/p&gt;

&lt;p&gt;If necessary, the browser should instead use &lt;a href="http://www.w3.org/Protocols/rfc2616/rfc2616-sec14.html"&gt;Accept&lt;/a&gt; headers to send stronger signals about what type of content it desires.&lt;/p&gt;

&lt;p&gt;Stop the User-Agent madness now.  Think of the bytes.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=sPRgxiYz"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=mLS5Clte"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=mLS5Clte" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=PZ5cyy7M"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=PZ5cyy7M" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/XtGueJWImao" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/programming/user-agent-headers-are-out-of-control/#comments" thr:count="9" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/programming/user-agent-headers-are-out-of-control/feed/" thr:count="9" />
		<thr:total>9</thr:total>
	<feedburner:origLink>http://blog.unto.net/programming/user-agent-headers-are-out-of-control/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Clearing up inaccuracies about the Google OpenID IDP launch]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/TzgWBEked6I/" />
		<id>http://blog.unto.net/?p=572</id>
		<updated>2008-11-10T15:07:53Z</updated>
		<published>2008-11-08T01:07:05Z</published>
		<category scheme="http://blog.unto.net" term="miscellaneous" /><category scheme="http://blog.unto.net" term="openid" />		<summary type="html"><![CDATA[Not exactly the post I want to write after a long week, but there have been several posts following the developer launch of the Google OpenID IDP.  Unfortunately, those posts are inaccurate, and it is worth clarifying what is going on so no one else makes the same mistake and repeats the (incorrect) claim [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/miscellaneous/clearing-up-inaccuracies-about-the-google-openid-idp-launch/">&lt;p&gt;Not exactly the post I want to write after a long week, but there have been &lt;a href="http://neosmart.net/blog/2008/google-doesnt-use-openid/"&gt;several&lt;/a&gt; &lt;a href="http://www.25hoursaday.com/weblog/2008/11/07/WhyGoogleForkedOpenIDAndOtherStories.aspx"&gt;posts&lt;/a&gt; following the &lt;a href="http://google-code-updates.blogspot.com/2008/10/google-moves-towards-single-sign-on.html"&gt;developer launch&lt;/a&gt; of the Google OpenID IDP.  Unfortunately, those posts are inaccurate, and it is worth clarifying what is going on so no one else makes the same mistake and repeats the (incorrect) claim that Google somehow &amp;#8220;forked&amp;#8221; OpenID.  &lt;/p&gt;

&lt;p&gt;The first criticism has something to do with the erroneous notion that, simply because the Google IDP supports the indirect lookup of a user&amp;#8217;s identity, this is somehow an invalid use of the OpenID protocol.  On the contrary, it is using a standard technique known as Directed Identity, which can be found in the OpenID 2.0 specification &lt;a href="http://openid.net/specs/openid-authentication-2_0.html#discovery"&gt;here&lt;/a&gt;.  Directed Identity allows users to enter a generic domain name (e.g.., &amp;#8220;example.com&amp;#8221;), rather than a fully qualified identity (e.g., &amp;#8220;example.com/users/bob&amp;#8221;), so that they can use their identity provider to make an informed decision about how much personal information to expose to the RP.  This is a &lt;em&gt;good thing&lt;/em&gt;.  You want this.  You want to be able to make that disclosure choice yourself.&lt;/p&gt;

&lt;p&gt;Another (again mistaken) claim is that because, during the test launch, Google whitelisted the initial set of allowed Relying Parties, that the specification was somehow violated.  On the contrary, there is nothing in the spec that requires an IDP to provide access to user data to all RPs (nor should it!), and in the case of the Google launch, the whitelisting was just planned for the initial launch anyway.   The initial launch went well, and &lt;a href="http://google-code-updates.blogspot.com/2008/10/moving-another-step-closer-to-single.html"&gt;all RPs are now whitelisted&lt;/a&gt;.  (This wasn&amp;#8217;t a reversal of policy, this was the plan all along.)&lt;/p&gt;

&lt;p&gt;The third inaccuracy stems from the second.  During the whitelist-only test launch, Google could not publish an XRDS document at the root of the gmail.com domain for all users because it would fail for users using it on non-whitelisted RPs.  I can see how this would be confusing if one didn&amp;#8217;t know how OpenID 2.0 works with XRDS, but it was the right decision.  And now that everyone is whitelisted, Google can publish the XRDS document on the root of gmail.com.  (I don&amp;#8217;t think that part has launched yet &amp;#8212; in the meantime, you can use the explicit path of &amp;#8220;&lt;a href="https://www.google.com/accounts/o8/id"&gt;https://www.google.com/accounts/o8/id&lt;/a&gt;&amp;#8221; to fetch the XRDS document.)&lt;/p&gt;

&lt;p&gt;And last, there seems to be a huge misunderstanding about email addresses vs. URLs as identifiers.  URLs make &lt;em&gt;fantastic&lt;/em&gt; identifiers &amp;#8212; for the 0.1% of the web population that understands that they &amp;#8220;are&amp;#8221; a URL.  Fortunately, the other 99.9% of the world (our parents, for example) already understand that they have an email address.  As has become increasingly clear to everybody doing &lt;a href="http://sites.google.com/site/oauthgoog/UXFedLogin/09nov-uxsummit"&gt;usability research&lt;/a&gt; on OpenID (see &lt;a href="http://sites.google.com/site/oauthgoog/"&gt;here&lt;/a&gt; and &lt;a href="http://developer.yahoo.com/openid/bestpractices.html"&gt;here&lt;/a&gt;), we absolutely need to provide mechanisms for mapping human-friendly identifiers like email addresses to identities.  That&amp;#8217;s not to say that URLs-as-identifiers should go away.  On the contrary, I myself use &amp;#8220;dewitt.unto.net&amp;#8221; as my identifier, and fortunately, the spec is smart to allow for multiple ways of surfacing that identity.  (Or more exotically, I expect we&amp;#8217;ll see great things to come with mobile phones or phone numbers as identifiers as well.)&lt;/p&gt;

&lt;p&gt;While I don&amp;#8217;t fully understand the motivation behind the attacks made in those articles, I do find it rather unfortunate that they&amp;#8217;ve been picked up and repeated by people who are similarly unfamiliar with the technology itself.  I guess a lesson might be to pause for a second before repeating a rumor you don&amp;#8217;t personally understand.&lt;/p&gt;

&lt;p&gt;The truth is that OpenID is still in its teenage years and still has a lot of growing up to do, but in the last few months we&amp;#8217;ve several of the biggest sites on the web launch as identity providers (nearly everyone on the web has an OpenID now), and continued improvements and additions to the &lt;a href="http://openid.net/developers/specs/"&gt;core specifications&lt;/a&gt;, and groundbreaking usability research.  Bumps along the way notwithstanding, this is forward progress.&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Kevin Marks has a &lt;a href="http://epeus.blogspot.com/2008/11/missing-point-of-openid.html"&gt;great response&lt;/a&gt; about whether or not, as Ben Metcalfe &lt;a href="http://blog.unto.net/miscellaneous/clearing-up-inaccuracies-about-the-google-openid-idp-launch/#comment-3623"&gt;says below&lt;/a&gt;, OpenID forked itself by turning into more than a mechanism for claiming resolvable URLs. &lt;/p&gt;

&lt;p&gt;I&amp;#8217;m personally of mixed opinions about this myself, as I don&amp;#8217;t want those more advanced use cases for OpenID overshadow the original role of OpenID as a standard for claiming URLs.  In fact, I was among those not entirely in favor of putting these (admittedly valuable) new concepts into the core OpenID 2.0 spec, and would have preferred independent extensions instead.  As people try and do more and more with OpenID &amp;#8212; such as SSO, profile exchange, and non-URL-based identity mappings &amp;#8212; this can indeed lead to what Dare calls the &amp;#8220;&lt;a href="http://www.25hoursaday.com/weblog/2008/11/07/WhyGoogleForkedOpenIDAndOtherStories.aspx"&gt;square peg in a round hole&lt;/a&gt;&amp;#8221; effect.  But to be crystal clear, no one is forking the spec just by implementing the spec in a way it allows for.&lt;/p&gt;

&lt;p&gt;And I stand duly chided by Kevin for the rhetorical exaggeration about whether or not the mainstream user can learn to type in a URL to identify themselves.  The truth is that no one knows for sure if they can, though the research is showing that that those of us (myself included) who argued for URLs exclusively were probably hoping for too much.  But as long as we can always map the user-driven identifiers back to URLs, then I do believe we get the best of both worlds.&lt;/p&gt;

&lt;p&gt;As Kevin says, see you all at &lt;a href="http://iiw.idcommons.net/Iiw2008b"&gt;IIW&lt;/a&gt;!&lt;/p&gt;

&lt;p&gt;&lt;em&gt;Disclosure: I work for Google, and I represent Google on the OpenID Foundation board.  That said, I&amp;#8217;m really writing this as a member of the community, just trying to figure out how this story got so mixed up to begin with.&lt;/em&gt;&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=tpaLjGlI"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=72DlVgq6"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=72DlVgq6" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=2uRKGSJ1"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=2uRKGSJ1" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/TzgWBEked6I" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/miscellaneous/clearing-up-inaccuracies-about-the-google-openid-idp-launch/#comments" thr:count="10" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/miscellaneous/clearing-up-inaccuracies-about-the-google-openid-idp-launch/feed/" thr:count="10" />
		<thr:total>10</thr:total>
	<feedburner:origLink>http://blog.unto.net/miscellaneous/clearing-up-inaccuracies-about-the-google-openid-idp-launch/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[Microblogging syndication formats]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/ED3hmatiXoE/" />
		<id>http://blog.unto.net/?p=524</id>
		<updated>2008-08-17T02:49:42Z</updated>
		<published>2008-08-16T17:49:54Z</published>
		<category scheme="http://blog.unto.net" term="syndication" />		<summary type="html"><![CDATA[I&#8217;ve been thinking a little bit about the syndication formats for microblogs lately, and I&#8217;m wondering if we might all agree upon some very simple conventions to integrate the various providers.  Nothing profound here, just some simple ideas about how to get an easy win with existing technologies.

Taking FriendFeed as the best current example [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/syndication/microblogging-syndication-formats/">&lt;p&gt;I&amp;#8217;ve been thinking a little bit about the syndication formats for microblogs lately, and I&amp;#8217;m wondering if we might all agree upon some very simple conventions to integrate the various providers.  Nothing profound here, just some simple ideas about how to get an easy win with existing technologies.&lt;/p&gt;

&lt;p&gt;Taking &lt;a href="http://friendfeed.com"&gt;FriendFeed&lt;/a&gt; as the best current example of an aggregation site, I notice that the FriendFeed team has &lt;a href="http://friendfeed.com/about/"&gt;hand-coded&lt;/a&gt; various content providers, but they don&amp;#8217;t have the same richness enabled for generic feeds.&lt;/p&gt;

&lt;p&gt;For example, take &lt;a href="http://friendfeed.com/davew"&gt;Dave Winer&amp;#8217;s stream on FriendFeed&lt;/a&gt;.   His FriendFeed page looks pretty darn good, doesn&amp;#8217;t it?  (I pick Dave because he does more to syndicate various content sources than just about anyone.) &lt;/p&gt;

&lt;p&gt;But then notice that &lt;a href="http://friendfeed.com/davew?service=internal"&gt;his native FriendFeed bookmarks&lt;/a&gt;,&lt;a href="http://friendfeed.com/davew?service=amazon"&gt; his Amazon wishlist&lt;/a&gt;, and &lt;a href="http://friendfeed.com/davew?service=flickr"&gt;his Flickr photos&lt;/a&gt; all have rich content syndicated and look stunning, but &lt;a href="http://friendfeed.com/davew?service=blog"&gt;his basic blog feed&lt;/a&gt; &amp;#8212; itself a very rich content source &amp;#8212; is comparably lacking in how it is represented in the aggregated stream.&lt;/p&gt;

&lt;p&gt;It&amp;#8217;s the difference between this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://static.unto.net/dave_winer_friendfeed.jpg" alt="Dave Winer's FriendFeed stream, full of rich information and images from the bookmarklet" /&gt;&lt;/p&gt;

&lt;p&gt;And this:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://static.unto.net/dave_winer_blog.jpg" alt="Dave Winer's current FriendFeed stream, very plain, without rich information from his RSS feed" /&gt;&lt;/p&gt;

&lt;p&gt;Why is this?  Dave&amp;#8217;s blog, syndicated over RSS, has plenty of great data to display.  Only the blog post title is displayed &amp;#8212; missing are the images, an icon, a summary, and more.  Couldn&amp;#8217;t those be captured as well?&lt;/p&gt;

&lt;p&gt;As a strawman proposal, what if content aggregation sites agree to display the following standard elements from RSS feeds:&lt;/p&gt;

&lt;pre&gt;&lt;code lang="xml"&gt;&amp;lt;?xml version="1.0"?&amp;gt;
&amp;lt;rss version="2.0"&amp;gt;
 &amp;lt;channel&amp;gt;
  &lt;strong&gt;&amp;lt;title&amp;gt;Scripting News&amp;lt;/title&amp;gt;&lt;/strong&gt;
  &lt;strong&gt;&amp;lt;link&amp;gt;http://www.scripting.com/&amp;lt;/link&amp;gt;&lt;/strong&gt;
  &amp;lt;description&amp;gt;
    Dave Winer&amp;amp;apos;s weblog, started in April 1997, 
    bootstrapped the blogging revolution.
  &amp;lt;/description&amp;gt;
  &amp;lt;language&amp;gt;en-us&amp;lt;/language&amp;gt;
  &amp;lt;copyright&amp;gt;Copyright 1997-2008 Dave Winer&amp;lt;/copyright&amp;gt;
  &amp;lt;pubDate&amp;gt;Fri, 15 Aug 2008 07:00:00 GMT&amp;lt;/pubDate&amp;gt;
  &amp;lt;lastBuildDate&amp;gt;Fri, 15 Aug 2008 20:35:00 GMT&amp;lt;/lastBuildDate&amp;gt;
  &amp;lt;docs&amp;gt;http://cyber.law.harvard.edu/rss/rss.html&amp;lt;/docs&amp;gt;
  &amp;lt;generator&amp;gt;OPML Editor v0.73&amp;lt;/generator&amp;gt;
  &amp;lt;managingEditor&amp;gt;scriptingnewsmail@gmail.com&amp;lt;/managingEditor&amp;gt;
  &amp;lt;webMaster&amp;gt;scriptingnewsmail@gmail.com&amp;lt;/webMaster&amp;gt;
  &amp;lt;item&amp;gt;
   &lt;strong&gt;&amp;lt;title&amp;gt;Perfect timing!&amp;lt;/title&amp;gt;&lt;/strong&gt;
   &lt;strong&gt;&amp;lt;link&amp;gt;
     http://www.scripting.com/stories/2008/08/15/perfectTiming.html
   &amp;lt;/link&amp;gt;&lt;/strong&gt;
   &amp;lt;guid&amp;gt;
     http://www.scripting.com/stories/2008/08/15/perfectTiming.html
   &amp;lt;/guid&amp;gt;
   &amp;lt;comments&amp;gt;
     http://www.scripting.com/stories/2008/08/15/perfectTiming.html#disqus_thread
   &amp;lt;/comments&amp;gt;
   &lt;strong&gt;&amp;lt;description&amp;gt;
      I just read this [...]
   &amp;lt;/description&amp;gt;&lt;/strong&gt;
   &lt;strong&gt;&amp;lt;enclosure url="http://www.scripting.com/mp3s/weatherReportSuite.mp3" 
     length="12216320" type="audio/mpeg" /&amp;gt;&lt;/strong&gt;
   &amp;lt;pubDate&amp;gt;Fri, 15 Aug 2008 18:23:10 GMT&amp;lt;/pubDate&amp;gt;
  &amp;lt;/item&amp;gt;
 &amp;lt;/channel&amp;gt;
&amp;lt;/rss&amp;gt;&lt;/code&gt;&lt;/pre&gt;

&lt;p&gt;From this feed we&amp;#8217;d want to consider the following RSS elements:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;rss/channel/title&lt;/code&gt; &amp;#8211; the name of the blog&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;rss/channel/link&lt;/code&gt; &amp;#8211; the link to the blog&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;rss/channel/item/title&lt;/code&gt; &amp;#8211; the name of the entry&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;rss/channel/item/link&lt;/code&gt; &amp;#8211; the link to the entry&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;rss/channel/item/description&lt;/code&gt; &amp;#8211; extract the first 512 characters as the first comment&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;rss/channel/item/enclosure &lt;/code&gt;- inlined media types (images, mp3, video)&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;And for the Atom case the corresponding elements would be:&lt;/p&gt;

&lt;ul&gt;
  &lt;li&gt;&lt;code&gt;feed/title&lt;/code&gt; &amp;#8211; the name of the blog&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/link&lt;/code&gt; &amp;#8211; the link to the blog&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/author/name&lt;/code&gt; &amp;#8211; the name of the author&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/entry/title&lt;/code&gt; &amp;#8211; the name of the entry&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/entry/link@rel="alternate"&lt;/code&gt; &amp;#8211; the link to the the entry&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/entry/link@rel="enclosure"&lt;/code&gt; &amp;#8211; inlined media types (images, mp3, video)&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/entry/summary&lt;/code&gt; &amp;#8211; extract the first 512 characters as the first comment&lt;/li&gt;
  &lt;li&gt;&lt;code&gt;feed/entry/content&lt;/code&gt; &amp;#8211; use this if the summary doesn&amp;#8217;t exist&lt;/li&gt;
&lt;/ul&gt;

&lt;p&gt;For bonus points in both cases, parse the HTML content of the &lt;code&gt;rss/channel/item/description&lt;/code&gt; or &lt;code&gt;feed/entry/summary&lt;/code&gt; elements for &lt;code&gt;&amp;lt;img/&amp;gt;&lt;/code&gt; elements, extract them, and display them as images along with the post.&lt;/p&gt;

&lt;p&gt;And for a custom icon, use the host&amp;#8217;s &lt;code&gt;/favicon.ico&lt;/code&gt;.&lt;/p&gt;

&lt;p&gt;Put all that together and we&amp;#8217;d have the following, all without any manual intervention on the aggregator&amp;#8217;s side:&lt;/p&gt;

&lt;p&gt;&lt;img src="http://static.unto.net/dave_winer_improved.jpg" alt="Dave Winer's FriendFeed steam, enhanced with rich data from his RSS feed" /&gt;&lt;/p&gt;

&lt;p&gt;This is just the beginning &amp;#8212; I feel I&amp;#8217;m only scratching the surface of what can be extracted from existing syndication formats.  For example, comment stream aggregation (via the &lt;code&gt;comments&lt;/code&gt; element or RFC 4685 autodiscovery) is a great next step after this.  And I only call out FriendFeed because they&amp;#8217;re the best at aggregating multiple content sources, but these concepts apply to any content aggregator, and finding a way to reuse existing formats like RSS and Atom to create rich presentations automatically will enable us to do more with less manual work between aggregators and publishers.&lt;/p&gt;

&lt;p&gt;Also note that this isn&amp;#8217;t intended to replace a standard format for &lt;em&gt;activity streams&lt;/em&gt;.  Those are something slightly different, and I know efforts are underway to define conventions there.  Rather, this is simply an effort to get more out of the syndication formats we already publish, and in doing so, allow for aggregators like FriendFeed to present a richer experience to their users without requiring as much manual tuning per content source.&lt;/p&gt;

&lt;p&gt;Thoughts?&lt;/p&gt;

&lt;p&gt;&lt;strong&gt;Update:&lt;/strong&gt;&lt;/p&gt;

&lt;p&gt;Bret &lt;a href="http://friendfeed.com/e/70198d83-e86b-4a70-9b4e-545cb63e5b13/DeWitt-Clinton-Blog-Archive-Microblogging/"&gt;notes&lt;/a&gt;:&lt;/p&gt;

&lt;blockquote&gt;We do pull out images and videos for entries that use Media RSS, but those tend to be video and photo sites (the spirit of the Media RSS format is that the post *is* a photo, as opposed to the use case highlighted here, where the picture is simply a thumbnail or accompanying a larger post).&lt;/blockquote&gt;

&lt;p&gt;Good point, and sounds like a great thing to do.&lt;/p&gt;

&lt;blockquote&gt;&lt;/blockquote&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=HDdZ85R5"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=8Hn3J69p"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=8Hn3J69p" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=P1QLRRiJ"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=P1QLRRiJ" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/ED3hmatiXoE" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/syndication/microblogging-syndication-formats/#comments" thr:count="5" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/syndication/microblogging-syndication-formats/feed/" thr:count="5" />
		<thr:total>5</thr:total>
	<feedburner:origLink>http://blog.unto.net/syndication/microblogging-syndication-formats/</feedburner:origLink></entry>
		<entry>
		<author>
			<name>DeWitt Clinton</name>
						<uri>http://www.unto.net/</uri>
					</author>
		<title type="html"><![CDATA[On Fighting the Web Itself]]></title>
		<link rel="alternate" type="text/html" href="http://feedproxy.google.com/~r/untonet/~3/pkjPMBJhlQA/" />
		<id>http://blog.unto.net/?p=457</id>
		<updated>2008-08-08T23:42:45Z</updated>
		<published>2008-08-08T19:46:29Z</published>
		<category scheme="http://blog.unto.net" term="open" /><category scheme="http://blog.unto.net" term="opensource" /><category scheme="http://blog.unto.net" term="openweb" /><category scheme="http://blog.unto.net" term="software" />		<summary type="html"><![CDATA[Earlier this week I posted a short piece about end user licensing questions in Silverlight.  I discussed potential incompatibilities in the Beta 2 licensing terms with respect to open source software development.  For most people this is a niche concern, a curiosity, but not something they would normally be thinking about.  Besides, [...]]]></summary>
		<content type="html" xml:base="http://blog.unto.net/open/on-fighting-the-web-itself/">&lt;p&gt;Earlier this week I posted a short piece about &lt;a href="http://blog.unto.net/opensource/will-silverlight-prohibit-open-source-applications/"&gt;end user licensing questions in Silverlight&lt;/a&gt;.  I discussed potential incompatibilities in the Beta 2 licensing terms with respect to open source software development.  For most people this is a niche concern, a curiosity, but not something they would normally be thinking about.  Besides, one expects that these problems will get fixed in the final Silverlight EULA.  So why raise the question at all?&lt;/p&gt;

&lt;p&gt;The short answer is that the technology behind Silverlight, and most certainly the company creating it, has the potential of changing how the web itself works.&lt;/p&gt;

&lt;p&gt;If you&amp;#8217;re a web developer then you&amp;#8217;ve felt the acute pain involved in writing applications inside the browser.  Even armed with the most state-of-the-art toolkits, such as jQuery, Dojo, etc., you&amp;#8217;re still limited to the available runtime of HTML, CSS, and JS, and worse, the absolute morass of cross-browser incompatibilities and restricted access to native client-side capabilities.  I remain in awe of what people have accomplished in this environment, but I&amp;#8217;m sad that this is all we&amp;#8217;ve been able to accomplish so far.&lt;/p&gt;

&lt;p&gt;The web revs slowly.  Very, very slowly.  In 10 years we&amp;#8217;ve seen virtually no meaningful advances in the the ubiquitous web client; just a painful slog forward as web developers learn to eek out just a little more functionality in a constrained environment.  Progress is slow because revving the ubiquitous client requires the coordination of multiple parties, not all of whom have shown consistent interest in working together to move the web forward.&lt;/p&gt;

&lt;p&gt;More recently we&amp;#8217;ve seen some earnest attempts at breaking that cycle.  Rather than wait for the entire web to catch up, projects like Gears seek to rev the client from the inside out.  It may take several years for standards like HTML5 to be widely deployed, but if developers can gain a toehold inside the client and start forcing the issue immediately then we&amp;#8217;ll quickly see what works and what doesn&amp;#8217;t, and be that much more informed about what to standardize and adopt as part of the long-term web platform.&lt;/p&gt;

&lt;p&gt;But there&amp;#8217;s another approach, an approach best exemplified today by the Flash runtime, whereby one doesn&amp;#8217;t seek to improve the web from the inside, but rather replace it entirely.  Sure, technologies like Flash take advantage of the web via http-based delivery mechanisms and in that they run inside the browser, and yes, they can use network connections like anything else, but these alternate runtimes fundamentally divorce themselves from the web ecosystem, and in doing so gain a significant advantage, but at a cost.&lt;/p&gt;

&lt;p&gt;In spite of circumventing the web &amp;#8212; no, &lt;em&gt;because&lt;/em&gt; they circumvent the web &amp;#8212; these new runtimes have the potential of offering a far better developer experience, and hence, a far better user experience, then the least-common-denominator of the standard widely-deployed ubiquitous browser runtimes of today.&lt;/p&gt;

&lt;p&gt;Which leads us to Silverlight: Silverlight is positioned to take the fork-and-forget approach to the web pioneered by Flash and bring to it an unprecedented wealth of technology and corporate might.  With a better underlying runtime and VM, better tool support, far superior multi-language capabilities, and more marketing muscle, Silverlight has all the potential to make rapid and noticeable inroads over the next several months, cleaving a large section clean out of the web.&lt;/p&gt;

&lt;p&gt;And the scary thing?  That this isn&amp;#8217;t entirely a bad idea.  The browser itself is anemic, the dependency on a single language is a handicap, the security models simultaneously constricting and flawed, the development environments underpowered, and frankly, the whole ecosystem is deserving of a major disruption.  We&amp;#8217;ve lived too long thinking that what we have today is good enough.&lt;/p&gt;

&lt;p&gt;Granted, these technologies won&amp;#8217;t be perfect at first.  On the contrary, they might be slow, cumbersome to deploy, buggy, and feature deprived.  But right now that doesn&amp;#8217;t matter.  The strategy is all about getting a wedge in place, a bit of leverage that can be used to further pry open a vector for escaping the existing ecosystem.  And over time, as the technology improves and adoption grows, so will the size of that tear in the fabric of the web.&lt;/p&gt;

&lt;p&gt;But fighting the web is like holding back the ocean; it will route around you or it will wear you down, but will never go away, and it will never tire or give up.  Yet in spite of the futility of fighting the web, Silverlight is being positioned in opposition to the web, not in support of it.&lt;/p&gt;

&lt;p&gt;Why in opposition to the web?  This stems from the principle that the web is axiomatically defined as an open system, where the underlying technologies are resistant to the centralization of control, where the protocols and formats are extensible and malleable, and where the power to effect change is shared and distributed.    The DNA of the web is one of ceding control, and of learning to work with, rather than against, the collective wisdom and power a larger community.&lt;/p&gt;

&lt;p&gt;Whereas a development monoculture, a centralization of control, and a tight grasp on the ability to change and adapt, all stand against these basic ideals, and give rise to the forces that, given enough time, will erode and eat away at any temporary advantage gained.&lt;/p&gt;

&lt;p&gt;A violation of these principles does not necessarily make for a bad technology, but it does make it something other than the web.  The winners here will be those that harness the power of the open web, not those who align themselves against it.  Fragmentation wastes time and energy and offers little in return other than short term distractions, whereas as a collaboration offers the potential for long term solutions.&lt;/p&gt;

&lt;p&gt;The collective forces on the web are not going to sit idly by and let the Internet operating system be fragmented and dominated like we saw in generations past.  Difficult lessons were learned, and there is an inherent will about the web that resists all such attempts with striking efficacy.  Success is unlikely when everyone is aligned against you.&lt;/p&gt;

&lt;p&gt;But the call to action here is not to go and try to fight the disruptive technology.  On the contrary, the ideas are sound and the improvements are very much needed.  No, the call is to discover ways in which these ideas can become a part of the web, rather than working to tear it apart.&lt;/p&gt;

&lt;p&gt;I do not want to see ambitious attempts like these fail.  Just the opposite &amp;#8212; I want to see them succeed.  But success on the web requires a different kind of DNA, the type of DNA that is difficult to adopt when one&amp;#8217;s attention is focused on fighting the web itself.&lt;/p&gt;
&lt;div class="feedflare"&gt;
&lt;a href="http://feeds.feedburner.com/~f/untonet?a=dV1VbH6F"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?d=41" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=ycUrr7Rn"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=ycUrr7Rn" border="0"&gt;&lt;/img&gt;&lt;/a&gt; &lt;a href="http://feeds.feedburner.com/~f/untonet?a=L19YymYt"&gt;&lt;img src="http://feeds.feedburner.com/~f/untonet?i=L19YymYt" border="0"&gt;&lt;/img&gt;&lt;/a&gt;
&lt;/div&gt;&lt;img src="http://feeds.feedburner.com/~r/untonet/~4/pkjPMBJhlQA" height="1" width="1"/&gt;</content>
		<link rel="replies" type="text/html" href="http://blog.unto.net/open/on-fighting-the-web-itself/#comments" thr:count="29" />
		<link rel="replies" type="application/atom+xml" href="http://blog.unto.net/open/on-fighting-the-web-itself/feed/" thr:count="29" />
		<thr:total>29</thr:total>
	<feedburner:origLink>http://blog.unto.net/open/on-fighting-the-web-itself/</feedburner:origLink></entry>
	</feed>
