<?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; other</title>
	<atom:link href="http://blogs.fluidinfo.com/terry/category/other/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>Emacs buffer mode histogram</title>
		<link>http://blogs.fluidinfo.com/terry/2011/11/10/emacs-buffer-mode-histogram/</link>
		<comments>http://blogs.fluidinfo.com/terry/2011/11/10/emacs-buffer-mode-histogram/#comments</comments>
		<pubDate>Thu, 10 Nov 2011 11:45:59 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[other]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tech]]></category>
		<category><![CDATA[elisp]]></category>
		<category><![CDATA[emacs]]></category>
		<category><![CDATA[lisp]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=914</guid>
		<description><![CDATA[Tonight I noticed that I had over 200 buffers open in emacs. I&#8217;ve been programming a lot in Python recently, so many of them are in Python mode. I wondered how many Python files I had open, and I counted them by hand. About 90. I then wondered how many were in Javascript mode, in [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight I noticed that I had over 200 buffers open in <a href="http://directory.fsf.org/wiki/Emacs">emacs</a>. I&#8217;ve been programming a lot in <a href="http://www.python.org">Python</a> recently, so many of them are in Python mode. I wondered how many Python files I had open, and I counted them by hand. About 90. I then wondered how many were in Javascript mode, in RST mode, etc. I wondered what a histogram would look like, for me and for others, at times when I&#8217;m programming versus working on documentation, etc.</p>
<p>Because it&#8217;s emacs, it wasn&#8217;t hard to write a function to display a buffer mode histogram.  Here&#8217;s mine:</p>
<pre>
235 buffers open, in 23 distinct modes

91               python +++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
47          fundamental +++++++++++++++++++++++++++++++++++++++++++++++
24                  js2 ++++++++++++++++++++++++
21                dired +++++++++++++++++++++
16                 html ++++++++++++++++
 7                 text +++++++
 4                 help ++++
 4           emacs-lisp ++++
 3                   sh +++
 3       makefile-gmake +++
 2          compilation ++
 2                  css ++
 1          Buffer-menu +
 1                 mail +
 1                 grep +
 1      completion-list +
 1                   vm +
 1                  org +
 1               comint +
 1              apropos +
 1                 Info +
 1           vm-summary +
 1      vm-presentation +
</pre>
<p>Tempting as it is, I&#8217;m not going to go on about the heady delights of having a fully programmable editor.  You either already know, or you can just drool in slack-jawed wonder.</p>
<p>Unfortunately I&#8217;m a terrible emacs lisp programmer. I can barely remember a thing each time I use it. But the interpreter is of course just emacs itself and the elisp documentation is in emacs, so it&#8217;s a really fun environment to develop in.  And because emacs lisp has a ton of support for doing things to itself, code that acts on emacs and your own editing session or buffers is often very succinct. See for example the <tt>save-excursion</tt> and <tt>with-output-to-temp-buffer</tt> functions below.</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="br0">&#40;</span><span class="kw1">defun</span> buffer-mode-histogram <span class="br0">&#40;</span><span class="br0">&#41;</span><br />
&nbsp; <span class="st0">&quot;Display a histogram of emacs buffer modes.&quot;</span><br />
&nbsp; <span class="br0">&#40;</span>interactive<span class="br0">&#41;</span><br />
&nbsp; <span class="br0">&#40;</span><span class="kw1">let</span>* <span class="br0">&#40;</span><span class="br0">&#40;</span>totals &#8216;<span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>buffers <span class="br0">&#40;</span>buffer-<span class="kw1">list</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>total-buffers <span class="br0">&#40;</span><span class="kw1">length</span> buffers<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>ht <span class="br0">&#40;</span>make-hash-table :<span class="me1">test</span> &#8216;<span class="kw1">equal</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span>save-excursion<br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">dolist</span> <span class="br0">&#40;</span>buffer buffers<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>set-buffer buffer<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">let</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>mode-<span class="kw1">name</span> <span class="br0">&#40;</span>symbol-<span class="kw1">name</span> major-mode<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span>puthash mode-<span class="kw1">name</span> <span class="br0">&#40;</span><span class="nu0">1</span>+ <span class="br0">&#40;</span>gethash mode-<span class="kw1">name</span> ht <span class="nu0">0</span><span class="br0">&#41;</span><span class="br0">&#41;</span> ht<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span>maphash <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>key <span class="kw1">value</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span><span class="kw1">setq</span> totals <span class="br0">&#40;</span><span class="kw1">cons</span> <span class="br0">&#40;</span><span class="kw1">list</span> key <span class="kw1">value</span><span class="br0">&#41;</span> totals<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;ht<span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">setq</span> totals <span class="br0">&#40;</span>sort totals <span class="br0">&#40;</span><span class="kw1">lambda</span> <span class="br0">&#40;</span>x y<span class="br0">&#41;</span> <span class="br0">&#40;</span>&gt; <span class="br0">&#40;</span><span class="kw1">cadr</span> x<span class="br0">&#41;</span> <span class="br0">&#40;</span><span class="kw1">cadr</span> y<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="br0">&#40;</span>with-output-to-temp-buffer <span class="st0">&quot;Buffer mode histogram&quot;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">princ</span> <span class="br0">&#40;</span>format <span class="st0">&quot;%d buffers open, in %d distinct modes<span class="es0">\n</span><span class="es0">\n</span>&quot;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; total-buffers <span class="br0">&#40;</span><span class="kw1">length</span> totals<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">dolist</span> <span class="br0">&#40;</span>item totals<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">let</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="br0">&#40;</span>key <span class="br0">&#40;</span><span class="kw1">car</span> item<span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>count <span class="br0">&#40;</span><span class="kw1">cadr</span> item<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">if</span> <span class="br0">&#40;</span><span class="kw1">equal</span> <span class="br0">&#40;</span>substring key <span class="nu0">-5</span><span class="br0">&#41;</span> <span class="st0">&quot;-mode&quot;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">setq</span> key <span class="br0">&#40;</span>substring key <span class="nu0">0</span> <span class="nu0">-5</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="br0">&#40;</span><span class="kw1">princ</span> <span class="br0">&#40;</span>format <span class="st0">&quot;%2d %20s %s<span class="es0">\n</span>&quot;</span> count key<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="br0">&#40;</span>make-string count ?+<span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p>Various things about the formatting could be improved. E.g., not use fixed-width fields for the count and the mode names, and make the + signs indicate more than one buffer mode when there are many.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2011/11/10/emacs-buffer-mode-histogram/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Back of the envelope calculations with The Rule of 72</title>
		<link>http://blogs.fluidinfo.com/terry/2011/06/20/back-of-the-envelope-calculations-with-the-rule-of-72/</link>
		<comments>http://blogs.fluidinfo.com/terry/2011/06/20/back-of-the-envelope-calculations-with-the-rule-of-72/#comments</comments>
		<pubDate>Mon, 20 Jun 2011 01:03:57 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=814</guid>
		<description><![CDATA[The Rule of 72 deserves to be better known among technical people. It&#8217;s a widely-known financial rule of thumb used for understanding and calculating interest rates. But others, including computer scientist and start-up founders, are often concerned with growth rates. Knowing and applying the rule of 72 can help in developing numerical literacy (numeracy) around [...]]]></description>
			<content:encoded><![CDATA[<p><div id="attachment_815" class="wp-caption alignright" style="width: 235px"><a href="http://www.internetworldstats.com/emarketing.htm"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2011/06/internet-growth-225x300.png" alt="" title="internet-growth" width="225" height="300" class="size-medium wp-image-815" /></a><p class="wp-caption-text">Image: internetworldstats.com</p></div><a href="http://en.wikipedia.org/wiki/Rule_of_72">The Rule of 72</a> deserves to be better known among technical people. It&#8217;s a widely-known financial rule of thumb used for understanding and calculating interest rates. But others, including computer scientist and start-up founders, are often concerned with growth rates. Knowing and applying the rule of 72 can help in developing numerical literacy (<a href="http://en.wikipedia.org/wiki/Numeracy">numeracy</a>) around growth.</p>
<p>For example, consider <a href="http://en.wikipedia.org/wiki/Moore's_law">Moore&#8217;s Law</a>, which describes how &quot;the number of transistors that can be placed inexpensively on an integrated circuit doubles approximately every two years.&quot; If something doubles every two years, at what rate does it increase per month, on average? If you know the rule of 72, you&#8217;ll instantly know that the monthly growth rate is about 3%.  You get the answer by dividing 72 by 24 (the number of months).</p>
<p>Computer scientists are usually very familiar with powers of two. It&#8217;s often convenient to take advantage of the fact that 2^10 is about 1,000. That means that when something increases by a factor of 1,000, it has doubled about 10 times. By extension, and with a little more error, an increase of a million corresponds to 20 doublings, and a billion is 30 doublings (log base two of a billion is actually 29.897, so the error isn&#8217;t too wild).  You can use this to ballpark the number of doublings in a process really easily, and go directly from that to a growth rate using the rule of 72.</p>
<p>For example, <a href="http://www.zooknic.com/Domains/counts.html">the bottom of this page</a> tells us that there were about 16,000 internet domains on July 1st 1992, and 1.3M of them on July 1st 1997. Let&#8217;s think in thousands: that&#8217;s a jump from 16 to just over 1,000 in 5 years. To get from 1 to 16 is four doublings, so from 16 to 1,000 is six doublings (because 1,000 is ten doublings from 1). So the number of domains doubled 6 times in 5 years, or 6 times in 60 months, or once every 10 months (on average). If you want something to double in 10 months, the rule of 72 tells us we need a growth rate of 7.2% per month.  To check: 16,000 * (1.072 ^ 60) = 1,037,067. That&#8217;s a damned good estimate (remember that we were shooting for 1M, not 1.3M) for five seconds of mental arithmetic! Note that the number of domains was growing much faster than Moore&#8217;s law (3% per month).</p>
<p>You can quickly get very good at doing these sorts of calculations.  Here&#8217;s another easy example. <a href="http://www.internetworldstats.com/emarketing.htm">This page</a> shows the number of internet users growing from 16M in December 1995 to 2,072M in March of 2011. That&#8217;s just like the above example, but it&#8217;s 7 doublings in 15.25 years, or 183 months. That&#8217;s pretty close to a doubling every 24 months, which we know from above corresponds to 3% growth per month.</p>
<p>You can use facility with growth rates to have a good sense for interest rates in general. You can use it when building simple (exponential) models of product growth. E.g., suppose you&#8217;re launching a product and you reckon you&#8217;ll have 300K users in a year&#8217;s time. You want to map this out in a spreadsheet using a simple exponential model. What should the growth rate be? 300K is obviously not much more than 256 * 1,024, which is 18 doublings in 365 days, or a doubling roughly every 20 days. The rule of 72 gives 72/20 = ~3.5, so you need to grow 3.5% every day to hit your target. Is that reasonable? If it is, it means that when you hit 300K users, you&#8217;ll be signing up about 3.5% of that number, or 10,500 users per day.  As you can see, familiarity with powers of two (i.e., estimating number of doublings) and with the rule of 72 can give you ballpark figures really easily. You can even use your new math powers to avoid looking stupid in front of VCs.</p>
<p><a href="http://betterexplained.com/articles/the-rule-of-72/">The math behind the rule of 72</a> is easy to extend to triplings (rule of 110), quadrupling (rule of 140), quintupling (rule of 160), etc.</p>
<p>Finally, you can use these rules of thumb to do super geeky party tricks. E.g., what&#8217;s the tenth root of two? Put another way, what interest rate do you need for something to double after ten periods? The rule of 72 tells you it&#8217;s 72/10 = 7.2%, so the tenth root of two will be about 1.072 (in fact 1.072 ^ 10 = 2.004).  What&#8217;s the 20th root of 5? The rule of 160 tells you you need 160/20 = 8% growth each period, so 1.08 should be about right (the correct answer is ~1.0838).</p>
<p>As with all rules of thumb, it&#8217;s good to have a sense of when it&#8217;s most applicable. See <a href="http://en.wikipedia.org/wiki/Rule_of_72">the wikipedia page</a> or <a href="http://mindyourdecisions.com/blog/2007/10/17/how-quickly-will-your-money-grow-the-rule-of-72-and-caveats-for-sophisticated-investors/">this page</a> for more detailed information. It&#8217;s also of course good to understand that it may not be suitable to model growth as an exponential at all.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2011/06/20/back-of-the-envelope-calculations-with-the-rule-of-72/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>The eighty six non-trivial powers &#8804; 2^20</title>
		<link>http://blogs.fluidinfo.com/terry/2011/03/30/the-eighty-six-non-trivial-powers-220/</link>
		<comments>http://blogs.fluidinfo.com/terry/2011/03/30/the-eighty-six-non-trivial-powers-220/#comments</comments>
		<pubDate>Tue, 29 Mar 2011 23:32:03 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[python]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=789</guid>
		<description><![CDATA[Tonight Jamu Kakar mentioned in IRC that a program of his had unexpectedly crashed after processing 1,048,376 items. I think it&#8217;s a useful debugging skill to have to be able to recognize numbers like that (it&#8217;s very close to 2^20). I&#8217;ve often wanted to write a tiny program to print out all the non-trivial powers, [...]]]></description>
			<content:encoded><![CDATA[<p>Tonight <a href="http://twitter.com/jkakar">Jamu Kakar</a> mentioned in IRC that a program of his had unexpectedly crashed after processing 1,048,376 items. I think it&#8217;s a useful debugging skill to have to be able to recognize numbers like that (it&#8217;s very close to 2^20). I&#8217;ve often wanted to write a tiny program to print out all the non-trivial powers, and since I have far more important and pressing things to be doing, I immediately went to write the code. At a minimum it seems prudent to recognize all powers up to 1000, and the powers of 2 to much higher. Below you have all 86 non-trivial powers up to 2^20. I don&#8217;t know them all, but I wish I did.</p>
<pre>
  4 = 2^2                  729 = 3^6, 9^3                32768 = 2^15, 8^5
  8 = 2^3                 1000 = 10^3                    38416 = 14^4
  9 = 3^2                 1024 = 2^10, 4^5               46656 = 6^6
 16 = 2^4, 4^2            1296 = 6^4                     50625 = 15^4
 25 = 5^2                 1331 = 11^3                    59049 = 3^10, 9^5
 27 = 3^3                 1728 = 12^3                    65536 = 2^16, 4^8, 16^4
 32 = 2^5                 2048 = 2^11                    78125 = 5^7
 36 = 6^2                 2187 = 3^7                     83521 = 17^4
 49 = 7^2                 2197 = 13^3                   100000 = 10^5
 64 = 2^6, 4^3, 8^2       2401 = 7^4                    104976 = 18^4
 81 = 3^4, 9^2            2744 = 14^3                   117649 = 7^6
100 = 10^2                3125 = 5^5                    130321 = 19^4
121 = 11^2                3375 = 15^3                   131072 = 2^17
125 = 5^3                 4096 = 2^12, 4^6, 8^4, 16^3   160000 = 20^4
128 = 2^7                 4913 = 17^3                   161051 = 11^5
144 = 12^2                5832 = 18^3                   177147 = 3^11
169 = 13^2                6561 = 3^8, 9^4               248832 = 12^5
196 = 14^2                6859 = 19^3                   262144 = 2^18, 4^9, 8^6
216 = 6^3                 7776 = 6^5                    279936 = 6^7
225 = 15^2                8000 = 20^3                   371293 = 13^5
243 = 3^5                 8192 = 2^13                   390625 = 5^8
256 = 2^8, 4^4, 16^2     10000 = 10^4                   524288 = 2^19
289 = 17^2               14641 = 11^4                   531441 = 3^12, 9^6
324 = 18^2               15625 = 5^6                    537824 = 14^5
343 = 7^3                16384 = 2^14, 4^7              759375 = 15^5
361 = 19^2               16807 = 7^5                    823543 = 7^7
400 = 20^2               19683 = 3^9                   1000000 = 10^6
512 = 2^9, 8^3           20736 = 12^4                  1048576 = 2^20, 4^10, 16^5
625 = 5^4                28561 = 13^4
</pre>
<p>I produced the above with this quick hack:</p>
<p><code></p>
<div class="dean_ch" style="white-space: nowrap;">
<p><span class="kw1">from</span> <span class="kw3">collections</span> <span class="kw1">import</span> defaultdict</p>
<p>powers = defaultdict<span class="br0">&#40;</span><span class="kw2">list</span><span class="br0">&#41;</span><br />
lim = <span class="nu0">20</span></p>
<p><span class="kw1">for</span> a <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">2</span>, lim + <span class="nu0">1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">for</span> b <span class="kw1">in</span> <span class="kw2">range</span><span class="br0">&#40;</span><span class="nu0">2</span>, lim + <span class="nu0">1</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; n = a ** b<br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">if</span> n &gt; <span class="nu0">2</span> ** lim:<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">break</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; powers<span class="br0">&#91;</span>n<span class="br0">&#93;</span>.<span class="me1">append</span><span class="br0">&#40;</span><span class="br0">&#40;</span>a, b<span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">for</span> n <span class="kw1">in</span> <span class="kw2">sorted</span><span class="br0">&#40;</span>powers.<span class="me1">keys</span><span class="br0">&#40;</span><span class="br0">&#41;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">'%7d = %s'</span> % <span class="br0">&#40;</span>n,<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">', '</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="st0">'%d^%d'</span> % <span class="br0">&#40;</span>a, b<span class="br0">&#41;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp; <span class="kw1">for</span> <span class="br0">&#40;</span>a, b<span class="br0">&#41;</span> <span class="kw1">in</span> powers<span class="br0">&#91;</span>n<span class="br0">&#93;</span><span class="br0">&#41;</span><span class="br0">&#41;</span><br />
&nbsp;</div>
<p></code></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2011/03/30/the-eighty-six-non-trivial-powers-220/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>GMZD: Google Maps Zoom-out Distance</title>
		<link>http://blogs.fluidinfo.com/terry/2011/02/06/gmzd-google-maps-zoom-out-distance/</link>
		<comments>http://blogs.fluidinfo.com/terry/2011/02/06/gmzd-google-maps-zoom-out-distance/#comments</comments>
		<pubDate>Sun, 06 Feb 2011 12:30:14 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[travel]]></category>
		<category><![CDATA[GMZD]]></category>
		<category><![CDATA[google-maps]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/?p=772</guid>
		<description><![CDATA[Here&#8217;s a fun and simple measure of distance between any two locations, A and B. First, find A using Google maps and zoom in (centered) as far as you can go, though don&#8217;t go into street view as lots of places still don&#8217;t have that. Now, if you can already see B on the map, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2011/02/slider.png"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2011/02/slider.png" alt="" title="slider" width="51" height="281" class="alignleft size-full wp-image-773" /></a>Here&#8217;s a fun and simple measure of distance between any two locations, A and B. First, find A using <a href="http://maps.google.com">Google maps</a> and zoom in (centered) as far as you can go, though don&#8217;t go into street view as lots of places still don&#8217;t have that. Now, if you can already see B on the map, it has a Google Maps Zoom-out Distance (GMZD) of zero because you don&#8217;t need to zoom out at all to see B.  If you have to zoom out once, then A and B are at distance 1 according to GMZD, etc.</p>
<p>For example, let&#8217;s start with <a href="http://bit.ly/fDd1I5">Union Square in New York</a>. Fully zoomed in we can see <a href="http://thecoffeeshopnyc.com/">Coffee Shop</a>, so that&#8217;s at distance 0. Those things are about a minute&#8217;s walk from the center of Union Square. Zooming out one click, we pick up Bowlmor Lanes on University Place and the Whole Foods Market at the South of Union Square. Those things are at GMZD-1. The outer edge of distance 1 is about a few minute&#8217;s walk from Union Square. Continuing outwards, <a href="http://betaworks.com">Betaworks</a> is at GMZD-4, Central Park at distance 6, Boston and Niagara Falls at distance 12, Florida, Winnipeg, and St John&#8217;s, Newfoundland at 14, San Francisco at 15, Barcelona at 16, and Sydney at 17. (Although you can zoom out 18 levels, GMZD-17 seems to be as many as you practically need to see anything.)</p>
<p>You can also think of GMZD as half the number of clicks you&#8217;d need to do on Google maps to go from being fully zoomed in on A to being fully zoomed in on B (with some panning in between). When you look at Google maps you can count the number of notches on the little slider (see image on left) above your current zoom level to see the GMZD from the center of the visible map to its outer edges.</p>
<p>Update: I meant to mention that GMZD is not a formal distance <a href="http://en.wikipedia.org/wiki/Metric_(mathematics)">metric</a>. It is non-negative (GMZD(A, B) >= 0) and symmetric (GMZD(A, B) = GMZD(B, A)) for all points A and B, but distinct points can be at distance zero and (as a result) the <a href="http://en.wikipedia.org/wiki/Triangle_inequality">triangle inequality</a> also does not hold (e.g., Union Square is distance zero from Coffee Shop, and Coffee Shop is distance zero from <a href="http://www.unionsquarecafe.com/">Union Square Cafe</a>, but the distance from Union Square to Union Square Cafe is one. Not being a metric space is what makes it interesting, though :-)</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2011/02/06/gmzd-google-maps-zoom-out-distance/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Pond scum</title>
		<link>http://blogs.fluidinfo.com/terry/2008/09/05/pond-scum/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/09/05/pond-scum/#comments</comments>
		<pubDate>Fri, 05 Sep 2008 13:53:19 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/09/05/pond-scum/</guid>
		<description><![CDATA[I had breakfast this morning at a bar in the Santa Caterina market in Barcelona with Jono Bennett. He&#8217;s a writer. We were reflecting on similarities in our struggles to do our own thing. An email about a potential Fluidinfo investor that I&#8217;d recently sent to a friend came to mind. I wrote: I had [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/09/2131361008_7e17583f3c_o.jpg" title="Pond scum"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/09/2131361008_7e17583f3c_o.thumbnail.jpg" alt="Pond scum" style="float: left; margin-right: 8px" /></a>I had breakfast this morning at a bar in the Santa Caterina market in Barcelona with Jono Bennett. He&#8217;s a writer. We were reflecting on similarities in our struggles to do our own thing. An email about a potential Fluidinfo investor that I&#8217;d recently sent to a friend came to mind. I wrote:</p>
<blockquote><p> I had a really good call with AAA. He told me he&#8217;s interested and wants to talk to BBB and CCC. I then got mail the next day from DDD (of the NYT) who told me he&#8217;d just had dinner with AAA and BBB and that they&#8217;d talked about my stuff. So something may happen there (i.e., I&#8217;ll never hear from them again).</p></blockquote>
<p>The last comment, that I&#8217;d probably never hear from them again, was entirely tongue-in-cheek. I wrote it knowing it was a possibility, but not really thinking it would happen.</p>
<p>But it did.</p>
<p>Things like that seem to be part &amp; parcel of the startup world as you attempt to get funded. I have often asked myself <em>how can it be possible</em> for things to be this way? How you can have people so excited, telling you and others you&#8217;re going to change the world, be worth billions, and then you never hear from them again?  (Yes, of course you have to follow up, and I did. But that&#8217;s not the point: If you didn&#8217;t follow up you&#8217;d never hear from them.)</p>
<p>How can that be? In what sort of world is such a thing possible?</p>
<p>I came up with a highly flawed analogy. Despite its limited accuracy I find it amusing and can&#8217;t resist blogging it even if people will label me bitter (I&#8217;m not).</p>
<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/09/2264534572_a39ac1fc50_o.jpg" title="Kids with sticks"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/09/2264534572_a39ac1fc50_o.thumbnail.jpg" alt="Kids with sticks" style="float: right; margin-left: 8px" /></a>First: startup founders are pond scum. Second: potential investors are a troupe of young kids wandering through the park with sticks.</p>
<p>The kids poke into the ponds, stirring up the scum. They&#8217;re looking for cool things, signs of life, perhaps even something to take home. They&#8217;re genuinely interested. They&#8217;re fascinated. The pond scum listen to their excited conversation and think the kids will surely be back tomorrow.  But it&#8217;s summer, and the world is so very very big.</p>
<p>The pond scum are working on little projects like photosynthesis, enhancements to the Krebs cycle, or the creation of life itself. All the while they&#8217;re pondering how to make themselves irresistible, believing that someday the kids with the sticks will be back, that they&#8217;ll eventually be scooped up.</p>
<p>As <a href="http://www.paulgraham.com/index.html">Paul Graham</a> recently wrote, <a href="http://www.paulgraham.com/fundraising.html">fundraising is brutal</a>. His #1 recommendation is to keep expectations low.</p>
<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/09/152285527_d7d4684f17_b.jpg" title="Kid with stick"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/09/152285527_d7d4684f17_b.thumbnail.jpg" alt="Kid with stick" style="float: left; margin-right: 8px" /></a>Yep, you&#8217;re pond scum.</p>
<p>Get used to it.</p>
<p>Embrace it.<br />
<br clear="all" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/09/05/pond-scum/feed/</wfw:commentRss>
		<slash:comments>17</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>Minor mischief: create redirect loops from predictable short URLs</title>
		<link>http://blogs.fluidinfo.com/terry/2008/07/01/minor-mischief-create-redirect-loops-from-predictable-short-urls/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/07/01/minor-mischief-create-redirect-loops-from-predictable-short-urls/#comments</comments>
		<pubDate>Tue, 01 Jul 2008 14:14:02 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[python]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/07/01/minor-mischief-create-redirect-loops-from-predictable-short-urls/</guid>
		<description><![CDATA[I was checking out the new bit.ly URL shortening service from Betaworks. I started wondering how random the URLs from these URL-shortening services could be. I wrote a tiny script the other day to turn URLs given on the command line into short URLs via is.gd: import urllib, sys for arg in sys.argv&#91;1:&#93;: &#160; &#160; [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/redirect.png" title="redirect loop"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/07/redirect.thumbnail.png" alt="redirect loop" style="float: left; margin-right: 8px" /></a>I was checking out the new <a href="http://bit.ly">bit.ly</a> URL shortening service from <a href="http://www.betaworks.com">Betaworks</a>.</p>
<p>I started wondering how random the URLs from these URL-shortening services could be. I wrote a tiny script the other day to turn URLs given on the command line into short URLs via <a href="http://is.gd">is.gd</a>:</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">import</span> <span class="kw3">urllib</span>, <span class="kw3">sys</span><br />
<span class="kw1">for</span> arg <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; <span class="kw1">print</span> <span class="kw3">urllib</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;http://is.gd/api.php?longurl=&#8217;</span> + arg<span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span></div>
<p>I ran it a couple of times to see what URLs it generated. Note that you have to use a new URL each time, as it&#8217;s smart enough not to give out a new short URL for one it has seen before. I got the sequence <tt>http://is.gd/JzB</tt>, <tt>http://is.gd/JzC</tt>, <tt>http://is.gd/JzD</tt>, <tt>http://is.gd/JzE</tt>,&#8230;</p>
<p>That&#8217;s an invitation to some minor mischief, because you can guess the next URL in the is.gd sequence before it&#8217;s actually assigned to redirect somewhere.</p>
<p>We can ask bit.ly for a short URL that redirects to our predicted next is.gd URL. Then we ask is.gd for a short URL that redirects to the URL that bit.ly gives us. If we do this fast enough, is.gd will not yet have assigned the predicted next URL and we&#8217;ll get it. So the bit.ly URL will end up redirecting to the is.gd URL and vice versa. In ugly Python (and with a bug/shortcoming in the nextIsgd function):</p>
<div class="dean_ch" style="white-space: nowrap;">
<span class="kw1">import</span> <span class="kw3">urllib</span>, <span class="kw3">random</span></p>
<p><span class="kw1">def</span> bitly<span class="br0">&#40;</span>url<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">urllib</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;http://bit.ly/api?url=&#8217;</span> + url<span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> isgd<span class="br0">&#40;</span>url<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="kw3">urllib</span>.<span class="me1">urlopen</span><span class="br0">&#40;</span><br />
&nbsp; &nbsp; &nbsp; &nbsp; <span class="st0">&#8216;http://is.gd/api.php?longurl=&#8217;</span> + url<span class="br0">&#41;</span>.<span class="me1">read</span><span class="br0">&#40;</span><span class="br0">&#41;</span></p>
<p><span class="kw1">def</span> nextIsgd<span class="br0">&#40;</span>url<span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; last = url<span class="br0">&#91;</span><span class="nu0">-1</span><span class="br0">&#93;</span><br />
&nbsp; &nbsp; <span class="kw1">if</span> last == <span class="st0">&#8216;z&#8217;</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; next = <span class="st0">&#8216;A&#8217;</span><br />
&nbsp; &nbsp; <span class="kw1">else</span>:<br />
&nbsp; &nbsp; &nbsp; &nbsp; next = <span class="kw2">chr</span><span class="br0">&#40;</span><span class="kw2">ord</span><span class="br0">&#40;</span>last<span class="br0">&#41;</span> + <span class="nu0">1</span><span class="br0">&#41;</span><br />
&nbsp; &nbsp; <span class="kw1">return</span> url<span class="br0">&#91;</span>:<span class="nu0">-1</span><span class="br0">&#93;</span> + next</p>
<p><span class="kw1">def</span> randomURI<span class="br0">&#40;</span><span class="br0">&#41;</span>:<br />
&nbsp; &nbsp; <span class="kw1">return</span> <span class="st0">&#8216;http://www.a%s.com&#8217;</span> % \<br />
&nbsp; &nbsp; &nbsp; &nbsp; &nbsp; &nbsp;<span class="st0">&#8221;</span>.<span class="me1">join</span><span class="br0">&#40;</span><span class="kw2">map</span><span class="br0">&#40;</span><span class="kw2">str</span>, <span class="kw3">random</span>.<span class="me1">sample</span><span class="br0">&#40;</span><span class="kw2">xrange</span><span class="br0">&#40;</span><span class="nu0">100000</span><span class="br0">&#41;</span>, <span class="nu0">3</span><span class="br0">&#41;</span><span class="br0">&#41;</span><span class="br0">&#41;</span></p>
<p>isgdURL = isgd<span class="br0">&#40;</span>randomURI<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;Last is.gd URL:&#8217;</span>, isgdURL</p>
<p>nextIsgdURL = nextIsgd<span class="br0">&#40;</span>isgdURL<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&#8216;Next is.gd URL will be:&#8217;</span>, nextIsgdURL</p>
<p><span class="co1"># Ask bit.ly for a URL that redirects to nextIsgdURL</span><br />
bitlyURL = bitly<span class="br0">&#40;</span>nextIsgdURL<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&#8216;Step 1: bit.ly now redirects %s to %s&#8217;</span> % <span class="br0">&#40;</span><br />
&nbsp; &nbsp; bitlyURL, nextIsgdURL<span class="br0">&#41;</span></p>
<p><span class="co1"># Ask is.gd for a URL that redirects to that bit.ly url</span><br />
isgdURL2 = isgd<span class="br0">&#40;</span>bitlyURL<span class="br0">&#41;</span><br />
<span class="kw1">print</span> <span class="st0">&#8216;Step 2: is.gd now redirects %s to %s&#8217;</span> % <span class="br0">&#40;</span><br />
&nbsp; &nbsp; isgdURL2, bitlyURL<span class="br0">&#41;</span></p>
<p><span class="kw1">if</span> nextIsgdURL == isgdURL2:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&#8216;Success&#8217;</span><br />
<span class="kw1">else</span>:<br />
&nbsp; &nbsp; <span class="kw1">print</span> <span class="st0">&#8216;Epic FAIL&#8217;</span></div>
<p>This worked first time, giving:</p>
<pre>
Step 1: bit.ly now redirects http://bit.ly/fkuL8 to http://is.gd/JA9
Step 2: is.gd now redirects http://is.gd/JA9 to http://bit.ly/fkuL8</pre>
<p>In general it&#8217;s not a good idea to use predictable numbers like this, which hardly bears saying as just about every responsible programmer knows that already.</p>
<p>is.gd wont shorten a <a href="http://tinyurl.com">tinyurl.com</a> link, as tinyurl is on their blacklist. So they obviously know what they&#8217;re doing. The bit.ly service is brand new and presumably not on the is.gd radar yet.</p>
<p>And finally, what happens when you visit one of the deadly looping redirect URLs in your browser? You&#8217;d hope that after all these years the browser would detect the redirect loop and break it at some point. And that&#8217;s what happened with Firefox 3, producing the image above.</p>
<p>If you want to give it a try, <a href="http://bit.ly/fkuL8">http://bit.ly/fkuL8</a> and <a href="http://is.gd/JA9">http://is.gd/JA9</a> point to each other. Do I need to add that I&#8217;m not responsible if your browser explodes in your face?</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/07/01/minor-mischief-create-redirect-loops-from-predictable-short-urls/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Manhole</title>
		<link>http://blogs.fluidinfo.com/terry/2008/05/09/manhole/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/05/09/manhole/#comments</comments>
		<pubDate>Fri, 09 May 2008 02:33:14 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/05/09/manhole/</guid>
		<description><![CDATA[[Listening just now to the Tiger Lillies song Bankrobber Blues I decided to post another little fictional story I wrote some years ago. The first in the series was Lucky Streak. As a kid I had a head full of criminal schemes and at times was convinced I'd inevitably grow up to be a cat [...]]]></description>
			<content:encoded><![CDATA[<p>[Listening just now to the Tiger Lillies song <em>Bankrobber Blues</em> I decided to post another little <em>fictional</em> story I wrote some years ago. The first in the series was <a href="http://blogs.fluidinfo.com/terry/2008/03/09/lucky-streak/">Lucky Streak</a>. As a kid I had a head full of criminal schemes and at times was convinced I'd inevitably grow up to be a cat burglar. Mathematician by day, cat burglar by night. It didn't pan out that way.]</p>
<p><strong>Manhole</strong></p>
<p>I recently became a photographer. Before high-quality digital cameras became available, I had never had an interest. Sure, I liked photos as much as the next person, but it was all so messy. So imprecise.  So&#8230; analog.  I mean why bother? I&#8217;m into digital music in a way I could never have been with tapes or vinyl. Why do anything else?  Nostalgia? Tradition? Gimme a break. Analog devices with linear access? Puhlease. I keep an eye on things, I have a feel for this stuff. When technology crosses some line, it&#8217;s time to buy in. Before that it&#8217;s just too messy.</p>
<p>I recently became a criminal. Historically, crime at a distance was always a challenge. Physical events took place, objects were exchanged, people met or talked on the phone. Messy, way too messy.  There was always a chain, a trail: someone had met the guy, someone had given someone else a brown paper bag stuffed with cash and a pistol. With time and money, the feds were eventually going to catch you. You couldn&#8217;t find good help, couldn&#8217;t recruit and train them, had to trust them, were betrayed or sold out, either to the cops or a rival. Whatever. It made no sense, unless you were the mob and you paid everyone off. Or bumped them off. Messy.</p>
<p>The internet changed all that. No government wants to allow anonymous action, but the net was too big. For nearly twenty years I have watched and been amazed that they didn&#8217;t do something to stop it. Now it&#8217;s too late, far too late. Anonymous action is possible. It&#8217;s not straightforward, one must be careful, but it can be done. Tools like mixmaster (anonymous remailer), spamgourmet (similar), the anonymizer (anonymous browsing), ssh tunnels, cheap and disposable machines for rent on the network running simple forwarding servers, paypal for anonymous transfers of cash, public auction sites for posting messages to those who know what to look for, steganography, instant messaging, strong crypto, wide open windows boxes (with broadband connections and fixed IP addresses) just waiting to be commandeered, etc. The tools are all out there and in most cases they&#8217;re freely available. With some knowledge, one can carefully build an action network that no-one&#8217;s ever going to trace. The whole point of some of these tools is to preserve anonymity. No logs are kept.  Subpoenas are useless when there simply are no records.</p>
<p>Just to warm up, I robbed a bank. Not a white-collar electronic robbery. I&#8217;m talking blue-collar physical bank robbery. It&#8217;s hardly a well-paying profession, but it&#8217;s a good lark.  In fact, it pays rather badly. It&#8217;s also increasingly common and easier, as tellers and other bank staff are instructed to do exactly as told, not to make a fuss, etc.  So why rob a bank? Well, why take a dumbass picture of a tree or your pet dog with your new digital camera? Why? Because you have the technology and you want to try it out. Because you can. Because you&#8217;ve gone digital and you can take a no-cost snap of whatever you damned well please.</p>
<p>I, physically, robbed a bank. That&#8217;s messy, true. But at some point I wanted skin in the game, wanted the whole thing to be real, to prove that it all worked. Plus, I can&#8217;t solve everything at once: I didn&#8217;t want someone else actually robbing the bank. That way, I&#8217;d either never see the money or I&#8217;d leave a trail that could be followed. So I planned carefully and I did it myself.</p>
<p>I recruited a dozen people online. That was actually the easy part.  There&#8217;s any number of bored and broke college kids out there on the net.  I made two roles: watchers and actors. I had actors do various silly extroverted tasks and each time had a watcher turn up to verify that the actor showed up. Everyone got different instructions and everyone was told enough and reported enough back to me so that a) actors knew they were being watched and b) I knew the test tasks were in fact getting done. I paid on task completion and verification.  An actor would be instructed to do something oddball and very specific, like walk into a 7-eleven at a certain time in the middle of summer, buy six dozen hotdogs and a case of Bud Lite and comment to the cashier that it sure did look like it might snow.  I&#8217;d schedule a watcher, and tell them to look out for the person who bought six dozen hotdogs and said how it looked like snowing. The watcher would be told to pay special attention to the other purchases and to the shoes of the purchaser. Afterwards, when I heard back from both, I&#8217;d ask the watcher what the other purchase was and tell the actor what sort of shoes they were wearing.  So the actor knew that I was in the loop and I could verify that the watcher had been there to verify. Everyone had to do their part or I&#8217;d know. In this way, I built up the confidence of my players: they knew that the game was for real and that, for whatever reason, if they just did some seemingly random and simple acts from time to time, they&#8217;d be paid. I let the actors and watchers take turns at both roles. If they ever asked what the deal was I just told them I was a university psych professor experimenting on social norms.</p>
<p>I admit this took some time. Two months. I had a few dropouts: people who found it too weird, people who tried to cheat by not turning up while claiming they did, people who just dropped out of contact.</p>
<p>When I was ready, I gave all my little helpers an identical task, each at a different bank. Each was to walk into their appointed bank, get in line for a teller, hand the teller a note that said they had a gun and to hand over all the cash from the drawer.  Having done that, the actor was to turn and walk straight out of the bank. No watchers, just twelve people playing actors. Everyone dressed the same. I figured several would drop out at this stage, but on the other hand I&#8217;d had them doing some pretty silly stuff, pushing the edge, and I knew at least half of them would be up for it. I also know a thing or two about banks. When the note gets to the teller, the first thing they&#8217;ll do is trigger the silent alarm.  The security guard in the bank will still be clueless, but the bank manager will see it and so will the cops, who are directly connected.</p>
<p>The banks are dotted around midtown Manhattan. The area&#8217;s thick with banks and crazy with traffic. Between 11:00 and 11:05 on July 2, the day before the holiday weekend break, the direct-connect police alarm systems of the 5th and 6th precincts go nuts. Cops cars are scrambled and routed to what turns out to be nine simultaneous false-alarm bank robberies. And one real robbery.</p>
<p>I walk into my bank at ten minutes after eleven. I&#8217;m dressed in a red shirt, just like my actors who are busy triggering the alarms in a dozen other midtown banks.  After a few minutes I reach the teller and hand her a note: &#8220;I have a gun. Keep your mouth shut. Pass me all your cash.&#8221; After a pause, she does this without a word. That&#8217;s the training, the banks learned that one a long time ago. A hero teller or guard taking a bullet winds up costing more than dozens of unsophisticated heists. Plus the banks are fully insured. So teller training is explicit: trigger the silent alarm and do anything the nasty bank robber tells you to.</p>
<p>I sweep the cash into my bag, there couldn&#8217;t have been more than $10,000 probably closer to $5,000. I hand her two more notes: &#8220;The client at my window has a gun. Keep your mouth shut. Pass all the cash from your drawer to your right.&#8221;  The other is identical, for the other direction. I indicate that she should pass them the notes, which she does. Handfuls of cash are passed from one to another between five tellers, under the glass to me, where I drop them into my bag.  Other customers look on, and I guess they figure something odd is happening, but of course no-one says anything.</p>
<p>Start to finish, I&#8217;m there putting money into my bag for less than two minutes. Up until the point the first cash hit my bag, I had a pretty good story: some random person on the internet put me up to it, got me to do all this weird shit, watch others do weird random stuff, paid me through paypal. With the money in my bag though, the game has changed.  I know the silent alarm was probably tripped in the first thirty seconds.  With your typical mid-morning midtown traffic chaos and the cops already dispatched to at least half a dozen banks apparently being robbed simultaneously, I figure they may not get here for twenty minutes.  I&#8217;m not counting on the delay any more than I have to, but I figure my margin for error is pretty healthy.</p>
<p>I walk out the front door. Fifteen steps from the bank entrance is a convenient manhole. And look&#8230; the cover is already off. The hole is surrounded by four orange cones connected by official-looking Men At Work tape.  Of course this is my doing: started and finished a few minutes before entering the bank.  From my bag I take a hard hat, some old gloves, and an orange reflective sleeveless vest. Standard issue street crew garb, bought for a few bucks here and there at thrift stores.  I pick up the steel tool used for removing manhole covers and drop it into the hole.  The rest of my props I leave for the cops. I climb down into the hole and pull the cover across on top of me.  Although the covers are heavy, putting one in place is actually a surprisingly easy job when done from below.</p>
<p>The sewers of Manhattan are pretty ugly, despite large-scale efforts to sanitize and modernize them in the 90s. But there&#8217;s no need to stay down for long in order to simply disappear. I&#8217;ve walked this route before a few times. It&#8217;s no big deal. How do I know all this? The plans are on the net: obtained and published online by some urban spelunking group.  Along the way I remove the red shirt and put it in my bag. A little over six minutes later I emerge from another manhole in a lane behind a hotel.  A couple of suits are standing outside having a smoke.  Nothing if not brazen, I bludge a cigarette and a light from one of them.  He&#8217;s only too happy to help a working man in a hard hat. Show his mates he&#8217;s on good terms with blue collar America.  With a false mustache, non-prescription glasses, a vest, and the hard hat, there&#8217;s not going to be much to go on later, even if these guys do wind up talking to the cops. Besides, as is well known, witnesses are wonderfully unreliable, so the more the merrier as far as I&#8217;m concerned. You&#8217;ve got to know how these things work and use them to your advantage. I tell the suits I&#8217;m on a break from the sewer, got to go to my bank, and off I slouch. Around the first corner I remove the working gear and it goes into my bag too. By my reckoning, the cops wont have even gone down the manhole outside the bank.  At most they&#8217;ll have a call in for someone to remove the cover.  They&#8217;ll also know that I&#8217;m probably no longer underground.</p>
<p>I walk down into the subway and head home to count my cash ($47,000 and change) and to catch the headline news: Daring daylight robbery!  Criminal mastermind! Nine (only nine) banks used to create a distraction while one was well and truly robbed. The police chief is interviewed, indignant: we&#8217;ll hunt these men down and put them where they belong. A sophisticated operation like this isn&#8217;t done in a vacuum.</p>
<p>Well, good luck chief. For me this is just the beginning, just a proof of concept really. No-one should have to rob banks for a living. That kind of crime doesn&#8217;t pay well enough, even if you never get caught.  Of course, I have other plans. As the world becomes more digital, less messy, things will only get easier for those who have the balls.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/05/09/manhole/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Digital camera found in Barcelona. Do you know these girls?</title>
		<link>http://blogs.fluidinfo.com/terry/2008/04/19/digital-camera-found-in-barcelona-do-you-know-these-girls/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/04/19/digital-camera-found-in-barcelona-do-you-know-these-girls/#comments</comments>
		<pubDate>Sat, 19 Apr 2008 17:51:13 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[barcelona]]></category>
		<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/04/19/digital-camera-found-in-barcelona-do-you-know-these-girls/</guid>
		<description><![CDATA[We found a digital camera down in Barceloneta this afternoon. Here are a couple of the images on it. Do you know these girls? The menu on the camera is in German. You can see why I&#8217;m desperate to get them their camera back.]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/cimg1269.jpg" title="tounges"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/cimg1269-small.jpg" alt="tounges small" style="float: left; margin-right: 8px" /></a>We found a digital camera down in Barceloneta this afternoon. Here are a couple of the images on it.</p>
<p>Do you know these girls?</p>
<p>The menu on the camera is in German.</p>
<p>You can see why I&#8217;m desperate to get them their camera back.<br />
<br clear="all" /></p>
<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/cimg1268.jpg" title="three girls"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/cimg1233-small.jpg" alt="three girls small" style="float: left; margin-right: 8px" /></a></p>
<p><br clear="all" /></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/04/19/digital-camera-found-in-barcelona-do-you-know-these-girls/feed/</wfw:commentRss>
		<slash:comments>11</slash:comments>
		</item>
		<item>
		<title>Paper on the global spread of influenza published in Science</title>
		<link>http://blogs.fluidinfo.com/terry/2008/04/18/paper-on-the-global-spread-of-influenza-published-in-science/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/04/18/paper-on-the-global-spread-of-influenza-published-in-science/#comments</comments>
		<pubDate>Fri, 18 Apr 2008 14:03:09 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/04/18/paper-on-the-global-spread-of-influenza-published-in-science/</guid>
		<description><![CDATA[I spent Sept. 2004 to Sept. 2007 as a postdoc in the Zoology Department at the University of Cambridge. We did research into influenza virus using a technique we called Antigenic Cartography. I don&#8217;t want to go into details now or here, but I do want to say that we yesterday published a paper in [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/080416141011.jpg" alt="flu spread" style="float: left; margin-right: 8px" />I spent Sept. 2004 to Sept. 2007 as a postdoc in the <a href="http://www.zoo.cam.ac.uk">Zoology Department</a> at the <a href="http://www.cam.ac.uk">University of Cambridge</a>. We did research into influenza virus using a technique we called <a href="http://antigenic-cartography.org">Antigenic Cartography</a>.</p>
<p>I don&#8217;t want to go into details now or here, but I do want to say that we yesterday published a paper in <a href="http://www.sciencemag.org">Science</a>. The paper&#8217;s title is <em>The Global Circulation of Seasonal Influenza A (H3N2) Viruses</em>. It digs into how flu viruses circulate around the world and what happens to them in the off season (summer) in temperate zones. This paper was years in the making. And if you consider the data collected by the worldwide influenza surveillance network, it has been decades in the making. As a result the paper has 28 authors, many of whom work at the international flu collaborating centers.</p>
<p>Here&#8217;s the official <a href="http://www.sciencemag.org/cgi/content/abstract/320/5874/340">paper in Science</a>. There&#8217;s a ton of other coverage, including stories in <a href="http://www.sciencedaily.com/releases/2008/04/080416141011.htm">Science Daily</a>, <a href="http://www.newscientist.com/article/dn13724-revealed-the-asian-source-of-the-annual-flu-epidemic.html?DCMP=ILC-hmts&amp;nsref=news1_head_dn13724">New Scientist</a>, the <a href="http://www.latimes.com/news/nationworld/nation/la-sci-flu17apr17,1,1623801.story">LA Times</a>, the <a href="http://www.washingtonpost.com/wp-dyn/content/article/2008/04/16/AR2008041603484.html">Washington Post</a>, <a href="http://news.nationalgeographic.com/news/2008/04/080416-flu-migration.html">National Geographic</a>, <a href="http://www.timesonline.co.uk/tol/life_and_style/health/article3760959.ece">Times Online</a>, <a href="http://uk.reuters.com/article/scienceNews/idUKN1635855020080416">Reuters</a>, the <a href="http://ap.google.com/article/ALeqM5jK-uv-h1k9i5OG_lDMX97YzWLqqQD90332J81">Associated Press</a>, the <a href="http://online.wsj.com/article/SB120836448930019901.html?mod=googlenews_wsj">Wall Street Journal</a>, and <a href="http://www.sciam.com/article.cfm?id=that-flu-you-caught-it-ca">Scientific American</a>. There are plenty more links (currently) available at <a href="http://news.google.com">Google News</a> if you search for influenza.</p>
<p>I&#8217;m listed as the #2 author, but it&#8217;s really my close friends the first and last authors, <a href="http://www.zoo.cam.ac.uk/zoostaff/russell.htm">Colin Russell</a> and <a href="http://www.zoo.cam.ac.uk/zoostaff/smithd.html">Derek Smith</a>, who did the heavy lifting on making this paper a reality. It&#8217;s so nice to see the thing finally published and getting such wide attention.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/04/18/paper-on-the-global-spread-of-influenza-published-in-science/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Could someone please give Natalie Jeremijenko a MacArthur grant?</title>
		<link>http://blogs.fluidinfo.com/terry/2008/04/14/could-someone-please-give-natalie-jeremijenko-a-macarthur-grant/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/04/14/could-someone-please-give-natalie-jeremijenko-a-macarthur-grant/#comments</comments>
		<pubDate>Mon, 14 Apr 2008 22:05:34 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/04/14/could-someone-please-give-natalie-jeremijenko-a-macarthur-grant/</guid>
		<description><![CDATA[Could someone please give Natalie Jeremijenko a MacArthur &#8220;genius&#8221; Grant? Thank you. I&#8217;m not in charge of these things, obviously. If I were though, I&#8217;d be hoping to see Natalie nominated so I could give her a grant. She&#8217;s a poster child for a genius grant (as is my good friend Derek Smith; but that&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/42t.jpg" alt="natbot" /></p>
<p>Could someone please give <a href="http://en.wikipedia.org/wiki/Natalie_Jeremijenko">Natalie Jeremijenko</a> a <a href="http://www.macfound.org/site/c.lkLXJ8MQKrH/b.959463/">MacArthur &#8220;genius&#8221; Grant</a>?</p>
<p>Thank you.</p>
<p>I&#8217;m not in charge of these things, obviously. If I were though, I&#8217;d be hoping to see Natalie nominated so I could give her a grant. She&#8217;s a poster child for a genius grant (as is my good friend <a href="http://www.zoo.cam.ac.uk/ZOOSTAFF/smithd.html">Derek Smith</a>; but that&#8217;s another story). I just spent 2 hours chatting with Natalie in her NYU office.</p>
<p>Here&#8217;s a <a href="http://www.salon.com/ent/feature/2006/06/22/natalie/">long article about her</a> in <a href="http://www.salon.com/">Salon</a>.</p>
<p>The MacArthur Foundation moves in mysterious ways. And so does the blogosphere. So I send out this tiny tug on the invisible strings to my invisible readers, asking them to tug in turn. Like many of Natalie&#8217;s many projects, a little collective tugging might do wonders.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/04/14/could-someone-please-give-natalie-jeremijenko-a-macarthur-grant/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Everything you think you know is wrong</title>
		<link>http://blogs.fluidinfo.com/terry/2008/04/11/everything-you-think-you-know-is-wrong/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/04/11/everything-you-think-you-know-is-wrong/#comments</comments>
		<pubDate>Fri, 11 Apr 2008 00:05:03 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/04/11/everything-you-think-you-know-is-wrong/</guid>
		<description><![CDATA[I&#8217;m often surprised at how confident people are about their knowledge of the world. Looking at the history of thought and of science, you quickly see that it&#8217;s strewn with discredited and totally incorrect theories about almost everything. So I don&#8217;t understand why it&#8217;s not more commonplace to look at history and to arrive immediately [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/davegoodman/126995001/"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/126995001_1dfc561088_o.thumbnail.jpg" alt="wrong" style="float: left; margin-right: 8px" /></a>I&#8217;m often surprised at how confident people are about their knowledge of the world. Looking at the history of thought and of science, you quickly see that it&#8217;s strewn with discredited and totally incorrect theories about almost everything. So I don&#8217;t understand why it&#8217;s not more commonplace to look at history and to arrive immediately at the most likely conclusion: that we too have almost everything wrong.</p>
<p>I don&#8217;t mean that literally <em>everything</em> we think is completely wrong. Some things are certainly partly right, or even mainly or fully right. But to have a high degree of confidence, or to assume we&#8217;re right just because we know so much more about the world than our ancestors did, or simply because we think we&#8217;re right, is just inviting ridicule. Considering our record, and our continual attendant misguided arrogance and confidence along the way, you&#8217;d be nuts to think that we know much today or that our confidence adds any weight at all. Many thousands of years of history argue strongly against that conclusion.</p>
<p>Thinking that almost everything is probably wrong in some important fundamental way is a useful default. That attitude stands you in good stead for digging into things, for reconsidering them, for asking questions at a low level. In mathematics when you know for sure that something is wrong (or right) it helps enormously in proving it. It&#8217;s a psychological thing. In my dissertation I proved a statistical result that I <em>knew</em> must be true from running simulations. It took me a week or two to nail the proof, and I would never have gotten there if I hadn&#8217;t known in advance that the equality I was trying to prove analytically was certainly true (pp 201-207 <a href="http://jon.es/research/phd.pdf">here</a> in case you&#8217;re interested).</p>
<p>As an example of something that I think will be overturned, I think we&#8217;ll come to regard our decades of designing computational systems according to the <a href="http://en.wikipedia.org/wiki/Von_neumann_architecture">Von Neumann Architecture</a> as extremely primitive. Maybe that will involve some form of analog or quantum computation. I think we&#8217;ll take more and more from nature, for instance in solving optimization problems.</p>
<p>On a less grandiose note but still important, I think we&#8217;ll look back on our current information architecture and also see it as being extremely primitive. Or, as I&#8217;ve <a href="http://blogs.fluidinfo.com/terry/2008/01/04/tagging-in-the-year-3000-bc/">said before</a>, we&#8217;re living in the shadow of information architecture decisions that were made decades ago. I think that&#8217;s all hopelessly wrong. In the real world, information processing simply doesn&#8217;t look much like a hierarchical file system.</p>
<p>Hence Fluidinfo.</p>
<p>And so ends another semi-cryptic and ultimately unsatisfying post. I do, as always, plan to eventually say more. And I will.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/04/11/everything-you-think-you-know-is-wrong/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>A curiously empty space in the heart of Manhattan</title>
		<link>http://blogs.fluidinfo.com/terry/2008/04/02/a-curiously-empty-space-in-the-heart-of-manhattan/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/04/02/a-curiously-empty-space-in-the-heart-of-manhattan/#comments</comments>
		<pubDate>Wed, 02 Apr 2008 00:06:45 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[travel]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/04/02/a-curiously-empty-space-in-the-heart-of-manhattan/</guid>
		<description><![CDATA[I was taken to lunch at the New York Yacht Club today by Ted Carroll of Noson Lawen Partners. By some miracle I happened to be dressed well enough to just scrape in &#8211; sans jacket and tie. It&#8217;s not the sort of place too many casual NY visitors get to see. Suffice to say, [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/img_0033.jpg" title="empty cup room"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/img_0033.thumbnail.jpg" alt="empty cup room" style="float: left; margin-right: 8px" /></a>I was taken to lunch at the <a href="http://www.nyyc.org/">New York Yacht Club</a> today by Ted Carroll of <a href="http://www.nosonlawenpartners.com/">Noson Lawen Partners</a>. By some miracle I happened to be dressed well enough to just scrape in &#8211; sans jacket and tie. It&#8217;s not the sort of place too many casual NY visitors get to see. Suffice to say, they&#8217;re a little on the exclusive side.</p>
<p>After lunch, Ted took me up to the cup room. Or the room that <em>used</em> to be the cup room. You see, there&#8217;s a slight problem. No cup. The room was specially built to hold the <a href="http://en.wikipedia.org/wiki/America's_Cup">America&#8217;s Cup</a>. It&#8217;s perfect, and even has a little viewing platform like the prow of a boat. It&#8217;s a beautiful space. And it&#8217;s totally empty.</p>
<p>I&#8217;m not much of one for nationalistic pride. But I couldn&#8217;t resist a little twinge of pleasure recalling that fateful day the Australian boat won the cup after the US had held it for 132 years. Bob Hawke, the Australian Prime Minister, appeared on TV in a bright Green and Gold kangaroo-covered jacket to declare that &#8220;any boss who fires a worker for not turning up today is a bum&#8221;. It was quite a scene. Good for yachting, I should think, just like when the England cricket team finally beat the Australians a few years ago.</p>
<p>Standing there in the exact spot that the America&#8217;s Cup had so immovably and confidently occupied for 132 years was really something. You could almost feel the sense of confusion and cognitive dissonance emanating from that empty space and flowing out to unbalance the entire club building. Ted took photos with his iPhone while I thought of <a href="http://en.wikipedia.org/wiki/Ozymandias">Ozymandias</a>, joked with the staff, and tried to sound like I was from somewhere else.</p>
<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/img_0034.jpg" title="model room"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/04/img_0034.thumbnail.jpg" alt="model room" style="float: left; margin-right: 8px" /></a>Then it was upstairs to the banquet hall and model room. There are many hundreds of model yachts on the walls and in glass cases. There are perfect models of every boat to win the America&#8217;s Cup, and yes I checked out <a href="http://en.wikipedia.org/wiki/Ben_Lexcen">Ben Lexcen</a>&#8216;s  famous <a href="http://en.wikipedia.org/wiki/Winged_keel">winged keel</a>. The accompanying plaque was careful to point out that the boat&#8217;s measurements were allowed by the rules. Unwritten: the spirit of yachting itself was shamelessly violated by the genius upstart designer from down under, but, strictly speaking, the boat was legal.</p>
<p>It&#8217;s quite a sight.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/04/02/a-curiously-empty-space-in-the-heart-of-manhattan/feed/</wfw:commentRss>
		<slash:comments>4</slash:comments>
		</item>
		<item>
		<title>Lucky Streak</title>
		<link>http://blogs.fluidinfo.com/terry/2008/03/09/lucky-streak/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/03/09/lucky-streak/#comments</comments>
		<pubDate>Sat, 08 Mar 2008 23:18:50 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[me]]></category>
		<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/03/09/lucky-streak/</guid>
		<description><![CDATA[My good friend Emily used to try to get me to write more. We had to find a way to turn it into a competition to get me to do it. Today I was talking to another friend on Skype and was reminded of the following story I wrote for Emily. So I&#8217;m posting it [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/03/img_0494.jpg" title="lucky streaks"><img src="http://blogs.fluidinfo.com/terry/wp-content/uploads/2008/03/img_0494.thumbnail.jpg" alt="lucky streaks" style="float: left; margin-right: 8px" /></a>My good friend Emily used to try to get me to write more. We had to find a way to turn it into a competition to get me to do it. Today I was talking to another friend on Skype and was reminded of the following story I wrote for Emily. So I&#8217;m posting it here. Maybe some other enterprising (and less scrupulous?) entrepreneur can implement it. I bet it would work.</p>
<p>By modern web attention span standards, this is really <a href="http://blogs.fluidinfo.com/terry/2007/06/14/its-long/">long</a>.</p>
<p><strong>LUCKY STREAK</strong></p>
<p>They say the first million is always the hardest. In my case it was actually pretty easy; it just took me a long time to figure out how to do it. They also say &#8220;if you&#8217;re so smart, why aren&#8217;t you rich?&#8221;  Although I don&#8217;t think anyone ever asked me that, I could never shake the question after I first came across it. It always rankled me somehow. If you&#8217;re that damned smart, making a mere million bucks shouldn&#8217;t even raise a sweat. Just think of all the rich idiots you&#8217;ve met over the years. What do they have that you don&#8217;t? Luck?</p>
<p>Anyway, that&#8217;s all the past. The computer I&#8217;m using right now has a monster 52 inch flat-screen plasma display. I&#8217;m listening to some of my favorite music on a $27,000 stereo system. I have wireless everything. There&#8217;s a high-speed multi-homed satellite connection to the internet hidden in the turret of my castle, and several high-performance motor cars in my graveled driveway. Did I say castle?  Correct. I&#8217;m in a 16th century castle on a hill in Spain. It&#8217;s mine.  So just how smart am I? It&#8217;s hard to say with certainty, but I&#8217;m one certifiably rich white dude. And I&#8217;m still raking it in. Over $3M a month, clear. It&#8217;s a one-man operation and I work about one hour a week.</p>
<p>Here&#8217;s my story.</p>
<p>The seed was sown when a friend told me about the following possibility.  First of all, buy a mailing list of 50 million email addresses. These can be had online for under $100. Then, pick some sporting event (let&#8217;s say) and make a prediction at random about the outcome: team X will beat team Y (ignore draws for now, that&#8217;s just a detail). Send your prediction, couched in the appropriate language about mystical forces, seeing the future etc, to all 50 million people on your mailing list. After the event takes place, half of the people you mailed will have received a correct prediction from you. Chuck out the 25 million addresses of the people who got the incorrect prediction.  Now pick another upcoming event.  Make a prediction at random and mail it to your 25 million survivors. Do this ten times.  Each time, say a little more about how omniscient you are in your email, about how you can look into the future. Whatever. After ten mailings you&#8217;ll be down to 50,000 people who will have all received ten correct predictions from you.</p>
<p>I probably don&#8217;t need to mention that at this point you&#8217;re going to have about 50,000 new friends. You could probably start a religion.  You could probably make some real money.</p>
<p>That&#8217;s the setup.  The problem my friend posed: what to do with these 50,000 believers?  How can you turn them into money, and in such a way that you also stay out of jail? Clearly you could pull a crude one-time scam. For example, offer to send them (for a price, naturally) the device you were using to make your predictions, and then mail them a Magic 8 ball. Solutions like that are obvious, but they&#8217;re very unsatisfying.  For one, you&#8217;re blowing away all you credibility in one go. For two, you&#8217;re going to have some fraction of 50,000 people complaining that they&#8217;ve been scammed (i.e., you&#8217;re going into hiding or you&#8217;re perhaps going to jail). And for three, you wont make that much money: maybe a million before you figure your costs, and that&#8217;s under the highly unrealistic assumption that you&#8217;ll be able to convince all those 50,000 people to simultaneously pay you $20 each. So while the basic idea holds water, it&#8217;s not clear where to take it and how to maximize its potential while staying on the right side of the law.</p>
<p>I admitted the idea was good. At first I didn&#8217;t see what to make of it, if anything. Then two months later, lying in bed, I realized I knew exactly what to do. I quit my job the next day.</p>
<p>I&#8217;ll tell you what I do. But first&#8230;.. Why would I tell you? Because I&#8217;ve learned, though actually I knew before I started it, that it just doesn&#8217;t matter if you know. It&#8217;s not the first time I&#8217;ve spilled the beans either, though it is the most explicit and it&#8217;s the first time in writing. It just doesn&#8217;t matter. Hardly anyone would believe you if you told them the truth. Not even if you presented them with a copy of this with my signature at the bottom. Some would say &#8220;well of course&#8221; but the rest, the great majority of my users, would be more inclined to argue passionately with you and even stop speaking to you if you will not admit your error. And nope, I&#8217;m not kidding.</p>
<p>First of all, I use a trade secret algorithm which combines a person&#8217;s email address with the text of a question and comes up with a yes/no answer. The secret sauce, oh so special, far too secret for mere patent protection, is in fact based on a simple MD5 checksum of the concatenated email address and question text. If the first character of the MD5 checksum is 0 to 7, the answer to the question for the person with that email address is Yes. Otherwise it&#8217;s No. The system can generate millions of these predictions in minutes.</p>
<p>To prime the service, I just sent out the predictions to people. My initial list was 35 million (valid, non-bouncing, unique) email addresses, and I didn&#8217;t whittle it down at all when people got sent a wrong prediction. Once I&#8217;d gone through ten iterations, the plan went into serious action.</p>
<p>The main point is to change the focus of the original idea. In the original, the focus or pretense is that you can predict the future.  Some number of people are going to believe you. But you&#8217;d better take advantage of that belief as quickly as possible because they&#8217;re going to stop believing pretty fast once you go wrong and it begins costing them. If you&#8217;re infallible and then you start screwing up regularly, you can kiss it all goodbye pretty quick smart.</p>
<p>The new focus? Luck. Instead of telling people you can predict the future, you tell them that everyone has lucky (and unlucky) streaks and that you&#8217;ve come up with a way to detect when people are on a roll.  You tell them up front (click here to accept the Terms and Conditions of service) that you explicitly cannot predict the future. That they should not bet on your predictions. That, as everyone knows, lucky streaks always come to an end, etc. You cover your ass here. What I offer is a service that advises people when it looks like they&#8217;re on a lucky (or unlucky) streak.</p>
<p>After the initial priming, all 35 million emails got a further email introducing them to lucky-streak.com. The introductory email depended on the number of initial predictions the system got right for the email address in question. The people who got sent ten correct initial predictions received a very different email from the ones who had an average time of it. Those with a very low success rate got an appropriate letter. Naturally, the take up rate for the service was extremely heavily skewed towards those who got many correct predictions, with a clear bump at the end of the distribution for those with zero correct predictions.</p>
<p>I mail out the predictions (this is a per-user configuration option) and make them available online so that users can see their prediction history. See their luck. For those that want it, an email or SMS text alert is sent to their PDA or mobile phone to tell them just when it looks like they&#8217;re on a roll or when their lucky streak seems to be over or ending. All this for $1.99 a month.</p>
<p>I have a couple of servers, located in Seeland. It&#8217;s an offshore secure site with basically no laws. The server takes credit card payments and transfers are made to accounts at one of several banks. Cayman Islands, Bermuda, Switzerland, Channel Isles, etc. I have about 30 offshore bank accounts in seven principalities. My business is highly welcomed, and absolutely no questions have ever been asked. In my very occasional visits to these banks, I am treated like royalty. I tip.</p>
<p>Users get to define their own concept of lucky streak. On average, people choose about 4.3. That is, if 4 or 5 of my predictions go their way in a row, they consider themselves to be in a lucky phase. If the same number go against them, they consider themselves to be unlucky.  When these things happen, I send out an alert. Consequently, something between 1/16th and 1/32nd of my users are feeling lucky at any one time and roughly the same fraction are being a little bit more cautious than normal. But that&#8217;s neither here nor there &#8211; the service costs the same whether you&#8217;re in a lucky phase or not. I don&#8217;t pretend to know anything for sure. No guarantees, no extra charges.</p>
<p>So I&#8217;m like a horoscope service or a palm reader.  Everyone knows the service makes mistakes, but people love it. And I mean they _really_ love it. Even when their friends tell them it&#8217;s a fraud and that there must be some trick, even if they explain the trick, the believers refuse to listen. They come back for more.  You can sign up for a year&#8217;s worth for a mere $15. Hundreds of thousands of people take that option.</p>
<p>Behind all this are a couple of machines with a simple database. Just linux PCs from Dell. Nothing too special. The database holds email addresses, the prediction questions, and the record of predictions for each user. When a user pulls up their history, I simply generate a line of recent predictions (red dot = wrong, green dot = right) and let them click on these to see the underlying question. It&#8217;s pretty easy to see when you&#8217;re on a roll. Lucky and unlucky streaks are undeniable. Of course, most of the time, most people are not on any kind of streak. But that&#8217;s no problem, that&#8217;s exactly what people expect.  After all, you can&#8217;t be lucky all the time.</p>
<p>Legally, I&#8217;m pretty well covered. First of all, I&#8217;m quite hard to locate. I spent several grand on a $400/hr lawyer in New York, crafting the Terms and Conditions agreement. It&#8217;s very explicit. It states that my predictions may have no more than a 50% chance of being correct. It warns that users should use the service for entertainment only, and under no circumstance as the basis for any kind of betting or other decision making. It tells them that the concept of a lucky streak is extremely nebulous and unproven and that even if there is such a thing it may end without any warning and at any moment. Then there are half a dozen paragraphs of disclaimers and acknowledgements that basically amount to a General Release. I&#8217;ve received two legal challenges over the last two years and both have quickly been thrown out long before reaching any court as the result of filing for declarative judgments. The Terms and Conditions are pretty ironclad.  The average time new users spend between receiving the page and clicking &#8220;I Agree&#8221;? About two seconds.</p>
<p>Naturally, people do bet on my predictions, and in general, when they receive an alert to tell them they may be on a lucky streak.  Not surprisingly, that seems to be the principal reason people use the service. In fact, I typically receive a couple of hundred grateful emails a month offering me some cut of their winnings!  For legal reasons, I always politely decline and instead suggest that they make a contribution to the political party of their choice. The government isn&#8217;t too likely to shut me down. In fact, I expect such contributions are pretty scarce. In any case, as far as I&#8217;ve been able to determine, I fall outside the jurisdiction and legal system of all countries except the one I reside in and residence itself is invariably a mathematical concept. Just by spending perpetual spring and early summers in various locations around the world, following the sun, it&#8217;s not at all clear that I&#8217;m a resident of any country or where taxes might be due, supposing any are due at all. The internet created some extraordinarily gaping holes that the historical national tax and legal systems are going to have a hard time filling any time soon.</p>
<p>So that&#8217;s it. Right now (and I do mean right now) I have exactly 1,348,216 monthly subscribers at $1.99 a month, plus 703,237 subs who paid the $15 in advance for a year of alerts. That works out at a touch over $3.5M per month.  I have no staff and almost nothing to do. Sometimes, I even consider going back to my old job. The servers have multiple redundant independent power supplies, hourly tape backup, RAID arrays, etc. They&#8217;re locked down with tight firewalls and the security team at Seeland apply patches on the rare occasion any problem is found (only 3 patches have been applied in two years &#8211; one to apache and two to ssh).  The credit card companies take a small cut. They love me too, and are lobbyists with considerable clout. My monthly hosting, service and traffic charge is about a thousand bucks. It took me four months to get the site together originally (this done in parallel with sending out the initial predictions). The lucky-streak.com domain costs me $15 a year.</p>
<p>My users love me too. They thank me. They believe. They have chat rooms, mailing lists, IRC channels, and even support groups (only in America of course). There&#8217;s a hard core that refuse to believe something so accurate could possibly be a scam. I&#8217;m giving them something they want.  They evangelize. They proselytize. They swear by me. And yes, they occasionally swear at me. Articles about the site have appeared in the international media and in many national and regional papers and magazines. I refuse virtually all interviews when occasional reporters do manage to get hold of me, and I never allow photos. I&#8217;m on record in a Rolling Stone interview as saying that of course it&#8217;s all random and that people shouldn&#8217;t take it seriously.  Did that put a dent in my numbers? No way. Quite the opposite: subscriptions jumped sharply following the interview.  My devoted users, interviewed by the same magazine, and others, simply refuse to believe that the service could be anything but real. Of course many don&#8217;t believe it has much, if any, accuracy in its actual predictions. They all have one thing in common: they all believe in luck. They believe that luck is real, and that lucky and unlucky streaks exist.  And who doesn&#8217;t believe that? I just offer a service, backed by seemingly solid evidence (my personalized prediction history for the user), to help flag the good and bad times.</p>
<p>I read some book about the importance of brand. There was a discussion of the Harley Davidson company as a great example of brand. It concluded something like this: if you can convince your customers to tattoo your brand name onto their bodies, you know you&#8217;ve won the branding game. I may not be there quite yet, but that&#8217;s the kind of following the service has. Reason and rationality are simply not a factor. The average person has no head for probability, in fact no concept of it. Their friends can&#8217;t convince them to stop buying lottery tickets or to cancel their subscription to lucky-streak.com.  In the end though, the friends don&#8217;t figure there&#8217;s much harm. After all, it&#8217;s just a couple of bucks a month.</p>
<p>When I said I could start a religion, I wasn&#8217;t kidding. Not too many leave the service, and at least at the moment, for every one that leaves, two new ones join.  Unlucky streaks are just as important to people as lucky ones. Lots of people have no intention of betting or doing anything crazy, but they want to know when they should be a little extra careful. It&#8217;s a vital aspect of the service that I&#8217;m there for you in the good and the bad, always trying to help, always on your side, ready to celebrate or commiserate as the case may be.  The predictions can be wrong half the time (and, of course, they are), but the service doesn&#8217;t lose people as a result. The subscribers don&#8217;t care about the individual predictions. They care about when they&#8217;re in a lucky phase. When they&#8217;re on a roll. When a prediction is wrong and you send them email them telling them to watch out, that their streak may be over, they&#8217;ll reply to say thank you. I make a random prediction and send it out. The prediction is completely wrong.  Nevertheless, the recipient sends me a thank-you note. It&#8217;s wacky, but that&#8217;s the way it works. I figure tattoos are not out of the question.</p>
<p>I know it can&#8217;t grow like this forever, but when you think about it, a couple of million people really is a very small fraction of the number of people online. I figure it&#8217;s going to settle down at around 5-10 million subscribers. At some point, probably within the next two years, I expect something will go wrong and that I&#8217;ll shut the whole thing down and walk away from it.  You can&#8217;t make $35M a year in a vacuum. There are all sorts of people that are simply not going to let that happen. Still, after two full years of operation, I have over $40M spread across my various bank accounts, so I&#8217;m doing OK. It&#8217;s probably strictly 100% legal. It&#8217;s not as easy to spend, invest, or move the money as I would like, but on the other hand I don&#8217;t pay tax.  I do my serious shopping by wire transfer, often to other offshore accounts.  There are clearly ethical questions, but I simply ignore them.  Like they say, every man has his price. They also say that lotteries are just a tax on people who are bad at math. But I&#8217;m not that callous. I have a service, and I&#8217;ve been quite up-front about what it does, what can be expected, and even how it works. People choose to send me money in exchange for the service. And after all, it&#8217;s for a very good cause.</p>
<p>Like all my satisfied clients, I know my run will also someday come to an end.</p>
<p>But for now, I&#8217;m really on a roll.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/03/09/lucky-streak/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>Understanding high-dimensional spaces</title>
		<link>http://blogs.fluidinfo.com/terry/2008/01/23/understanding-high-dimensional-spaces/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/01/23/understanding-high-dimensional-spaces/#comments</comments>
		<pubDate>Wed, 23 Jan 2008 17:46:36 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/01/23/understanding-high-dimensional-spaces/</guid>
		<description><![CDATA[I&#8217;ve spent lots of time thinking about high-dimensional spaces, usually in the context of optimization problems. Many difficult problems that we face today can be phrased as problems of navigating in high-dimensional spaces. One problem with high-dimensional spaces is that they can be highly non-intuitive. I did a lot of work on fitness landscapes, which [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://farm1.static.flickr.com/157/436297320_018532add0_m_d.jpg"><img src="http://farm1.static.flickr.com/157/436297320_018532add0_m_d.jpg" style="float: left; margin-right: 8px" /></a><br />
I&#8217;ve spent lots of time thinking about high-dimensional spaces, usually in the context of optimization problems. Many difficult problems that we face today can be phrased as problems of navigating in high-dimensional spaces.</p>
<p>One problem with high-dimensional spaces is that they can be highly non-intuitive. I did a lot of work on fitness landscapes, which are a form of high dimensional space, and ran into lots of cases in which problems were exceedingly difficult because it&#8217;s not clear how to navigate efficiently in such a space. If you&#8217;re trying to find high points (e.g., good solutions), which way is up? We&#8217;re all so used to thinking in 3 dimensions. It&#8217;s very easy to do the natural thing and let our simplistic lifelong physical and visual 3D experience influence our thinking about solving problems in high-dimensional spaces.</p>
<p>Another problem with high-dimensional spaces is that we can&#8217;t visualize them unless they are very simple. You could argue that an airline pilot in a cockpit monitoring dozens of dials (each dial gives a reading on one dimension) does a pretty good job of navigating a high-dimensional space. I don&#8217;t mean the 3D space in which the plane is flying, I mean the virtual high-dimensional space whose points are determined by the readings on all the instruments.</p>
<p>I think that&#8217;s true, but the landscape is so smooth that we know how to move around on it pretty well. Not too many planes fall out of the sky.</p>
<p>Things get vastly more difficult when the landscape is not smooth. In fact they get positively weird. Even with trivial examples, like a hypercube, things get weird fast. For example, if you&#8217;re at a vertex on a hypercube, exactly one half of the space is reachable in a single step. That&#8217;s completely non-intuitive, and we haven&#8217;t even put fitness numbers on the nodes. When I say fitness, I mean goodness, or badness, or energy level, or heuristic, or whatever it is you&#8217;re dealing with.</p>
<p>We can visually understand and work with many 3D spaces (though 3D mazes can of course be hard). We can hold them in our hands, turn them around, and use our visual system to help us. If you had to find the high-point looking out over a collection of sand dunes, you could move to a good vantage point (using your visual system and understanding of 3D spaces) and then just look. There&#8217;s no need to run an optimization algorithm to find high points, avoiding getting trapped in local maxima, etc.</p>
<p>But that&#8217;s not the case in a high-dimensional space. We can&#8217;t just look at them and solve problems visually. So we write awkward algorithms that often do exponentially increasing amounts of work.</p>
<p>If we can&#8217;t visually understand a high-dimensional space, is there some other kind of understanding that we could get?</p>
<p>If so, how could we prove that we understood the space?</p>
<p>I think the answer might be that there are difficult high-dimensional spaces that we could understand, and demonstrate that we understand them.</p>
<p>One way to demonstrate that you understand a 3D space is to solve puzzles in it, like finding high points, or navigating over or through it without crashing.</p>
<p>We can apply the same test to a high-dimensional space: build problems and see if they can be solved on the fly by the system that claims to understand the space.</p>
<p>One way to do that is the following.</p>
<p>Have a team of people who will each sit in front of a monitor showing them a 3D scene. They&#8217;ll each have a joystick that they can use to &#8220;fly&#8221; through the scene that they see. You take your data and give 3 dimensions to each of the people. You do this with some degree of dimensional overlap. Then you let the people try to solve a puzzle in the space, like finding a high point. Their collective navigation gives you a way to move through the high-dimensional space.</p>
<p>You&#8217;d have to allocate dimensions to people carefully, and you&#8217;d have to do something about incompatible decisions. But if you built something like this (e.g., with 2 people navigating through a 4D space), you&#8217;d have a distributed understanding of the high-dimensional space. No one person would have a visual understanding of the whole space, but collectively they would.</p>
<p>In a way it sounds expensive and like overkill. But I think it&#8217;s pretty easy to build and there&#8217;s enormous value to be had from doing better optimization in high-dimensional spaces.</p>
<p>All we need is a web server hooked up to a bunch of people working on <a href="http://www.mturk.com/mturk/welcome">Mechanical Turk</a>. Customers upload their high-dimensional data, specify what they&#8217;re looking for, the data is split by dimension, and the humans do their 3D visual thing. If the humans are distributed and don&#8217;t know each other they also can&#8217;t collude to steal or take advantage of the data &#8211; because they each only see a small slice.</p>
<p>There&#8217;s a legitimate response that we already build systems like this. Consider the hundreds of people monitoring the space shuttle in a huge room, each in front of a monitor. Or even a pilot and co-pilot in a plane, jointly monitoring instruments (does a co-pilot do that? I don&#8217;t even know). Those are teams collectively understanding high-dimensional spaces. But they&#8217;re, in the majority of cases, not doing overlapping dimensional monitoring, and the spaces they&#8217;re working in are probably relatively smooth. It&#8217;s not a conscious effort to collectively monitor or understand a high-dimensional space. But the principle is the same, and you could argue that it&#8217;s a proof the idea would work &#8211; for sufficiently non-rugged spaces.</p>
<p>Apologies for errors in the above &#8211; I just dashed this off ahead of going to play real football in 3D. That&#8217;s a hard enough optimization problem for me.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/01/23/understanding-high-dimensional-spaces/feed/</wfw:commentRss>
		<slash:comments>10</slash:comments>
		</item>
		<item>
		<title>Giselle is served an apple martini, but she doesn&#8217;t drink it</title>
		<link>http://blogs.fluidinfo.com/terry/2008/01/20/giselle-is-served-an-apple-martini-but-she-doesnt-drink-it/</link>
		<comments>http://blogs.fluidinfo.com/terry/2008/01/20/giselle-is-served-an-apple-martini-but-she-doesnt-drink-it/#comments</comments>
		<pubDate>Sun, 20 Jan 2008 11:35:42 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2008/01/20/giselle-is-served-an-apple-martini-but-she-doesnt-drink-it/</guid>
		<description><![CDATA[Well that&#8217;s a relief.]]></description>
			<content:encoded><![CDATA[<p><a href="http://farm1.static.flickr.com/30/45686085_ccd9b21866_m_d.jpg"><img src="http://farm1.static.flickr.com/30/45686085_ccd9b21866_m_d.jpg" style="float: left; margin-right: 8px" /></a> Well <a href="http://www.imdb.com/title/tt0461770/parentalguide">that&#8217;s</a> a relief.<br clear="all"/></p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2008/01/20/giselle-is-served-an-apple-martini-but-she-doesnt-drink-it/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>User authentication in a world with no free will</title>
		<link>http://blogs.fluidinfo.com/terry/2007/12/13/user-authentication-in-a-world-with-no-free-will/</link>
		<comments>http://blogs.fluidinfo.com/terry/2007/12/13/user-authentication-in-a-world-with-no-free-will/#comments</comments>
		<pubDate>Thu, 13 Dec 2007 01:43:18 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>
		<category><![CDATA[tech]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2007/12/13/user-authentication-in-a-world-with-no-free-will/</guid>
		<description><![CDATA[I have a little background in user authentication. I wrote my undergrad CS honors thesis on Secrecy and Authentication. If you search Google hard enough you can even find mentions of the Seberry &#38; Jones Scheme for implementing subliminal channels. I held a provisional patent with Sydney University on a biometric user authentication method based [...]]]></description>
			<content:encoded><![CDATA[<p>I have a little background in user authentication. I wrote my undergrad CS honors thesis on Secrecy and Authentication. If you search Google hard enough you can even find mentions of the Seberry &amp; Jones Scheme for implementing subliminal channels. I held a provisional patent with Sydney University on a biometric user authentication method based on typing style in 1985/6. The method turned out not to be original, has been re-invented multiple times since then, and was even somehow published as new years later in <a href="http://www.acm.org/publications/cacm/">CACM</a>.</p>
<p>I therefore feel eminently qualified to speculate on what user authentication might look like in a world with no free will.</p>
<p>Note that I don&#8217;t care whether free will exists or not, and I certainly don&#8217;t want to waste my time thinking or talking about it. But if it doesn&#8217;t exist, then the following user authentication algorithm does exist. We couldn&#8217;t implement it, but it would certainly exist and it&#8217;s fun to consider instead of doing real work.</p>
<p>When a computer needs to verify who you are, it tells you to move the mouse around randomly for as long as you like. Or to just bang on the keyboard. The kind of thing you do when you&#8217;re generating randomness for the construction of a PGP/GPG key.</p>
<p>But if there&#8217;s no free will then it&#8217;s not random.</p>
<p>So the algorithm can just look up what you did in a big table to see who you are. As two users could conceivably do the same thing, it probably needs a little more information, like the time of day and your IP address &#8211; neither of which you&#8217;d have any control over either.</p>
<p>That&#8217;s it. No need for anything fancy, just a lookup table. No-one would ever fail to be recognized, no-one would ever be mistaken for someone else, there&#8217;d be no identity theft, etc. Even if you just sat there and did nothing for a while the machine would know exactly who you were. You could always log in by just briefly doing nothing at all, and then continuing. The length of time you did nothing for would betray you.</p>
<p>All totally absurd, of course, and thinking about it quickly becomes highly circular. Just like the rest of the debate.</p>
<p>As you were.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2007/12/13/user-authentication-in-a-world-with-no-free-will/feed/</wfw:commentRss>
		<slash:comments>6</slash:comments>
		</item>
		<item>
		<title>Bicycle removal problem &#8211; solution</title>
		<link>http://blogs.fluidinfo.com/terry/2007/11/13/bicycle-removal-problem-solution/</link>
		<comments>http://blogs.fluidinfo.com/terry/2007/11/13/bicycle-removal-problem-solution/#comments</comments>
		<pubDate>Tue, 13 Nov 2007 22:06:14 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2007/11/13/bicycle-removal-problem-solution/</guid>
		<description><![CDATA[I wrote earlier about a bicycle removal problem. I wasn&#8217;t exactly flooded with responses. Anyway, here&#8217;s my solution. You buy a large collection of bike locks. Then you drive around the city and lock people&#8217;s bike locks to the bike racks (or poles or railings or whatever). People can still take their bikes and their [...]]]></description>
			<content:encoded><![CDATA[<p>I wrote earlier about a <a href="http://blogs.fluidinfo.com/terry/2007/11/04/bicycle-removal-problem/">bicycle removal problem</a>. I wasn&#8217;t exactly flooded with responses. Anyway, here&#8217;s my solution.</p>
<p>You buy a large collection of bike locks. Then you drive around the city and lock people&#8217;s bike <em>locks</em> to the bike racks (or poles or railings or whatever).  People can still take their bikes and their locks away as usual, and your lock then falls to the ground (but is still attached to the bike rack). Once every X weeks your people go out and do a sweep &#8211; taking away bikes and bike fragments that still have your lock on their lock, recovering your locks that are no longer locked to other locks, and using these to lock the locks of bikes that do not have your lock on them.</p>
<p>You can put a brightly colored ring with a warning message on your locks &#8220;This bike will be taken away in X weeks if this bicycle has not been used&#8221;.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2007/11/13/bicycle-removal-problem-solution/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Bicycle removal problem</title>
		<link>http://blogs.fluidinfo.com/terry/2007/11/04/bicycle-removal-problem/</link>
		<comments>http://blogs.fluidinfo.com/terry/2007/11/04/bicycle-removal-problem/#comments</comments>
		<pubDate>Sun, 04 Nov 2007 05:40:59 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://blogs.fluidinfo.com/terry/2007/11/04/bicycle-removal-problem/</guid>
		<description><![CDATA[Walking on the UCSD campus in 1998, I passed a bike rack that looked partly like a scrap metal junkyard. There were bikes in many conditions, from perfect to clearly abandoned rusting frames. Some had no wheels or no seat. Several were just a frame and a chain locked to the bike rack with a [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://www.flickr.com/photos/edyson/371340844/"><img src="http://farm1.static.flickr.com/130/371340844_74584e0abe.jpg?v=0" /></a></p>
<p>Walking on the <a href="http://www.ucsd.edu">UCSD</a> campus in 1998, I passed a bike rack that looked partly like a scrap metal junkyard.  There were bikes in many conditions, from perfect to clearly abandoned rusting frames. Some had no wheels or no seat. Several were just a frame and a chain locked to the bike rack with a big expensive U-lock.</p>
<p>I thought &#8220;interesting, I wonder how they deal with these old bikes, possibly abandoned or forgotten bikes, abandoned frames, wheeless bikes, bikes whose owners died, etc.  How can they know when it&#8217;s ok to cut something free and take it away? How can they know when it&#8217;s not ok?&#8221;</p>
<p>I saw the same problem at my apartment building, a similar tangle of 6 or 8 old bikes. Later, living in NYC down in the village I&#8217;d see hundreds of apparently abandoned <em>eyesores</em>. Blots on the fair face of the city.</p>
<p>So there&#8217;s the problem.</p>
<p>That is, devise a method or a policy for dealing with the removal of these bikes, ex-bikes, partial bikes, etc. Below are some requirements for a good solution. If you miss on any one of these, whatever you&#8217;re thinking of probably isn&#8217;t as good as what I thought of :-) There are many partial solutions.</p>
<ol>
<li>It must be cheap. You must be able to employ regular people to carry out your plan. No high tech, no massive salaries, none of that.</li>
<li>It must be effective: no abandoned or unused bike will be missed.</li>
<li>There must be no waste.</li>
<li>Bike owners must get fair warning their bike is going to be taken away.</li>
<li>No-one should be able to cause anyone else&#8217;s bike to be taken away.</li>
<li>No-one should be able to cause a bike that should have been taken away not to be taken away.</li>
<li>No-one should be able to make a bike be taken away without the owner getting a fair chance to know it was due to be taken. E.g., with parking tickets I can simply take the parking ticket off any car I like and chuck it in the trash.</li>
<li>There should not be (as far as possible) opportunities to exploit the system by criminals.</li>
<li>You must not interfere with any bicycle (no marking them, etc).</li>
<li>The program must be something that has a high probability of being regarded as fair and which gets good press (everyone loves it, business comes to you).</li>
</ol>
<p>Those are all the conditions I can think of right now, but there may be more.</p>
<p>You get to make all the decisions. Pretend you&#8217;re the mayor of NYC, coming up with a new policy for cleaning up the streets. And it&#8217;s an election year.</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2007/11/04/bicycle-removal-problem/feed/</wfw:commentRss>
		<slash:comments>5</slash:comments>
		</item>
		<item>
		<title>calculus of secrets</title>
		<link>http://blogs.fluidinfo.com/terry/2007/02/20/calculus-of-secrets/</link>
		<comments>http://blogs.fluidinfo.com/terry/2007/02/20/calculus-of-secrets/#comments</comments>
		<pubDate>Tue, 20 Feb 2007 08:28:59 +0000</pubDate>
		<dc:creator>terry</dc:creator>
				<category><![CDATA[other]]></category>

		<guid isPermaLink="false">http://fluidinfo.com/terry/2007/02/20/calculus-of-secrets/</guid>
		<description><![CDATA[OK, this has nothing to do with calculus, but I wanted a short title. Better would have been On the monotonically decreasing incentive to keep secrets, etc. If you have a secret and you tell someone, it makes no sense to tell them they can&#8217;t tell anyone else. Let&#8217;s say there are 2 kinds of [...]]]></description>
			<content:encoded><![CDATA[<p>OK, this has nothing to do with calculus, but I wanted a short title. Better would have been <em>On the monotonically decreasing incentive to keep secrets</em>, etc.</p>
<p>If you have a secret and you tell someone, it makes no sense to tell them they can&#8217;t tell anyone else.</p>
<p>Let&#8217;s say there are 2 kinds of secrets you might be tempted to pass along: a) those that are more important to the receiver than they are to you (e.g., you just found out that X is sleeping with your friend Y&#8217;s partner and you&#8217;re considering telling Y), and b) those that are less important to the receiver than they are to you.</p>
<p>Clearly it doesn&#8217;t make much sense to tell the receiver in class (a) that they can&#8217;t tell anyone. They probably have less incentive to be telling people than you do, they&#8217;re closer to the source than you are, and perhaps the information is &#8220;theirs&#8221; more than it is &#8220;yours&#8221;. Things like that.</p>
<p>But it doesn&#8217;t make sense to tell the receiver in class (b) that they can&#8217;t tell anyone either. That&#8217;s because it&#8217;s unreasonable to expect them to keep something secret that you&#8217;re not keeping secret when it&#8217;s even less important to them than it is to you. Even if you swear them to secrecy, as you may have been sworn to secrecy, you can&#8217;t rationally expect them to keep the secret.</p>
<p>Most secrets fall into class (b).</p>
<p>The rational and responsible conclusion is that either you decide that the buck stops with you and you don&#8217;t pass it on, OR you decide to pass it on, in the full knowledge that you are actively spreading the secret, and in fact lowering the barrier to it spreading more widely. At the very least, have the intellectual honesty not to preface the secret telling with &#8220;you can&#8217;t tell anyone about this&#8230;&#8221;</p>
]]></content:encoded>
			<wfw:commentRss>http://blogs.fluidinfo.com/terry/2007/02/20/calculus-of-secrets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
	</channel>
</rss>

