<?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>~/</title>
	<atom:link href="http://geoff.greer.fm/feed/" rel="self" type="application/rss+xml" />
	<link>http://geoff.greer.fm</link>
	<description>Geoff&#039;s website</description>
	<lastBuildDate>Sun, 05 Feb 2012 08:27:44 +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>My Twisted Hack Day Project: Why is the Reactor Pausing?</title>
		<link>http://geoff.greer.fm/2012/02/04/my-twisted-hack-day-project-why-is-the-reactor-pausing/</link>
		<comments>http://geoff.greer.fm/2012/02/04/my-twisted-hack-day-project-why-is-the-reactor-pausing/#comments</comments>
		<pubDate>Sun, 05 Feb 2012 07:04:44 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=1316</guid>
		<description><![CDATA[Last week we had a twisted hack day at work. The project I work on has over a dozen twisted services, so this was right up my alley. I knew a couple of services were doing dumb things (like DB calls in the main thread) but nobody had gotten around to fixing the issues.[1] It&#8217;s [...]]]></description>
			<content:encoded><![CDATA[<p>Last week we had a <a href="http://twistedmatrix.com/trac/">twisted</a> hack day at work. The project I work on has over a dozen twisted services, so this was right up my alley. I knew a couple of services were doing dumb things (like DB calls in the main thread) but nobody had gotten around to fixing the issues.<a href="#foot_1">[1]</a> It&#8217;s pretty easy to find most instances of Django calls in the main thread, but there are many other ways to hang the reactor. I wanted to find every instance of pausing, so that&#8217;s what I decided to make for my hack day project.</p>
<p>Before the hack day, <a href="http://as.ynchrono.us/">Jean-Paul Calderone</a> came to the office and gave some talks about twisted. I asked him if there were any tools for finding the cause of reactor pauses. He said he&#8217;d built his own little script a while back, and that the key was to use <a href="http://en.wikipedia.org/wiki/SIGALRM">SIGALRM</a>. That was enough to get me on the right track.</p>
<p><a href="https://github.com/ggreer/twisted_hang">Here&#8217;s the result</a>. It&#8217;s a pretty simple script. Every 100 milliseconds, it cancels any pending SIGALRM and calls <a href="http://docs.python.org/library/signal.html#signal.setitimer">setitimer</a>, so that the OS will send SIGALRM to the process in 500ms. It also has a handler for SIGALRM that logs a traceback and adds the offending function to a stats dict.<a href="#foot_2">[2]</a></p>
<p>If the reactor is paused for more than 500ms, the pending SIGALRM won&#8217;t be cancelled, so it will be sent to the process. Then the handler will print out the traceback and update stats. Pretty handy.</p>
<p>My tool can give false positives on a heavily-loaded system. This is because I&#8217;m calling setitimer with ITIMER_REAL instead of ITIMER_VIRTUAL. Using virtual time won&#8217;t catch stuff like sleep()s in the main thread, since sleeping doesn&#8217;t count toward execution time. Using real time will fire the SIGALRM after 0.5 seconds even if the process has gotten zero time on the CPU. I got a few false positives on my overloaded VM, but this turned out to be beneficial. The tracebacks went all the way to <a href="http://en.wikipedia.org/wiki/Select_(Unix)">select()</a>. I mentioned this fact to <a href="http://journal.paul.querna.org/">Paul</a> and he reminded me that we should be using the <a href="http://twistedmatrix.com/documents/current/core/howto/choosing-reactor.html#auto9">epoll reactor</a>.</p>
<p>That&#8217;s two production issues identified and fixed because of a silly hack day project. Booyah.<a href="#foot_3">[3]</a></p>
<p>&nbsp;<br />
<br />&nbsp;<br />
<br />&nbsp;</p>
<p>Footnotes:</p>
<p><a name="foot_1">[1]</a> We got around performance issues by running multiple instances of these services. The problems were never fixed because they were in really old code that was written before anyone at Cloudkick knew how to write twisted.</p>
<p><a name="foot_1">[2]</a> A stats <a href="http://docs.python.org/library/collections.html#collections.defaultdict">defaultdict</a>, to be precise. If you haven&#8217;t used defaultdict before, check it out. It will save you from writing some dumb boilerplate code.</p>
<p><a name="foot_1">[3]</a> I wasn&#8217;t the only person to do a hack day project. <a href="https://github.com/HackThePlanet/TwistedPython-HackDay">Here&#8217;s the full list.</a></p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2012/02/04/my-twisted-hack-day-project-why-is-the-reactor-pausing/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Programming: We can do Science</title>
		<link>http://geoff.greer.fm/2012/01/30/programming-we-can-do-science/</link>
		<comments>http://geoff.greer.fm/2012/01/30/programming-we-can-do-science/#comments</comments>
		<pubDate>Mon, 30 Jan 2012 16:11:28 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=1174</guid>
		<description><![CDATA[Let&#8217;s say you&#8217;re messing with some Python and you forget how the global keyword changes scoping[1]. To find the answer you might try&#8230; Google Stack Overflow Actually reading the docs Asking someone who knows more about it than you &#8230;usually in that order. That&#8217;s not a terrible way of going about it, but there&#8217;s an [...]]]></description>
			<content:encoded><![CDATA[<p>Let&#8217;s say you&#8217;re messing with some Python and you forget how the <code>global</code> keyword changes scoping<a href="#foot_1">[1]</a>. To find the answer you might try&#8230;</p>
<ol>
<li><a href="https://www.google.com/">Google</a></li>
<li><a href="http://stackoverflow.com/">Stack Overflow</a></li>
<li><a href="http://docs.python.org/">Actually reading the docs</a></li>
<li>Asking someone who knows more about it than you</li>
</ol>
<p>&#8230;usually in that order. That&#8217;s not a terrible way of going about it, but there&#8217;s an oft-overlooked option. Instead of scouring documentation or bugging a coworker, sometimes it&#8217;s best to run experiments.</p>
<p>This code&#8230;</p>
<pre class="prettyprint"><code>#!/usr/bin/env python

blah = 1

def foo():
    blah = 0
    print "foo:blah", blah

print "global:blah", blah
foo()
print "global:blah", blah
</code></pre>
<p>&#8230;prints&#8230;</p>
<pre class="prettyprint"><code>global:blah 1
foo:blah 0
global:blah 1</code></pre>
<p>While adding a <code>global</code> in foo&#8230;</p>
<pre class="prettyprint"><code>#!/usr/bin/env python

blah = 1

def foo():
    global blah
    blah = 0
    print "foo:blah", blah

print "global:blah", blah
foo()
print "global:blah", blah
</code></pre>
<p>&#8230;prints&#8230;</p>
<pre class="prettyprint"><code>global:blah 1
foo:blah 0
global:blah 0</code></pre>
<p>Without <code>global</code>, foo&#8217;s blah is not the same blah. With <code>global</code>, it is.</p>
<p>These sorts of code blurbs are great for learning. They&#8217;re also great for solving disagreements about code behavior. Warning: You will be wrong sometimes. You will look stupid in front of your peers. On the bright side, these embarrassing moments will stick in your mind. You won&#8217;t forget what you were wrong about.</p>
<p>Code experiments can be much trickier, and much more useful, than above. For example&#8230;</p>
<p>&#8230;at work we recently switched a project&#8217;s MySQL engine from <a href="http://en.wikipedia.org/wiki/MyISAM">MyISAM</a> to <a href="http://en.wikipedia.org/wiki/InnoDB">InnoDB</a>. After the switch, we encountered some weird errors. A process would save an object to the DB, but some services couldn&#8217;t find the newly-created object<a href="#foot_2">[2]</a>. I had a hunch that transactions were responsible for the weirdness; my reasoning being that MyISAM lacks transaction support, and it had worked fine.</p>
<p>So I did science. I opened up two MySQL consoles. In console #1, I ran <code>start transaction;</code>. Then in console #2, I ran:</p>
<pre class="prettyprint"><code>mysql&gt; start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql&gt; insert into inventory_nodeaddress (node_id, ip, ip_version, type) values (NULL, '31.22.190.54', 4, 0);
Query OK, 1 row affected (0.00 sec)

mysql&gt; commit;
Query OK, 0 rows affected (0.00 sec)

mysql&gt; select * from inventory_nodeaddress where node_id is NULL;
+-----+---------+-------------------------------------+------------+------+
| id  | node_id | ip                                  | ip_version | type |
+-----+---------+-------------------------------------+------------+------+
| 106 |    NULL | 50.57.96.184                        |          4 |    0 |
| 107 |    NULL | 10.182.67.171                       |          4 |    1 |
| 147 |    NULL | 31.22.190.54                        |          4 |    0 |
+-----+---------+-------------------------------------+------------+------+
3 rows in set (0.00 sec)

mysql&gt;</code></pre>
<p>OK, the data&#8217;s committed. I even double-checked that it was there by selecting it. Everything is fine, right?</p>
<p>Nope. Back in console #1, I ran:</p>
<pre class="prettyprint"><code>mysql&gt; select * from inventory_nodeaddress where node_id is NULL;
+-----+---------+-------------------------------------+------------+------+
| id  | node_id | ip                                  | ip_version | type |
+-----+---------+-------------------------------------+------------+------+
| 106 |    NULL | 50.57.96.184                        |          4 |    0 |
| 107 |    NULL | 10.182.67.171                       |          4 |    1 |
+-----+---------+-------------------------------------+------------+------+
2 rows in set (0.00 sec)

mysql&gt;</code></pre>
<p>Once I ended the transaction in console #1 (either through a rollback or a commit), the new row showed up in selects. After some Googling I finally found <a href="http://dev.mysql.com/doc/refman/5.0/en/set-transaction.html#isolevel_read-committed">the relevant MySQL documentation</a>. Once I changed the transaction isolation from <code>REPEATABLE-READ</code> to <code>READ-COMMITTED</code>, selects inside transactions showed recently-inserted rows.</p>
<p>The experiment plus <a href="https://github.com/morgabra">Brad</a>&#8216;s knowledge of Django helped solve the mystery. Django only runs <code>commit</code> when writing to the DB. This sucks for any long-running service that never writes. The service will start up, connect to MySQL, run <code>start transaction</code> and do selects without ever ending the transaction. With the default InnoDB configuration, these services will see an ever-older version of the database. Not fun.</p>
<p>After I added <code>transaction-isolation = READ-COMMITTED</code> to the my.cnf <a href="http://wiki.opscode.com/display/chef/Home">chef</a> template, everything worked swimmingly. Hooray for science.</p>
<p>The next time you&#8217;re stumped, try some experiments. As a programmer, you have immense power over the program&#8217;s universe. Your code runs on a perfectly deterministic machine<a href="#foot_3">[3]</a>. With the right software tools, you can stop time. You can read or change any part of memory. <a href="http://en.wikipedia.org/wiki/GNU_Debugger">You can step through</a>, <a href="http://docs.python.org/library/pdb.html">one line at a time</a>, to see exactly what&#8217;s happening.</p>
<p>Of course, this isn&#8217;t <em>real</em> science. These apparati make programming a cakewalk compared to real science.</p>
<p>&nbsp;<br />
<br />&nbsp;<br />
<br />&nbsp;</p>
<p>Footnotes:</p>
<p><a name="foot_1">[1]</a> You forgot this fact not because you suck at Python, but because you usually write clean code with no globals. At least, that&#8217;s what you keep telling yourself.</p>
<p><a name="foot_2">[2]</a> Just so nobody freaks out: This thing is non-customer-facing and currently under heavy development. I&#8217;m also over-simplifying the process. The actual changes happened in a development branch and weren&#8217;t merged until things were hunky-dory.</p>
<p><a name="foot_3">[3]</a><a href="http://en.wikipedia.org/wiki/Single_event_upset">Cosmic rays</a> notwithstanding.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2012/01/30/programming-we-can-do-science/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>Making Ag Faster: Profiling with Valgrind</title>
		<link>http://geoff.greer.fm/2012/01/23/making-programs-faster-profiling/</link>
		<comments>http://geoff.greer.fm/2012/01/23/making-programs-faster-profiling/#comments</comments>
		<pubDate>Mon, 23 Jan 2012 18:47:36 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=1070</guid>
		<description><![CDATA[These days, a lot of software is written to be &#8220;fast enough&#8221;. Since code bases can be very large, there&#8217;s no such thing as &#8220;fast enough&#8221; for The Silver Searcher. In fact, my main goal with Ag is speed. Improving performance is not always easy, but it is simple: Find the slowest part of the [...]]]></description>
			<content:encoded><![CDATA[<p>These days, a lot of software is written to be &#8220;fast enough&#8221;. Since code bases can be very large, there&#8217;s no such thing as &#8220;fast enough&#8221; for <a href="https://github.com/ggreer/the_silver_searcher">The Silver Searcher</a>. In fact, my main goal with Ag is speed.</p>
<p>Improving performance is not always easy, but it is simple:</p>
<ol>
<li>Find the slowest part of the program.</li>
<li>Make that part faster.</li>
<li>Repeat until it&#8217;s fast enough or you go insane.</li>
</ol>
<p>There are lots of profiling tools and programmers often argue about which is the best. I use <a href="http://www.cs.utah.edu/dept/old/texinfo/as/gprof.html">gprof</a>, <a href="http://valgrind.org/docs/manual/cl-manual.html">callgrind</a>, and <a href="http://developer.apple.com/library/mac/#documentation/DeveloperTools/Conceptual/InstrumentsUserGuide/Introduction/Introduction.html">Instruments.app</a>. Which profiler you use doesn&#8217;t matter as much as <em>actually using one</em>. They all have their advantages and disadvantages, but for this post I&#8217;ll only cover <a href="http://valgrind.org/">Valgrind&#8217;s</a> callgrind. Using callgrind doesn&#8217;t require special compilation. Just invoke it with your program&#8217;s name and it will generate profiling data for callgrind_annotate to analyze.</p>
<p>Here&#8217;s a typical profiling run for Ag:</p>
<pre class="prettyprint"><code>$ make clean &amp;&amp; ./build.sh
(snip)
$ time valgrind --tool=callgrind ./ag --literal abcdefghijklmnopqrstuvwxyz ../
(snip)
real	1m34.709s
user	1m33.206s
sys	0m1.492s
$ callgrind_annotate --auto=yes callgrind.out.10361
--------------------------------------------------------------------------------
Profile data file 'callgrind.out.10361' (creator: callgrind-3.6.1-Debian)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 798409857
Trigger: Program termination
Profiled target:  ./ag --literal abcdefghijklmnopqrstuvwxyz ../ (PID 10361, part 1)
Events recorded:  Ir
Events shown:     Ir
Event sort order: Ir
Thresholds:       99
Include dirs:
User annotated:
Auto-annotation:  on

--------------------------------------------------------------------------------
           Ir
--------------------------------------------------------------------------------
3,068,387,924  PROGRAM TOTALS

--------------------------------------------------------------------------------
           Ir  file:function
--------------------------------------------------------------------------------
1,764,541,095  src/util.c:ag_strnstr [/home/geoff/code/the_silver_searcher/ag]
  386,020,821  /build/buildd/eglibc-2.13/posix/fnmatch_loop.c:internal_fnmatch [/lib/x86_64-linux-gnu/libc-2.13.so]
  226,548,868  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../strcmp.S:__GI_strncmp [/lib/x86_64-linux-gnu/libc-2.13.so]
  181,861,517  src/util.c:is_binary [/home/geoff/code/the_silver_searcher/ag]
  123,211,270  /build/buildd/eglibc-2.13/posix/fnmatch.c:fnmatch@@GLIBC_2.2.5 [/lib/x86_64-linux-gnu/libc-2.13.so]
  104,867,805  src/print.c:print_file_matches [/home/geoff/code/the_silver_searcher/ag]
   77,058,570  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../strlen.S:__GI_strlen [/lib/x86_64-linux-gnu/libc-2.13.so]
   60,030,629  /build/buildd/eglibc-2.13/posix/fnmatch_loop.c:internal_fnmatch'2 [/lib/x86_64-linux-gnu/libc-2.13.so]
   44,019,376  src/ignore.c:filename_filter [/home/geoff/code/the_silver_searcher/ag]
   27,072,821  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/memchr.S:memchr [/lib/x86_64-linux-gnu/libc-2.13.so]
    9,329,984  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../strcmp.S:__GI_strcmp [/lib/x86_64-linux-gnu/libc-2.13.so]
    7,803,075  /build/buildd/eglibc-2.13/malloc/malloc.c:_int_malloc [/lib/x86_64-linux-gnu/libc-2.13.so]
    7,040,644  /build/buildd/eglibc-2.13/posix/../locale/weight.h:internal_fnmatch
    6,062,124  /build/buildd/eglibc-2.13/string/../string/memmove.c:__GI_memmove [/lib/x86_64-linux-gnu/libc-2.13.so]
    4,384,383  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../memcpy.S:__GI_memcpy [/lib/x86_64-linux-gnu/libc-2.13.so]
    3,951,640  /build/buildd/eglibc-2.13/malloc/malloc.c:_int_free [/lib/x86_64-linux-gnu/libc-2.13.so]
    3,779,300  /build/buildd/eglibc-2.13/dirent/../sysdeps/unix/readdir.c:readdir [/lib/x86_64-linux-gnu/libc-2.13.so]
    3,181,118  /build/buildd/eglibc-2.13/malloc/malloc.c:malloc [/lib/x86_64-linux-gnu/libc-2.13.so]
(snip)
</code></pre>
<p>I snipped out the annotated source code. You can see the full output <a href="/code/ag_callgrind_slow.txt">here</a>.</p>
<p>This profiling info tells me that I&#8217;m spending all my time in strnstr(). I did some research on string-matching and found out about the <a href="http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore_string_search_algorithm">Boyer-Moore algorithm</a>. After some <a href="http://blog.phusion.nl/2010/12/06/efficient-substring-searching/">more reading</a>, I decided to go with a simplified version of Boyer-Moore called <a href="http://en.wikipedia.org/wiki/Boyer%E2%80%93Moore%E2%80%93Horspool_algorithm">Boyer-Moore-Horspool</a>.</p>
<p>Here&#8217;s the data after I <a href="https://github.com/ggreer/the_silver_searcher/pull/12">implemented</a> Boyer-Moore-Horspool strstr:</p>
<pre class="prettyprint"><code>$ time valgrind --tool=callgrind ./ag --literal abcdefghijklmnopqrstuvwxyz ../
real	0m32.429s
user	0m31.034s
sys	0m1.324s
$ callgrind_annotate --auto=yes callgrind.out.11921
--------------------------------------------------------------------------------
Profile data file 'callgrind.out.11921' (creator: callgrind-3.6.1-Debian)
--------------------------------------------------------------------------------
I1 cache:
D1 cache:
LL cache:
Timerange: Basic block 0 - 228181262
Trigger: Program termination
Profiled target:  ./ag --literal abcdefghijklmnopqrstuvwxyz ../ (PID 11921, part 1)
Events recorded:  Ir
Events shown:     Ir
Event sort order: Ir
Thresholds:       99
Include dirs:
User annotated:
Auto-annotation:  on

--------------------------------------------------------------------------------
           Ir
--------------------------------------------------------------------------------
1,139,437,344  PROGRAM TOTALS

--------------------------------------------------------------------------------
         Ir  file:function
--------------------------------------------------------------------------------
386,014,011  /build/buildd/eglibc-2.13/posix/fnmatch_loop.c:internal_fnmatch [/lib/x86_64-linux-gnu/libc-2.13.so]
181,870,097  src/util.c:is_binary [/home/geoff/code/the_silver_searcher/ag]
123,209,345  /build/buildd/eglibc-2.13/posix/fnmatch.c:fnmatch@@GLIBC_2.2.5 [/lib/x86_64-linux-gnu/libc-2.13.so]
104,867,805  src/print.c:print_file_matches [/home/geoff/code/the_silver_searcher/ag]
 76,747,163  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../strlen.S:__GI_strlen [/lib/x86_64-linux-gnu/libc-2.13.so]
 63,421,170  src/util.c:boyer_moore_strnstr [/home/geoff/code/the_silver_searcher/ag]
 60,028,609  /build/buildd/eglibc-2.13/posix/fnmatch_loop.c:internal_fnmatch'2 [/lib/x86_64-linux-gnu/libc-2.13.so]
 44,018,667  src/ignore.c:filename_filter [/home/geoff/code/the_silver_searcher/ag]
 27,072,637  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/memchr.S:memchr [/lib/x86_64-linux-gnu/libc-2.13.so]
  8,312,570  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../strcmp.S:__GI_strcmp [/lib/x86_64-linux-gnu/libc-2.13.so]
  7,803,075  /build/buildd/eglibc-2.13/malloc/malloc.c:_int_malloc [/lib/x86_64-linux-gnu/libc-2.13.so]
  7,040,534  /build/buildd/eglibc-2.13/posix/../locale/weight.h:internal_fnmatch
  6,061,868  /build/buildd/eglibc-2.13/string/../string/memmove.c:__GI_memmove [/lib/x86_64-linux-gnu/libc-2.13.so]
  4,384,383  /build/buildd/eglibc-2.13/string/../sysdeps/x86_64/multiarch/../memcpy.S:__GI_memcpy [/lib/x86_64-linux-gnu/libc-2.13.so]
  3,951,640  /build/buildd/eglibc-2.13/malloc/malloc.c:_int_free [/lib/x86_64-linux-gnu/libc-2.13.so]
  3,779,220  /build/buildd/eglibc-2.13/dirent/../sysdeps/unix/readdir.c:readdir [/lib/x86_64-linux-gnu/libc-2.13.so]
  3,181,118  /build/buildd/eglibc-2.13/malloc/malloc.c:malloc [/lib/x86_64-linux-gnu/libc-2.13.so]
  3,089,135  src/main.c:search_dir'2 [/home/geoff/code/the_silver_searcher/ag]
  2,095,514  /build/buildd/eglibc-2.13/malloc/malloc.c:free [/lib/x86_64-linux-gnu/libc-2.13.so]
  2,018,298  /build/buildd/eglibc-2.13/dirent/../sysdeps/wordsize-64/../../dirent/scandir.c:scandir [/lib/x86_64-linux-gnu/libc-2.13.so]
  1,941,992  /build/buildd/eglibc-2.13/string/strcoll_l.c:strcoll_l [/lib/x86_64-linux-gnu/libc-2.13.so]
  1,889,859  /build/buildd/eglibc-2.13/stdlib/msort.c:msort_with_tmp.part.0'2 [/lib/x86_64-linux-gnu/libc-2.13.so]
  1,704,553  /build/buildd/eglibc-2.13/malloc/malloc.c:malloc_consolidate.part.3 [/lib/x86_64-linux-gnu/libc-2.13.so]
  1,644,688  src/ignore.c:ignorefile_filter [/home/geoff/code/the_silver_searcher/ag]
  1,601,628  /build/buildd/eglibc-2.13/dirent/../sysdeps/unix/sysv/linux/getdents.c:__getdents [/lib/x86_64-linux-gnu/libc-2.13.so]
  1,582,620  src/util.c:strlcat [/home/geoff/code/the_silver_searcher/ag]
(snip)
</code></pre>
<p>For the curious, full output of callgrind_annotate is <a href="/code/ag_callgrind.txt">here</a>.</p>
<p>That&#8217;s a 3x overall speedup and a 27x speedup in string matching. Impressive! Now Ag is spending most of the time figuring out whether or not it should search a file. It&#8217;s clear where I need to optimize next.</p>
<p>Valgrind isn&#8217;t perfect though. It makes programs run 25-50x slower than they normally would, so you won&#8217;t notice if you&#8217;re spending all your time waiting for network or disk I/O. In the case of Ag, this turned into a 20% performance improvement in my benchmarks. </p>
<p>Getting more useful data requires switching from an instrumenting profiler to a sampling profiler. Both Instruments.app and gprof are sampling profilers, but this post is already too long. I&#8217;ll cover them some other time.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2012/01/23/making-programs-faster-profiling/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Building for Others</title>
		<link>http://geoff.greer.fm/2012/01/20/building-for-others/</link>
		<comments>http://geoff.greer.fm/2012/01/20/building-for-others/#comments</comments>
		<pubDate>Fri, 20 Jan 2012 16:14:57 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=1065</guid>
		<description><![CDATA[I like to write new code. Unfortunately, writing new code is only a small part of building something useful. The Pareto principle applies. Once you&#8217;ve written 80% of the code in a short, fun-filled period, you spend much longer finishing up little things. You have to debug some odd edge case, clean up messy stuff [...]]]></description>
			<content:encoded><![CDATA[<p>I like to write new code. Unfortunately, writing new code is only a small part of building something useful. The <a href="http://en.wikipedia.org/wiki/Pareto_principle">Pareto principle</a> applies. Once you&#8217;ve written 80% of the code in a short, fun-filled period, you spend much longer finishing up little things. You have to debug some odd edge case, clean up messy stuff that mostly works, and get it to build and run on some <a href="http://www.ubuntu.com/">obscure Linux distribution</a>.</p>
<p>Worst of all, you have to write documentation.</p>
<p>This stuff isn&#8217;t fun, but it&#8217;s necessary if you want others to use your project.</p>
<p>Because you made it, the various dependencies and <a href="http://lesswrong.com/lw/ke/illusion_of_transparency_why_no_one_understands/">quirks are obvious to you</a>. For the poor soul who clones your repository, the same is not true. Even compiling is a challenge for a newbie. What build system does your project use? Make? Scons? Ant? What build dependencies does it have? Does it check for them or print out a useful error message if any are missing? Is there a helpful README?</p>
<p>If you want other people to use (and possibly one day improve) your work, you need to polish the build scripts and write documentation. Think of it like a <a href="http://en.wikipedia.org/wiki/Sales_process">sales funnel</a>. Perhaps 100 people download your code, 80 get it to build, 75 run it, 50 use it regularly, 5 make modifications, and finally, 2 contribute patches back. You can increase the numbers. Making those steps easier will grow your user base and contributions. </p>
<p>So that&#8217;s what I&#8217;ve done with <a href="/2011/12/27/the-silver-searcher-better-than-ack/">Ag</a>. Over the past couple of weeks I&#8217;ve added a man page, <a href="https://github.com/ggreer/the_silver_searcher/wiki">a wiki</a>, accepted <a href="https://github.com/ggreer/the_silver_searcher/pull/9">pull requests</a> to <a href="https://github.com/ggreer/the_silver_searcher/pull/10">clean up the build</a>, and even improved the &#8211;help output. </p>
<p>I&#8217;ll be the first to admit that fixing trivial inconveniences is boring. But frequently, boring work is the difference between a personal project and a community of users. Too often, <a href="http://lesswrong.com/lw/f1/beware_trivial_inconveniences/">trivial inconveniences</a> stop projects from reaching critical mass. So if you want to build something for others, grit those teeth and go <a href="http://paulgraham.com/schlep.html">schlep</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2012/01/20/building-for-others/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>The Silver Searcher: Better than Ack</title>
		<link>http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/</link>
		<comments>http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/#comments</comments>
		<pubDate>Wed, 28 Dec 2011 00:36:40 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=962</guid>
		<description><![CDATA[A lot of my time spent &#8220;writing&#8221; code is actually spent reading code. And a decent chunk of my time spent reading code is actually spent searching code. Lately I&#8217;ve started working with a larger codebase.[1] Both grep and ack take a non-negligible amount of time to search it. Both are slow, but for different [...]]]></description>
			<content:encoded><![CDATA[<p>A lot of my time spent &#8220;writing&#8221; code is actually spent reading code. And a decent chunk of my time spent reading code is actually spent searching code. Lately I&#8217;ve started working with a larger codebase.<a href="#foot_1">[1]</a> Both grep and ack take a non-negligible amount of time to search it. Both are slow, but for different reasons. <a href="http://www.gnu.org/s/grep/">Grep</a> is fast, but doesn&#8217;t ignore files.<a href="#foot_2">[2]</a> <a href="http://betterthangrep.com/">Ack</a> is very good at ignoring files, but it&#8217;s written in Perl instead of C. What I really want is something that&#8217;s fast <em>and</em> ignores files.</p>
<p>So I built it. I call it <a href="https://github.com/ggreer/the_silver_searcher">The Silver Searcher</a>, or <a href="http://en.wikipedia.org/wiki/Symbol_(chemical_element)">Ag</a> for short. Ag is like ack, but better. It&#8217;s fast. It&#8217;s damn fast. The only thing faster is stuff that builds indicies beforehand, like <a href="http://ctags.sourceforge.net/">Exuberant Ctags</a>.</p>
<p>Don&#8217;t believe me? Here are some benchmarks. I ran them multiple times and grabbed the median for each.</p>
<pre class="prettyprint">
<code>ggreer@carbon:~/cloudkick/reach% du -sh
250M	.

ggreer@carbon:~% time grep -r -i SOLR ~/cloudkick/reach | wc -l
     617
11.06s user 0.81s system 96% cpu 12.261 total

ggreer@carbon:~% time ack -i SOLR ~/cloudkick/reach | wc -l
     488
2.87s user 0.78s system 97% cpu 3.750 total

ggreer@carbon:~% time ag -i SOLR ~/cloudkick/reach | wc -l
     573
1.00s user 0.51s system 95% cpu 1.587 total
</code>
</pre>
<p>Here&#8217;s Ag with some extra ignores, similar to how ack ignores many files by default:</p>
<pre class="prettyprint">
<code>ggreer@carbon:~% cat ~/cloudkick/reach/.agignore
extern
release
fixtures
ggreer@carbon:~% time ag -i SOLR ~/cloudkick/reach | wc -l
     499
0.35s user 0.15s system 94% cpu 0.528 total
</code>
</pre>
<p>That&#8217;s the same as <a href="http://book.git-scm.com/4_finding_with_git_grep.html">git grep</a>:</p>
<pre class="prettyprint">
<code>ggreer@carbon:~/cloudkick/reach% time git grep -i SOLR ~/cloudkick/reach | wc -l
     489
0.32s user 0.58s system 161% cpu 0.556 total
</code>
</pre>
<p>&#8230;except git grep only works in git repos. And it doesn&#8217;t ignore stuff in the repository like extern or generated files.<a href="#foot_3">[3]</a></p>
<p>The bottom line: Grep&#8217;s output was the least useful. It dutifully reported matches in .pyc files and other things I don&#8217;t care about. Ack&#8217;s results were better and faster than grep. Ag had more results than ack, but <strong>took half as long.</strong> With a couple of clever ignores (like the extern directory), Ag took a mere half-second and gave even more pertinent results.</p>
<p>I can already hear someone saying, &#8220;Big deal. It&#8217;s only a second faster. What does one second matter when searching an entire codebase?&#8221; My reply: <a href="http://lesswrong.com/lw/f1/beware_trivial_inconveniences/">trivial inconveniences matter</a>. Using Ag is like having a faster computer; you don&#8217;t realize how slow things were until you&#8217;ve experienced fast. The difference is big enough that I can&#8217;t go back to ack, just like ack users can&#8217;t go back to grep.</p>
<p>Since it behaves like ack, Ag can be used by many fancy ack GUI front-ends. This makes searching convenient as well as fast. After I got Ag sorta-working, I forked <a href="https://github.com/protocool/AckMate/">AckMate</a> so that I could use Ag in <a href="http://macromates.com/">my favorite editor</a>. <a href="https://github.com/ggreer/AckMate/">My fork</a> bundles both AckMate&#8217;s Ack and my own Ag. You can switch between them with a simple check box. The tmbundle is on the <a href="https://github.com/ggreer/AckMate/downloads">downloads page</a>. Be warned: it replaces your current AckMate.</p>
<p>There&#8217;s still plenty of stuff I want to add,<a href="#foot_4">[4]</a> but it&#8217;s good enough for my own daily use so I figured I should tell others about it. And of course, patches are welcome!</p>
<p>&nbsp;<br />
<br />&nbsp;<br />
<br />&nbsp;<br />
Footnotes:</p>
<p><a name="foot_1">[1]</a> The decision was made to put all python dependencies into extern/ instead of using pip. A good call, in my opinion.</p>
<p><a name="foot_2">[2]</a> At least not without a bunch of pipes and find and xargs. Yes I know there are aliases but it&#8217;s annoying to keep those up-to-date.</p>
<p><a name="foot_3">[3]</a> Yes, I know it&#8217;s bad form to put generated files in revision control. </p>
<p><a name="foot_4">[4]</a> Ctags support, for one. Also inverted matching, accepting piped input, and basic stuff like retrying a search with fewer ignores and no case-sensitivity.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2011/12/27/the-silver-searcher-better-than-ack/feed/</wfw:commentRss>
		<slash:comments>1</slash:comments>
		</item>
		<item>
		<title>The Moral Trajectory</title>
		<link>http://geoff.greer.fm/2011/12/12/the-moral-trajectory/</link>
		<comments>http://geoff.greer.fm/2011/12/12/the-moral-trajectory/#comments</comments>
		<pubDate>Mon, 12 Dec 2011 08:20:11 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Rationality]]></category>
		<category><![CDATA[Transhumanism]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=908</guid>
		<description><![CDATA[Apologies in advance. This post is about philosophy and morality; way out of my area of expertise. You have been warned. By our standards, ancient Rome was not a nice place. I&#8217;m not just talking about problems due to inferior technology or sanitation or disease. Even a hypothetical ancient Rome that fixed those things would [...]]]></description>
			<content:encoded><![CDATA[<p>Apologies in advance. This post is about philosophy and morality; way out of my area of expertise. You have been warned.</p>
<p>By our standards, ancient Rome was not a nice place. I&#8217;m not just talking about problems due to inferior technology or sanitation or disease. Even a hypothetical ancient Rome that fixed those things would be worse than the modern world. Slaves would still exist. Racism and discrimination would still be rampant. The citizenship of one&#8217;s parents would still determine your lot in life. Simply put, ancient Roman morality was worse than ours.</p>
<p>It is my claim that over time, most civilizations have moved along a moral trajectory. Slowly -ever so slowly- people have become nicer. We&#8217;ve recognized more humans as worthy of moral value. Eventually we decided slavery was wrong. We began to treat women and men equally. Currently we&#8217;re moving toward treating homosexuals and heterosexuals equally.</p>
<p>The fact that morals have improved over time should strike people as extraordinary. Think about what must have happened for slavery to go from right to wrong. At some point, a person went from thinking &#8220;slavery is right&#8221; to thinking &#8220;slavery is wrong&#8221;, <em>without initially wanting to change his mind!</em> I wish I knew how to trigger that sort of thinking. It&#8217;s as valuable as vaccines.</p>
<p>It&#8217;s great that people have become more moral over the millennia. Now what are the odds that after thousands of years, we suddenly got morality right? What are the chances that we won&#8217;t improve upon our current ideas about right and wrong?</p>
<p>&nbsp;<br />
<br />&nbsp;</p>
<p>Yeah, pretty damn small.</p>
<p>&nbsp;</p>
<p>OK, so if we&#8217;re wrong, we should ask the question, &#8220;What are some things that future societies might condemn us for?&#8221;</p>
<p>Stop here and think about them. I don&#8217;t want to contaminate your initial ideas.</p>
<p>&nbsp;<br />
<br />&nbsp;<br />
<br />&nbsp;<br />
&#8230;<br />
<br />&nbsp;<br />
<br />&nbsp;<br />
<br />&nbsp;</p>
<p>There are some obvious ones that are already in political discourse. Recreational drugs. LGBT rights. <a href="http://elidourado.com/blog/smash-the-new-aristocracy/">Border and immigration laws.</a> Religious indoctrination of children. Other things that <a href="http://www.paulgraham.com/say.html">You Can&#8217;t Say</a>&#8230; yet. </p>
<p>One day morality will even go beyond those things. What about eating meat? It&#8217;s absolutely indefensible that we breed, kill, chop up, and eat animals. It&#8217;s not the eating of meat that&#8217;s wrong. If we could grow meat in vats, there would be no problem. The problem is that animals experience pain much like we do. While animals are not open to the same range of experiences as humans, they still seem to have some moral value. All else equal, I think we&#8217;d prefer that animals not suffer and die.</p>
<p>Future technologies could improve morality as well. Like education and nutrition today, in the future it could be considered abusive to not give your child anti-aging and intelligence-enhancing treatments. And that&#8217;s just the start.</p>
<p>Does this future scare you? Well so would the present to those who lived in the past. <a href="http://lesswrong.com/lw/xl/eutopia_is_scary/">Eutopia is Scary</a>.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2011/12/12/the-moral-trajectory/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Consume Less Shallow Content</title>
		<link>http://geoff.greer.fm/2011/12/04/consume-less-shallow-content/</link>
		<comments>http://geoff.greer.fm/2011/12/04/consume-less-shallow-content/#comments</comments>
		<pubDate>Sun, 04 Dec 2011 23:21:13 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=936</guid>
		<description><![CDATA[Many of my friends and coworkers own iPads. I do not. I don&#8217;t have anything against Apple, in fact I love their products. I agree that the iPad is an engineering marvel, both of hardware and software. It&#8217;s elegant. It&#8217;s responsive. It&#8217;s just plain fun to play with. But I don&#8217;t own one. I don&#8217;t [...]]]></description>
			<content:encoded><![CDATA[<p>Many of my friends and coworkers own iPads. I do not. I don&#8217;t have anything against Apple, in fact <a href="/2010/11/16/five-years-of-progress-in-laptops/">I love their products</a>. I agree that the iPad is an engineering marvel, both of hardware and software. It&#8217;s elegant. It&#8217;s responsive. It&#8217;s just plain fun to play with. But I don&#8217;t own one.</p>
<p>I don&#8217;t own an iPad for the same reason I don&#8217;t have a cable subscription: Because it encourages shallow content consumption. </p>
<p>Don&#8217;t misunderstand. I don&#8217;t think content consumption is bad. I enjoy it and spend lots of time doing it. But there are different ways to consume it, different types to consume, and differing amounts of time one can spend on it. </p>
<p>So what is shallow content? The shallowest content consists of action movies and chick flicks. These are equivalent to sitting in front of a machine that pulls levers in your brain to trigger emotional reactions. Shallow content is easily accessible, but uninformative and in the long run, less rewarding. </p>
<p>Deep content is complex. Profound. Memorable. It is organized on multiple levels. It rewards re-reading (or re-watching). <a href="http://en.wikipedia.org/wiki/G%C3%B6del,_Escher,_Bach">Gödel, Escher, Bach: An Eternal Golden Braid</a> is the prototype of deep content.</p>
<p>Shallow content is cotton candy and Coca-Cola. Deep content is raspberry cheesecake and Riesling.</p>
<p>When it comes to content consumption, different devices encourage different behaviors. For example, a television is the ultimate device for consuming shallow content. You select a channel. The pictures and sounds elicit emotional responses. Changing the channel is easy, so TV shows are selected for stickiness and addictiveness. TV shows can&#8217;t be as complex as other media.[1] They have to be accessible to people who start watching in the middle.</p>
<p>Whether or not a device is meant for content consumption is not a binary attribute; it&#8217;s more of a sliding scale. A television is solely for consuming. An iPad is more general-purpose, but encourages consumption over production, and shallow content over deep. A laptop or desktop computer is fully general-purpose. A good indicator of a device&#8217;s purpose is its input interface. A TV&#8217;s input is simple: channel selection. An iPad has a touch-screen that can show a virtual keyboard for occasions when you need to write something. A computer has a physical keyboard, the fastest brain-machine interface currently available. </p>
<p>Of course, even with a computer you can waste your days on Reddit and IRC (consuming and producing shallow content) or you can do something <a href="http://projecteuler.net/problems">more</a> <a href="https://github.com/">rewarding</a>.</p>
<p>[1] Also, the cost to make a TV show is much greater than the cost to make a book. So to be profitable, a TV show must appeal to a greater population than a book. This limits the ideas and opinions on television. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2011/12/04/consume-less-shallow-content/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Information Dieting with a Kindle</title>
		<link>http://geoff.greer.fm/2011/03/14/information-dieting-with-a-kindle/</link>
		<comments>http://geoff.greer.fm/2011/03/14/information-dieting-with-a-kindle/#comments</comments>
		<pubDate>Mon, 14 Mar 2011 07:44:35 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=847</guid>
		<description><![CDATA[I got a Kindle a few months ago, and it has completely changed how I read. It&#8217;s yet another example of trivial inconveniences affecting behavior. Before, my information diet consisted of countless hours reading short, forgetful pieces linked from IRC, Twitter, Google Reader, or Hacker News. I would try to read longer articles on my [...]]]></description>
			<content:encoded><![CDATA[<p>I got a Kindle a few months ago, and it has completely changed how I read. It&#8217;s yet another example of <a href="http://lesswrong.com/lw/f1/beware_trivial_inconveniences/">trivial inconveniences</a> affecting behavior. </p>
<p>Before, my information diet consisted of countless hours reading short, forgetful pieces linked from <a href="http://en.wikipedia.org/wiki/Internet_Relay_Chat">IRC</a>, <a href="http://twitter.com/">Twitter</a>, <a href="http://www.google.com/reader/">Google Reader</a>, or <a href="http://news.ycombinator.com/">Hacker News</a>. I would try to read longer articles on my laptop, but it was hard to avoid distractions such as e-mail and IM clients. </p>
<p>Reading full-length books was also a hassle, although I didn&#8217;t realize it at the time. I&#8217;d order a book from Amazon and wait two days. Then I had to carry a chunk of dead tree around. When travelling, I usually took multiple books with me, since I&#8217;d finish more than one on a trip. </p>
<p>Right after I got my Kindle, <a href="http://trolocsis.com/wp/">Ryan Phillips</a> told me about <a href="http://www.instapaper.com/">Instapaper</a>. Now I skim or ignore short things, and use Instapaper to mark a couple of large gems for evening reading. Instead of habitually refreshing Hacker News, I load it maybe once a day. </p>
<p>Fan fiction such as <a href="http://www.fanfiction.net/s/5782108/1/Harry_Potter_and_the_Methods_of_Rationality">Harry Potter and the Methods of Rationality</a> have fan-created .mobi and .epub files, but many stories aren&#8217;t popular enough to warrant such devotion. Fortunately I found <a href="http://fanfictionloader.appspot.com/">FanFiction Downloader</a>, a semi-automated way to get <a href="http://fanfiction.net/">FanFiction.net</a> stories onto my Kindle. The app isn&#8217;t perfect though. It runs out of memory on longer books.</p>
<p>The only major annoyance I&#8217;ve encountered is from flight attendants asking me to turn off my Kindle during takeoff and landing. I smile and wait for them to move on, then continue reading. Flipping the power switch wouldn&#8217;t do much anyway; Kindles don&#8217;t really turn off. They wake up to check for new content periodically, and there&#8217;s no way to remove the battery. I&#8217;m surprised the &#8220;no electronic devices&#8221; rule has lasted so long. If I were a conspiracy theorist, I&#8217;d rant about Amish Illuminati controlling the FAA. Googling for that idea doesn&#8217;t return much. I guess conspiracy theorists aren&#8217;t very creative. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2011/03/14/information-dieting-with-a-kindle/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>VPS.net is Really Annoying</title>
		<link>http://geoff.greer.fm/2010/11/20/vps-net-is-really-annoying/</link>
		<comments>http://geoff.greer.fm/2010/11/20/vps-net-is-really-annoying/#comments</comments>
		<pubDate>Sat, 20 Nov 2010 11:55:10 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=769</guid>
		<description><![CDATA[I&#8217;m writing this because I am annoyed at VPS.net. I wanted a server in the UK so I could use things like Spotify and BBC iPlayer. Cloudkick supports Linode and VPS.net. Both are closer to normal virtual private server providers than &#8220;true&#8221; cloud providers.[1] Linode billed monthly and VPS.net offered daily billing, so I went [...]]]></description>
			<content:encoded><![CDATA[<p>I&#8217;m writing this because I am annoyed at <a href="http://www.vps.net/">VPS.net</a>. I wanted a server in the UK so I could use things like <a href="http://en.wikipedia.org/wiki/Spotify">Spotify</a> and <a href="http://www.bbc.co.uk/iplayer/tv">BBC iPlayer</a>. <a href="https://www.cloudkick.com/">Cloudkick</a> supports <a href="http://www.linode.com/">Linode</a> and VPS.net. Both are closer to normal virtual private server providers than &#8220;true&#8221; cloud providers.<sup><a href="#foot1">[1]</a></sup> Linode billed monthly and VPS.net offered daily billing, so I went with the latter. The signup process was typical, except that I was asked to fill out four security questions. I entered stupid nonsensical answers, since while many people know my mother&#8217;s maiden name, nobody knows my current passwords and I am unlikely to forget them. Not long after signing up, I received a confirmation e-mail&#8230; containing my password in plaintext.</p>
<p>E-mailing me my password tells me several things about your company. It tells me that you store passwords in plaintext instead of hashing them. If anyone gets ahold of a DB dump, they&#8217;ll have passwords and e-mail addresses. Lots of people use the same password everywhere, making their e-mail vulnerable. E-mailing my password also tells me that you don&#8217;t either don&#8217;t know or don&#8217;t care about the dangers of sending secrets via e-mail. E-mail isn&#8217;t always encrypted and messages are often relayed through many servers. Anyone with access to one of those servers could see my password. </p>
<p>The password thing was a big red flag, but I didn&#8217;t want to give up so easily. I booted a server and started screwing around with it. I renamed my server in the VPS.net dashboard. Suddenly, my ssh session died. It turns out that renaming a server reboots it without warning. Frustrated, I gave up and decided to try again when I had more patience.</p>
<p>I woke up and saw my inbox contained an invoice for $1.00. Yes, VPS.net sends an invoice every day. Worse, after a week, VPS.net started warning me that my invoices were overdue. I tried to log in and pay the measly $10. I was confronted with a login page asking me to enter my username, password, and answer some security questions. They noticed I was trying to log in from a different IP address and threw some security questions at me. I finally managed to get enough answers correct to log in.</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/11/Screen-shot-2010-11-11-at-1.06.18-AM.png"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/11/Screen-shot-2010-11-11-at-1.06.18-AM-500x242.png" alt="" title="VPS.net Invoices" width="500" height="242" class="aligncenter size-large wp-image-814" /></a></p>
<p>That &#8220;Pay Now&#8221; button is actually a &#8220;try to pay $1 and show a big failure message, but mark the invoice as paid if there have been no payment attempts in the past few hours&#8221; button. I had to click it once for each invoice, waiting 3-4 hours between tries if I wanted them to work. Later I noticed the charges actually showed up on my card. </p>
<p>There were other things I noticed, such as sequential instance IDs. Did you know VPS.net has only booted a total of 33,000 instances? Anyway, after the invoice thing I wrote VPS.net off as amateurs and tried out Linode. I&#8217;ve had no problems with Linode. Their stuff works without annoying the hell out of me. If you want a server in the UK, go with them.</p>
<p><a name="foot1"></a>[1] The litmus test I use is, &#8220;Can I make an API call and get a booted server in under 5 minutes?&#8221; If not, then it&#8217;s not really cloud computing. It&#8217;s more of a reasonably fast VPS provider. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/11/20/vps-net-is-really-annoying/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Five Years of Progress in Laptops</title>
		<link>http://geoff.greer.fm/2010/11/16/five-years-of-progress-in-laptops/</link>
		<comments>http://geoff.greer.fm/2010/11/16/five-years-of-progress-in-laptops/#comments</comments>
		<pubDate>Tue, 16 Nov 2010 09:07:52 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=780</guid>
		<description><![CDATA[The last iteration of the iBook G4 came out in September of 2005 and was sold until mid-2006. 11.6&#8243; MacBook Air 14&#8243; iBook G4 Processor 1.6Ghz Core 2 Duo 1.42Ghz PowerPC G4 Memory 4GB 1067Mhz DDR3 RAM 512MB 333Mhz DDR2 RAM [1] Storage 128GB SSD 60GB 4200RPM HDD Battery 5-7 hours 3-4 hours Weight 2.3 [...]]]></description>
			<content:encoded><![CDATA[<p>The last iteration of the iBook G4 came out in September of 2005 and was sold until mid-2006. </p>
<table border="1" cellpadding="4" cellspacing="0">
<tr>
<th></th>
<th>11.6&#8243; MacBook Air</th>
<th>14&#8243; iBook G4</th>
</tr>
<tr>
<td>Processor</td>
<td>1.6Ghz Core 2 Duo</td>
<td>1.42Ghz PowerPC G4</td>
</tr>
<tr>
<td>Memory</td>
<td>4GB 1067Mhz DDR3 RAM</td>
<td>512MB 333Mhz DDR2 RAM <sup><a href="#foot1">[1]</a></sup></td>
</tr>
<tr>
<td>Storage</td>
<td>128GB SSD</td>
<td>60GB 4200RPM HDD</td>
</tr>
<tr>
<td>Battery</td>
<td>5-7 hours</td>
<td>3-4 hours</td>
</tr>
<tr>
<td>Weight</td>
<td>2.3 lbs</td>
<td>5.9 lbs</td>
</tr>
<tr>
<td>Dimensions</td>
<td>0.11-0.68 x 11.8 x 7.6</td>
<td>1.35 x 12.7 x 10.2</td>
</tr>
<tr>
<td>Cost</td>
<td>$1500</td>
<td>$1700</td>
</tr>
</table>
<p><a name="foot1"></a>[1] Bottlenecked by 142Mhz front side bus.</p>
<p>There are a dozen things that don&#8217;t show up in the numbers. The iBook&#8217;s keyboard is spongy. It has a smaller trackpad that only supports two-finger scrolling. The iBook&#8217;s display is much worse, although that may be due to age. The iBook&#8217;s trackpad is plastic instead of glass. Even with a fresh install of Leopard, it feels slow. Yet somehow I used it as my main computer for two years.</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/11/air_ibook2.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/11/air_ibook2-500x332.jpg" alt="" title="Air and iBook open" width="500" height="332" class="aligncenter size-large wp-image-782" /></a></p>
<p>In case you forgot, that skinny ethernet port on the iBook is a 56k modem. It&#8217;s like ethernet, but data goes 1,800 times slower and makes angry noises.</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/11/air_ibook.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/11/air_ibook-500x250.jpg" alt="" title="Air and iBook closed" width="500" height="250" class="aligncenter size-large wp-image-781" /></a></p>
<p>I wonder what I&#8217;ll compare my Air to in 2015.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/11/16/five-years-of-progress-in-laptops/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Expensive Computers are Worth the Price</title>
		<link>http://geoff.greer.fm/2010/10/30/expensive-computers-are-worth-the-price/</link>
		<comments>http://geoff.greer.fm/2010/10/30/expensive-computers-are-worth-the-price/#comments</comments>
		<pubDate>Sat, 30 Oct 2010 15:37:15 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=755</guid>
		<description><![CDATA[You should not be afraid to spend lots of money on a computer. All too often developers skimp on their computers. They balk at high price tags and try to save money by buying a less expensive model. For example: A Samsung NC20 goes for around $500. A completely maxed-out 11.6&#8243; MacBook Air costs $1500. [...]]]></description>
			<content:encoded><![CDATA[<p>You should not be afraid to spend lots of money on a computer. All too often developers skimp on their computers. They balk at high price tags and try to save money by buying a less expensive model. </p>
<p>For example: A <a href="http://en.wikipedia.org/wiki/Samsung_NC20">Samsung NC20</a> goes for around $500. A completely maxed-out 11.6&#8243; <a href="http://www.apple.com/macbookair/">MacBook Air</a> costs $1500. Most people look at those two prices and think, &#8220;Wow, I could save $1,000 by taking a small hit in performance and features.&#8221; Or worse, &#8220;$1500 is too much money for a computer.&#8221; That is the wrong way to think about it. </p>
<p>Here&#8217;s why: According to RescueTime, I average 10 hours a day on my laptop. Assuming I upgrade every 18 months, that&#8217;s 5,400 hours of use. Amortized over its life, a $1,500 laptop costs me 28 cents per hour. A $500 laptop would be 9 cents per hour. The important factor I haven&#8217;t mentioned yet is the amount of value I can create per hour. Let&#8217;s be extremely pessimistic and say I create $5 worth of value per hour on average. Let&#8217;s also say the $1500 laptop makes me 10% more efficient than the $500 laptop. That means I would create $5.50 worth of value each hour on the expensive laptop. Subtracting the amortized cost of the expensive laptop still leaves me with an extra 31 cents per hour. </p>
<p>The expensive laptop costs 3x as much and only improves my performance by 10%, but it still comes out ahead purely for economic reasons. This is because the amount of value you extract or create using a computer is much greater than the hourly cost of that computer. I&#8217;m not even factoring in more subjective things like ease-of-use or aesthetics. You shouldn&#8217;t be worried about spending too much on your computer. You should be worried about not spending enough! </p>
<p>I&#8217;ve followed my own advice here and bought a maxed-out 11&#8243; MacBook Air. I&#8217;m using it as my sole development machine. It&#8217;s amazing. </p>
<p>OK, I admit it. This entire post was just an excuse to brag about my MacBook Air.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/10/30/expensive-computers-are-worth-the-price/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>On Alpha Geeks and Gadgets</title>
		<link>http://geoff.greer.fm/2010/10/25/on-alpha-geeks-and-gadgets/</link>
		<comments>http://geoff.greer.fm/2010/10/25/on-alpha-geeks-and-gadgets/#comments</comments>
		<pubDate>Mon, 25 Oct 2010 10:43:39 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=728</guid>
		<description><![CDATA[Earlier this month, Benjamin Stein observed that &#8220;alpha geeks&#8221; are now using the same hardware as normal people. I have a hypothesis for why this is. Today, there are three main computing devices that people use: Laptops, which fit in a backpack and are fast enough for most stuff; smartphones, which fit in a pocket [...]]]></description>
			<content:encoded><![CDATA[<p>Earlier this month, Benjamin Stein observed that <a href="http://benjaminste.in/post/1223476561/hey-guys-whatcha-doing">&#8220;alpha geeks&#8221; are now using the same hardware as normal people</a>. I have a hypothesis for why this is.</p>
<p>Today, there are three main computing devices that people use: Laptops, which fit in a backpack and are fast enough for most stuff; smartphones, which fit in a pocket and are a tradeoff of size and speed/features; and desktops, which can have more storage and better graphics than laptops.</p>
<p>Now which one of those three things can an individual assemble and customize?</p>
<p>That&#8217;s why nerds/hackers are using the same hardware as everyone else. It used to be that almost everyone had desktops. Alpha geeks built custom machines from parts. Now, people use laptops and smartphones. Alpha geeks don&#8217;t have the resources to build or modify such tightly-integrated devices. Instead, they buy whatever best satisfies their needs. Lately, those products have been Macs and iPhones. </p>
<p>So are alpha geeks done with hardware tinkering? I doubt it. I think a new type of device will  show up: the wearable. Recent advances in microdisplays and embedded computing have made wearable computers a borderline-practical idea. And individuals can build them for about the cost of a laptop. <a href="http://www.umpcportal.com/2009/07/awesome-wearable-computer-setup-is-powered-by-sony-vaio-ux-umpc">A</a> <a href="http://www.linux.com/community/blogs/my-wearable-computer-updates-and-what-happens-next.html">few</a> <a href="http://blog.2yb.org/2010/07/cd-case-wearable-computer.html">people</a> have already hacked their own together from video goggles (like the Myvu Crystal) and single-board computers (like the <a href="http://beagleboard.org/">BeagleBoard</a>). </p>
<p>An often-heard objection to wearables is, &#8220;I already carry a computer with me. It&#8217;s called an iPhone and I can use it any time.&#8221; That&#8217;s true, but most people don&#8217;t realize how much <a href="http://lesswrong.com/lw/f1/beware_trivial_inconveniences/">trivial inconveniences</a> can affect their behavior. Every time you want to look something up, you have to pull the phone out of your pocket and unlock it. You lose eye contact with anyone you were conversing with. It takes time for the phone to come out of hibernation and run whatever app you want to use. The screen is visible to those nearby, so you can&#8217;t message a friend, &#8220;What&#8217;s the name of this person next to me?&#8221;, or search your e-mail archives for a forgotten message that has come up in discussion. </p>
<p>Two major issues with wearables are fashion and software. Fashion will probably be resolved as technology gets better and people become more used to seeing wearables. Software is going to be a bigger problem. Wearables have to be extremely responsive. The idea is to completely integrate the computer with your life. Smartphone software has a similar constraints, but not to the same degree.</p>
<p>A wearable with good software would be outrageously useful. Imagine having a local cache of Wikipedia, e-mail, personal notes, and other data sources. Add a camera to the mix to get <a href="http://en.wikipedia.org/wiki/Lifelog">lifelogging</a> and <a href="http://en.wikipedia.org/wiki/Augmented_reality">augmented reality</a>. While AR is more of a toy, people completely underestimate the utility of lifelogging. I know of one case where a lifelogger had video of the first time he met his wife. A lifelog would also come in handy if you were witness to a crime or accident. To get some idea of what you do all day, you could put the lifelog data into something like <a href="https://www.rescuetime.com/">RescueTime</a>. If automated transcribing gets better you could build a searchable database of all your conversations. With these new sources of data and forms of interaction, the possibilities are quite vast.</p>
<p>Note: This post is expanded from <a href="http://news.ycombinator.com/item?id=1758750">a comment I made</a> on Hacker News.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/10/25/on-alpha-geeks-and-gadgets/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Time Management</title>
		<link>http://geoff.greer.fm/2010/10/10/time-management/</link>
		<comments>http://geoff.greer.fm/2010/10/10/time-management/#comments</comments>
		<pubDate>Mon, 11 Oct 2010 04:07:33 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Rationality]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=695</guid>
		<description><![CDATA[Each year has 365 days. Each day has 24 hours. That&#8217;s 8,760 hours a year. Sounds like a lot, but how much of it is spent doing stuff you have to do versus what you want to do? You need around 8 hours a day for sleep. That leaves 5,840 hours of wakefulness. A full-time [...]]]></description>
			<content:encoded><![CDATA[<p>Each year has 365 days. Each day has 24 hours. That&#8217;s 8,760 hours a year. Sounds like a lot, but how much of it is spent doing stuff you <em>have</em> to do versus what you <em>want</em> to do?</p>
<p>You need around 8 hours a day for sleep. That leaves 5,840 hours of wakefulness. </p>
<p>A full-time job is around 2,000 hours a year. 3,840 hours left. </p>
<p>In addition to work you&#8217;re paid for, you have to run errands and do chores (shop for groceries, go to the bank, yard work, vacuum, cook, wash dishes, etc). Let&#8217;s say you average 90 minutes a day on that, which is 548 hours per year. 3,292 hours remaining. </p>
<p>How long is your commute? The average is 25 minutes each way, so just over 208 hours a year. 3,084 hours left. </p>
<p>How long do you take to get ready in the morning? 40 minutes? 240 hours. 2,844 left. </p>
<p>Do you exercise? Maybe you don&#8217;t work out every day. 1 hour a day, 3 times a week? 156 hours. 2,688 left. </p>
<p>Now let&#8217;s say you&#8217;re 25 years old and healthy. According to most <a href="http://www.ssa.gov/OACT/STATS/table4c6.html">actuarial tables</a>, that gives you even odds of sticking around for another 50 years.</p>
<p>2,688 hours * 50 = 134,400 hours. That&#8217;s 15 years. I admit it&#8217;s a very rough estimate. I left out a lot of factors (such as anything related to raising children). People work less when they&#8217;re older, but that&#8217;s partially offset by more time spent being sick. I&#8217;d also weight calculations toward free time in younger years, since youth usually means fewer responsibilities and greater physical ability. Later years are spent undergoing general cognitive and physical decline. </p>
<p>What wisdom do I take away from this calculation? Pretty straightforward stuff: Find a job you enjoy. Use a tool like <a href="https://www.rescuetime.com/">RescueTime</a> to ensure you spend your free time wisely. Finally, you spend a significant chunk of your life using your bed, office chair, and/or computer. Don&#8217;t skimp on those things. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/10/10/time-management/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Stanislav Petrov Day</title>
		<link>http://geoff.greer.fm/2010/09/26/stanislav-petrov-day/</link>
		<comments>http://geoff.greer.fm/2010/09/26/stanislav-petrov-day/#comments</comments>
		<pubDate>Sun, 26 Sep 2010 07:34:28 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Uncategorized]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=668</guid>
		<description><![CDATA[Many people say Thanksgiving is the fourth Thursday in November. I disagree. If there is any day of the year on which to give thanks, it is September 26th. Why? Today is the 27th anniversary of when Stanislav Petrov chose not to destroy the world. When an early warning system reported the Americans had launched [...]]]></description>
			<content:encoded><![CDATA[<p>Many people say Thanksgiving is the fourth Thursday in November. I disagree. If there is any day of the year on which to give thanks, it is September 26th.</p>
<p>Why?</p>
<p>Today is the 27th anniversary of when <a href="http://en.wikipedia.org/wiki/Stanislav_Petrov">Stanislav Petrov</a> chose not to destroy the world. When an early warning system reported the Americans had launched ICBMs, Petrov told his superiors it was a malfunction. Had he decided incorrectly, the Soviets would have launched their nukes, causing the United States to <em>actually</em> launch their nukes. Billions would have died. </p>
<p>I am continually amazed by how few know about this incident. The average person could probably tell you the latest celebrity gossip or which team won some sporting competition, but ask them who prevented a gigadeath event and they wouldn&#8217;t have a clue. </p>
<p>Lieutenant Colonel Petrov, your name isn&#8217;t as famous as it should be, but thank you nonetheless. The gratitude owed to you simply cannot be conveyed. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/09/26/stanislav-petrov-day/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Burning Man 2010</title>
		<link>http://geoff.greer.fm/2010/09/06/burning-man-2010/</link>
		<comments>http://geoff.greer.fm/2010/09/06/burning-man-2010/#comments</comments>
		<pubDate>Mon, 06 Sep 2010 22:31:21 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Photography]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=647</guid>
		<description><![CDATA[This was my second year going to Burning Man. Like last year, I went with camp cryo. We used up 265 liters of liquid nitrogen in a single afternoon. Apparently people love free ice cream when it&#8217;s 100ºF out. Flavors ranged from boring vanilla and chocolate to a surprisingly tasty mix of chili pepper and [...]]]></description>
			<content:encoded><![CDATA[<p>This was my second year going to <a href="http://www.burningman.com/">Burning Man</a>. Like last year, I went with camp cryo. We used up 265 liters of liquid nitrogen in a single afternoon. Apparently people love free ice cream when it&#8217;s 100ºF out. </p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/09/DSC_8060-e1283812486401.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/09/DSC_8060-e1283812486401-500x752.jpg" alt="" title="DSC_8060" width="398" height="600" class="aligncenter size-large wp-image-664" /></a></p>
<p>Flavors ranged from boring vanilla and chocolate to a surprisingly tasty mix of chili pepper and graham cracker. The heat of the peppers and the cold of the ice cream complemented each other, or something. I&#8217;m no culinary expert. </p>
<p>The art was pretty impressive too. I&#8217;ve <a href="http://www.flickr.com/photos/ggreer/sets/72157624763335007/">thrown a few photos up</a> on Flickr and <a href="http://geoff.greer.fm/gallery/v/burn10/">a few more</a> in my gallery. My favorite piece was a 40 foot tall metal statue of a woman. </p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/09/DSC_7942.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/09/DSC_7942-500x752.jpg" alt="" title="DSC_7942" width="500" height="752" class="aligncenter size-large wp-image-650" /></a></p>
<p>Not only is the statue visually appealing, it&#8217;s an impressive engineering feat. There are no guy-wires to keep it standing. It&#8217;s balanced on a small pedestal hidden under the playa dust. The whole weight of the statue is supported by one foot.</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/09/DSC_8028-e1283811412520.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/09/DSC_8028-e1283811412520-500x752.jpg" alt="" title="DSC_8028" width="500" height="752" class="aligncenter size-large wp-image-652" /></a></p>
<p>Oh and it lights up at night. There are LEDs throughout the metal latticework, cycling through most of the color spectrum. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/09/06/burning-man-2010/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Return of the Supermotard</title>
		<link>http://geoff.greer.fm/2010/08/02/return-of-the-supermotard/</link>
		<comments>http://geoff.greer.fm/2010/08/02/return-of-the-supermotard/#comments</comments>
		<pubDate>Mon, 02 Aug 2010 22:43:50 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Vroom!]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=578</guid>
		<description><![CDATA[Two weeks ago, my DR-Z400SM was stolen. It was a sad day. It was especially sad because I only have liability insurance. On Sunday afternoon I got a call: the San Francisco Police Department found my bike! It took a few hours to sort out paperwork and run UPDATE VEHICLES SET STOLEN=FALSE WHERE LICENCE_PLATE='ABC4567'; It [...]]]></description>
			<content:encoded><![CDATA[<p>Two weeks ago, my DR-Z400SM was stolen. It was a sad day. It was especially sad because I only have liability insurance. </p>
<p>On Sunday afternoon I got a call: the San Francisco Police Department found my bike! It took a few hours to sort out paperwork and run <code>UPDATE VEHICLES SET STOLEN=FALSE WHERE LICENCE_PLATE='ABC4567';</code> It was DMV-esque: talking to different cogs in the machine; each one converting time into frustration. Finally, I was ready to pick up my bike.</p>
<p>Patience waning, I walked across the street to the impound lot, where the real adventure began. I was told it would be $200 to get my bike out of impound. The fee would have been $400, but the city of San Francisco gave me a we&#8217;re-sorry-your-bike-got-stolen-but-not-so-sorry-that-we-won&#8217;t-charge-you discount. I had no choice. I paid the money. The sleepy lady behind the bulletproof glass then said my bike wouldn&#8217;t be available until tomorrow morning. </p>
<p>Now that, I will not abide. </p>
<p>I took a breath. The words I wanted to say would not help me get my bike back. Had I said them, the end result would have been to annoy a sleepy lady and force me to come back to the impound lot in the morning. </p>
<p>I thought up some new words that <em>would</em> help me get my bike back. I exaggerated my plight. &#8220;Lady, I have a flight in the morning and I won&#8217;t be back for a week. That bike is my only vehicle. You&#8217;re the only person who can help me right now.&#8221; This was&#8230; somewhat true. I had a flight, but it was in the afternoon. I own a car, but I haven&#8217;t driven it in weeks. Really, I just wanted my bike. </p>
<p>The sleepy lady relented. My bike would be at the impound lot in an hour. Where was it coming from? Why couldn&#8217;t I take a cab to where it was now? Again I bit my tongue.</p>
<p>Finally, done with bureaucratic bullshit. I had spent a good chunk of my Sunday to get to this moment. Carrying my helmet everywhere I went. Fiddling with the key in my jacket pocket. Imagining the engine sound, the smell of fuel-rich exhaust, the exhilaration of twisting the throttle, dropping the clutch and accelerating quicker than my mind could comprehend. Buoyed by these images, I strode through the impound lot. Smiling. Anticipating. Key in hand, ready to ride a celebratory wheelie all&#8230; the way&#8230; home.</p>
<p>Except, wait a second. Where&#8217;s the keyhole in the ignition?</p>
<p>The thief made a few modifications to my bike. </p>
<p>Keyless ignition!</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7730_resized.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7730_resized-500x332.jpg" alt="" title="DSC_7730_resized" width="500" height="332" class="aligncenter size-large wp-image-606" /></a></p>
<p>The thief removed the ignition. There&#8217;s no place to insert my key. Now if I want to ride, I just flip the kill switch and hit the starter.</p>
<p>Passenger pegs! </p>
<p>I don&#8217;t have a picture of these yet, but the pegs were attached with <strong>wood screws</strong>.</p>
<p>Aftermarket gas cap! </p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7726.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7726-500x394.jpg" alt="" title="DSC_7726" width="500" height="394" class="aligncenter size-large wp-image-579" /></a><br />
<a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7727.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7727-500x374.jpg" alt="" title="DSC_7727" width="500" height="374" class="aligncenter size-large wp-image-580" /></a></p>
<p>The original gas cap had a key lock. The thief did not have a key. Improvisation ensued.</p>
<p>Broken turn signals!</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7728_resized.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7728_resized-500x332.jpg" alt="" title="DSC_7728_resized" width="500" height="332" class="aligncenter size-large wp-image-608" /></a></p>
<p>Fender eliminator kit!</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7729_resized.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7729_resized-500x751.jpg" alt="" title="DSC_7729_resized" width="500" height="751" class="aligncenter size-large wp-image-607" /></a></p>
<p>(The thief hacksawed off part of the fender and moved the license plate up.)</p>
<p>Other minor changed included removing the tool pouch, removing all reflectors, and adding <strong>500 miles</strong> to the odometer.</p>
<p>This morning I noticed one more thing&#8230;</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7734_resized.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7734_resized-500x751.jpg" alt="" title="DSC_7734_resized" width="500" height="751" class="aligncenter size-large wp-image-610" /></a><br />
<a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7735_resized.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/08/DSC_7735_resized-500x751.jpg" alt="" title="DSC_7735_resized" width="500" height="751" class="aligncenter size-large wp-image-611" /></a></p>
<p>The thief wrecked my bike and cracked part of the engine case. He &#8220;fixed&#8221; it with some JB weld. It leaks oil when running.</p>
<p>Last I heard from the cops, they have a suspect and he is in jail. I guess that&#8217;s a happy ending for everyone involved. Except the thief, who is in jail. And me, since I&#8217;m out $200 and my bike is fucked. </p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/08/02/return-of-the-supermotard/feed/</wfw:commentRss>
		<slash:comments>0</slash:comments>
		</item>
		<item>
		<title>Insert Frozen Food Joke Here</title>
		<link>http://geoff.greer.fm/2010/07/09/insert-frozen-food-joke-here/</link>
		<comments>http://geoff.greer.fm/2010/07/09/insert-frozen-food-joke-here/#comments</comments>
		<pubDate>Fri, 09 Jul 2010 11:17:37 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Rationality]]></category>
		<category><![CDATA[Transhumanism]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=504</guid>
		<description><![CDATA[I am signed up for cryonics. I applied in April of 2009 and finished the paperwork in September. I am Alcor member A-2447; signed up for whole-body cryopreservation and funded by a whole life insurance policy. Many of my friends, family, and coworkers know this already. If you didn&#8217;t know, you&#8217;re probably wondering, &#8220;Why?&#8221; The [...]]]></description>
			<content:encoded><![CDATA[<p>I am signed up for <a href="http://en.wikipedia.org/wiki/Cryonics">cryonics</a>. I applied in April of 2009 and finished the paperwork in September. I am <a href="http://alcor.org/">Alcor</a> member A-2447; signed up for whole-body cryopreservation and funded by a whole life insurance policy.</p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/05/tags1.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/05/tags1-500x225.jpg" alt="" title="Tags" width="500" height="225" class="aligncenter size-large wp-image-506" /></a></p>
<p>Many of my friends, family, and coworkers know this already. If you didn&#8217;t know, you&#8217;re probably wondering, &#8220;Why?&#8221;</p>
<p>The decision to pursue cryonics really comes down to answering two questions: &#8220;How likely is it that cryonics will work?&#8221; and &#8220;Is life extension desirable and moral?&#8221; <a href="http://www.singinst.org/blog/2007/06/16/transhumanism-as-simplified-humanism/">Others</a> have <a href="http://www.singinst.org/blog/2007/10/14/the-meaning-that-immortality-gives-to-life/">answered</a> the second question better than I can, so I&#8217;ll just talk about the current feasibility. </p>
<p>Accurately evaluating cryonics requires knowledge scattered across many disciplines. Even so, the basic principle can be understood by anyone: Frozen meat lasts a long time.</p>
<p>I first heard about cryonics in high school. I knew that water expanded when frozen, and wrote off cryonics as a crackpot idea that would never work. It was obvious: ice crystals damaged cells irreparably. There was no way anyone could revive a frozen body. Case closed.</p>
<p>Until early 2009, when I stumbled on <a href="http://www.overcomingbias.com">Overcoming Bias</a>. A <a href="http://www.overcomingbias.com/2008/12/we-agree-get-froze.html">couple of posts</a> <a href="http://www.overcomingbias.com/2009/03/break-cryonics-down.html">discussed cryonics</a>, and caused me to reconsider it. After seeing electron micrographs of cryopreserved brain tissue, I read more. I realized the idea wasn&#8217;t so crazy. </p>
<p><a href="http://lesswrong.com/lw/wq/you_only_live_twice/">This post on Less Wrong</a> got me to start the paperwork. Signing up is rather involved. Major steps include becoming a member of a cryonics provider, securing funding (usually a life insurance policy), and notarizing and witnessing paperwork. For me, the whole process took several months. </p>
<p>While Eliezer Yudkowsky&#8217;s post convinced me to sign up for cryonics, the most persuasive writing in the world won&#8217;t convince <em>reality</em> that cryonics works. Cryonics either works or it doesn&#8217;t. Finding the answer requires examining evidence. So, bring on the evidence! </p>
<p>This presentation by Brian Wowk does a good job showing the state of cryopreservation technology:</p>
<p><embed class="aligncenter" id=VideoPlayback src=http://video.google.com/googleplayer.swf?docid=2157944955525659858&#038;hl=en&#038;fs=true style=width:400px;height:326px allowFullScreen=true allowScriptAccess=always type=application/x-shockwave-flash> </embed></p>
<p>For those who don&#8217;t want to spend 25 minutes watching the video, the main points are:</p>
<ul>
<li>The common conception of freezing damage is backwards. Ice doesn&#8217;t cause cells to expand and burst. Ice crystals form between cells, dehydrating and squishing cells as the crystals grow.</li>
<li>Cryoprotectants can limit or even eliminate ice formation at liquid nitrogen temperatures. Instead of freezing, the solution increases in viscosity as temperature drops. Around -120ºC, the solution reaches its <a href="http://en.wikipedia.org/wiki/Glass_transition">glass transition temperature</a> and becomes an <a href="http://en.wikipedia.org/wiki/Amorphous_solid">amorphous solid</a>.</li>
<li>Cryoprotectant research is ongoing. A decade ago, cryoprotectants needed cooling/warming rates of 70ºC per second to prevent ice formation. Cell survival rates were around 50% in tissue samples. Today&#8217;s cryoprotectants can revive 90% of cells with cooling/warming rates of less than 1ºC per second.</li>
<li>Wowk&#8217;s team used their current best cryoprotectant (M22) to successfully cryopreserve, thaw, and transplant rabbit kidneys.</li>
<li>Based on evidence from victims of hypothermia, barbituate overdose, and cardiac arrest, silencing electrical activity in the brain doesn&#8217;t erase any long-term memories. Cryopreserving the brain should preserve all aspects of self.</li>
<li>SEM micrographs of cryopreserved brain tissue show fine structure is preserved. Individual <a href="http://en.wikipedia.org/wiki/Axon">axons</a> are unharmed. Even <a href="http://en.wikipedia.org/wiki/Synaptic_vesicle">synaptic vesicles</a> are preserved.</li>
<li>Cooling cryoprotectant solution too far below the glass transition temperature will cause fracturing from thermal stresses. While they make revival harder, the fractures are few in number and typically cause simple translations of tissue. The information destroyed is negligible.</li>
<li>Despite limited funding, cryopreservation techniques have improved substantially. Cryopreservation and transplantation of large organs is expected in 10 years.</li>
</ul>
<p>Alcor uses M22 to cryopreserve the brains of their customers. <a href="http://www.cryonics.org/">The Cryonics Institute</a> uses a similar solution. If Alcor or CI gets to you in time, the structure of your brain will be accurately preserved down to the nanometer scale. Everything we know about chemistry, biology, and neuroscience tells us that this process preserves all the information required to reconstruct a human mind. </p>
<p>The biggest unknown in cryonics is the revival process. Right now it&#8217;s completely speculative. People have thrown some ideas around, but all require major advances in current technologies. Some even require inventing new technologies (such as molecular nanotech). So today, a few unaugmented, 21st-century, biological humans have given it some thought but haven&#8217;t built revival technology. But the information in cryopreserved brains will wait patiently for a solution. Cryonics organizations pay for indefinite maintenance with the interest from low-risk investments. Failure requires that no future intelligence ever finds a way to revive people.  </p>
<p>Based on this evidence, I&#8217;m very sure the preservation process works. My doubts are about the future. I assign a low probability to being revived: around 5%, since a lot of things have to go right. The biggest thing being that humanity has to not destroy itself. While 5% is a small likelihood, it&#8217;s still worth paying for. Any civilization with the means and desire to revive people will be a <em>very</em> nice place to live. And members of that civilization would live a very long time. Quality of life would probably be better than most current depictions of heaven. I am not kidding.</p>
<p>When I told people, reactions varied. My mother laughed. My father and siblings thought it was weird and sort of interesting. I don&#8217;t think any of them took it seriously. I guess I&#8217;m too timid to say, &#8220;It&#8217;s your funeral.&#8221;</p>
<p>Well, too timid to say it face-to-face.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/07/09/insert-frozen-food-joke-here/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Super-something-tard</title>
		<link>http://geoff.greer.fm/2010/05/03/super-something-tard/</link>
		<comments>http://geoff.greer.fm/2010/05/03/super-something-tard/#comments</comments>
		<pubDate>Tue, 04 May 2010 04:03:18 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Vroom!]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=515</guid>
		<description><![CDATA[In anticipation of my move to San Francisco, I&#8217;ve bought a slightly used (salvaged) Suzuki DR-Z400 SM. The SM stands for supermotard. The idea behind supermotard bikes is to put street wheels and turn signals on a dirtbike. Compared to a typical sportbike, they are light, slow, and good on bumpy streets and dirt. I&#8217;m [...]]]></description>
			<content:encoded><![CDATA[<p>In anticipation of my move to San Francisco, I&#8217;ve bought a slightly used (salvaged) <a href="http://en.wikipedia.org/wiki/Suzuki_DR-Z400">Suzuki DR-Z400 SM</a>. The SM stands for <a href="http://en.wikipedia.org/wiki/Supermotard">supermotard</a>. The idea behind supermotard bikes is to put street wheels and turn signals on a dirtbike. Compared to a typical sportbike, they are light, slow, and good on bumpy streets and dirt. </p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/05/DSC_7304.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/05/DSC_7304-500x487.jpg" alt="" title="DSC_7304" width="500" height="487" class="aligncenter size-large wp-image-524" /></a></p>
<p>I&#8217;m 5&#8217;6&#8243;, so the bike is pretty tall for me. I can barely touch my toes to the pavement when I straddle it. But that height comes in handy; I can easily see over cars in traffic. In fact, I&#8217;m pretty sure I could ride over the roofs of those cars. The ridiculous suspension lets me ride over curbs and baby strollers without worries. It&#8217;s practical as well. Insurance is cheap. It&#8217;s slower (and probably safer) than my SV-650/S. It&#8217;s ugly in an endearing way. And it doesn&#8217;t have expensive fairings to fix after it falls. </p>
<p><a href="http://geoff.greer.fm/rambling/wp-content/uploads/2010/05/DSC_7306.jpg"><img src="http://geoff.greer.fm/rambling/wp-content/uploads/2010/05/DSC_7306-500x476.jpg" alt="" title="DSC_7306" width="500" height="476" class="aligncenter size-large wp-image-526" /></a></p>
<p>Finally, it can do this:<br />
<object width="480" height="385"><param name="movie" value="http://www.youtube.com/v/U_Xkywi5XGM&#038;hl=en_US&#038;fs=1&#038;"></param><param name="allowFullScreen" value="true"></param><param name="allowscriptaccess" value="always"></param><embed src="http://www.youtube.com/v/U_Xkywi5XGM&#038;hl=en_US&#038;fs=1&#038;" type="application/x-shockwave-flash" allowscriptaccess="always" allowfullscreen="true" width="480" height="385"></embed></object></p>
<p>OK, maybe it&#8217;s not safer.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/05/03/super-something-tard/feed/</wfw:commentRss>
		<slash:comments>2</slash:comments>
		</item>
		<item>
		<title>Ubuntu Annoyances</title>
		<link>http://geoff.greer.fm/2010/04/30/ubuntu-annoyances/</link>
		<comments>http://geoff.greer.fm/2010/04/30/ubuntu-annoyances/#comments</comments>
		<pubDate>Sat, 01 May 2010 02:37:11 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=423</guid>
		<description><![CDATA[Ubuntu 10.04 came out yesterday. It&#8217;s probably the best desktop Linux distro out there, which is about as prestigious as being the best Yugoslavian car company. Here are a few simple things that have annoyed me users for years. I&#8217;ve included the year each bug was created along with links to any upstream bug reports [...]]]></description>
			<content:encoded><![CDATA[<p>Ubuntu 10.04 came out yesterday. It&#8217;s probably the best desktop Linux distro out there, which is about as prestigious as being the best Yugoslavian car company. Here are a few simple things that have annoyed <del datetime="2010-04-22T03:28:02+00:00">me</del> users for years. I&#8217;ve included the year each bug was created along with links to any upstream bug reports I could find.</p>
<p><a href="https://bugs.launchpad.net/ubuntu/+bug/11334">Bug #11334: MASTER Copy-Paste doesn&#8217;t work if the source is closed before the paste</a> (2004)</p>
<p>I don&#8217;t know why this one has stuck around for so long. Fortunately, most of apps have been updated to work around the bug, but there is no good excuse for having clipboard functionality broken in a modern OS.</p>
<p><a href="https://bugs.launchpad.net/nautilus/+bug/20284">Bug #20284: Keep Desktop icons automatically arranged</a> (2005)<br />
Upstream: <a href="https://bugzilla.gnome.org/show_bug.cgi?id=172128">Bug 172128 &#8211; Autosorting desktop icons</a><br />
Related: <a href="https://bugs.launchpad.net/ubuntu/+source/nautilus/+bug/12608">Bug #12608: &#8216;keep aligned&#8217; does not work right</a></p>
<p>If you delete or add icons (for example, by inserting or removing a USB drive), the desktop icons will not stay sorted. New icons will often overlap others. Deleted icons will leave empty spaces on the desktop. There is an option to align icons to a grid, but the grid is smaller than the icons, so icons still overlap.</p>
<p><a href="https://bugs.launchpad.net/ubuntu/+source/gnome-screensaver/+bug/22007">Bug #22007: no &#8216;Settings&#8217; button in gnome-screensaver</a> (2005)<br />
Upstream: <a href="https://bugzilla.gnome.org/show_bug.cgi?id=316654">Bug 316654 &#8211; no ability to configure the different screensavers</a></p>
<p>Have you ever wanted to change the text of GLText? It used to be as easy as selecting that screensaver and clicking on the settings button. Now there is no way to change screensaver settings short of manually editing some obscure XML files. The comment by the gnome-screensaver developer is particularly infuriating: <i>Resolution: WONTFIX I don&#8217;t have any plans to support this. My view is that any screensaver theme that requires configuration is inherently broken.</i> </p>
<p><a href="https://bugs.launchpad.net/ubuntu/+source/util-linux/+bug/10550">Bug #10550: DVDs with restrictive permissions are unreadable for normal user</a> (late 2004)</p>
<p>This one is especially silly, considering a fix probably involves passing some extra params to mount. </p>
<p><a href="https://bugs.launchpad.net/ubuntu/+source/linux/+bug/16454">Bug #16454: Sound still comes out of speakers when PCM volume is set to 0</a> (2005)</p>
<p>What? A bug in <a href="http://www.alsa-project.org/main/index.php/Main_Page">ALSA</a>? What a surprise! I think all ALSA and PulseAudio developers are deaf, because they certainly haven&#8217;t heard users screaming about Linux sound issues for the past <i>decade</i>.</p>
<p><a href="https://bugs.launchpad.net/ubuntu/+bug/18666">Bug #18666: Lots of seemingly redundant fonts</a> (2005)</p>
<p>*sigh*</p>
<p>What do these issues have in common? All of them are old, so chances are good they&#8217;ll stick around in future Ubuntu releases. A decent portion of them are caused by Gnome upstream. Most are rationalized as not worth fixing because they are rarely encountered by typical users. Another common excuse is that each annoyance is minor. But an OS with a lot of small annoyances makes for a <i>terrible</i> user experience. The chances of a user getting annoyed in a given time period are much higher in Ubuntu than in an OS with a few huge bugs. Lots of little bugs make expectation management impossible. New users can&#8217;t learn about all the annoyances before they try the product. If there were only a couple of large deficiencies, users could learn about them beforehand and decide not to use the product. At the very least, their expectations of the product would be closer to reality, and the short list of deficiencies would be easier to remember and work around. </p>
<p>I&#8217;ve been bit by every single bug I&#8217;ve mentioned. But those are only the oldest, most common annoyances. I&#8217;m not including newer stuff like Nvidia drivers breaking in 10.04, or static in the right channel of my headphone jack after upgrading to 10.04, or having to screw with fstab, xorg.conf, and <a href="https://bugs.launchpad.net/ubuntu/+source/atk1.0/+bug/547244">building my own .deb files</a> just to get my system to boot again.</p>
<p>There&#8217;s a reason Ubuntu is free: Nobody in their right mind would pay money for it.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/04/30/ubuntu-annoyances/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
		<item>
		<title>Is My Credit Card Stolen?</title>
		<link>http://geoff.greer.fm/2010/04/23/is-my-credit-card-stolen/</link>
		<comments>http://geoff.greer.fm/2010/04/23/is-my-credit-card-stolen/#comments</comments>
		<pubDate>Sat, 24 Apr 2010 00:34:27 +0000</pubDate>
		<dc:creator>Geoff Greer</dc:creator>
				<category><![CDATA[Computers]]></category>

		<guid isPermaLink="false">http://geoff.greer.fm/?p=467</guid>
		<description><![CDATA[Paul bought ismycreditcardstolen.com a couple days ago. AJ came up with the idea a while back, but Paul&#8217;s purchase of the domain drove me to throw together a site. The goal was to educate gullible people about phishing while amusing the technically-inclined. With some help from friends (Ben Lowery and Bjorn Tipling), I cleaned up [...]]]></description>
			<content:encoded><![CDATA[<p><a href="http://journal.paul.querna.org/">Paul</a> bought <a href="http://ismycreditcardstolen.com/">ismycreditcardstolen.com</a> a couple days ago. <a href="http://aj.slater.net/">AJ</a> came up with the idea a while back, but Paul&#8217;s purchase of the domain drove me to throw together a site. The goal was to educate gullible people about phishing while amusing the technically-inclined.</p>
<p>With some help from friends (<a href="http://blowery.org/">Ben Lowery</a> and <a href="http://bjorn.tipling.com/">Bjorn Tipling</a>), I cleaned up the styling and made sure that the credit card details were never sent across the wire. </p>
<p><a href="http://news.ycombinator.com/item?id=1286880">I submitted the link to Hacker News</a>, where it was rather well-received. Everyone got the joke. Some even offered suggestions to improve the text of the warning message.</p>
<p>The site quickly became popular. <a href="http://twitter.com/#search?q=ismycreditcardstolen">People on Twitter talked about it</a>. </p>
<p>That&#8217;s when things started going south. A decent number of <a href="http://twitter.com/badwebsites/statuses/12672928201">people</a> <a href="http://twitter.com/kisasondi/statuses/12717240592">didn&#8217;t</a> <a href="http://twitter.com/privacycommons/statuses/12672938161">get</a> <a href="http://twitter.com/robertobrien/status/12672594696">the</a> <a href="http://twitter.com/dgapeev/statuses/12690786526">joke</a>. They thought it was a real phishing site. Among them was <a href="http://twitter.com/bobmcardle/status/12692632353">this guy</a>, supposedly a researcher at antivirus company <a href="http://us.trendmicro.com/us/home/">Trend Micro</a>. Google Analytics shows about half of the visitors actually clicked the submit button. I&#8217;m guessing the other half didn&#8217;t see the &#8220;This was a test. You failed.&#8221; message and assumed it was a phishing site.)</p>
<p>I normally don&#8217;t care about idiots on the Internet, but enough Firefox users reported it as a phishing site that it got blacklisted. Now if you try to visit it in any modern browser, you&#8217;ll get a giant warning. Even worse, sites like Twitter use the Firefox phishing blacklist to filter links, so nobody can link to the site now.</p>
<p>In a final bit of ridiculousness, <a href="http://uk.news.yahoo.com/16/20100423/ttc-security-group-creates-educational-p-6315470.html">UK Yahoo News reported</a> that the <a href="http://www.antiphishing.org/">Anti-Phishing Working Group</a> was responsible for creating ismycreditcardstolen.com. This misunderstanding wouldn&#8217;t have happened if the reporter read the <a href="http://ismycreditcardstolen.com/about.html">about page</a>.</p>
<p>What have I learned from this? </p>
<ul>
<li>People on Twitter are dumber than I thought.</li>
<li>A small group can add any relatively-unpopular site to the Firefox phishing blacklist.</li>
<li>Some &#8220;reporter&#8221; couldn&#8217;t be troubled to click the about link on the front page of the site he wrote an article about.</li>
</ul>
<p>Quite a few people have reported the site as being incorrectly flagged, but it hasn&#8217;t done any good. I doubt it will ever be removed from the phishing blacklist. Oh well, it was fun while it lasted. And since Paul bought the domain I&#8217;m not out any money.</p>
]]></content:encoded>
			<wfw:commentRss>http://geoff.greer.fm/2010/04/23/is-my-credit-card-stolen/feed/</wfw:commentRss>
		<slash:comments>3</slash:comments>
		</item>
	</channel>
</rss>

<!-- Performance optimized by W3 Total Cache. Learn more: http://www.w3-edge.com/wordpress-plugins/

Page Caching using disk: basic
Object Caching 874/1060 objects using disk: basic

Served from: geoff.greer.fm @ 2012-02-05 05:32:05 -->
