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

<channel>
	<title>Terry Jones &#187; companies</title>
	<atom:link href="http://blogs.fluidinfo.com/terry/category/companies/feed/" rel="self" type="application/rss+xml" />
	<link>http://blogs.fluidinfo.com/terry</link>
	<description>Random thoughts on tech, books, programming, etc.</description>
	<lastBuildDate>Sat, 21 Jan 2012 06:18:14 +0000</lastBuildDate>
	<language>en</language>
	<sy:updatePeriod>hourly</sy:updatePeriod>
	<sy:updateFrequency>1</sy:updateFrequency>
	<generator>http://wordpress.org/?v=3.3.1</generator>
		<item>
		<title>Apple channeling Microsoft?</title>
		<link>http://blogs.fluidinfo.com/terry/2011/02/01/apple-channeling-microsoft/</link>
		<comments>http://blogs.fluidinfo.com/terry/2011/02/01/apple-channeling-microsoft/#comments</comments>
		<pubDate>Tue, 01 Feb 2011 22:59:06 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=752</guid>
		<description><![CDATA[Apple&#8217;s behavior, as described today in the New York Times and in Ars Technica reminds me of Microsoft building MSIE into Windows. When that happened, other browser manufacturers cried foul. They argued that this was bundling, that few people would want to use a non-native browser, and that Microsoft was using its platform monopoly to [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_756" class="wp-caption alignright" style="width: 310px"><a href="http://www.flickr.com/photos/lara604/4749531404/"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2011/02/4749531404_fe75d48163_b-300x240.jpg" alt="" title="Rotten apple" width="300" height="240" class="size-medium wp-image-756" /></a><p class="wp-caption-text">Image by Lara64</p></div>Apple&#8217;s behavior, as described today <a href="http://www.nytimes.com/2011/02/01/technology/01apple.html?_r=1">in the New York Times</a> and <a href="http://arstechnica.com/apple/news/2011/02/apple-responds-to-app-store-furor-says-it-wants-a-cut-of-e-book-sales.ars">in Ars Technica</a> reminds me of Microsoft building MSIE into Windows. When that happened, other browser manufacturers cried foul. They argued that this was bundling, that few people would want to use a non-native browser, and that Microsoft was using its platform monopoly to tilt the browser playing field.</p>
<p>Here again we have a vendor (<a href="http://www.apple.com">Apple</a>), with an operating system platform (<a href="http://en.wikipedia.org/wiki/IOS_(Apple)">iOS</a>), with a piece of extremely valuable functionality (the <a href="http://en.wikipedia.org/wiki/App_Store">App Store</a>) built in by the vendor, who are now strong-arming others writing applications for the platform into always offering access through their functionality.  That all reminds me of Microsoft.</p>
<p>While it might now be difficult to think of the <a href="http://en.wikipedia.org/wiki/IPhone">iPhone</a> without the App Store, the iPhone existed for 18 months before the App Store came along: the iPhone was released in January 2007, the App Store in July 2008. Windows and MSIE also started life as independent entities; it was about 2 years before they were fused and optimistically declared inseparable.</p>
<p>The two cases are obviously not the same in detail, but I find the similarities striking and thought-provoking.</p>
<p>Just for fun, imagine a court case aimed at forcing Apple to make their App Store separable from their operating system platform. To allow others to build their own app stores. To give the user the choice to install/uninstall whatever app stores they liked. Imagine Apple claiming that such a separation is technically impossible and that the App Store is fundamental to the iPhone experience.</p>
<p>Couldn&#8217;t possibly happen, right?</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2011/02/01/apple-channeling-microsoft/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Faulkner on splendid failure</title>
		<link>http://blogs.fluidinfo.com/terry/2010/09/29/faulkner-on-splendid-failure/</link>
		<comments>http://blogs.fluidinfo.com/terry/2010/09/29/faulkner-on-splendid-failure/#comments</comments>
		<pubDate>Wed, 29 Sep 2010 16:02:54 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[books]]></category>
		<category><![CDATA[companies]]></category>
		<category><![CDATA[failure]]></category>
		<category><![CDATA[faulkner]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=699</guid>
		<description><![CDATA[I always enjoy running across writing that is not about entrepreneurialism but which seems directly relevant. A couple of snippets that I&#8217;ve blogged before are The entrepreneurial spirit in literature (from Conrad&#8216;s Heart of Darkness) and Orwell on T. S. Eliot and the path from existential angst to serial entrepreneur. Here&#8217;s another. It&#8217;s Faulkner&#8217;s address [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2010/09/faulkner1.s600x600.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2010/09/faulkner1.s600x600.jpg" alt="" title="faulkner1.s600x600" width="278" height="432" class="alignright size-full wp-image-702" /></a>I always enjoy running across writing that is not about entrepreneurialism but which seems directly relevant. A couple of snippets that I&#8217;ve blogged before are <a href="http://blogs.fluidinfo.com/terry/2009/03/02/the-entrepreneurial-spirit-in-literature/">The entrepreneurial spirit in literature</a> (from <a href="http://en.wikipedia.org/wiki/Joseph_Conrad">Conrad</a>&#8216;s <a href="http://en.wikipedia.org/wiki/Heart_of_Darkness">Heart of Darkness</a>) and <a href="http://blogs.fluidinfo.com/terry/2007/06/07/orwell-on-t-s-eliot-and-the-path-from-existential-angst-to-serial-entrepreneur/">Orwell on T. S. Eliot and the path from existential angst to serial entrepreneur</a>.</p>
<p>Here&#8217;s another. It&#8217;s Faulkner&#8217;s address upon receiving the National Book Award for fiction in 1955. Taken from <em>William Faulkner Essays, Speeches &#038; Public Letters</em>. Random House 1965, pp 143-5.</p>
<p>It makes me think about what I consider Faulkner&#8217;s crowning masterpiece, <a href="http://en.wikipedia.org/wiki/Absalom,_Absalom!">Absalom, Absalom!</a> and the effort that must have gone into its creation. It also puts me in mind of <a href="http://twitter.com/timoreilly">Tim O&#8217;Reilly&#8217;s</a> exhortation to entrepreneurs to &#8220;work on stuff that matters&#8221;.</p>
<blockquote><p>By artist I mean of course everyone who has tried to create something which was not here before him, with no other tools and material than the uncommerciable ones of the human spirit; who has tried to carve, no matter how crudely, on the wall of that final oblivion beyond which he will have to pass, in the tongue of the human spirit &#8216;Kilroy was here.&#8217;</p>
<p>That is primarily, and I think in its essence, all that we ever really tried to do. And I believe we will all agree that we failed. That what we made never quite matched and never will match the shape, the dream of perfection which we inherited and which drove us and will continue to drive us, even after each failure, until anguish frees us and the hand falls still at last.</p>
<p>Maybe it&#8217;s just as well that we are doomed to fail, since, as long as we do fail and the hand continues to hold blood, we will try again; where, if we ever did attain the dream, match the shape, scale that ultimate peak of perfection, nothing would remain but to jump off the other side of it into suicide. Which would not only deprive us of our American right to existence, not only inalienable but harmless too, since by our standards, in our culture, the pursuit of art is a peaceful hobby like breeding Dalmations, it would leave refuse in the form of, at best indigence and at worst downright crime resulting from unexhausted energy, to be scavenged and removed and disposed of. While this way, constantly and steadily occupied by, obsessed with, immersed in trying to do the impossible, faced always with the failure which we decline to recognize and accept, we stay out of trouble, keep out of the way of the practical and busy people who carry the burden of America.</p>
<p>So all are happy&#8212;the giants of industry and commerce, and the manipulators for profit or power of the mass emotions called government, who carry the tremendous load of geopolitical solvency, the two of which conjoined are America; and the harmless breeders of the spotted dogs (unharmed too, protected, immune in the inalienable right to exhibit our dogs to one another for acclaim, and even to the public too; defended in our right to collect from them at the rate of five or ten dollars for the special signed editions, and even at the rate of thousands to special fanciers named Picasso or Matisse).</p>
<p>Then something like this happens&#8212;like this, here, this afternoon; not just once and not even just once a year. Then that anguished breeder discovers that not only his fellow breeders, who must support their mutual vocation in a sort of mutual desperate defensive confederation, but other people, people whom he had considered outsiders, also hold that what he is doing is valid. And not only scattered individuals who hold his doings valid, but enough of them to confederate in their turn, for no mutual benefit of profit or defense but simply because they also believe it is not only valid but important that man should write on the wall &#8216;Man was here also A.D. 1953, or &#8217;54 or &#8217;55&#8242;, and so go on record like this this afternoon.</p>
<p>To tell not the individual artist but the world, the time itself, that what he did is valid. That even failure is worth while and admirable, provided only that the failure is splendid enough, the dream splendid enough, unattainable enough yet forever valuable enough, since it was of perfection.</p>
<p>So when this happens to him (or to one of his fellows; it doesn&#8217;t matter which one, since all share the validation of the mutual devotion) the thought occurs that perhaps one of the things wrong with our country is success. That there is too much success in it. Success is too easy. In our country a young man can gain it with no more than a little industry. He can gain it so quickly and easily that he has not had time to learn the humility to handle it with, or even to discover, realise, that he will need humility.</p></blockquote>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2010/09/29/faulkner-on-splendid-failure/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>At what point does an Amazon EC2 reserved instance become worth it?</title>
		<link>http://blogs.fluidinfo.com/terry/2010/01/08/at-what-point-does-an-amazon-ec2-reserved-instance-become-worth-it/</link>
		<comments>http://blogs.fluidinfo.com/terry/2010/01/08/at-what-point-does-an-amazon-ec2-reserved-instance-become-worth-it/#comments</comments>
		<pubDate>Fri, 08 Jan 2010 13:32:58 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=651</guid>
		<description><![CDATA[If you purchase an Amazon EC2 reserved instance, you&#8217;ll pay a certain amount up front (pricing). If you don&#8217;t use the instance much, it will be more expensive per hour than a regular on-demand instance. E.g., if you paid $227.50 to reserve a small instance for a year but then only used it for a [...]]]></description>
			<content:encoded><![CDATA[<p>If you purchase an Amazon EC2 reserved instance, you&#8217;ll pay a certain amount up front (<a href="http://aws.amazon.com/ec2/#pricing">pricing</a>). If you don&#8217;t use the instance much, it will be more expensive per hour than a regular on-demand instance. E.g., if you paid $227.50 to reserve a small instance for a year but then only used it for a single day, you&#8217;d be paying almost $10/hr and it would obviously be much cheaper to just get an on-demand instance and pay just 8.5 cents per hour.</p>
<p>OTOH, if you ran a small instance for a year at the on-demand price, you&#8217;d pay $745 and it would obviously be cheaper to pay the up-front reservation price ($227.50) plus a year of the low per-hour pricing (365 * 24 * $0.03), or $490.</p>
<p>So for how long do you have to run an instance in order for it to be cheaper to pay for a reserved instance? (Note that I&#8217;m ignoring the time value of money, what you might do with the up-front money in the meantime if you didn&#8217;t give it to Amazon in advance, etc.)</p>
<p>The answer is pretty simple: for a one-year reservation you need to run the instance for about 6 months to make it worthwhile. For a three-year reservation you need to run the instance for at least 3 months per year, on average.</p>
<p>Here&#8217;s a fragment from <a href="http://jon.es/other/ec2-costs.ods">a simple spreadsheet I made</a>, based on the US N. Virginia prices:</p>
<p><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2010/01/ec2.png" alt="ec2" title="ec2" width="571" height="363" class="alignleft size-full wp-image-653" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2010/01/08/at-what-point-does-an-amazon-ec2-reserved-instance-become-worth-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Fault-tolerant Python Twisted classes for getting all Twitter friends or followers</title>
		<link>http://blogs.fluidinfo.com/terry/2009/10/22/fault-tolerant-python-twisted-classes-for-getting-all-twitter-friends-or-followers/</link>
		<comments>http://blogs.fluidinfo.com/terry/2009/10/22/fault-tolerant-python-twisted-classes-for-getting-all-twitter-friends-or-followers/#comments</comments>
		<pubDate>Wed, 21 Oct 2009 23:56:20 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[twisted]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=634</guid>
		<description><![CDATA[It&#8217;s been forever since I blogged here. I just wrote a little Python to grab all of a user&#8217;s friends or followers (or just their user ids). It uses Twisted, of course. There were two main reasons for doing this: 1) I want all friends/followers, not just the first bunch returned by the Twitter API, [...]]]></description>
			<content:encoded><![CDATA[<p>It&#8217;s been forever since I blogged here. I just wrote a little Python to grab all of a user&#8217;s friends or followers (or just their user ids). It uses <a href="http://twistedmatrix.com">Twisted</a>, of course. There were two main reasons for doing this: 1) I want <em>all</em> friends/followers, not just the first bunch returned by the <a href="http://apiwiki.twitter.com/">Twitter API</a>, and 2) I wanted code that is fairly robust in the face of various 50x HTTP errors (I regularly experience INTERNAL_SERVER_ERROR, BAD_GATEWAY, and SERVICE_UNAVAILABLE).</p>
<p>If you want to use the code below and you&#8217;re not familiar with the Twitter API, consider whether you can use the <code>FriendsIdFetcher</code> and <code>FollowersIdFetcher</code> classes as they&#8217;ll do far fewer requests (you get 5000 results per API call, instead of 100). If you can live with user ids and do the occasional fetch of a full user, you&#8217;ll probably do far fewer API calls.</p>
<p>For the <code>FriendsFetcher</code> and <code>FollowersFetcher</code> classes, you get back a list of dictionaries, one per user. For <code>FriendsIdFetcher</code> and <code>FollowersIdFetcher</code> you get a list of Twitter user ids.</p>
<p><em>Of course</em> there&#8217;s no documentation. Feel free to ask questions in the comments. <a href="http://jon.es/other/twitter-fetcher.py">Download the source</a>.</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">import</span> <span class="kw3">sys</span></p>
<p><span class="kw1">from</span> twisted.<span class="me1">internet</span> <span class="kw1">import</span> defer<br />
<span class="kw1">from</span> twisted.<span class="me1">web</span> <span class="kw1">import</span> client, error, http<br />
&nbsp; &nbsp; <br />
<span class="kw1">if</span> <span class="kw3">sys</span>.<span class="me1">hexversion</span> &gt;= 0x20600f0:<br />
&nbsp; &nbsp; <span class="kw1">import</span> json<br />
<span class="kw1">else</span>:<br />
&nbsp; &nbsp; <span class="kw1">import</span> simplejson as json</p>
<p><span class="kw1">class</span> _Fetcher<span class="br0">&#40;</span><span class="kw2">object</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; baseURL = <span class="st0">&#8216;http://twitter.com/&#8217;</span><br />
&nbsp; &nbsp; URITemplate = <span class="kw2">None</span> <span class="co1"># Override in subclass.</span><br />
&nbsp; &nbsp; dataKey = <span class="kw2">None</span> <span class="co1"># Override in subclass.</span><br />
&nbsp; &nbsp; maxErrs = <span class="nu0">10</span><br />
&nbsp; &nbsp; okErrs = <span class="br0">&#40;</span>http.<span class="me1">INTERNAL_SERVER_ERROR</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http.<span class="me1">BAD_GATEWAY</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; http.<span class="me1">SERVICE_UNAVAILABLE</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> <span class="kw4">__init__</span><span class="br0">&#40;</span><span class="kw2">self</span>, name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">assert</span> <span class="kw2">self</span>.<span class="me1">baseURL</span>.<span class="me1">endswith</span><span class="br0">&#40;</span><span class="st0">&#8216;/&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">results</span> = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">errCount</span> = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">nextCursor</span> = <span class="nu0">-1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">deferred</span> = defer.<span class="me1">Deferred</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">URL</span> = <span class="kw2">self</span>.<span class="me1">baseURL</span> + <span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">URITemplate</span> % <span class="br0">&#123;</span> <span class="st0">&#8216;name&#8217;</span> : name <span class="br0">&#125;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> _fail<span class="br0">&#40;</span><span class="kw2">self</span>, failure<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; failure.<span class="me1">trap</span><span class="br0">&#40;</span>error.<span class="me1">Error</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">errCount</span> += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">errCount</span> &lt; <span class="kw2">self</span>.<span class="me1">maxErrs</span> <span class="kw1">and</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">int</span><span class="br0">&#40;</span>failure.<span class="me1">value</span>.<span class="me1">status</span><span class="br0">&#41;</span> <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">okErrs</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">fetch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">deferred</span>.<span class="me1">errback</span><span class="br0">&#40;</span>failure<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> _parse<span class="br0">&#40;</span><span class="kw2">self</span>, result<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data = json.<span class="me1">loads</span><span class="br0">&#40;</span>result<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">nextCursor</span> = data.<span class="me1">get</span><span class="br0">&#40;</span><span class="st0">&#8216;next_cursor&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">results</span>.<span class="me1">extend</span><span class="br0">&#40;</span>data<span class="br0">&#91;</span><span class="kw2">self</span>.<span class="me1">dataKey</span><span class="br0">&#93;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">Exception</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">deferred</span>.<span class="me1">errback</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">fetch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> _deDup<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">raise</span> <span class="kw2">NotImplementedError</span><span class="br0">&#40;</span><span class="st0">&#8216;Override _deDup in subclasses.&#8217;</span><span class="br0">&#41;</span></p>
<p>&nbsp; &nbsp; <span class="kw1">def</span> fetch<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> <span class="kw2">self</span>.<span class="me1">nextCursor</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d = client.<span class="me1">getPage</span><span class="br0">&#40;</span><span class="kw2">self</span>.<span class="me1">URL</span> + <span class="st0">&#8216;?cursor=%s&#8217;</span> % <span class="kw2">self</span>.<span class="me1">nextCursor</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d.<span class="me1">addCallback</span><span class="br0">&#40;</span><span class="kw2">self</span>._parse<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d.<span class="me1">addErrback</span><span class="br0">&#40;</span><span class="kw2">self</span>._fail<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw2">self</span>.<span class="me1">deferred</span>.<span class="me1">callback</span><span class="br0">&#40;</span><span class="kw2">self</span>._deDup<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">self</span>.<span class="me1">deferred</span></p>
<p><span class="kw1">class</span> _FriendsOrFollowersFetcher<span class="br0">&#40;</span>_Fetcher<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; dataKey = u<span class="st0">&#8216;users&#8217;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> _deDup<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; seen = <span class="kw2">set</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> userdict <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">results</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; uid = userdict<span class="br0">&#91;</span><span class="st0">&#8216;id&#8217;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> uid <span class="kw1">not</span> <span class="kw1">in</span> seen:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.<span class="me1">append</span><span class="br0">&#40;</span>userdict<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seen.<span class="me1">add</span><span class="br0">&#40;</span>uid<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> result</p>
<p><span class="kw1">class</span> _IdFetcher<span class="br0">&#40;</span>_Fetcher<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; dataKey = u<span class="st0">&#8216;ids&#8217;</span><br />
&nbsp; &nbsp; <br />
&nbsp; &nbsp; <span class="kw1">def</span> _deDup<span class="br0">&#40;</span><span class="kw2">self</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="co1"># Keep the ids in the order we received them.</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; seen = <span class="kw2">set</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; result = <span class="br0">&#91;</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> uid <span class="kw1">in</span> <span class="kw2">self</span>.<span class="me1">results</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> uid <span class="kw1">not</span> <span class="kw1">in</span> seen:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; result.<span class="me1">append</span><span class="br0">&#40;</span>uid<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; seen.<span class="me1">add</span><span class="br0">&#40;</span>uid<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> result</p>
<p><span class="kw1">class</span> FriendsFetcher<span class="br0">&#40;</span>_FriendsOrFollowersFetcher<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; URITemplate = <span class="st0">&#8216;statuses/friends/%(name)s.json&#8217;</span></p>
<p><span class="kw1">class</span> FollowersFetcher<span class="br0">&#40;</span>_FriendsOrFollowersFetcher<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; URITemplate = <span class="st0">&#8216;statuses/followers/%(name)s.json&#8217;</span></p>
<p><span class="kw1">class</span> FriendsIdFetcher<span class="br0">&#40;</span>_IdFetcher<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; URITemplate = <span class="st0">&#8216;friends/ids/%(name)s.json&#8217;</span></p>
<p><span class="kw1">class</span> FollowersIdFetcher<span class="br0">&#40;</span>_IdFetcher<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; URITemplate = <span class="st0">&#8216;followers/ids/%(name)s.json&#8217;</span><br />
&nbsp;</div>
<p>Usage is dead simple:</p>
<div class="dean_ch" style="white-space: nowrap;">
fetcher = FriendsFetcher<span class="br0">&#40;</span><span class="st0">&#8216;terrycojones&#8217;</span><span class="br0">&#41;</span><br />
d = fetcher.<span class="me1">fetch</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
d.<span class="me1">addCallback</span><span class="br0">&#40;</span>&#8230;.<span class="br0">&#41;</span> <span class="co1"># etc.</span><br />
&nbsp;</div>
<p>Enjoy.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2009/10/22/fault-tolerant-python-twisted-classes-for-getting-all-twitter-friends-or-followers/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Python code for retrieving all your tweets</title>
		<link>http://blogs.fluidinfo.com/terry/2009/06/24/python-code-for-retrieving-all-your-tweets/</link>
		<comments>http://blogs.fluidinfo.com/terry/2009/06/24/python-code-for-retrieving-all-your-tweets/#comments</comments>
		<pubDate>Wed, 24 Jun 2009 20:44:06 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=608</guid>
		<description><![CDATA[Here&#8217;s a little Python code to pull back all a user&#8217;s Twitter tweets. Make sure you read the notes at bottom in case you want to use it. import sys, twitter, operator from dateutil.parser import parse twitterURL = &#8216;http://twitter.com&#8217; def fetch&#40;user&#41;: &#160; &#160; data = &#123;&#125; &#160; &#160; api = twitter.Api&#40;&#41; &#160; &#160; max_id = [...]]]></description>
			<content:encoded><![CDATA[<p>Here&#8217;s a little Python code to pull back all a user&#8217;s Twitter tweets. Make sure you read the notes at bottom in case you want to use it.</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">import</span> <span class="kw3">sys</span>, twitter, <span class="kw3">operator</span><br />
<span class="kw1">from</span> dateutil.<span class="kw3">parser</span> <span class="kw1">import</span> parse</p>
<p>twitterURL = <span class="st0">&#8216;http://twitter.com&#8217;</span></p>
<p><span class="kw1">def</span> fetch<span class="br0">&#40;</span><span class="kw3">user</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; data = <span class="br0">&#123;</span><span class="br0">&#125;</span><br />
&nbsp; &nbsp; api = twitter.<span class="me1">Api</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; max_id = <span class="kw2">None</span><br />
&nbsp; &nbsp; total = <span class="nu0">0</span><br />
&nbsp; &nbsp; <span class="kw1">while</span> <span class="kw2">True</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; statuses = api.<span class="me1">GetUserTimeline</span><span class="br0">&#40;</span><span class="kw3">user</span>, count=<span class="nu0">200</span>, max_id=max_id<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; newCount = ignCount = <span class="nu0">0</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> s <span class="kw1">in</span> statuses:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> s.<span class="kw2">id</span> <span class="kw1">in</span> data:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; ignCount += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; data<span class="br0">&#91;</span>s.<span class="kw2">id</span><span class="br0">&#93;</span> = s<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newCount += <span class="nu0">1</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; total += newCount<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> &gt;&gt;sys.<span class="me1">stderr</span>, <span class="st0">&quot;Fetched %d/%d/%d new/old/total.&quot;</span> % <span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; newCount, ignCount, total<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> newCount == <span class="nu0">0</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; max_id = <span class="kw2">min</span><span class="br0">&#40;</span><span class="br0">&#91;</span>s.<span class="kw2">id</span> <span class="kw1">for</span> s <span class="kw1">in</span> statuses<span class="br0">&#93;</span><span class="br0">&#41;</span> &#8211; <span class="nu0">1</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> data.<span class="me1">values</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> htmlPrint<span class="br0">&#40;</span><span class="kw3">user</span>, tweets<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">for</span> t <span class="kw1">in</span> tweets:<br />
&nbsp; &nbsp; &nbsp; &nbsp; t.<span class="me1">pdate</span> = parse<span class="br0">&#40;</span>t.<span class="me1">created_at</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; key = <span class="kw3">operator</span>.<span class="me1">attrgetter</span><span class="br0">&#40;</span><span class="st0">&#8216;pdate&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; tweets = <span class="kw2">sorted</span><span class="br0">&#40;</span>tweets, key=key<span class="br0">&#41;</span><br />
&nbsp; &nbsp; f = <span class="kw2">open</span><span class="br0">&#40;</span><span class="st0">&#8216;%s.html&#8217;</span> % <span class="kw3">user</span>, <span class="st0">&#8216;wb&#8217;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> &gt;&gt;f, <span class="st0">&quot;&quot;</span><span class="st0">&quot;&lt;html&gt;&lt;title&gt;Tweets for %s&lt;/title&gt;<br />
&nbsp; &nbsp; &lt;meta http-equiv=&quot;</span>Content-Type<span class="st0">&quot; content=&quot;</span>text/html;charset=utf<span class="nu0">-8</span><span class="st0">&quot;&gt;<br />
&nbsp; &nbsp; &lt;body&gt;&lt;small&gt;&quot;</span><span class="st0">&quot;&quot;</span> % <span class="kw3">user</span><br />
&nbsp; &nbsp; <span class="kw1">for</span> i, t <span class="kw1">in</span> <span class="kw2">enumerate</span><span class="br0">&#40;</span>tweets<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> &gt;&gt;f, <span class="st0">&#8216;%d. %s &lt;a href=&quot;%s/%s/status/%d&quot;&gt;%s&lt;/a&gt;&lt;br/&gt;&#8217;</span> % <span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i, t.<span class="me1">pdate</span>.<span class="me1">strftime</span><span class="br0">&#40;</span><span class="st0">&#8216;%Y-%m-%d %H:%M&#8217;</span><span class="br0">&#41;</span>, twitterURL,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw3">user</span>, t.<span class="kw2">id</span>, t.<span class="me1">text</span>.<span class="me1">encode</span><span class="br0">&#40;</span><span class="st0">&#8216;utf8&#8242;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> &gt;&gt;f, <span class="st0">&#8216;&lt;/small&gt;&lt;/body&gt;&lt;/html&gt;&#8217;</span><br />
&nbsp; &nbsp; f.<span class="me1">close</span><span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <br />
<span class="kw1">if</span> __name__ == <span class="st0">&#8216;__main__&#8217;</span>:<br />
&nbsp; &nbsp; <span class="kw3">user</span> = <span class="st0">&#8216;terrycojones&#8217;</span> <span class="kw1">if</span> <span class="kw2">len</span><span class="br0">&#40;</span><span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#41;</span> &lt; <span class="nu0">2</span> <span class="kw1">else</span> <span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; data = fetch<span class="br0">&#40;</span><span class="kw3">user</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; htmlPrint<span class="br0">&#40;</span><span class="kw3">user</span>, data<span class="br0">&#41;</span><br />
&nbsp;</div>
<p><strong>Notes:</strong></p>
<p>Fetch all of a user&#8217;s tweets and write them to a file <tt>username.html</tt> (where username is given on the command line).</p>
<p>Output is to a file instead of to stdout as tweet texts are unicode and <tt>sys.stdout.encoding</tt> is <tt>ascii</tt> on my machine, which prevents printing non-ASCII chars.</p>
<p>This code uses the Python-Twitter library. You need to get (via SVN) <a href="http://python-twitter.googlecode.com/svn/trunk">the very latest version</a>, and then you need to fix a tiny bug, <a href="http://groups.google.com/group/python-twitter/msg/6ba85d52d36be02e">described here</a>.  Or wait a while and the SVN trunk will be patched.</p>
<p>This worked flawlessly for <a href="http://jon.es/twitter/terrycojones.html">my 2,300 tweets</a>, but only retrieved about half the tweets of someone who had over 7,000. I&#8217;m not sure what happened there.</p>
<p>There are tons of things that could be done to make the output more attractive and useful. And yes, for nitpickers, the code has a couple of slight inefficiencies :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2009/06/24/python-code-for-retrieving-all-your-tweets/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>FluidDB domain names available early (and free) for Twitter users</title>
		<link>http://blogs.fluidinfo.com/terry/2009/01/24/fluiddb-domain-names-available-early-and-free-for-twitter-users/</link>
		<comments>http://blogs.fluidinfo.com/terry/2009/01/24/fluiddb-domain-names-available-early-and-free-for-twitter-users/#comments</comments>
		<pubDate>Sat, 24 Jan 2009 22:04:40 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[FluidDB]]></category>
		<category><![CDATA[Fluidinfo]]></category>
		<category><![CDATA[twitter]]></category>
		<category><![CDATA[domains]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=502</guid>
		<description><![CDATA[Sometime in the next few months, Fluidinfo will launch an alpha version of FluidDB, the database with the heart of a wiki. It&#8217;s a big engineering task, and there will still be a lot to do when we go into alpha, so we&#8217;ll initially only have a small number of applications being built on FluidDB. [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fluidinfo.com/"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/12/fi-large1.png" alt="" title="Fluidinfo" width="204" height="250" class="alignleft size-medium wp-image-475" /></a>Sometime in the next few months, <a href="http://fluidinfo.com">Fluidinfo</a> will launch an alpha version of FluidDB, <em>the database with the heart of a wiki</em>.  It&#8217;s a big engineering task, and there will still be a lot to do when we go into alpha, so we&#8217;ll initially only have a small number of applications being built on FluidDB.</p>
<p>But that doesn&#8217;t mean you can&#8217;t get into the action early.</p>
<p>Starting today, we&#8217;re pleased to offer FluidDB domains <em>for free</em> to <a href="http://twitter.com">Twitter</a> users. This is perhaps the simplest way you&#8217;ll ever sign up for a new web service &#8211; if you&#8217;re a Twitter user:</p>
<p>Simply <a href="http://twitter.com/fluidDB">follow FluidDB</a> on Twitter.</p>
<p>Yes, that&#8217;s it. You&#8217;re done.</p>
<p>Later, when we create your FluidDB domain, we&#8217;ll send you your FluidDB password via a direct message in Twitter. Note that we haven&#8217;t asked for your real name, your email, a password, sent you a cookie, or asked you to fill out a pesky sign-up form. The point here is simply to give you an early opportunity to trivially claim your preferred name.</p>
<p>Feel free to tweet the URL of this posting (<a href="http://bit.ly/bezc">http://bit.ly/bezc</a>). You can <a href="http://twitter.com/terrycojones">follow me too</a> for extra credit. If you&#8217;re not already a Twitter user and you want a free FluidDB domain name, <a href="https://twitter.com/signup">sign up for Twitter</a>, and then follow FluidDB.</p>
<blockquote><p><strong>Mini FAQ:</strong></p>
<p><b>Why would I do this?</b> By following FluidDB you will reserve your (Twitter) user name as your domain name in FluidDB.</p>
<p><b>Is there any charge?</b> No.</p>
<p><b>What is a FluidDB domain?</b> Sorry, but you&#8217;ll have to wait to find out the answer to this. We can tell you though that FluidDB domains will have many uses, and that they wont all be free.</p>
<p><b>What if I change my mind?</b> Just unfollow FluidDB on Twitter.</p>
<p><b>Why Twitter?</b> Because we like Twitter. We <em>may</em> do a similar thing for other services, allowing users to later claim their domain via <a href="http://OpenID.net">OpenID</a>, but that introduces the potential of naming conflicts.</p></blockquote>
<p>Finally, please note that we can&#8217;t give an iron-clad guarantee that you&#8217;ll get your Twitter user name as your FluidDB domain name, but we&#8217;ll do our best. At this early stage of the game, we reserve the right to do whatever we want :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2009/01/24/fluiddb-domain-names-available-early-and-free-for-twitter-users/feed/</wfw:commentRss>
		<slash:comments>30</slash:comments>
		</item>
		<item>
		<title>Who signed up for Twitter immediately before/after you?</title>
		<link>http://blogs.fluidinfo.com/terry/2009/01/14/who-signed-up-for-twitter-immediately-beforeafter-you/</link>
		<comments>http://blogs.fluidinfo.com/terry/2009/01/14/who-signed-up-for-twitter-immediately-beforeafter-you/#comments</comments>
		<pubDate>Wed, 14 Jan 2009 02:52:55 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=497</guid>
		<description><![CDATA[This is just a quick hack, done in about 20 minutes in 32 lines of Python. The following script will print out the Twitter screen names of the people who signed up immediately before and after a given user. import sys from twitter import Api from operator import add from functools import partial inc = [...]]]></description>
			<content:encoded><![CDATA[<p>This is just a quick hack, done in about 20 minutes in 32 lines of Python. The following script will print out the Twitter screen names of the people who signed up immediately before and after a given user.</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">import</span> <span class="kw3">sys</span><br />
<span class="kw1">from</span> twitter <span class="kw1">import</span> Api<br />
<span class="kw1">from</span> <span class="kw3">operator</span> <span class="kw1">import</span> add<br />
<span class="kw1">from</span> functools <span class="kw1">import</span> partial</p>
<p>inc = partial<span class="br0">&#40;</span>add, <span class="nu0">1</span><span class="br0">&#41;</span><br />
dec = partial<span class="br0">&#40;</span>add, <span class="nu0">-1</span><span class="br0">&#41;</span><br />
api = Api<span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> getUser<span class="br0">&#40;</span>u<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">try</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> api.<span class="me1">GetUser</span><span class="br0">&#40;</span>u<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">except</span> <span class="kw2">Exception</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">return</span> <span class="kw2">None</span></p>
<p><span class="kw1">def</span> do<span class="br0">&#40;</span>name<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw3">user</span> = getUser<span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> <span class="kw3">user</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> f, what <span class="kw1">in</span> <span class="br0">&#40;</span>dec, <span class="st0">&#8216;Before:&#8217;</span><span class="br0">&#41;</span>, <span class="br0">&#40;</span>inc, <span class="st0">&#8216;After:&#8217;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = <span class="kw3">user</span>.<span class="kw2">id</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">while</span> <span class="kw2">True</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = f<span class="br0">&#40;</span>i<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; u = getUser<span class="br0">&#40;</span>i<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> u:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> what, u.<span class="me1">screen_name</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&#8216;Could not find user %r&#8217;</span> % name</p>
<p><span class="kw1">if</span> __name__ == <span class="st0">&#8216;__main__&#8217;</span>:<br />
&nbsp; &nbsp; <span class="kw1">for</span> name <span class="kw1">in</span> <span class="kw3">sys</span>.<span class="me1">argv</span><span class="br0">&#91;</span><span class="nu0">1</span>:<span class="br0">&#93;</span>: <br />
&nbsp; &nbsp; &nbsp; &nbsp; do<span class="br0">&#40;</span>name<span class="br0">&#41;</span><br />
&nbsp;</div>
<p>I&#8217;m happy to have reached the point in my Python development where I can pretty much just type something like this in without really having to think, including the use of <code>operator.add</code> and <code>functools.partial</code>.</p>
<p>BTW, the users who signed up immediately before and after I did were <a href="http://twitter.com/skywalker">skywalker</a> and <a href="http://twitter.com/kitu012">kitu012</a>.</p>
<p>The above is just a hack. Notes:</p>
<ol>
<li>If it can&#8217;t retrieve a user for any reason, it just assumes there is no such user.</li>
<li>Twitter periodically deletes accounts of abusers, so the answer will skip those.</li>
<li>Twitter had lots of early hiccups, so there may be no guarantee that user ids were actually assigned sequentially.</li>
<li>This script may run forever.</li>
<li>I&#8217;m using the <a href="http://code.google.com/p/python-twitter/">Python Twitter library</a> written by DeWitt Clinton. It&#8217;s been a while since it was updated, and it doesn&#8217;t give you back the time a user was created in Twitter. It would be fun to print that too.</li>
</ol>
<p>As you were.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2009/01/14/who-signed-up-for-twitter-immediately-beforeafter-you/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>10,000 things: Andrew Hensel lives (on Twitter)</title>
		<link>http://blogs.fluidinfo.com/terry/2009/01/05/10000-things-andrew-hensel-lives-on-twitter/</link>
		<comments>http://blogs.fluidinfo.com/terry/2009/01/05/10000-things-andrew-hensel-lives-on-twitter/#comments</comments>
		<pubDate>Mon, 05 Jan 2009 00:21:20 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=484</guid>
		<description><![CDATA[Andrew Hensel was an extraordinary human being. We were graduate students together at The University of Waterloo in Canada in 1986-88. I met him on my first day there and we spent many hours together on a daily basis over the next 2.5 years. I don&#8217;t want to try to say too much about him [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2009/01/adh1.gif"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2009/01/adh1-150x150.gif" alt="" title="Andrew Hensel" width="150" height="150" class="alignleft size-thumbnail wp-image-485" /></a>Andrew Hensel was an extraordinary human being.</p>
<p>We were graduate students together at <a href="http://www.uwaterloo.ca">The University of Waterloo</a> in Canada in 1986-88. I met him on my first day there and we spent many hours together on a daily basis over the next 2.5 years. I don&#8217;t want to try to say too much about him now. It occurred to me a few days ago that I might post a few stories here. We did lots of crazy things. At one point I had wanted to write something titled &#8220;100 things to a Hensel&#8221; and I made a bunch of notes, but it went no further.</p>
<p>I wrote about him in <a href="http://jon.es/research/acknowledgments.html">my Ph.D. acknowledgments</a> in 1995:</p>
<blockquote><p>Andrew Hensel, with whom I shared so much of my two and a half years at Waterloo, was the most original and creative person I have ever known well. Together, we dismantled the world and rebuilt it on our own crazy terms. We lived life at a million miles an hour and there was nothing like it. Five years ago, Andrew killed himself. There have been few days since then that I have not thought of him and the time we spent together.</p></blockquote>
<p>I still think about him frequently. Today I was remembering one of his many, many oddball projects (most of which went unfinished), which he called &#8220;10,000 things&#8221;. It was to be a list of 10,000 things that he thought of. By the time he started sending them to me we had both dropped out of Waterloo. He was back in Australia and I was in Munich.</p>
<p>He only sent me 300 of the to-be 10,000. Of course I still have them. They&#8217;re all very short. At the risk of being thought macabre I&#8217;ve decided to bring Andrew back a very little and post them to Twitter, chosen at random, one a day. You can <a href="http://twitter.com/adhensel">follow adhensel</a> to get just a glimpse of his mind. The first tweet, <a href="http://twitter.com/adhensel/status/1095969541">people being planted into earth</a>, is already up.</p>
<p>There are at least half a dozen twitterers who knew Andrew, including one who knew him probably better than anybody. Once in a while I get email from someone who finds my online mentions of him. Invariably they also found him extraordinary.</p>
<p>What would Andrew have made of Twitter? I have no doubt at all that he&#8217;d have immediately dismissed it as &#8220;weak&#8221;. That was one of his favorite adjectives. Almost everything was weak. It&#8217;s a small miracle to me to partly bring him back to life 18 years after he died, by posting just some of his 10,000 things to Twitter.</p>
<p>And&#8230; my apologies to anyone who knew Andrew and who finds this upsetting.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2009/01/05/10000-things-andrew-hensel-lives-on-twitter/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Not alone</title>
		<link>http://blogs.fluidinfo.com/terry/2008/12/05/not-alone/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/12/05/not-alone/#comments</comments>
		<pubDate>Fri, 05 Dec 2008 15:39:02 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=480</guid>
		<description><![CDATA[Robert Scoble has just written a really nice article about Fluidinfo, calling us both &#8220;world-changing&#8221; and &#8220;unfundable&#8221;. Funnily, Tim O&#8217;Reilly said something similar when I talked to him at OATV. He said something like: &#8220;This could take over the world&#8221; and in the very same sentence &#8220;but I don&#8217;t see how we could fund you.&#8221; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fluidinfo.com/"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/12/fi-large1.png" alt="" title="Fluidinfo" width="204" height="250" class="alignleft size-medium wp-image-475" /></a><a href="http://www.fastcompany.com/scoble">Robert Scoble</a> has just written <a href="http://scobleizer.com/2008/12/05/the-unfundable-world-changing-startup/">a really nice article</a> about <a href="http://www.fluidinfo.com">Fluidinfo</a>, calling us both &#8220;world-changing&#8221; and &#8220;unfundable&#8221;. Funnily, <a href="http://en.wikipedia.org/wiki/Tim_O%27Reilly">Tim O&#8217;Reilly</a> said something similar when I talked to him at <a href="http://www.oatv.com/">OATV</a>. He said something like: &#8220;This could take over the world&#8221; and in the very same sentence &#8220;but I don&#8217;t see how we could fund you.&#8221; The two things an entrepreneur most and least wants to hear, all in one sentence. I&#8217;ll never forget it.</p>
<p>A few people have mailed me to say that the Scoble videos create the incorrect impression that I&#8217;m building FluidDB alone. So I wanted to clear that up. Others who are actively involved in Fluidinfo are:</p>
<p><br clear="all"/></p>
<p><a href="http://www.linkedin.com/in/estevefernandez">Esteve Fernandez</a> is doing the most difficult coding. Esteve and I are the only two employees of the company. We even have modest salaries. We spend most of our time apart, writing code, swapping email. Once or twice a week we meet in person to talk about architecture, current problems, or for him to gently explain to me how I could have written my code more elegantly and usefully. I usually try to stay out of his way, as he&#8217;s a force of nature and I just slow him down. He left a solid and secure job that he liked in Barcelona and then said no to <a href="http://www.google.com">Google</a> to join Fluidinfo.</p>
<p><a href="http://en.wikipedia.org/wiki/Esther_Dyson">Esther Dyson</a> invested in Fluidinfo just over a year ago. Esther is an incredible investor to have involved for a company like Fluidinfo. I wont try to summarize, except to say that without her support we probably wouldn&#8217;t be here today. After a year of trying to find investors, I&#8217;m more keenly aware than ever of how extraordinary Esther is.</p>
<p><a href="http://rustle.blogsome.com/">Russell Manley</a> is the other company director. It was Russell who pointed Delicious out to me a few years ago and got me back onto working on this project after I&#8217;d put it aside for 6 years. Russell is a finance guy with a ton of experience in operations and running companies. He&#8217;s an investment director at <a href="http://www.landsecurities.com/index.asp?PageID=1">Land Securities</a> in London, and sits on over 30 boards. He&#8217;s also a close friend, incredibly smart, and widely read. I hope one day we&#8217;ll be able to get him into Fluidinfo, though that will take some doing.</p>
<p><a href="http://www.stochasticsolutions.com/about.html">Nicholas Radcliffe</a> is an old friend and advisor. He&#8217;s the founder and CEO of <a href="http://www.stochasticsolutions.com/index.html">Stochastic Solutions</a>. He was also a founder, CTO, and then CEO of Quadstone, raising tens of millions of pounds along the way. Quadstone was acquired a couple of years ago. He&#8217;s into algorithmic approaches to targeted direct marketing, and he&#8217;s very successful. He has a Ph.D. in physics, so you don&#8217;t want to mess with Nick. He&#8217;s also an advisor to <a href="http://www.sep.co.uk">Scottish Equity Partners</a>. Nick is my harshest and most unrelenting critic.</p>
<p>That&#8217;s it for now. There are probably a dozen others who are peripherally involved, but not on a day-to-day basis. I&#8217;m very happy to have just two people on payroll right now. We&#8217;re pretty much recession proof. I went through the 2000-2004 as CTO of <a href="http://www.eatoni.com">Eatoni</a> in New York, and we survived by cutting every possible cost and keeping our headcount as low as possible. So operating on a shoestring comes pretty naturally. I feel we&#8217;re strong and small like a hard nut, and not really exposed to the economic downturn. It&#8217;s a great time to be tiny and to be focussed on building a product.</p>
<p>It would of course be nice to be properly funded. But I&#8217;ve always been confident that&#8217;s just a matter of time. The main thing, perhaps the only thing, is to get an alpha version of FluidDB released so people can start building things on it.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/12/05/not-alone/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Twittendipity: a chance interview with Robert Scoble</title>
		<link>http://blogs.fluidinfo.com/terry/2008/12/04/twittendipity-a-chance-interview-with-robert-scoble/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/12/04/twittendipity-a-chance-interview-with-robert-scoble/#comments</comments>
		<pubDate>Thu, 04 Dec 2008 11:25:30 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=442</guid>
		<description><![CDATA[On Monday Tim O&#8217;Reilly posted a Twitter tweet suggesting to Robert Scoble that he contact me while in Barcelona. First off, Tim is very generous in doing this. He&#8217;s ultra connected and he spends a significant amount of his time in Twitter pointing things out, connecting people, and re-tweeting stuff he finds interesting. Re-tweeting is [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.fastcompany.com/scoble"><img alt="" src="http://s3.amazonaws.com/twitter_production/profile_images/50819312/newscoblecamsmallcrop_bigger.jpg" title="Robert Scoble" class="alignleft" width="73" height="73" /></a>On Monday <a href="http://twitter.com/timoreilly">Tim O&#8217;Reilly</a> posted a <a href="http://twitter.com/">Twitter</a> <a href="http://twitter.com/timoreilly/statuses/1032592518">tweet</a> suggesting to <a href="http://www.fastcompany.com/scoble">Robert Scoble</a> that he contact me while in Barcelona.</p>
<p>First off, Tim is very generous in doing this. He&#8217;s ultra connected and he spends a significant amount of his time in Twitter pointing things out, connecting people, and re-tweeting stuff he finds interesting. Re-tweeting is really important because when you tweet you only reach the people who are already following you. But when someone re-tweets you, you reach new people who likely have no idea of your existence. And when Tim does the re-tweeting there can be a big impact. 24 hours after his message to Robert I had 50 new followers. Tim explicitly tries to help people doing things he finds interesting, but who have just a small number of Twitter followers. He filters and amplifies information, broadcasting it out to his 16,000+ followers. Robert was in a hotel about 10 minutes&#8217; walk from my place and I had no idea. A mutual friend in California noticed and took a minute to connect us. That&#8217;s really something, and it perfectly illustrates some of the value of Twitter.</p>
<p>I met Robert yesterday afternoon and we spent 6 hours together. It was great. You can see at once why he&#8217;s been so successful: he&#8217;s smart, he&#8217;s thoughtful, he&#8217;s sympathetic, and he&#8217;s a careful listener. I had no idea what to expect, and seeing as what we&#8217;re building can take some time to sink in, I wondered what sort of an audience he&#8217;d be.</p>
<p>After we&#8217;d climbed around up in the Sagrada Familia (<a href="http://www.sagradafamilia.cat/">official site</a>, <a href="http://en.wikipedia.org/wiki/Sagrada_Fam%C3%ADlia">wikipedia</a>), Robert came back to my place to see a demo of the things I&#8217;d been describing. We sat down and he pulled out his cell phone and asked if he could film me. I didn&#8217;t really think about it and said of course. It didn&#8217;t dawn on me that we were doing an informal interview, and I was totally unprepared &#8211; which is probably a good thing.</p>
<p>In the end we filmed 4 segments: parts  <a href="http://www.kyte.tv/ch/6118/284759">one</a>, <a href="http://www.kyte.tv/ch/6118/284808">two</a>, <a href="http://www.kyte.tv/ch/6118/284848">three</a>, and <a href="http://www.kyte.tv/ch/6118/284869">four</a>. There&#8217;s also been some discussion <a href="http://friendfeed.com/e/c49688ca-34a5-4ed3-aac2-14f5dc0272be/Terry-Jones-1-http-www-kyte-tv-ch-6118/">here</a> on Robert&#8217;s <a href="http://friendfeed.com">FriendFeed</a> page.</p>
<p>So if you&#8217;ve been wondering what we&#8217;re building in here, go watch the videos.</p>
<p>I had no idea all this was about to come down. The <a href="http://fluidinfo.com">Fluidinfo</a> web site (a generous word) was a single page with no contact information, no nuthin&#8217;. We simply haven&#8217;t needed a web site of any description yet. I went and added a box so you can sign up to receive news of the alpha launch.</p>
<p>And then there was this, <a href="http://twitter.com/Scobleizer/statuses/1037537924">posted on Twitter</a>, and which I have absolutely no shame in reproducing (this is a blog, after all):</p>
<blockquote><p>Wow, what @<a href="http://twitter.com/terrycojones">terrycojones</a> showed me last night (a new kind of database that he&#8217;s been workng on for 11 years) blew me away. Uploading vids now</p></blockquote>
<p>Now I have to put my head back down with <a href="http://twitter.com/esteve">Esteve</a> to get the alpha out the door ASAP.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/12/04/twittendipity-a-chance-interview-with-robert-scoble/feed/</wfw:commentRss>
		<slash:comments>12</slash:comments>
		</item>
		<item>
		<title>Amazon SimpleDB a complete flop?</title>
		<link>http://blogs.fluidinfo.com/terry/2008/12/02/amazon-simpledb-a-complete-flop/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/12/02/amazon-simpledb-a-complete-flop/#comments</comments>
		<pubDate>Tue, 02 Dec 2008 02:18:51 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=409</guid>
		<description><![CDATA[Today Amazon slashed the price on storage in SimpleDB from $1.50 per Gb per month to just $0.25 per Gb per month. Note that you can buy a 1TB hard drive these days for $75. That&#8217;s 7.5 cents per Gb for as long as the drive lasts. So Amazon were charging 200 times the price [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://aws-portal.amazon.com/gp/aws/developer/subscription/index.html?productCode=AmazonSimpleDB"><img alt="" src="http://media.amazonwebservices.com/btn_sufsdb.gif" title="SimpleDB signup" class="alignleft" width="195" height="27" /></a>Today Amazon slashed the price on storage in <a href="http://aws.amazon.com/simpledb/">SimpleDB</a> from $1.50 per Gb per month to just $0.25 per Gb per month.</p>
<p>Note that you can buy a 1TB hard drive these days for $75. That&#8217;s 7.5 cents per Gb for as long as the drive lasts. So Amazon were charging <em>200 times</em> the price of retail hard disk storage <em>per month</em>. Yes, the AWS storage is replicated, and you don&#8217;t need a data center or employees, but a 200X markup (per month) seemed a bit excessive. Until last night, that $1.50 figure was the first price in the pricing section of the SimpleDB page &#8211; not a smart move (sticker shock). The storage price is now the last thing in the pricing section.</p>
<p>I spend a bunch of time talking to folks working at other startups. I hear about EC2 and S3 usage all the time, but I&#8217;ve never heard of anyone using SimpleDB. I hadn&#8217;t really thought about it too much. I had noticed that the price for storage in SimpleDB is (was) 10 times higher than for storage in S3, and thought that created an opportunity for <a href="http://fluidinfo.com">Fluidinfo</a>. But that huge difference is now gone &#8211; in fact SimpleDB is now <em>free</em> for everyone for the first 6 months following the public beta.</p>
<p>I found myself asking &#8220;What&#8217;s going on?&#8221;  It&#8217;s not like Amazon to suddenly offer their services for free. The free offer coming with the service entering beta seemed pretty thin. If anything it should get more expensive, or stay the same, not suddenly transition to <em>free</em>.</p>
<p>Then I began to explicitly wonder just how many people are actually using SimpleDB. So I just ran some sample Google queries to get an idea. The results are amazing:</p>
<table style="border-collapse: collapse; border: 1px solid;">
<tr style="background-color: #aaaaff;">
<td style="border: 1px solid; padding 2px;">Query</td>
<td style="border: 1px solid; padding 2px;"># Hits</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22using amazon simpleDB%22">&#8220;using amazon simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">68</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22using simpleDB%22">&#8220;using simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">1010</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22simpleDB sucks%22">&#8220;simpleDB sucks&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">3</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22love simpleDB%22">&#8220;love simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">1</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22hate simpleDB%22">&#8220;hate simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">0</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22recommend simpleDB%22">&#8220;recommend simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">0</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22we are using simpleDB%22">&#8220;we are using simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">0</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22we are using amazon simpleDB%22">&#8220;we are using amazon simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">0</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22we use amazon simpleDB%22">&#8220;we use amazon simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">1</td>
</tr>
<tr>
<td style="border: 1px solid; padding 2px;"><a href="http://www.google.com/search?q=%22we use simpleDB%22">&#8220;we use simpleDB&#8221;</a></td>
<td style="border: 1px solid; padding 2px;" align="right">4</td>
</tr>
</table>
<p><small>Note that all queries are entered into Google in quotes.</small></p>
<p>Given just these results, and knowledge that SimpleDB was launched a year ago, I think you&#8217;d have to conclude that SimpleDB is a complete flop. Either that or Google is playing evil tricks due to their own appEngine offering. That would seem unlikely. Plus, the numbers for the obviously popular S3 and EC2 are much much higher: If you try these queries with S3 or EC2 instead of SimpleDB, you&#8217;ll see 5K, 10K, 15K results.</p>
<p>I find the above numbers astounding. I&#8217;m deadly curious to know what&#8217;s going on here. Was SimpleDB just too expensive to consider using? Is its model too awkward? If it sucked, people would say so. But there&#8217;s virtually <em>nothing</em> out there. It&#8217;s as though developers took one look and completely ignored it. That would be my guess (in fact it&#8217;s what I did, so I&#8217;m probably biased in my explanation of what others may have done).</p>
<p>At least we can say that more people love SimpleDB than hate it :-)</p>
<p>It&#8217;s not my intention to bash Amazon or AWS. I love and use S3 and EC2 every single day. They&#8217;ve changed the world, and this is only the beginning. But I have no use at all for SimpleDB. I&#8217;d always assumed it was a big success too, but it looks like that may be wrong.</p>
<p>Comments very welcome. Do you know anyone using SimpleDB?</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/12/02/amazon-simpledb-a-complete-flop/feed/</wfw:commentRss>
		<slash:comments>39</slash:comments>
		</item>
		<item>
		<title>Changing POV under Twitter</title>
		<link>http://blogs.fluidinfo.com/terry/2008/11/26/changing-pov-under-twitter/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/11/26/changing-pov-under-twitter/#comments</comments>
		<pubDate>Wed, 26 Nov 2008 18:01:35 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=386</guid>
		<description><![CDATA[One thing I&#8217;d like to be able to do in Twitter is change my point of view. That is, see what Twitter looks like from the POV of another user. Given Twitter&#8217;s asymmetric follower model and the prevalence of @ messaging, it&#8217;s very common to run across a fragment of a conversation that seems potentially [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://farm4.static.flickr.com/3250/2984888209_2aa4472357_m_d.jpg"><img alt="" src="http://farm4.static.flickr.com/3250/2984888209_2aa4472357_m_d.jpg" title="POV" class="alignleft" width="240" height="200" /></a>One thing I&#8217;d like to be able to do in <a href="http://twitter.com">Twitter</a> is change my point of view.  That is, see what Twitter looks like from the POV of another user.</p>
<p>Given Twitter&#8217;s asymmetric follower model and the prevalence of @ messaging, it&#8217;s very common to run across a fragment of a conversation that seems potentially interesting.  It&#8217;s also common not to be following the full set of people who are interacting.</p>
<p>For example, four people might be exchanging tweets on a subject, and you may follow just one of them. So you&#8217;ll see roughly one quarter of the thread. Right now, to get the context for the discussion you need to go take a look at the archives of the various people and try to piece the conversation together. You have to do this one tweeter at a time. Or you could temporarily follow the people involved and then page backwards through time to see the flow of tweets. With some work on the server side, Twitter could let you see this using the Twitter search interface (you&#8217;d need to put in the names of the various parties though).</p>
<p>It would be much simpler and <em>much</em> cooler to just to click a link besides a user&#8217;s name and get that user&#8217;s POV. You&#8217;d see what they see, except for the people whose tweets are private and which you&#8217;re prevented from seeing by the Twitter permission system. Not only could you see more or all of a conversation, I bet it would be really interesting to see Twitter from someone else&#8217;s POV. You could click on the @Replies tab to see all replies to that user, etc. There&#8217;s no reason why not &#8211; it&#8217;s all public data, and you can easily fetch the @replies using the search interface. I think wandering around inside the Twitterverse jumping from the POV of one identity to another would be fascinating. It reminds me of wandering around inside the <a href="http://archive.org">wayback machine</a>, except it&#8217;s the present.</p>
<p>That would all be pretty easy to implement, even for a 3rd party using the Twitter API. It would be nice if Twitter were to implement it themselves.  I could do the basics myself in a few hours, but I&#8217;d rather not. This is also something that could be accessed via a Firefox extension or <a href="https://addons.mozilla.org/en-US/firefox/addon/748">Greasemonkey</a> &#8211; install it and get an extra button next to every tweet.  The button switches you to the POV of the tweeter.</p>
<p>All we need is someone to build it.</p>
<p>I have several more Twitter blog posts I&#8217;d love to write. The most interesting, to me, is all about evolutionary biology, sex, and the meaning of life itself. But no time, no time. I&#8217;ve finally added a <a href="http://blogs.fluidinfo.com/terry/category/companies/twitter/">Twitter category</a> to this blog, and was surprised to find 14 posts that fit it. Am I obsessed?</p>
<p>As usual, make sure you <a href="http://twitter.com/terrycojones">follow me</a> :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/11/26/changing-pov-under-twitter/feed/</wfw:commentRss>
		<slash:comments>16</slash:comments>
		</item>
		<item>
		<title>Passion and the creation of highly non-uniform value</title>
		<link>http://blogs.fluidinfo.com/terry/2008/11/10/passion-and-the-creation-of-highly-non-uniform-value/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/11/10/passion-and-the-creation-of-highly-non-uniform-value/#comments</comments>
		<pubDate>Mon, 10 Nov 2008 01:20:09 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=296</guid>
		<description><![CDATA[Here, finally, are some thoughts on the creation of value. I don&#8217;t plan to do as good a job as the subject merits, but if I don&#8217;t take a rough stab at it, it&#8217;ll never happen. I&#8217;ll first explain what I mean by &#8220;the creation of highly non-uniform value&#8221;. I&#8217;m talking about ideas that create [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://francescobaldisserri.wordpress.com/2007/09/21/the-long-tail-how-endless-choice-is-creating-unlimited-demand/"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/11/800px-long_tail.png" alt="" title="non-uniform" width="300" height="156" class="alignleft size-full wp-image-337" /></a>Here, finally, are some thoughts on the creation of value. I don&#8217;t plan to do as good a job as the subject merits, but if I don&#8217;t take a rough stab at it, it&#8217;ll never happen.</p>
<p>I&#8217;ll first explain what I mean by &#8220;the creation of highly non-uniform value&#8221;. I&#8217;m talking about ideas that create a lot of (monetary) value for a very small number of people. If you made a graph and on the X axis put all the people in the world, in sorted order of how much they make from an idea, and on the Y axis you put value they each receive, we&#8217;re talking about distributions that look like the image above, but <em>much</em> more skewed.</p>
<p>In other words, a setting in which a very small number of people try to get extremely rich. I.e., startup founders, a few key employees, their investors, and their investors&#8217; investors. BTW, I don&#8217;t want to talk about the moral side of this, if there is one. There&#8217;s nothing to stop the obscenely rich from giving their money away or doing other charitable things with it.</p>
<p>So let&#8217;s just accept that many startup founders, and (in theory) all venture investors, are interested in turning ideas into wealth distributions that look like the above.</p>
<p>I was partly beaten to the punch on this post by <a href="http://www.paulgraham.com/">Paul Graham</a> in his essay <a href="http://www.paulgraham.com/googles.html">Why There Aren&#8217;t More Googles?</a> Paul focused on VC caution, and with justification. But there&#8217;s another important part of the answer.</p>
<p>One of the most fascinating things I&#8217;ve heard in the last couple of years is an anecdote about the early Google. I wrote about it in an earlier article, <a href="http://blogs.fluidinfo.com/terry/2007/05/01/the-blind-leading-the-blind/">The blind leading the blind</a>:</p>
<blockquote>
<p>&#8230;the Google guys were apparently running around search engine companies trying to sell their idea (vision? early startup?) for $1M. They couldn&#8217;t find a buyer. What an extraordinary lack of.. what? On the one hand you want to laugh at those idiot companies (and VCs) who couldn&#8217;t see the huge value. OK, maybe. But the more extraordinary thing is that Larry Page and Sergei Brin <em>couldn&#8217;t see it either!</em> That&#8217;s pretty amazing when you think about it. Even the entrepreneurs couldn&#8217;t see the enormous value. They somehow decided that $1M would be an acceptable deal. Talk about a lack of vision and belief.</p>
<p>So you can&#8217;t really blame the poor VCs or others who fail to invest. If the founding tech people can&#8217;t see the value and don&#8217;t believe, who else is going to?</p>
</blockquote>
<p>I went on to talk about what seemed like it might be a necessary connection between risk and value.</p>
<p><br clear="all"/></p>
<p><img alt="True value" src="http://farm2.static.flickr.com/1153/946850389_8f39efdd2b_m_d.jpg" width="240" height="159"  style="float: left; margin-right: 8px"  /></a><strong>Following on&#8230;</strong></p>
<p>After more thought, I&#8217;m now fairly convinced that I was on the right track in that post.</p>
<p>It seems to me that the degree to which a highly non-uniform wealth distribution can be created from an idea depends heavily on how non-obvious the value of the idea is.</p>
<p>If an idea is obviously valuable, I don&#8217;t think it can create highly non-uniform wealth. That&#8217;s not to say that it can&#8217;t create vast wealth, just that the <em>distribution</em> of that wealth will be more widely spread. Why is that the case? I think it&#8217;s true simply because the value will be apparent to many people, there will be multiple implementations, and the value created will be spread more widely. If the value of an idea is clear, others will be building it even as you do. You might all be very successful, but the distribution of created value will be more uniform.</p>
<p>Obviously it probably helps if an idea is hard to implement too, or if you have some other barrier to entry (e.g., patents) or create a barrier to adoption (e.g., users getting positive reinforcement from using the same implementation).</p>
<p>I don&#8217;t mean to say that an idea must be uniquely brilliant, or even new, to generate this kind of wealth distribution. But it needs to be the kind of proposition that many people look at and think &#8220;that&#8217;ll never work.&#8221;  Even better if potential competitors continue to say that 6 months after launch and there&#8217;s only gradual adoption. Who can say when something is going to take off wildly? No-one. There are highly successful non-new ideas, like the iPod or YouTube. Their timing and implementation were somehow right. They created massive wealth (highly non-uniformly distributed in the case of YouTube), and yet many people wrote them off early on. It certainly wasn&#8217;t plain sailing for the YouTube founders &#8211; early adoption was extremely slow. Might <a href="http://twitter.com">Twitter</a>, a pet favorite (go on, <a href="http://twitter.com/terrycojones">follow me</a>), create massive value? Might <a href="http://www.mahalo.com">Mahalo</a>? Many people would have found that idea ludicrous 1-2 years ago &#8211; but that&#8217;s <em>precisely</em> the point. Google is certainly a good example &#8211; search was supposedly &#8220;done&#8221; in 1998 or so. We had Alta Vista, and it seemed great. Who would&#8217;ve put money into two guys building a search engine? Very few people.</p>
<p>If it had been obvious the Google guys were doing something immensely valuable, things would have been very different. But they traveled around to various companies (I don&#8217;t have this first hand, so I&#8217;m imagining), showing a demo of the product that would eventually create $100-150B in value. It wasn&#8217;t clear to <em>anyone</em> that there was anything like that value there. Apparently no-one thought it would be worth significantly more that $1M.</p>
<p>I&#8217;ve come to the rough conclusion that that sort of near-universal rejection might be necessary to create that sort of highly non-uniform wealth distribution.</p>
<p>There are important related lessons to be learned along these lines from books like <a href="http://www.amazon.com/Structure-Scientific-Revolutions-Thomas-Kuhn/dp/0226458083/ref=sr_1_1?ie=UTF8&#038;s=books&#038;qid=1226276778&#038;sr=1-1">The Structure of Scientific Revolutions</a> and <a href="http://www.amazon.com/Innovators-Dilemma-Revolutionary-Business-Essentials/dp/0060521996">The Innovator&#8217;s Dilemma</a>.</p>
<p>Now back to Paul&#8217;s question: Why aren&#8217;t there more Googles?</p>
<p>Part of the answer has to be that value is non-obvious. Given the above, I&#8217;d be willing to argue (over beer, anyway) that that&#8217;s almost by definition.</p>
<p>So if value is non-obvious, <em>even to the founders</em>, how on earth do things like this get created?</p>
<p>The answer is <em>passion</em>. If you don&#8217;t have entrepreneurs who are building things just from sheer driving passion, then hard projects that require serious energy, sacrifice, and risk-taking, simply wont be built.</p>
<p>As a corollary, big companies are unlikely to build these things &#8211; because management is constantly trying to assess value. That&#8217;s one reason to rue the demise of industrial research, and a reason to hope that cultures that encourage people to work on whatever they want (e.g., Google, Microsoft research) might be able to one day stumble across this kind of value.</p>
<p>This gets me to <a href="http://www.tbray.org/ongoing/When/200x/2008/10/23/Build-For-Yourself">a recent posting</a> by <a href="http://www.tbray.org/ongoing/">Tim Bray</a>, which encourages people to work on things they care about.</p>
<p>It&#8217;s not enough just to have entrepreneurs who are trying to create value. As I&#8217;m trying to say, practically no-one can consistently and accurately predict where undiscovered value lies (some would argue that Marc Andreessen is an exception). If it were generally possible to do so, the world would be a very different place &#8211; the whole startup scene and venture/angel funding system would be different, supposing they even existed. Even if it looks like a VC or entrepreneur can infallibly put their finger on undiscovered value, they probably can&#8217;t. One-time successful VCs and entrepreneurs go on to attract disproportionately many great companies, employees, funding, etc., the next time round. You can&#8217;t properly separate their raw ability to see undiscovered value from the strong bias towards excellence in the opportunities they are later afforded. Successful entrepreneurs are often refreshingly and encouragingly frank about the role of luck in their success. They&#8217;re done. VCs are much less sanguine &#8211; they&#8217;re supposed to have natural talent, they&#8217;re trying to manufacture the impression that they know what they&#8217;re doing. They have to do that in order to get their limited partners to invest in their funds. For all their vaunted insight, roughly only 25% of VCs provide returns that are better than the market. The percentage generating huge returns will of course be much smaller, as in turn will be those doing so consistently. I reckon the whole thing&#8217;s a giant crap shoot. We may as well all admit it.</p>
<p>I have lots of other comments I could make about VCs, but I&#8217;ll restrict myself to just one as it connects back to Paul&#8217;s article.</p>
<p>VCs who claim to be interested in investing in the next Google cannot possibly have the next Google in their portfolio unless they have a company whose fundamental idea looks like it&#8217;s unlikely to pan out. That doesn&#8217;t mean VCs should invest in bad ideas. It means that unless VCs make bets on ideas that look really good &#8211; but which are e.g., clearly going to be hard to build, will need huge adoption to work, appear to be very risky long-shots, etc. &#8211; then they can&#8217;t be sitting on the next Google. It also doesn&#8217;t mean VCs must place big bets on stuff that&#8217;s highly risky. A few hundred thousand can go a long way in a frugal startup. </p>
<p>I think this is a fundamental tradeoff. You&#8217;ll very frequently hear VCs talk about how they&#8217;re looking for companies that are going to create massive value (non-uniformly distributed, naturally), with massive markets, etc. I think that&#8217;s pie in the sky posturing <em>unless</em> they&#8217;ve already invested in, or are willing to invest in, things that look very risky. That should be understood. And so a question to VCs from entrepreneurs and limited partners alike: if you claim to be aiming to make massive returns, where are your necessary correspondingly massively risky investments?  Chances are you wont find any.</p>
<p>There is a movement in the startup investment world towards smaller funds that make smaller investments earlier. I believe this movement is unrelated to my claim about non-obviousness and highly non-uniform returns. The trend is fuelled by the realization that lots of web companies are getting going without the need for traditional levels of financing. If you don&#8217;t get in early with them, you&#8217;re not going to get in at all. A big fund can&#8217;t make (many) small investments, because their partners can&#8217;t monitor more than a handful of companies. So funds that want to play in this area are necessarily smaller. I think that makes a lot of sense. A perhaps unanticipated side effect of this is that things that look like they may be of less value end up getting small amounts of funding. But on the whole I don&#8217;t think there&#8217;s a conscious effort in that direction &#8211; investors are strongly driven to select the <em>least</em> risky investment opportunities from the huge number of deals they see. After all, their jobs are on the line. You can&#8217;t expect them to take big risks. But by the same token you should probably ignore any talk of &#8220;looking for the next Google&#8221;. They talk that way, but they don&#8217;t invest that way.</p>
<p>Finally, if you&#8217;re working on something that&#8217;s being widely rejected or whose value is being widely questioned, don&#8217;t lose heart (instead go read <a href="http://blogs.fluidinfo.com/terry/2008/11/09/expecting-and-embracing-startup-rejection/">my earlier posting</a>) and don&#8217;t waste your time talking to VCs. Unless they&#8217;re exceptional and serious about creating massive non-uniformly distributed value, and they understand what that involves, they certainly wont bite.</p>
<p>Instead, follow your passion.  Build your dream and get it out there.  Let the value take care of itself, supposing it&#8217;s even there. If you can&#8217;t predict value, you may as well do something you really enjoy.</p>
<p>Now I&#8217;m working hard to follow my own advice.</p>
<p>I had to learn all this the hard way. I spent much of 2008 on the road trying to get people to invest in <a href="http://fluidinfo.com">Fluidinfo</a>, without success. If you&#8217;re interested to know a little more, earlier tonight I wrote a <a href="http://blogs.fluidinfo.com/terry/2008/11/09/brief-history-of-an-idea/">Brief history of an idea</a> to give context for this posting.</p>
<p>That&#8217;s it for now. Blogging is a luxury I can&#8217;t afford right now, not that I would presume to try to predict which way value lies.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/11/10/passion-and-the-creation-of-highly-non-uniform-value/feed/</wfw:commentRss>
		<slash:comments>31</slash:comments>
		</item>
		<item>
		<title>Expecting and embracing startup rejection</title>
		<link>http://blogs.fluidinfo.com/terry/2008/11/09/expecting-and-embracing-startup-rejection/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/11/09/expecting-and-embracing-startup-rejection/#comments</comments>
		<pubDate>Sun, 09 Nov 2008 21:47:02 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[me]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=321</guid>
		<description><![CDATA[When I was younger, I didn&#8217;t know what to make of it when people rejected my ideas. Instead of fighting it, trying again, or improving my delivery, I&#8217;d just conclude that the rejector was an idiot, and that it was their loss if they didn&#8217;t get it. For example, I put considerable time and effort [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/huesofheather/380629090/"><img alt="" src="http://farm1.static.flickr.com/185/380629090_2b0ef7cb9d_o_d.jpg" class="alignleft" width="300" height="398" /></a>When I was younger, I didn&#8217;t know what to make of it when people rejected my ideas. Instead of fighting it, trying again, or improving my delivery, I&#8217;d just conclude that the rejector was an idiot, and that it was their loss if they didn&#8217;t get it.</p>
<p>For example, I put considerable time and effort into writing academic papers, several of which were rejected, to my surprise. I&#8217;d never considered that the papers might not be accepted. When this happened, I wouldn&#8217;t re-submit them or try to re-publish them. By then I would usually have moved on to doing something else anyway.</p>
<p>When I applied for jobs, it never entered my mind that I might not be wanted. How could anyone not want <em>me</em>? After a couple of years <a href="http://blogs.fluidinfo.com/terry/2008/11/09/brief-history-of-an-idea/">working on my current ideas</a>, I applied for a computer science faculty position at over 40 US universities. I refused to emphasize my well-received and published <a href="http://jon.es/research/phd.html">Ph.D. work</a>, of which I was and am still proud, because I was no longer working in that area.</p>
<p>I was convinced the new ideas would be recognized as being strong.</p>
<p>But guess what? I was summarily rejected by all 40+ universities. I only got one interview, at <a href="http://www.rpi.edu">RPI</a>. No other school even wanted to meet me. I kept all the rejection letters. I still have them. (Amusingly, I was swapping emails with <a href="http://www.cs.umd.edu/~bederson/">Ben Bederson</a> earlier this year and it transpired that he&#8217;d had the same experience, also with 40 universities, and he too kept all his rejection letters!)</p>
<p>You never learn more than when you&#8217;re being humbled.</p>
<p>I&#8217;ve now returned to those same ideas and have been working on them for the last 3 years. In January 2007 I went and met with a couple of the most appropriately visionary VCs to tell them what I was building. I was na&iuml;ve enough to think they might back me at that early point.  Wrong. They suggested I come back with a demo to concretely illustrate what the system would allow people to do. That was easier said than done &#8211; the system is not simple. I spent 2007 building the core engine, a 90% fully-functional demo of the major application, several smaller demo apps (including a Firefox toolbar extension built by Esteve Fernandez), and added about 20 sample data sets to further illustrate possibilities.</p>
<p>That&#8217;ll show &#8216;em, right? I went out in November 2007 armed with all this, and began talking to a variety of potential investors. I was sure VCs would be falling over themselves to invest, especially given that we were working on some mix of innovative search, cloud computation, APIs, and various Web 2.0 concepts, and that tons of VCs claimed to be looking for the Next Big Thing in search, and for Passionate Entrepreneurs tackling Hard Problems who wanted to build Billion Dollar Companies, etc., etc.</p>
<p>You guessed it. Over the next year literally dozens of potential investors all said no. The demo wasn&#8217;t enough. Would people use it? Could we build the real thing? Would it scale?  Where was the team? What are you doing in Barcelona? &#8220;Looks fascinating, do please let us know when you&#8217;ve released it and are seeing adoption,&#8221; they almost universally told me. The standout exception to this was <a href="http://en.wikipedia.org/wiki/Esther_Dyson">Esther Dyson</a>, who agreed to invest immediately after seeing the demo, and whose courage I hope I can one day richly reward.</p>
<p>What to make of all this rejection?</p>
<p>One thing that became clear is that if you&#8217;re smarter than average, you&#8217;ll almost by definition be constantly thinking of things too early. Maybe many years too early. Your ideas will seem strange, doubtful, and perhaps plain wrong to many people.</p>
<p>This makes you realize how important timing is.</p>
<p>Being right with an idea too early and trying to build a startup around it is similar to correctly knowing a company is going to fail, and immediately rushing out to short its stock. Even though you&#8217;re right, you can be completely wiped out if the stock&#8217;s value rises in the short term. You were brilliant, insightful, and 100% correct &#8211; but you were too early.</p>
<p>Getting timing right <em>can</em> clearly be partly based on calculation and reason. But given that many startups are driven by founder passion, I think luck in timing plays an extremely important role in startup success.  And the smarter and more far-sighted you are, the greater the chance that your timing will be wrong.</p>
<p>So the that&#8217;s the first thing to understand: if you&#8217;re smarter than average, your ideas will, on average, be ahead of their time. Some level of rejection comes with the territory.</p>
<p>But I&#8217;d go much further than that, and claim that <em>if you are not seeing a very high level of rejection in trying to get a new idea off the ground, you&#8217;re probably not working on anything that&#8217;s going to change the world or be extremely valuable.</em></p>
<p>That might sound like an outrageous extrapolation (or even wishful thinking, given my history). Later tonight I plan to explain this claim in a post on the connections between passion, value, non-obviousness, and rejection. That&#8217;s the subject I really want to write about.</p>
<p>For now though, I simply want to say that I&#8217;ve come to understand that having one&#8217;s ideas regularly rejected is a good sign. It tells you you&#8217;re either on a fool&#8217;s errand, or that you&#8217;re doing something that might actually be valuable and important.</p>
<p>If you&#8217;re not going to let rejection get you down, you might content yourself by learning to ignore it.  But you can do better. You can come to regard it as positive and affirming. Without becoming pessimistic or in any way accepting defeat, you can come to expect to be rejected and even to embrace it.</p>
<p>If you can do that, rejection loses its potential for damage. As <a href="http://www.paulgraham.com/">Paul Graham</a> <a href="http://www.paulgraham.com/fundraising.html">pointed out</a>, the impact of disappointment can destroy a startup. That&#8217;s an important observation, and a part of why startups can be so volatile and such a wild ride.</p>
<p>I don&#8217;t mean to suggest that you don&#8217;t also do practical things with rejection too &#8211; like learn from it. That&#8217;s very important and will help you shape your product, thoughts, presentation, expectations, etc. Again, see <a href="http://www.paulgraham.com/fundraising.html">Paul&#8217;s posting.</a></p>
<p>But I think the mental side of rejection is more important than the practical. The mental side has more destructive potential. You have to figure out how to deal with it. If you look at it the right way you can turn it into something that&#8217;s almost by definition positive, as I&#8217;ve tried to illustrate.</p>
<p>In a sense I even relish it, and use it for fuel.  There are little tricks I sometimes use to keep myself motivated. I even keep a list of them (and no, you can&#8217;t see it). One is imagining that some day all the people who rejected me along the way will wring their hands in despair at having missed such an opportunity :-)</p>
<p>I&#8217;ve not been <em>universally</em> rejected, of course. There are lots of people who know what we&#8217;re doing and are highly supportive (more on them at a later point). If I&#8217;d been universally rejected, or rejected by many well-known people whose opinions I value, I probably would have stopped by now.</p>
<p>I&#8217;ve had to learn to see a high level of rejection as not just normal but a necessary (but not sufficient!) component of a correct belief that you&#8217;re doing something valuable.</p>
<p>Stay tuned for the real point of this flurry of blogging activity.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/11/09/expecting-and-embracing-startup-rejection/feed/</wfw:commentRss>
		<slash:comments>21</slash:comments>
		</item>
		<item>
		<title>Twitter&#8217;s amazing stickiness (with a caveat)</title>
		<link>http://blogs.fluidinfo.com/terry/2008/10/31/twitters-amazing-stickiness-with-a-caveat/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/10/31/twitters-amazing-stickiness-with-a-caveat/#comments</comments>
		<pubDate>Fri, 31 Oct 2008 02:35:27 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=273</guid>
		<description><![CDATA[I just followed a link to a site that shows the date of the first tweet of 50 early Twitter users. I wondered how many of these early users were still active users, and guessed many would be. Instead of going and fetching each user&#8217;s last tweet by hand, I wrote a little shell script [...]]]></description>
			<content:encoded><![CDATA[<p>I just followed a link to <a href="http://myfirsttweet.com/oldest.php">a site that shows the date of the first tweet of 50 early Twitter users</a>. I wondered how many of these early users were still active users, and guessed many would be.</p>
<p>Instead of going and fetching each user&#8217;s last tweet by hand, I wrote a little shell script to do all the work:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">for</span> name <span class="kw1">in</span> \<br />
&nbsp; `curl -s http://myfirsttweet.com/oldest.php | <br />
&nbsp; &nbsp;<span class="kw2">perl</span> -p -e <span class="st0">&#8216;s,&lt;a href=&quot;http://myfirsttweet.com/1st/(<span class="es0">\w</span>+)&quot;&gt;,<span class="es0">\n</span>NAME:<span class="es0">\t</span>$1<span class="es0">\n</span>,g&#8217;</span> |<br />
&nbsp; &nbsp;<span class="kw2">egrep</span> <span class="st0">&#8216;^NAME:&#8217;</span> |<br />
&nbsp; &nbsp;<span class="kw2">cut</span> -f2 |<br />
&nbsp; &nbsp;<span class="kw2">uniq</span>`<br />
<span class="kw1">do</span><br />
&nbsp; &nbsp; <span class="kw3">echo</span> <span class="re1">$name</span> \<br />
&nbsp; &nbsp; &nbsp; `curl -s <span class="st0">&quot;http://twitter.com/statuses/user_timeline/$name.xml?count=1&quot;</span> |<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">grep</span> created_at |<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">cut</span> -f2 -d\&gt; |<br />
&nbsp; &nbsp; &nbsp; &nbsp;<span class="kw2">cut</span> -f1 -d\&lt;`<br />
<span class="kw1">done</span><br />
&nbsp;</div>
<p>Who wouldn&#8217;t want to be a (UNIX) programmer!?</p>
<p>And the output, massaged into an HTML table:</p>
<table>
<tr>
<td>User</td>
<td>Last tweeted on</td>
</tr>
<tr>
<td>jack</td>
<td>Thu Oct 30 03:41:49 +0000 2008</td>
</tr>
<tr>
<td>biz</td>
<td>Thu Oct 30 22:24:12 +0000 2008</td>
</tr>
<tr>
<td>Noah</td>
<td>Tue Oct 28 22:56:15 +0000 2008</td>
</tr>
<tr>
<td>adam</td>
<td>Thu Oct 30 21:34:56 +0000 2008</td>
</tr>
<tr>
<td>tonystubblebine</td>
<td>Fri Oct 31 00:53:38 +0000 2008</td>
</tr>
<tr>
<td>dom</td>
<td>Thu Oct 30 20:36:31 +0000 2008</td>
</tr>
<tr>
<td>rabble</td>
<td>Fri Oct 31 00:56:28 +0000 2008</td>
</tr>
<tr>
<td>kellan</td>
<td>Fri Oct 31 00:32:44 +0000 2008</td>
</tr>
<tr>
<td>sarahm</td>
<td>Thu Oct 30 22:45:37 +0000 2008</td>
</tr>
<tr>
<td>dunstan</td>
<td>Thu Oct 30 23:59:57 +0000 2008</td>
</tr>
<tr>
<td>stevej</td>
<td>Fri Oct 31 00:12:03 +0000 2008</td>
</tr>
<tr>
<td>lemonodor</td>
<td>Thu Oct 30 18:21:43 +0000 2008</td>
</tr>
<tr>
<td>blaine</td>
<td>Wed Oct 29 23:52:06 +0000 2008</td>
</tr>
<tr>
<td>rael</td>
<td>Fri Oct 31 01:02:58 +0000 2008</td>
</tr>
<tr>
<td>bob</td>
<td>Fri Oct 31 00:39:18 +0000 2008</td>
</tr>
<tr>
<td>graysky</td>
<td>Fri Oct 31 00:23:21 +0000 2008</td>
</tr>
<tr>
<td>veen</td>
<td>Thu Oct 30 19:47:40 +0000 2008</td>
</tr>
<tr>
<td>dens</td>
<td>Fri Oct 31 00:13:12 +0000 2008</td>
</tr>
<tr>
<td>heyitsnoah</td>
<td>Thu Oct 30 20:09:35 +0000 2008</td>
</tr>
<tr>
<td>rodbegbie</td>
<td>Thu Oct 30 23:42:39 +0000 2008</td>
</tr>
<tr>
<td>astroboy</td>
<td>Thu Oct 30 22:07:50 +0000 2008</td>
</tr>
<tr>
<td>alba</td>
<td>Thu Oct 30 16:06:29 +0000 2008</td>
</tr>
<tr>
<td>kareem</td>
<td>Thu Oct 30 20:20:14 +0000 2008</td>
</tr>
<tr>
<td>gavin</td>
<td>Thu Oct 30 17:48:45 +0000 2008</td>
</tr>
<tr>
<td>nick</td>
<td>Fri Oct 31 01:17:29 +0000 2008</td>
</tr>
<tr>
<td>psi</td>
<td>Thu Oct 30 20:40:53 +0000 2008</td>
</tr>
<tr>
<td>vertex</td>
<td>Fri Oct 31 00:44:09 +0000 2008</td>
</tr>
<tr>
<td>mulegirl</td>
<td>Fri Oct 31 00:31:05 +0000 2008</td>
</tr>
<tr>
<td>thedaniel</td>
<td>Thu Oct 30 20:00:31 +0000 2008</td>
</tr>
<tr>
<td>myles</td>
<td>Thu Oct 30 15:50:31 +0000 2008</td>
</tr>
<tr>
<td>mike</td>
<td>ftw Fri Oct 31 00:28:00 +0000 2008</td>
</tr>
<tr>
<td>stumblepeach</td>
<td>Thu Oct 30 23:20:06 +0000 2008</td>
</tr>
<tr>
<td>bunch</td>
<td>Sat Oct 25 20:46:42 +0000 2008</td>
</tr>
<tr>
<td>adamgiles</td>
<td>com Thu Apr 10 17:22:52 +0000 2008</td>
</tr>
<tr>
<td>naveen</td>
<td>Thu Oct 30 23:24:23 +0000 2008</td>
</tr>
<tr>
<td>nph</td>
<td>Fri Oct 31 01:53:13 +0000 2008</td>
</tr>
<tr>
<td>caterina</td>
<td>Tue Oct 28 18:07:32 +0000 2008</td>
</tr>
<tr>
<td>rafer</td>
<td>Thu Oct 30 19:23:50 +0000 2008</td>
</tr>
<tr>
<td>ML</td>
<td>Thu Oct 30 15:31:47 +0000 2008</td>
</tr>
<tr>
<td>brianoberkirch</td>
<td>Thu Oct 30 20:21:43 +0000 2008</td>
</tr>
<tr>
<td>joelaz</td>
<td>Thu Oct 30 22:03:59 +0000 2008</td>
</tr>
<tr>
<td>arainert</td>
<td>Fri Oct 31 01:18:43 +0000 2008</td>
</tr>
<tr>
<td>tony</td>
<td>Sun Oct 26 18:16:02 +0000 2008</td>
</tr>
<tr>
<td>brianr</td>
<td>Fri Oct 31 01:57:27 +0000 2008</td>
</tr>
<tr>
<td>prash</td>
<td>Tue Oct 28 22:14:24 +0000 2008</td>
</tr>
<tr>
<td>danielmorrison</td>
<td>Thu Oct 30 21:37:41 +0000 2008</td>
</tr>
<tr>
<td>slack</td>
<td>Fri Oct 31 01:26:08 +0000 2008</td>
</tr>
<tr>
<td>mike9r</td>
<td>Thu Oct 30 21:17:29 +0000 2008</td>
</tr>
<tr>
<td>monstro</td>
<td>Thu Oct 30 22:28:46 +0000 2008</td>
</tr>
<tr>
<td>mat</td>
<td>Fri Oct 31 00:26:22 +0000 2008</td>
</tr>
</table>
<p>Wow&#8230; look at those dates. Only one of these people has failed to update in the last week!</p>
<p>Here&#8217;s the caveat. We don&#8217;t know how many early Twitter users are in the My First Tweet database. The data looks suspicious: there are only 50 Twitter users in a 7 month period? That can&#8217;t be right. So it&#8217;s possible the My First Tweet database is built by finding currently active tweeters and <em>then</em> looking back to their first post. If so, my table doesn&#8217;t say much about stickiness.</p>
<p>But I find it fairly impressive in any case.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/10/31/twitters-amazing-stickiness-with-a-caveat/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Digging into Twitter following</title>
		<link>http://blogs.fluidinfo.com/terry/2008/10/13/digging-into-twitter-following/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/10/13/digging-into-twitter-following/#comments</comments>
		<pubDate>Mon, 13 Oct 2008 16:56:36 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/10/13/digging-into-twitter-following/</guid>
		<description><![CDATA[This is just a quick post. I have a ton of things I could say about this, but they&#8217;ll have to wait &#8211; I need to do some real work. Last night and today I wrote some Python code to dig into the follower and following sets of Twitter users. I also think I understand [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.twitter.com/" title="Twitter"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/06/twitter.png" alt="Twitter" style="float: left; margin-right: 8px" /></a>This is just a quick post. I have a ton of things I could say about this, but they&#8217;ll have to wait &#8211; I need to do some real work.</p>
<p>Last night and today I wrote some Python code to dig into the follower and following sets of <a href="http://twitter.com">Twitter</a> users.</p>
<p>I also think I understand better why Twitter is so compelling, but that&#8217;s going to have to wait for now too.</p>
<p>You give my program some Twitter user names and it builds you a table showing numbers of followers, following etc. for each user. It distinguishes between people you follow and who don&#8217;t follow you, and people who follow you but whom you don&#8217;t follow back.</p>
<p>But the really interesting thing is to look at the intersection of some of these sets between users.</p>
<p>For example, if I follow X and they don&#8217;t follow me back, we can assume I have some interest in X. So if am later followed by Y and it turns out that X follows Y, I might be interested to know that. I might want to follow Y back just because I know it might bring me to the attention of X, who may then follow me. If I follow Y, I might want to publicly @ message him/her, hoping that he/she might @ message me back, and that X may see it and follow me.</p>
<p>Stuff like that.  If you think that sort of thing isn&#8217;t important, or is too detailed or introspective, I&#8217;ll warrant you don&#8217;t know much about primate social studies. But more on that in another posting too.</p>
<p>As another example use, I plan to forward the mails Twitter sends me telling me someone new is following me into a variant of my program. It can examine the sets of interest and weight them. That can give me an automated recommendation of whether I should follow that person back &#8211; or just do the following for me.</p>
<p>There are <em>lots</em> of directions you could push this in, like considering who the person had @ talked to (and whether those people were followers or not) and the content of their Tweets (e.g., do they talk about things I&#8217;m interested or not interested in?).</p>
<p>Lots.</p>
<p>For now, here are links to a few sample runs. Apologies to the Twitter users I&#8217;ve picked on &#8211; you guys were on my screen or on my mind (following FOWA).</p>
<p>I&#8217;d love to turn these into nice <a href="http://en.wikipedia.org/wiki/Euler_diagram">Euler Diagrams</a> but I didn&#8217;t find any decent open source package to produce them.</p>
<p>I&#8217;m also hoping someone else (or other people) will pick this up and run with it. I&#8217;ve got no time for it!  I&#8217;m happy to send the source code to anyone who wants it. Just <a href="http://twitter.com/terrycojones">follow me on Twitter</a> and ask for it.</p>
<p><a href="/terry-twitter/littleidea-sarawinge.html">Example 1</a>: <a href="http://twitter.com/littleidea">littleidea</a> compared to <a href="http://twitter.com/sarawinge">sarawinge</a>.<br />
<a href="/terry-twitter/swardley-voidspace.html">Example 2</a>: <a href="http://twitter.com/swardley">swardley</a> compared to <a href="http://twitter.com/voidspace">voidspace</a>.<br />
<a href="/terry-twitter/aweissman-johnborthwick.html">Example 3</a>: <a href="http://twitter.com/aweissman">aweissman</a> compared to <a href="http://twitter.com/johnborthwick">johnborthwick</a>.</p>
<p>And finally here&#8217;s <a href="/terry-twitter/dewitt.html">the result</a> for <a href="http://twitter.com/dewitt">deWitt</a>, on whose <a href="http://code.google.com/p/python-twitter/">Twitter Python library</a> I based my own code.  This is the output you get from the program when you only give it one user to examine.</p>
<p>More soon, I guess.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/10/13/digging-into-twitter-following/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>How many users does Twitter have?</title>
		<link>http://blogs.fluidinfo.com/terry/2008/10/13/how-many-users-does-twitter-have/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/10/13/how-many-users-does-twitter-have/#comments</comments>
		<pubDate>Sun, 12 Oct 2008 22:55:53 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/10/13/how-many-users-does-twitter-have/</guid>
		<description><![CDATA[Here&#8217;s a short summary of a failed experiment using the Principle of Inclusion/Exclusion to estimate how many users Twitter has. I.e., there&#8217;s no answer below, just the outline of some quick coding. I was wondering about this over cereal this morning. I know some folks at Twitter, and I know some folks who have access [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/10/in-ex.png" alt="Inclusion/Exclusion" /></p>
<p>Here&#8217;s a short summary of a failed experiment using the Principle of Inclusion/Exclusion to estimate how many users <a href="http://twitter.com">Twitter</a> has. I.e., there&#8217;s no answer below, just the outline of some quick coding.</p>
<p>I was wondering about this over cereal this morning. I know some folks at Twitter, and I know some folks who have access to the full tweet database, so I could perhaps get that answer just by asking. But that wouldn&#8217;t be any fun, and I probably couldn&#8217;t blog about it.</p>
<p>I was at <a href="http://london2008.futureofwebapps.com/">FOWA</a> last week and it seemed that absolutely <em>everyone</em> was on Twitter. Plus, they were active users, not people who&#8217;d created an account and didn&#8217;t use it. If Twitter&#8217;s usage pattern looks anything like a <a href="http://en.wikipedia.org/wiki/Power_law">Power Law</a> as we might expect, there will be many, many inactive or dormant accounts for every one that&#8217;s moderately active.</p>
<p>BTW, I&#8217;m <a href="http://twitter.com/terrycojones">terrycojones</a> on Twitter. Follow me please, I&#8217;m trying to catch <a href="http://twitter.com/JasonCalacanis">Jason Calacanis</a>.</p>
<p>You could have a crack at answering the question by looking at Twitter user id numbers via the API and trying to estimate how many users there are.  I did <a href="http://blogs.fluidinfo.com/terry/2007/11/24/hacking-twitter-on-jetblue/">play with that at one point</a> at least with tweet ids, but although they increase there are large holes in the tweet id space. And approaches like that have to go through the Twitter API, which limits you to a mere 70 requests per hour &#8211; not enough for any serious (and quick) probing.</p>
<p>In any case, I was looking at the Twitter <a href="https://twitter.com/invitations">Find People</a> page. Go to the Search tab and you can search for users.</p>
<p>I searched for the single letter A, and got around 109K hits.  That lead me to think that I could get a bound on Twitter&#8217;s size using the <a href="http://en.wikipedia.org/wiki/Inclusion-exclusion_principle">Principle of Inclusion/Exclusion</a> (PIE). (If you don&#8217;t know what that is, don&#8217;t be intimidated by the math &#8211; it&#8217;s actually very simple, just consider the cases of counting the size of the union of 2 and 3 sets). The PIE is a beautiful and extremely useful tool in combinatorics and probability theory (some nice examples can be found in Chapter 3 of the introductory text <a href="http://www.amazon.com/Applied-Combinatorics-Problem-Solving-Bradley/dp/0201129086">Applied Combinatorics With Problem Solving</a>). The image above comes from <a href="http://en.wikipedia.org/wiki/Inclusion-exclusion_principle">the Wikipedia page</a>.</p>
<p>To get an idea of how many Twitter users there are, we can add the number of people with an A in their name to the number with a B in their name, &#8230;., to the number with a Z in their name.</p>
<p>That will give us an over-estimate though, as names typically have many letters in them. So we&#8217;ll be counting users multiple times in this simplistic sum. That&#8217;s where the PIE comes in.  The basic idea is that you add the size of a bunch of sets, and then you subtract off the sizes of all the pairwise intersections. Then you add on the sizes of all the triple set intersections, and so on. If you keep going, you get the answer exactly. If you stop along the way you&#8217;ll have an upper or lower bound.</p>
<p>So I figured I could add the size of all the single-letter searches and then adjust that downwards using some simple estimates of letter co-occurrence.</p>
<p>That would definitely work.</p>
<p>But then the theory ran full into the reality of Twitter.</p>
<p>To begin with, Twitter gives <em>zero</em> results if you search for S or T. I have no idea why. It gives a result for all other (English) letters. My only theory was that Twitter had anticipated my effort and the missing S and T results were their way of saying <em>Stop That!</em></p>
<p>Anyway, I put the values for the 24 letters that do work into a <a href="http://www.python.org">Python</a> program and summed them:</p>
<div class="dean_ch" style="white-space: nowrap;">
count = <span class="kw2">dict</span><span class="br0">&#40;</span>a = <span class="nu0">108938</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;b = &nbsp;<span class="nu0">12636</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;c = &nbsp;<span class="nu0">13165</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;d = &nbsp;<span class="nu0">21516</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;e = &nbsp;<span class="nu0">14070</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;f = &nbsp; <span class="nu0">5294</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;g = &nbsp; <span class="nu0">8425</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;h = &nbsp; <span class="nu0">7108</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;i = <span class="nu0">160592</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;j = &nbsp; <span class="nu0">9226</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;k = &nbsp;<span class="nu0">12524</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;l = &nbsp; <span class="nu0">8112</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;m = &nbsp;<span class="nu0">51721</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;n = &nbsp;<span class="nu0">11019</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;o = &nbsp; <span class="nu0">9840</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;p = &nbsp; <span class="nu0">8139</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;q = &nbsp; <span class="nu0">1938</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;r = &nbsp;<span class="nu0">10993</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;s = &nbsp; &nbsp; &nbsp;<span class="nu0">0</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;t = &nbsp; &nbsp; &nbsp;<span class="nu0">0</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;u = &nbsp; <span class="nu0">8997</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;v = &nbsp; <span class="nu0">4342</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;w = &nbsp; <span class="nu0">6834</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;x = &nbsp; <span class="nu0">8829</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;y = &nbsp; <span class="nu0">8428</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;z = &nbsp; <span class="nu0">3245</span><span class="br0">&#41;</span></p>
<p>upperBoundOnUsers = <span class="kw2">sum</span><span class="br0">&#40;</span>count.<span class="me1">values</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&#8216;Upper bound on number of users:&#8217;</span>, upperBoundOnUsers</div>
<p>The total was 515,931.</p>
<p>Remember that that&#8217;s a <em>big</em> over-estimate due to duplicate counting.</p>
<p>And unless I really do live in a tech bubble, I think that number is way too small &#8211; even without adjusting it using the PIE.</p>
<p>(If we were going to adjust it, we could try to estimate how often pairs of letters co-occur in Twitter user names. That would be difficult as user names are not like normal words. But we could try.)</p>
<p>Looking at the letter frequencies, I found them really strange. I wrote a tiny bit more code, using the English letter frequencies <a href="http://en.wikipedia.org/wiki/Letter_frequencies">as given on Wikipedia</a> to estimate how many hits I&#8217;d have gotten back on a normal set of words. If we assume Twitter user names have an average length of 7, we can print the expected numbers versus the actual numbers like this:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="co1"># From http://en.wikipedia.org/wiki/Letter_frequencies</span><br />
freq = <span class="kw2">dict</span><span class="br0">&#40;</span>a = <span class="nu0">0.08167</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; b = <span class="nu0">0.01492</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; c = <span class="nu0">0.02782</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; d = <span class="nu0">0.04253</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; e = <span class="nu0">0.12702</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; f = <span class="nu0">0.02228</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; g = <span class="nu0">0.02015</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; h = <span class="nu0">0.06094</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; i = <span class="nu0">0.06966</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; j = <span class="nu0">0.00153</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; k = <span class="nu0">0.00772</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; l = <span class="nu0">0.04025</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; m = <span class="nu0">0.02406</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; n = <span class="nu0">0.06749</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; o = <span class="nu0">0.07507</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; p = <span class="nu0">0.01929</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; q = <span class="nu0">0.00095</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; r = <span class="nu0">0.05987</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; s = <span class="nu0">0.06327</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; t = <span class="nu0">0.09056</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; u = <span class="nu0">0.02758</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; v = <span class="nu0">0.00978</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; w = <span class="nu0">0.02360</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; x = <span class="nu0">0.00150</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; y = <span class="nu0">0.01974</span>,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; z = <span class="nu0">0.00074</span><span class="br0">&#41;</span></p>
<p>estimatedUserNameLen = <span class="nu0">7</span></p>
<p><span class="kw1">for</span> L <span class="kw1">in</span> <span class="kw2">sorted</span><span class="br0">&#40;</span>count.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; probNotLetter = <span class="nu0">1.0</span> &#8211; freq<span class="br0">&#91;</span>L<span class="br0">&#93;</span><br />
&nbsp; &nbsp; probOneOrMore = <span class="nu0">1.0</span> &#8211; probNotLetter ** estimatedUserNameLen<br />
&nbsp; &nbsp; expected = <span class="kw2">int</span><span class="br0">&#40;</span>upperBoundOnUsers * probOneOrMore<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&quot;%s: expected %6d, saw %6d.&quot;</span> % <span class="br0">&#40;</span>L, expected, count<span class="br0">&#91;</span>L<span class="br0">&#93;</span><span class="br0">&#41;</span></div>
<p>Which results in:</p>
<pre>
a: expected 231757, saw 108938.
b: expected  51531, saw  12636.
c: expected  92465, saw  13165.
d: expected 135331, saw  21516.
e: expected 316578, saw  14070.
f: expected  75281, saw   5294.
g: expected  68517, saw   8425.
h: expected 183696, saw   7108.
i: expected 204699, saw 160592.
j: expected   5500, saw   9226.
k: expected  27243, saw  12524.
l: expected 128942, saw   8112.
m: expected  80866, saw  51721.
n: expected 199582, saw  11019.
o: expected 217149, saw   9840.
p: expected  65761, saw   8139.
q: expected   3421, saw   1938.
r: expected 181037, saw  10993.
s: expected 189423, saw      0.
t: expected 250464, saw      0.
u: expected  91732, saw   8997.
v: expected  34301, saw   4342.
w: expected  79429, saw   6834.
x: expected   5392, saw   8829.
y: expected  67205, saw   8428.
z: expected   2666, saw   3245.</pre>
<p>You can see there are wild differences here.</p>
<p>While it&#8217;s clearly not right to be multiplying the probability of one or more of each letter appearing in a name by the 515,931 figure (because that&#8217;s a major over-estimate), you might hope that the results would be more consistent and tell you how much of an over-estimate it was. But the results are all over the place.</p>
<p>I briefly considered writing some code to scrape the search results and calculate the co-occurrence frequencies (and the actual set of letters in user names). Then I noticed that the results don&#8217;t always add up. E.g., search for C and you&#8217;re told there are 13,190 results. But the results come 19 at a time and there are 660 pages of results (and 19 * 660 = 12,540, which is not 13,190).</p>
<p>At that point I decided not to trust Twitter&#8217;s results and to call it quits.</p>
<p>A promising direction (and blog post) had fizzled out. I was reminded of trying to use AltaVista to compute co-citation distances between web pages back in 1996. AltaVista was highly variable in its search results, which made it hard to do mathematics.</p>
<p>I&#8217;m blogging this as a way to stop thinking about this question and to see if someone else wants to push on it, or email me the answer. Doing the above only took about 10-15 mins. Blogging it took at least a couple of hours :-(</p>
<p>Finally, in case it&#8217;s not clear there are lots of assumptions in what I did. Some of them:</p>
<ul>
<li>We&#8217;re not considering non-English letters (or things like underscores, which are common) in user names.</li>
<li>The mean length of Twitter user names is probably not 7.</li>
<li>Twitter search returns user names that don&#8217;t contain the searched-for letter (instead, the letter appears in the user&#8217;s name, not the username).</li>
</ul>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/10/13/how-many-users-does-twitter-have/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>GPS serendipity: Florence Avenue, Sebastopol</title>
		<link>http://blogs.fluidinfo.com/terry/2008/07/14/gps-serendipity-florence-avenue-sebastopol/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/07/14/gps-serendipity-florence-avenue-sebastopol/#comments</comments>
		<pubDate>Mon, 14 Jul 2008 15:57:27 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[me]]></category>
		<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/07/14/gps-serendipity-florence-avenue-sebastopol/</guid>
		<description><![CDATA[I drove from Oakland up to the O&#8217;Reilly Foo camp last Friday. The O&#8217;Reilly offices are just outside Sebastopol, CA. I stopped at an ATM and my GPS unit got totally confused. So I took a few turns at random and wound up on Florence Avenue. I drove a couple of hundred meters and started [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0601.jpg" title="img_0601.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0601.thumbnail.jpg" alt="img_0601.jpg" style="float: left; margin-right: 8px" /></a>I drove from Oakland up to the <a href="http://oreilly.com/">O&#8217;Reilly</a> <a href="http://wiki.oreillynet.com/foocamp08">Foo camp</a> last Friday. The O&#8217;Reilly offices are just outside Sebastopol, CA. I stopped at an ATM and my GPS unit got totally confused. So I took a few turns at random and wound up on Florence Avenue. I drove a couple of hundred meters and started seeing big colorful structures out the front of many houses. They were so good I stopped, got out my camera, and took a whole bunch of pictures.</p>
<p>I talked to a man washing his car in his driveway. He told me that &#8220;Patrick&#8221; had created all the figures, and installed them on the front lawns. I got the impression that it was all free. Soon after I found the house that was unmistakably Patrick&#8217;s and seeing a man loading things into a pickup truck I went up and asked if he was Patrick. It was him and we had a friendly talk (mainly me telling him he was amazing). He gave me a calendar of his work.</p>
<p>Click on the thumbnails below to see bigger versions. There&#8217;s even a FC Barcelona structure. As I found out later, lots of people (of course) have seen these sculptures. When I got to Foo, there was one (image above) outside the O&#8217;Reilly office. Google for Patrick Amiot or Florence Avenue, Sebastopol and you&#8217;ll find much more. And Patrick has <a href="http://www.patrickamiot-brigittelaurent.com/">his own web site</a>.</p>
<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0556.jpg" title="img_0556.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0556.thumbnail.jpg" alt="img_0556.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0558.jpg" title="img_0558.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0558.thumbnail.jpg" alt="img_0558.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0560.jpg" title="img_0560.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0560.thumbnail.jpg" alt="img_0560.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0561.jpg" title="img_0561.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0561.thumbnail.jpg" alt="img_0561.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0567.jpg" title="img_0567.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0567.thumbnail.jpg" alt="img_0567.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0568.jpg" title="img_0568.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0568.thumbnail.jpg" alt="img_0568.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0569.jpg" title="img_0569.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0569.thumbnail.jpg" alt="img_0569.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0570.jpg" title="img_0570.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0570.thumbnail.jpg" alt="img_0570.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0572.jpg" title="img_0572.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0572.thumbnail.jpg" alt="img_0572.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0573.jpg" title="img_0573.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0573.thumbnail.jpg" alt="img_0573.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0579.jpg" title="img_0579.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0579.thumbnail.jpg" alt="img_0579.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0581.jpg" title="img_0581.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0581.thumbnail.jpg" alt="img_0581.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0582.jpg" title="img_0582.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0582.thumbnail.jpg" alt="img_0582.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0585.jpg" title="img_0585.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0585.thumbnail.jpg" alt="img_0585.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0586.jpg" title="img_0586.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0586.thumbnail.jpg" alt="img_0586.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0589.jpg" title="img_0589.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0589.thumbnail.jpg" alt="img_0589.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0592.jpg" title="img_0592.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0592.thumbnail.jpg" alt="img_0592.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0595.jpg" title="img_0595.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0595.thumbnail.jpg" alt="img_0595.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0599.jpg" title="img_0599.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0599.thumbnail.jpg" alt="img_0599.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0575.jpg" title="img_0575.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0575.thumbnail.jpg" alt="img_0575.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0577.jpg" title="img_0577.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0577.thumbnail.jpg" alt="img_0577.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0564.jpg" title="img_0564.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0564.thumbnail.jpg" alt="img_0564.jpg" /></a><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0566.jpg" title="img_0566.jpg"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/img_0566.thumbnail.jpg" alt="img_0566.jpg" /></a></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/07/14/gps-serendipity-florence-avenue-sebastopol/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Sequoia Capital is the new Delphic Oracle</title>
		<link>http://blogs.fluidinfo.com/terry/2008/06/17/sequoia-capital-is-the-new-delphic-oracle/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/06/17/sequoia-capital-is-the-new-delphic-oracle/#comments</comments>
		<pubDate>Tue, 17 Jun 2008 11:46:18 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[books]]></category>
		<category><![CDATA[companies]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/06/17/sequoia-capital-is-the-new-delphic-oracle/</guid>
		<description><![CDATA[In a belated attempt to educate myself by reading some of the things that many people study in high school, I&#8217;m reading The Histories of Herodotus. It&#8217;s highly entertaining and easy to read. I read The History of the Peloponnesian War by Thucydides a few years ago and enjoyed that even more. Herodotus is the [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://en.wikipedia.org/wiki/Delphi" title="Consulting the Oracle"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/06/250px-pythia1.jpg" alt="Consulting the Oracle" style="float: left; margin-right: 8px" /></a>In a belated attempt to educate myself by reading some of the things that many people study in high school, I&#8217;m reading <a href="http://en.wikipedia.org/wiki/Histories_%28Herodotus%29">The Histories</a> of <a href="http://en.wikipedia.org/wiki/Herodotus">Herodotus</a>. It&#8217;s highly entertaining and easy to read. I read <a href="http://en.wikipedia.org/wiki/History_of_the_Peloponnesian_War">The History of the Peloponnesian War</a> by <a href="http://en.wikipedia.org/wiki/Thucydides">Thucydides</a> a few years ago and enjoyed that even more. Herodotus is the more colorful, but the speeches and drama in Thucydides are fantastic.</p>
<p>There were lots of <a href="http://en.wikipedia.org/wiki/Oracle">oracles</a> in classical Greece, and elsewhere.Of the Greek oracles, the <a href="http://en.wikipedia.org/wiki/Pythia">Delphic Oracle</a> was, and still is, the best known. People (kings, dictators, emperors, wannabees) would send questions like &#8220;Should I invade Persia?&#8221; to the oracle and receive typically ambiguous or cryptic responses. We have a large number of <a href="http://en.wikipedia.org/wiki/Famous_Oracular_Statements_from_Delphi">famous oracular replies</a>. Herodotus recounts how <a href="http://en.wikipedia.org/wiki/Croesus">Croesus</a> decided to test the various oracles by sending them all the same question, asking what he was doing on a certain day. The oracle at Delphi won hands down. Croesus then immediately put more pressing matters to the Delphic oracle, famously misinterpreted the pronouncements, and was duly wiped out by the Persians.</p>
<p>Imagine yourself in the position of the Delphic oracle. You&#8217;ve got all sorts of rulers and aspiring rulers constantly sending you their thoughts and questions, asking what you think. You&#8217;re in a unique position, simultaneously privy to the most secret potential plans of many powerful rulers. You really know what&#8217;s going on. You know what&#8217;s likely to succeed or to fail, and why. You get to give the thumbs up or thumbs down. By virtue of your position and the information flowing through your temple, you can direct traffic; you can shape and create history. You might even be tempted to profit from your knowledge. Your successful accurate pronouncements invariably reap you rich tribute.</p>
<p>OK, you can see where this is leading&#8230;</p>
<p><a href="http://www.sequoiacap.com/">Sequoia Capital</a>, and other well-known venture firms, have a somewhat similar position. They have thousands of leaders and wannabee leaders bringing them their detailed secret plans, proposing to mount armies, found cities, build empires, to attack the modern-day Persians, etc. By virtue of their unusual position they probably have a pretty good idea of what might work, and why. Using this knowledge, but without necessarily revealing sources, they can cryptically but assuredly state &#8220;oh, that&#8217;ll never work&#8221; or they can encourage ideas that are new and which they can see will somehow fit and succeed. If company X has consulted the oracle, disclosing a detailed plan to go left, and company Y plans to attack from the right, well&#8230;. why not?</p>
<p>Entrepreneurs beg an audience, get a tiny slice of time to make their pitch, and occasionally receive rare clear endorsements. Much more frequently they are left to scratch their heads over cryptic, ambiguous and unexplained responses (and non-responses). You can bet the Delphic oracle didn&#8217;t sign NDAs either.</p>
<p>It&#8217;s stretching it too far to seriously claim that Sequoia is the modern-day equivalent of the Delphic oracle. But on the other hand, over 2500 years have elapsed, so you&#8217;d expect a few changes.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/06/17/sequoia-capital-is-the-new-delphic-oracle/feed/</wfw:commentRss>
		<slash:comments>8</slash:comments>
		</item>
		<item>
		<title>Random thoughts on Twitter</title>
		<link>http://blogs.fluidinfo.com/terry/2008/06/09/random-thoughts-on-twitter/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/06/09/random-thoughts-on-twitter/#comments</comments>
		<pubDate>Mon, 09 Jun 2008 00:48:54 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[companies]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[twitter]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/06/09/random-thoughts-on-twitter/</guid>
		<description><![CDATA[I&#8217;ve spent a lot of time thinking about Twitter this year. Here are a few thoughts at random. Obviously Twitter have tapped into something quite fundamental, which at a high level we might simply call human sociability. We humans are primates, though there&#8217;s a remarkably strong tendency to forget or ignore this. We know a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.twitter.com/" title="Twitter"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/06/twitter.png" alt="Twitter" style="float: left; margin-right: 8px" /></a>I&#8217;ve spent a lot of time thinking about Twitter this year. Here are a few thoughts at random.</p>
<p>Obviously Twitter have tapped into something quite fundamental, which at a high level we might simply call human sociability. We humans are primates, though there&#8217;s a remarkably strong tendency to forget or ignore this.  We know a lot about the intensely social lives of our fellow primate species.  It shouldn&#8217;t come as a surprise that we like to Twitter amongst ourselves too.</p>
<p>Here are a couple of interesting (to me) reasons for the popularity of Twitter.</p>
<p>One is that many people are in some sense atomized by the fact that many of us now work in an isolated way. Technical people who can do their work and communicate over the internet probably see less of their peers than others do. That&#8217;s just a general point, it&#8217;s not specific to Twitter or to 2008. It would have seemed unfathomably odd to humans 50 years ago to hear that many of us would be doing a large percentage of our work and social communication via machines, interacting with people who we don&#8217;t otherwise know, and who we rarely or never meet face to face. The rise of internet-based communication is obviously(?) helping to fill a gap created by this generational change.</p>
<p>The second point is specific to Twitter. Through brilliance or accident, the form of communication on Twitter is really special. Building a social network on nothing-implied asymmetric follower relationships is not something I would have predicted as leading to success. Maybe it worked, or could have all gone wrong, just due to random chance. But I&#8217;m inclined to believe that there&#8217;s more to it than that. Perhaps we&#8217;re all secretly voyeurs, or stickybeaks (nosy-parkers). Perhaps we like to see one half of conversations and be able to follow along if we like. Perhaps there&#8217;s a small secret thrill to promiscuously following someone and seeing if they follow you back. I don&#8217;t know the answer, but as I said above I do think Twitter have tapped into something interesting and strong here. There&#8217;s a property of <em>us</em>, we simple primates, that the Twitter model has managed to latch onto.</p>
<p>I think Twitter should change the dynamics for new users by initially assigning them ten random followers. New users can easily follow others, but if no-one is following them&#8230;.. why bother? New user uptake would be much higher if they didn&#8217;t have the (correct) feeling that they were for some reason expected to want to Twitter in a vacuum. You announce a new program, called e.g., Twitter Guides and ask for people to volunteer to be guides (i.e., followers) of newbees. Lend a hand, make new friends, maybe get some followers yourself, etc. Lots of people would click to be a Guide. I bet this would change Twitter&#8217;s adoption dynamics. If you study things like random graph theory and dynamic systems, you know that making small changes to (especially initial) probabilities can have a dramatic effect on overall structure. If Twitter is eventually to reach a mass audience (whatever that means), it should be an uncontestable assertion that anything which significantly reduces the difficulty for new users to get into using it is very important.</p>
<p>Twitter should probably fix their reliability issues sometime soon.</p>
<p>I say &#8220;probably&#8221; because reliability and scaling are obviously not the most important things. Twitter has great value. It must have, or it would have lost its users long ago.</p>
<p>There&#8217;s a positive side to Twitter&#8217;s unreliability. People are amazed that the site goes down so often. Twitter gets snarled up in ways that give rise to a wide variety of symptoms. The result seems to be more attention, to make the service somehow more charming.  It&#8217;s like a bad movie that you remember long afterwards because it wasn&#8217;t good. We don&#8217;t take Twitter for granted and move on the next service to pop up &#8211; we&#8217;re all busy standing around making snide remarks, playing armchair engineer, knowing that we too might face some of these issues, and talking, talking, talking.  Twitter is a fascinating sight. Great harm is done by its unreliability, but the fact that their success so completely flies in the face of conventional wisdom is fascinating &#8211; and the fact that we find it so interesting and compelling a spectacle is fantastic for Twitter. They can fix the scaling issues, I hope. They should prove temporary. But the human side of Twitter, its character as a site, the site we stuck with and rooted for when times were so tough, the amazing little site that dropped to the canvas umpteen times but always got back to its feet, etc&#8230;. All that is permanent. If Twitter make it, they&#8217;re going to be more than just a web service. The public outages are like a rock musician or movie star doing something outrageous or threatening suicide &#8211; capturing attention. We&#8217;re drawn to the spectacle and the drama. We can&#8217;t help ourselves: it is our selves. We love it, we hate it, it brings us together to gnash our teeth when it&#8217;s down. But do we leave? Change the channel? No way.</p>
<p>Twitter is both the temperamental child rock star we love <em>and</em>, often, the medium by which we discuss it &#8211; an enviable position!</p>
<p>I&#8217;m reminded of a trick I learned during tens of thousands of miles of hitch-hiking. A great place to try for a lift is on a fairly high-speed curve on the on-ramp to the freeway / motorway / autopista / autoroute etc. Stand somewhere where a speeding car can only just manage a stop and only just manage to pull in away from the following traffic.  Conventional wisdom tells you that you&#8217;ll never get a ride. But the opposite is true &#8211; you&#8217;ll get a ride extremely quickly. Invariably, the first thing the driver says when you get in is &#8220;Why on earth where you standing there?  You&#8217;re very lucky I managed to stop. No-one would have <em>ever</em> picked you up standing there!&#8221;  I&#8217;ve done this dozens of times. Twitter—being incredibly, unbelievably, frustratingly, unreliable and running contrary to all received wisdom—is a powerful spectacle. Human psyche is a funny thing. That&#8217;s a part of why it&#8217;s probably impossible to foretell success when mass adoption is required.</p>
<p>If I were running Twitter, apart from working to get the service to be more reliable, I&#8217;d be telling the engineering team to log <em>everything</em>. There&#8217;s a <em>ton</em> of value in the data flowing into Twitter.</p>
<p>Just as Google took internet search to a new level by link analysis, there&#8217;s another level of value in Twitter that I don&#8217;t think has really begun to be tapped yet.</p>
<p>PageRank, at least as I understand its early operation, ran a kind of iterative relaxation algorithm assigning and passing on credit via linked pages. A similar thing is clearly possible with Twitter, and some people have commented on this or tried to build little things that assign some form of score to users. But I think there&#8217;s a <em>lot</em> more that can be done.  Because the Twitter API isn&#8217;t that powerful (mainly because you&#8217;re largely limited to querying as a single authorized user) and certainly because it&#8217;s rate-limited to just 70 API calls an hour, this sort of analysis will need to be done by Twitter themselves. I&#8217;m sure they&#8217;re well aware of that. Rate limiting probably helps them stay up, but it also means that the truly interesting and valuable stuff can&#8217;t be done by outsiders. I have no beef with that &#8211; I just wish Twitter would hurry up and do some of it.</p>
<p>Some examples in no order:</p>
<ul>
<li> The followers to following ratio of a Twitter user is obviously a high-level measure of that user&#8217;s &#8220;importance&#8221; (in some Twitter sense of importance). But there&#8217;s more to it than that. <em>Who</em> are the followers? Who do they follow, who follows them? Etc. This leads immediately back to Google PageRank.</li>
<li> If a user gets followed by many people and doesn&#8217;t follow those people back, what does it say about the people involved? If X follows Y and Y then goes to look at a few pages of X&#8217;s history but does not then follow X, what do we know?</li>
<li> If X has 5K followers and re-tweets a twit of Y, how many of X&#8217;s followers go check out and perhaps follow Y? What kind of people are these? (How do you advertise to them, versus others?)</li>
<li> Along the lines of co-citation analysis, Twitter could build up a map showing you who you might follow. I.e., you can get pairwise distances between users X and Y by considering how many people they follow in common and how many they follow not-in-common. That would lead to a people you should be following that you&#8217;re not kind of suggestion.</li>
<li> Even without co-citation analysis (or similar), Twitter should be able to tell me about people that many of the people I follow are following but whom I am not following. I&#8217;d find that very useful.</li>
<li> Twitter could tell me why someone chooses to follow me. What were they looking at (if anything) before they decided to follow me? I.e., were they browsing the following list of someone else? Did they see my user name mentioned in a Tweet? Did they come in from an outside link? Would a premium Twitter user pay to have that information?</li>
<li> Twitter has tons of links. They know the news as it happens. They could easily create a news site like Digg.</li>
<li> In some sense the long tail of Twitter is where the value is. For instance, it doesn&#8217;t mean much if a user following 10K others follows someone. But if someone is following just 10 people, it&#8217;s much more significant. There&#8217;s more information there (probably). The Twitter mega users are in some way uninteresting &#8211; the more people they have following them and the more they follow, the less you really know (or care) about them. Yes, you could probably figure out more if you really wanted to, but if someone has 10K followers all you really know is that they&#8217;re probably famous in some way.  If they add another 100 followers it&#8217;s no big deal. (I say all this a bit lightly and generally &#8211; the details might of course be fascinating and revealing &#8211; e.g., if you notice Jason Calacanis and Dave Winer have suddenly started @ messaging each other again it&#8217;s like IRC coming back from a network split :-))</li>
<li> Similarly if someone with a very high followers to following ratio follows a Twitter user who has just a couple of followers, it&#8217;s a safe bet that those two are somehow friends with a pre-existing relationship.</li>
<li>I bet you could do a pretty good job of putting Twitter users into boxes just based on their overall behavior, something like the 16 Myers-Briggs categories. Do you follow people back when they follow you? Do you @ answer people who @ address you (and Twitter knows when you&#8217;ve seen the original message)? Do you send @ messages to people (and how influential are those people)? Do those people @ you back (and how influential those people are says something about how interesting / provocative you are)? Do you follow tons and tons of people? Do you follow people and then un-follow them if they don&#8217;t follow you back? Do you follow random links in other people&#8217;s Twitters, and are those links accompanied by descriptive text or tinyurl links?  Do you @ message people after you follow their links? Do your Twitter times follow a strict pattern, or are you on at all hours, or suddenly spending days without Twittering?  Do you visit and just read much more than you tweet? How much old stuff do you read? Do you tend to talk in public or via DM? Are your tweets public?All that without even considering the <em>content</em> of your Twitters.</li>
<li> Could Twitter become a search engine?  That&#8217;s not a 100% serious question, but it&#8217;s worth considering.  I don&#8217;t mean just making the content of all tweet searchable, I mean it with some sort of ranking algorithm, again perhaps akin to PageRank. If you somehow rank results by the importance or closeness of the user whose tweets match the search terms, you might have something interesting.</li>
<li> Twitter also presumably know who&#8217;s talking about whom in the DM backchat.  They can&#8217;t use that information in obvious way, but it&#8217;s of high value.</li>
</ul>
<p>I could go on for hours, but that&#8217;s more than enough for now. I don&#8217;t feel like any of the above list is particularly compelling, but I do think the list of nice things they could be doing is extremely long and that Twitter have only just begun (at least publicly) to tap into the value they&#8217;re sitting on.</p>
<p>I think Google should buy Twitter. They have what Twitter needs: 1) engineering and scale, 2) link analysis and algorithm brilliance, and 3) they&#8217;re in a position to monetize the value illustrated above (via their search engine, that already has ads) without pissing off the Twitter community by e.g., running ads on Twitter. What percentage of Twitter users also use Google? I bet it&#8217;s very high.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/06/09/random-thoughts-on-twitter/feed/</wfw:commentRss>
		<slash:comments>23</slash:comments>
		</item>
	</channel>
</rss>

