<?xml version='1.0' encoding='UTF-8'?><?xml-stylesheet href="http://www.blogger.com/styles/atom.css" type="text/css"?><feed xmlns='http://www.w3.org/2005/Atom' xmlns:openSearch='http://a9.com/-/spec/opensearchrss/1.0/' xmlns:georss='http://www.georss.org/georss' xmlns:gd='http://schemas.google.com/g/2005' xmlns:thr='http://purl.org/syndication/thread/1.0'><id>tag:blogger.com,1999:blog-5304409</id><updated>2012-02-16T07:43:42.389-08:00</updated><category term='future'/><category term='speculation'/><category term='economics'/><category term='emacs'/><category term='typography'/><category term='howto'/><category term='programming'/><category term='mac'/><category term='structure'/><category term='giving'/><category term='environment'/><category term='heroes'/><category term='project'/><category term='review'/><title type='text'>Amit's Thoughts</title><subtitle type='html'>Amit has &lt;em&gt;crazy thoughts&lt;/em&gt;.</subtitle><link rel='http://schemas.google.com/g/2005#feed' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/posts/default'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default?max-results=100'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/'/><link rel='hub' href='http://pubsubhubbub.appspot.com/'/><link rel='next' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default?start-index=101&amp;max-results=100'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><generator version='7.00' uri='http://www.blogger.com'>Blogger</generator><openSearch:totalResults>215</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>100</openSearch:itemsPerPage><entry><id>tag:blogger.com,1999:blog-5304409.post-4956017507190647382</id><published>2011-08-27T17:05:00.000-07:00</published><updated>2011-08-31T11:43:27.845-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: custom mode line</title><content type='html'>&lt;p&gt;
&lt;a href="http://emacs-fu.blogspot.com/2011/08/customizing-mode-line.html"&gt;Dirk-Jan C. Binnema&amp;#8217;s mode-line blog post&lt;/a&gt; inspired me to post about my own Emacs mode line configuration. I found the &lt;a href="http://www.emacswiki.org/emacs/ModeLine"&gt;default mode line&lt;/a&gt; to be too busy for my tastes. I removed most of it and added to the features I care about most. Here’s what it currently looks like:&lt;/p&gt;

&lt;div style="overflow: hidden"&gt;
&lt;a href="http://lh3.googleusercontent.com/-iWYuNOTbwHg/TlkpWBAJ92I/AAAAAAAAExc/Nn9lj2yGwpM/s800/amitp-mode-line-regular.png"&gt;
&lt;img src="http://lh3.googleusercontent.com/-iWYuNOTbwHg/TlkpWBAJ92I/AAAAAAAAExc/Nn9lj2yGwpM/s800/amitp-mode-line-regular.png" alt="Emacs mode line" /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;p&gt;I use a proportional font for most of the mode line, along with extra padding to make the mode line taller than other lines. From left to right:&lt;/p&gt;

&lt;ol&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Line and column position&lt;/strong&gt;. I use a monospace font for this portion because it&amp;#8217;s changing all the time, and I don&amp;#8217;t want the rest of the mode line to move around. &lt;/p&gt;

&lt;p&gt;I also highlight the column number if I go over 80 columns, using code similar to &lt;a href="http://www.emacswiki.org/emacs/ModeLinePosition"&gt;modeline-posn.el&lt;/a&gt;:&lt;/p&gt;

&lt;div style="overflow: hidden"&gt;
&lt;a href="http://lh3.googleusercontent.com/-ZH6oVzJ0rZw/TlkpW7ua39I/AAAAAAAAExg/QVEyhotHY2w/s800/amitp-mode-line-80col.png"&gt;&lt;img src="http://lh3.googleusercontent.com/-ZH6oVzJ0rZw/TlkpW7ua39I/AAAAAAAAExg/QVEyhotHY2w/s800/amitp-mode-line-80col.png" alt="Emacs mode line with 80 column indicator" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Buffer status&lt;/strong&gt;. If the buffer is modified, I use a bright white and red block:&lt;/p&gt;

&lt;div style="overflow: hidden"&gt;
&lt;a href="http://lh5.googleusercontent.com/-fRax4GVZfCU/TlkpXOp_dTI/AAAAAAAAExk/2egCA4TEYXI/s800/amitp-mode-line-modified.png"&gt;&lt;img src="http://lh5.googleusercontent.com/-fRax4GVZfCU/TlkpXOp_dTI/AAAAAAAAExk/2egCA4TEYXI/s800/amitp-mode-line-modified.png" alt="Emacs mode line with buffer modified indicator" /&gt;&lt;/a&gt;
&lt;/div&gt;

&lt;p&gt;If it&amp;#8217;s read-only, I use a blue indicator:&lt;/p&gt;

&lt;div style="overflow: hidden"&gt;
&lt;a href="http://lh5.googleusercontent.com/-hd8q9KwGSOE/TlkpX5B0HeI/AAAAAAAAExo/ehQwDCtAZ4w/s800/amitp-mode-line-readonly.png"&gt;&lt;img src="http://lh5.googleusercontent.com/-hd8q9KwGSOE/TlkpX5B0HeI/AAAAAAAAExo/ehQwDCtAZ4w/s800/amitp-mode-line-readonly.png" alt="Emacs mode line with buffer read only indicator" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Directory and buffer name&lt;/strong&gt;. I found that the current directory matters to me so I decided to put it into the mode line, in addition to alternatives like &lt;a href="http://www.emacswiki.org/emacs/uniquify"&gt;Uniquify&lt;/a&gt;. Some directory names are too long so I only show the trailing portion.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;&lt;strong&gt;Mode indicators&lt;/strong&gt;. I want to see the major mode. I&amp;#8217;m less sure about the rest: VC mode (not all VC packages use this), narrowing (I almost never use this), recursive edit (I should use this but I don&amp;#8217;t), minor modes (I almost never look at this part of the mode-line), process status.&lt;/p&gt;&lt;/li&gt;
&lt;li&gt;&lt;p&gt;And what would a mode line be without &lt;a href="http://www.emacswiki.org/emacs/NyanMode"&gt;Nyan mode&lt;/a&gt;? It only turns on if I use &lt;code&gt;M-x nyan-mode&lt;/code&gt;.&lt;/p&gt;&lt;/li&gt;
&lt;/ol&gt;

&lt;p&gt;I removed things I don&amp;#8217;t care about: character encoding, mule, end of line conversion, tooltips, menus, file size, overwrite mode, frame information, portion of buffer being displayed, and the dashes.&lt;/p&gt;

&lt;p&gt;&lt;a href="http://emacs-fu.blogspot.com/2011/08/customizing-mode-line.html?showComment=1314399530368#c6534582178318426727"&gt;Duncan MacGregor suggests splitting up the mode line into smaller pieces&lt;/a&gt;. However, I haven&amp;#8217;t done that yet. Instead, I expanded everything into one big list.&lt;/p&gt;

&lt;style type="text/css"&gt;&lt;!-- 
/* I used M-x htmlfontify and then manually fixed this up */
/* Some of the colors are from https://github.com/ChrisKempson/Tomorrow-Theme */
.snippet span.constant   { color: #718c00;     }
.snippet span.doc   { color: #666666;  background: #e8e8e8;    }
.snippet span.function-name   { font-weight: bold;  color: #4271ae;  }
.snippet span.keyword   { color: #0000cd;     }
.snippet span.mf   { color: #4271ae;     }
.snippet span.string   { color: #666666;  background: #d8e0d8;    }
.snippet span.builtin   { color: #508b20;     }
.snippet span.pf   { color: #a0a090;  font-weight: 700;     }
.snippet span.comment   { font-family: Contra;   color: #006699;  background: #ffffff;  }
 --&gt;&lt;/style&gt;

&lt;pre class="snippet"&gt;;; &lt;span class="comment"&gt;Mode line setup
&lt;/span&gt;&lt;span class="pf"&gt;(&lt;/span&gt;setq-default
 mode-line-format
 '&lt;span class="pf"&gt;(&lt;/span&gt;; &lt;span class="comment"&gt;Position, including warning for 80 columns
&lt;/span&gt;   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:propertize&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;%4l:&amp;quot;&lt;/span&gt; face mode-line-position-face&lt;span class="pf"&gt;)&lt;/span&gt;
   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:eval&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;propertize &lt;span class="string"&gt;&amp;quot;%3c&amp;quot;&lt;/span&gt; 'face
                      &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;if&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;&amp;gt;= &lt;span class="pf"&gt;(&lt;/span&gt;current-column&lt;span class="pf"&gt;)&lt;/span&gt; 80&lt;span class="pf"&gt;)&lt;/span&gt;
                          'mode-line-80col-face
                        'mode-line-position-face&lt;span class="pf"&gt;)))&lt;/span&gt;
   ; &lt;span class="comment"&gt;emacsclient &lt;/span&gt;&lt;span class="comment"&gt;[&lt;/span&gt;&lt;span class="comment"&gt;default -- keep?&lt;/span&gt;&lt;span class="comment"&gt;]&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;   mode-line-client
   &lt;span class="string"&gt;&amp;quot;  &amp;quot;&lt;/span&gt;
   ; &lt;span class="comment"&gt;read-only or modified status
&lt;/span&gt;   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:eval&lt;/span&gt;
    &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;cond&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;buffer-read-only
           &lt;span class="pf"&gt;(&lt;/span&gt;propertize &lt;span class="string"&gt;&amp;quot; RO &amp;quot;&lt;/span&gt; 'face 'mode-line-read-only-face&lt;span class="pf"&gt;))&lt;/span&gt;
          &lt;span class="pf"&gt;((&lt;/span&gt;buffer-modified-p&lt;span class="pf"&gt;)&lt;/span&gt;
           &lt;span class="pf"&gt;(&lt;/span&gt;propertize &lt;span class="string"&gt;&amp;quot; ** &amp;quot;&lt;/span&gt; 'face 'mode-line-modified-face&lt;span class="pf"&gt;))&lt;/span&gt;
          &lt;span class="pf"&gt;(&lt;/span&gt;t &lt;span class="string"&gt;&amp;quot;      &amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;)))&lt;/span&gt;
   &lt;span class="string"&gt;&amp;quot;    &amp;quot;&lt;/span&gt;
   ; &lt;span class="comment"&gt;directory and buffer/file name
&lt;/span&gt;   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:propertize&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:eval&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;shorten-directory default-directory 30&lt;span class="pf"&gt;))&lt;/span&gt;
                face mode-line-folder-face&lt;span class="pf"&gt;)&lt;/span&gt;
   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:propertize&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;%b&amp;quot;&lt;/span&gt;
                face mode-line-filename-face&lt;span class="pf"&gt;)&lt;/span&gt;
   ; &lt;span class="comment"&gt;narrow &lt;/span&gt;&lt;span class="comment"&gt;[&lt;/span&gt;&lt;span class="comment"&gt;default -- keep?&lt;/span&gt;&lt;span class="comment"&gt;]&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;   &lt;span class="string"&gt;&amp;quot; %n &amp;quot;&lt;/span&gt;
   ; &lt;span class="comment"&gt;mode indicators: vc, recursive edit, major mode, minor modes, process, global
&lt;/span&gt;   &lt;span class="pf"&gt;(&lt;/span&gt;vc-mode vc-mode&lt;span class="pf"&gt;)&lt;/span&gt;
   &lt;span class="string"&gt;&amp;quot;  %&lt;/span&gt;&lt;span class="string"&gt;[&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;&lt;/span&gt;
   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:propertize&lt;/span&gt; mode-name
                face mode-line-mode-face&lt;span class="pf"&gt;)&lt;/span&gt;
   &lt;span class="string"&gt;&amp;quot;%&lt;/span&gt;&lt;span class="string"&gt;]&lt;/span&gt;&lt;span class="string"&gt; &amp;quot;&lt;/span&gt;
   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:eval&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;propertize &lt;span class="pf"&gt;(&lt;/span&gt;format-mode-line minor-mode-alist&lt;span class="pf"&gt;)&lt;/span&gt;
                      'face 'mode-line-minor-mode-face&lt;span class="pf"&gt;))&lt;/span&gt;
   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:propertize&lt;/span&gt; mode-line-process
                face mode-line-process-face&lt;span class="pf"&gt;)&lt;/span&gt;
   &lt;span class="pf"&gt;(&lt;/span&gt;global-mode-string global-mode-string&lt;span class="pf"&gt;)&lt;/span&gt;
   &lt;span class="string"&gt;&amp;quot;    &lt;/span&gt;&lt;span class="string"&gt;&amp;quot;&lt;/span&gt;
   ; &lt;span class="comment"&gt;nyan-mode uses nyan cat as an alternative to %p
&lt;/span&gt;   &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:eval&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;when&lt;/span&gt; nyan-mode &lt;span class="pf"&gt;(&lt;/span&gt;list &lt;span class="pf"&gt;(&lt;/span&gt;nyan-create&lt;span class="pf"&gt;))))&lt;/span&gt;
   &lt;span class="pf"&gt;))&lt;/span&gt;

;; &lt;span class="comment"&gt;Helper function&lt;/span&gt;&lt;span class="comment"&gt;
&lt;/span&gt;&lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;defun&lt;/span&gt; &lt;span class="function-name"&gt;shorten-directory&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;dir max-length&lt;span class="pf"&gt;)&lt;/span&gt;
  &lt;span class="doc"&gt;&amp;quot;Show up to `&lt;/span&gt;&lt;span class="constant"&gt;max-length&lt;/span&gt;&lt;span class="doc"&gt;' characters of a directory name `&lt;/span&gt;&lt;span class="constant"&gt;dir&lt;/span&gt;&lt;span class="doc"&gt;'.&amp;quot;&lt;/span&gt;
  &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;let&lt;/span&gt; &lt;span class="pf"&gt;((&lt;/span&gt;path &lt;span class="pf"&gt;(&lt;/span&gt;reverse &lt;span class="pf"&gt;(&lt;/span&gt;split-string &lt;span class="pf"&gt;(&lt;/span&gt;abbreviate-file-name dir&lt;span class="pf"&gt;)&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;/&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;)))&lt;/span&gt;
        &lt;span class="pf"&gt;(&lt;/span&gt;output &lt;span class="string"&gt;&amp;quot;&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;))&lt;/span&gt;
    &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;when&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;and path &lt;span class="pf"&gt;(&lt;/span&gt;equal &lt;span class="string"&gt;&amp;quot;&amp;quot;&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;car path&lt;span class="pf"&gt;)))&lt;/span&gt;
      &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;setq&lt;/span&gt; path &lt;span class="pf"&gt;(&lt;/span&gt;cdr path&lt;span class="pf"&gt;)))&lt;/span&gt;
    &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;while&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;and path &lt;span class="pf"&gt;(&lt;/span&gt;&amp;lt; &lt;span class="pf"&gt;(&lt;/span&gt;length output&lt;span class="pf"&gt;)&lt;/span&gt; &lt;span class="pf"&gt;(&lt;/span&gt;- max-length 4&lt;span class="pf"&gt;)))&lt;/span&gt;
      &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;setq&lt;/span&gt; output &lt;span class="pf"&gt;(&lt;/span&gt;concat &lt;span class="pf"&gt;(&lt;/span&gt;car path&lt;span class="pf"&gt;)&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;/&amp;quot;&lt;/span&gt; output&lt;span class="pf"&gt;))&lt;/span&gt;
      &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;setq&lt;/span&gt; path &lt;span class="pf"&gt;(&lt;/span&gt;cdr path&lt;span class="pf"&gt;)))&lt;/span&gt;
    &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;when&lt;/span&gt; path
      &lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="keyword"&gt;setq&lt;/span&gt; output &lt;span class="pf"&gt;(&lt;/span&gt;concat &lt;span class="string"&gt;&amp;quot;.../&amp;quot;&lt;/span&gt; output&lt;span class="pf"&gt;)))&lt;/span&gt;
    output&lt;span class="pf"&gt;))&lt;/span&gt;

;; &lt;span class="comment"&gt;Extra mode line faces
&lt;/span&gt;&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-read-only-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-modified-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-folder-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-filename-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-position-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-mode-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-minor-mode-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-process-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;make-face &lt;span class="mf"&gt;'mode-line-80col-face&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;

&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray60&amp;quot;&lt;/span&gt; &lt;span class="builtin"&gt;:background&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray20&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:inverse-video&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:box&lt;/span&gt; '&lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:line-width&lt;/span&gt; 6 &lt;span class="builtin"&gt;:color&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray20&amp;quot;&lt;/span&gt; &lt;span class="builtin"&gt;:style&lt;/span&gt; nil&lt;span class="pf"&gt;))&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-inactive&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray80&amp;quot;&lt;/span&gt; &lt;span class="builtin"&gt;:background&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray40&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:inverse-video&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:box&lt;/span&gt; '&lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:line-width&lt;/span&gt; 6 &lt;span class="builtin"&gt;:color&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray40&amp;quot;&lt;/span&gt; &lt;span class="builtin"&gt;:style&lt;/span&gt; nil&lt;span class="pf"&gt;))&lt;/span&gt;

&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-read-only-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#4271ae&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:box&lt;/span&gt; '&lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:line-width&lt;/span&gt; 2 &lt;span class="builtin"&gt;:color&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#4271ae&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;))&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-modified-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#c82829&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:background&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#ffffff&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:box&lt;/span&gt; '&lt;span class="pf"&gt;(&lt;/span&gt;&lt;span class="builtin"&gt;:line-width&lt;/span&gt; 2 &lt;span class="builtin"&gt;:color&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#c82829&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;))&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-folder-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray60&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-filename-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#eab700&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:weight&lt;/span&gt; &lt;span class="mf"&gt;'bold&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-position-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:family&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;Menlo&amp;quot;&lt;/span&gt; &lt;span class="builtin"&gt;:height&lt;/span&gt; 100&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-mode-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray80&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-minor-mode-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-mode-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;gray40&amp;quot;&lt;/span&gt;
    &lt;span class="builtin"&gt;:height&lt;/span&gt; 110&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-process-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#718c00&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;
&lt;span class="pf"&gt;(&lt;/span&gt;set-face-attribute &lt;span class="mf"&gt;'mode-line-80col-face&lt;/span&gt; nil
    &lt;span class="builtin"&gt;:inherit&lt;/span&gt; &lt;span class="mf"&gt;'mode-line-position-face&lt;/span&gt;
    &lt;span class="builtin"&gt;:foreground&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;black&amp;quot;&lt;/span&gt; &lt;span class="builtin"&gt;:background&lt;/span&gt; &lt;span class="string"&gt;&amp;quot;#eab700&lt;/span&gt;&lt;span class="string"&gt;&amp;quot;&lt;/span&gt;&lt;span class="pf"&gt;)&lt;/span&gt;

&lt;/pre&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4956017507190647382?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4956017507190647382/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4956017507190647382' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4956017507190647382'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4956017507190647382'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2011/08/emacs-custom-mode-line.html' title='Emacs: custom mode line'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh3.googleusercontent.com/-iWYuNOTbwHg/TlkpWBAJ92I/AAAAAAAAExc/Nn9lj2yGwpM/s72-c/amitp-mode-line-regular.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-5125064931110952129</id><published>2011-08-24T10:38:00.001-07:00</published><updated>2011-08-24T21:33:24.249-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Interactive diagrams</title><content type='html'>&lt;p&gt;
Five years ago I got interested in interactive diagrams and made a few, but then got distracted by other things. I wrote a &lt;a href="http://simblob.blogspot.com/2007/07/interactive-illustrations.html"&gt;blog post about why I was interested in them&lt;/a&gt;. I've recently become interested in them again. Back then, I used Flash, but these days I think HTML5 is a good option. I generally make better progress by starting small, so I've started working on something fairly simple: &lt;a href="http://theory.stanford.edu/~amitp/diagrams/car-blind-spots/"&gt;a diagram showing where the “blind spots” are when driving a car&lt;/a&gt;. 
&lt;/p&gt;
&lt;p style="margin:1em;text-align:center"&gt;
&lt;a href="http://theory.stanford.edu/~amitp/diagrams/car-blind-spots/"&gt;&lt;img src="http://theory.stanford.edu/~amitp/diagrams/car-blind-spots/screenshot.png" /&gt;
&lt;br /&gt;(click through to try it)&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
It's not yet complete but I've already learned some things:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;If you have your seat forward the blind spots are smaller than if you have your seat back.&lt;/li&gt;
&lt;li&gt;The right side mirror shows much less area than the left side mirror. To see a larger area you need to distort the area, which causes things to look smaller. This is why you see “Objects are closer than they appear” on the right mirror but not the left mirror.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In retrospect, these should've been obvious, but the diagram is what made it clear to me. It also became clear that the diagram needs more work. I need to add an option to make the right side mirror curved (I'm not sure what the typical curvature is). I might need to calculate the effect of someone rotating their head. I should measure car mirrors and the driver position inside the car.
&lt;/p&gt;
&lt;p&gt;
It's been a fun little project. I learned some Javascript and SVG, and I got to play with Mike Bostock's &lt;a href="http://mbostock.github.com/d3/"&gt;d3&lt;/a&gt; library, even though it's overkill for a diagram like this. The process of working on the diagram helped me understand things and motivated me to learn more. I'd like to work on several more interactive diagrams to see if the car diagram is a special case or if interactive diagrams are generally useful for me.
&lt;/p&gt;
&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-5125064931110952129?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/5125064931110952129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=5125064931110952129' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5125064931110952129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5125064931110952129'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2011/08/interactive-diagrams.html' title='Interactive diagrams'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3370915746428577192</id><published>2011-08-12T08:01:00.000-07:00</published><updated>2011-08-12T08:01:16.908-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>TiVo Features I want</title><content type='html'>&lt;p&gt;Over the years Tivo has added lots of features to the
   product. Unfortunately I'm not interested in most of them. Things I
   don't care about:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     Swivel Search
 &lt;/li&gt;

 &lt;li&gt;
     Guru Guides
 &lt;/li&gt;

 &lt;li&gt;
     podcasts
 &lt;/li&gt;

 &lt;li&gt;
     Discovery Bar
 &lt;/li&gt;

 &lt;li&gt;
     KidZone
 &lt;/li&gt;

 &lt;li&gt;
     radio stations
 &lt;/li&gt;

 &lt;li&gt;
     games
 &lt;/li&gt;

 &lt;li&gt;
     TivoCast
 &lt;/li&gt;

 &lt;li&gt;
     Photo, music, video streaming from my computer
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I do like the internet guide loading (so I don't need a phone line),
   the Netflix/Hulu/Amazon streaming, and support for HDTV (Cablecard).
&lt;/p&gt;
&lt;p&gt;What I'd really like are features without funny names:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     When I press a button on the remote, the Tivo should react instantly.
 &lt;/li&gt;

 &lt;li&gt;
     No more waiting. When I change a season pass or settings, I shouldn't have to wait for the Tivo to do its calculations. It should let me continue while it works in the background.
 &lt;/li&gt;

 &lt;li&gt;
     When I delete several shows in a row from a folder, the Tivo shouldn't get confused. I sometimes find that it tells me the group is now empty, and I have to go out and back into the group to see the remaining shows.
 &lt;/li&gt;

 &lt;li&gt;
     When I add a show to be recorded (or a season pass), I want to choose a folder. I don't want to use the folders by show name; I want to choose folders that mean something to me, like “history shows” or “time travel movies”. This didn't matter when the capacity was 40GB but the more storage there is, the more useful folders become.
 &lt;/li&gt;

 &lt;li&gt;
     Instead of assuming I receive all 500 channels, ask me which level of Cable TV I subscribe to, so that I can see just the 100 channels I actually get. Every channel change can be relative to that list. Right now, most channel changes are irrelevant to me, and end up adding channels that I don't actually get.
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;I suspect that as a company gets larger, it's easier to get management to approve people working on features with names than on features without names. However, this is pure speculation on my part.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3370915746428577192?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3370915746428577192/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3370915746428577192' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3370915746428577192'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3370915746428577192'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2011/08/tivo-features-i-want.html' title='TiVo Features I want'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-6085287941894130377</id><published>2011-05-25T12:15:00.001-07:00</published><updated>2011-05-25T12:15:54.145-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Gene therapy</title><content type='html'>&lt;p&gt;In an alternative universe, instead of hearing about gene therapy for:
&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; 
     Cancer
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Alzheimer's
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Parkinson's
 &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;we'd be hearing about gene therapy for:
&lt;/p&gt; 
&lt;ul&gt; 
 &lt;li&gt; 
     Hair loss
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Hair color
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Hair style
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Eye color
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Skin color
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Perfume
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Effects of aging
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Weight loss and gain
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Muscle growth
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Body part enhancement
 &lt;/li&gt; 
 
 &lt;li&gt; 
     Chicken that tastes like bacon
 &lt;/li&gt; 
&lt;/ul&gt; 
&lt;p&gt;For the yellow outfit you're wearing today you might pick a light
   brown skin tone and green eyes. You'd use the light brown skin tone
   body wash to change the genes in your skin. You'd put in the green eye
   eyedrops to deliver the genes into your eyes. You'd place a stencil on
   your skin and use a spray to deliver genes for a light skin color tone
   to form a tattoo.  You'd deliver citrusy scent genes to the
   odor-creating bacteria on your skin to produce that smell today.
&lt;/p&gt; 
&lt;p&gt;But we don't live in that alternate universe. Instead of all these
   miracles, all we're going to get is a cure for cancer.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-6085287941894130377?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/6085287941894130377/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=6085287941894130377' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6085287941894130377'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6085287941894130377'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2011/05/genetic-therapy.html' title='Gene therapy'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-116595886739450173</id><published>2011-03-06T07:52:00.000-08:00</published><updated>2011-03-06T07:53:49.138-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Microwave Oven controls</title><content type='html'>&lt;p&gt;In the old days, microwave ovens had dials. You turned the dial to the amount of time you wanted it to run, and then it ran. Life was simple.
&lt;/p&gt;
&lt;p&gt;These days, microwave ovens have lots of buttons. Yes, there are more features, but it's also much more confusing, especially for the simple use case.
&lt;/p&gt;
&lt;div&gt;
&lt;a href="http://3.bp.blogspot.com/-yhfGLgwBD1k/TXOtGSsASPI/AAAAAAAAEEQ/T13iiAJ6TUA/s1600/IMG_2663.JPG" style="float:right; margin-left:1em; margin-bottom:1em"&gt;&lt;img height="320" width="240" src="http://3.bp.blogspot.com/-yhfGLgwBD1k/TXOtGSsASPI/AAAAAAAAEEQ/T13iiAJ6TUA/s320/IMG_2663.JPG" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;The microwave I have has the best of both worlds. For the simple case, it uses a dial. For the extra features that are rarely used, it uses buttons. The dial has a good feel to it, and it has discrete stops (not continuous). The stop size increases as the time increases:
&lt;/p&gt;
&lt;ul&gt;
 &lt;li&gt;
     From 1 to 10 seconds, it's rounded to the second.
 &lt;/li&gt;

 &lt;li&gt;
     From 10 seconds to 1 minute, it's rounded to 5 seconds.
 &lt;/li&gt;

 &lt;li&gt;
     From 1 minute to 5 minutes, it's rounded to 10 seconds.
 &lt;/li&gt;

 &lt;li&gt;
     From 5 minutes to 10 minutes, it's rounded to 15 seconds.
 &lt;/li&gt;

 &lt;li&gt;
     From 10 minutes to 30 minutes, it's rounded to 30 seconds.
 &lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Consider the alternatives.  If it had been linear, with high precision (1 second), I'd have to turn the dial for a very long time to reach 10 minutes.  In addition, my compulsive behavior would have me fiddling until it's &lt;em&gt;exactly&lt;/em&gt; 10:00 minutes, not 9:57 or 10:02.  If it had been linear, with low precision (10 seconds), I'd have no good way to specify durations such as 15 or 45 seconds. I'd end up running it and watching it the whole time, stopping it at the right time.
&lt;/p&gt;
&lt;p&gt;
I love using this microwave oven. For most needs, I can turn the dial, then press Start. Rarely do I have to use the other buttons.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-116595886739450173?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/116595886739450173/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=116595886739450173' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116595886739450173'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116595886739450173'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2011/03/microwave-oven-controls.html' title='Microwave Oven controls'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/-yhfGLgwBD1k/TXOtGSsASPI/AAAAAAAAEEQ/T13iiAJ6TUA/s72-c/IMG_2663.JPG' height='72' width='72'/><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-7711267986650806047</id><published>2011-01-29T11:21:00.000-08:00</published><updated>2011-01-29T11:21:32.054-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><title type='text'>Evolutionary handicaps</title><content type='html'>&lt;p&gt;
We evolved alongside parasites that weaken us,
and recently in human history we were able to get rid of those parasites. What would happen? Our bodies would overcompensate, just like the &lt;a href="http://www.ehow.com/how_2249289_do-floating-arms-experiment.html"&gt;“floating arms” experiment&lt;/a&gt;.
&lt;/p&gt;

&lt;ul&gt;

&lt;li&gt;If parasites weakened the immune system, then human bodies would adapt by making the immune system more aggressive. Removing the parasites would lead to human immune systems increasingly overreacting to things. There are some people who &lt;a href="http://en.wikipedia.org/wiki/Helminthic_therapy"&gt;infect themselves with parasites&lt;/a&gt; to treat allergies and immune disorders.&lt;/li&gt;

&lt;li&gt;If parasites increased our aggressiveness (as &lt;a href="http://notexactlyrocketscience.wordpress.com/2007/01/14/brain-parasite-drives-human-culture/"&gt;toxoplasma gondii is hypothesized to do&lt;/a&gt;), then humans would adapt by lowering aggressivness. Removing the parasites would lead to more the human race becoming more passive.&lt;/li&gt;

&lt;li&gt;If parasites weakened our mental abilities, then humans would adapt by making extra-powerful brains. Removing the parasites would lead to more intelligent humans.&lt;/li&gt;

&lt;/ul&gt;

&lt;p&gt;
Is it possible that human brains are far more powerful than they need to be for survival in the wild because parasite evolution forced them to be that way?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-7711267986650806047?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/7711267986650806047/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=7711267986650806047' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7711267986650806047'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7711267986650806047'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2011/01/evolutionary-handicaps.html' title='Evolutionary handicaps'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-5762183178902037327</id><published>2010-10-27T21:11:00.000-07:00</published><updated>2011-01-29T11:22:47.516-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><title type='text'>Cows are like Poodles</title><content type='html'>&lt;p&gt;
Poodles are man-made creatures. There were no packs of wild poodles roaming the African savannah, hunting antelope. Poodles were created by humans, through &lt;a href="http://en.wikipedia.org/wiki/Dog_breeding"&gt;breeding&lt;/a&gt;, over thousands of years. They act and look very different from wolves because we bred them for &lt;s&gt;appearance&lt;/s&gt; retrieving and, recently, appearance (&lt;strong&gt;edit&lt;/strong&gt;: corrected, thanks to Simon Proctor's comment below). That's where we focused our energies, and it shows.
&lt;/p&gt;

&lt;p style="text-align:center"&gt;
&lt;a href="http://www.flickr.com/photos/jonner/487461265/" title="A Very Pink Poodle by jonner, on Flickr"&gt;&lt;img src="http://farm1.static.flickr.com/223/487461265_ecb90b2d49.jpg" style="max-width:100%" alt="Packs of poodles did not roam Africa" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;photo by &lt;a href="http://www.flickr.com/photos/jonner/"&gt;jonner&lt;/a&gt; on flickr&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
Cows are also man-made creatures. Let me clarify: the cows &lt;em&gt;we milk and eat&lt;/em&gt; are man-made creatures. We've created them through breeding, over ten thousand years. They look similar to &lt;a href="http://en.wikipedia.org/wiki/Aurochs"&gt;wild cattle&lt;/a&gt; (now extinct) because we bred them for what's on the inside. We've made them smaller and more docile. We've made them produce more milk. We've made them produce more meat. We've also altered their appearance, but not as much as we've done for poodles. There were no herds of black-and-white mottled cows roaming across Asia.
&lt;/p&gt;

&lt;p style="text-align:center"&gt;
&lt;a href="http://www.flickr.com/photos/hockadilly/2573593820/" title="as usual, bertie drew an audience by hockadilly, on Flickr"&gt;&lt;img src="http://farm4.static.flickr.com/3007/2573593820_b3d6babedb.jpg" style="max-width:100%" alt="Cattle are strangely colored" /&gt;&lt;/a&gt;&lt;br /&gt;&lt;small&gt;photo by &lt;a href="http://www.flickr.com/photos/hockadilly/"&gt;hockadilly&lt;/a&gt; on flickr&lt;/small&gt;
&lt;/p&gt;

&lt;p&gt;
So that's my random thought for the day: &lt;strong&gt;cows are like poodles&lt;/strong&gt;.  They're man-made creatures.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-5762183178902037327?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/5762183178902037327/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=5762183178902037327' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5762183178902037327'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5762183178902037327'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2010/10/cows-are-like-poodles.html' title='Cows are like Poodles'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm1.static.flickr.com/223/487461265_ecb90b2d49_t.jpg' height='72' width='72'/><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-4120592377624109607</id><published>2010-04-18T19:52:00.000-07:00</published><updated>2011-08-31T11:50:07.295-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><title type='text'>Diminishing returns in a project</title><content type='html'>&lt;p&gt;
I've been thinking about why people should ever change projects. The longer they're on the project, the more familiar they are with it, and the more effective they are. We might draw this on a graph, with productivity increasing over time:
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://lh5.ggpht.com/_kV9ZnGnZL7M/S8vCLL3tWII/AAAAAAAADj8/5Ds1OkSrtew/s800/Diminishing%20Returns%20-%20Productivity.png"&gt;&lt;img style="max-width:90%" src="http://lh5.ggpht.com/_kV9ZnGnZL7M/S8vCLL3tWII/AAAAAAAADj8/5Ds1OkSrtew/s800/Diminishing%20Returns%20-%20Productivity.png" alt="increasing productivity as people become more familiar with the project" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;a name='more'&gt;&lt;/a&gt;

&lt;p&gt;
However it's likely that for a brand new project, there might be some initial work to do before they really get going: studying the problem, building some models, designing a solution, etc. So let's draw this in this way:
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://lh5.ggpht.com/_kV9ZnGnZL7M/S8vCLbrUnhI/AAAAAAAADkA/3Y3Rx4xGktk/s800/Diminishing%20Returns%20-%20Starting%20Up.png"&gt;&lt;img style="max-width:90%" src="http://lh5.ggpht.com/_kV9ZnGnZL7M/S8vCLbrUnhI/AAAAAAAADkA/3Y3Rx4xGktk/s800/Diminishing%20Returns%20-%20Starting%20Up.png" alt="initially the team is unproductive as they set things up" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
I'd also guess that for many projects, things are prioritized so that the parts with the best benefit/cost ratio are done first. That means as time goes on, the things the team is working on are less beneficial, or higher cost. We could draw it in this way, with cheap wins coming first:
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://lh3.ggpht.com/_kV9ZnGnZL7M/S8vCLMhL2mI/AAAAAAAADj4/Ta9h-iYr2RI/s800/Diminishing%20Returns%20-%20Prioritization.png"&gt;&lt;img style="max-width:90%" src="http://lh3.ggpht.com/_kV9ZnGnZL7M/S8vCLMhL2mI/AAAAAAAADj4/Ta9h-iYr2RI/s800/Diminishing%20Returns%20-%20Prioritization.png" alt="do the best cost ratio things first" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
What's the combination of these three? On one hand, people are becoming more effective over time. On the other hand, the things that being worked on are less important over time, because the most important things were done earlier. I multiplied the above three graphs to get this:
&lt;/p&gt;

&lt;p&gt;
&lt;a href="http://lh4.ggpht.com/_kV9ZnGnZL7M/S8vCK2GlfpI/AAAAAAAADj0/FZmu94XZ7DA/s800/Diminishing%20Returns%20-%20Combined.png"&gt;&lt;img style="max-width:90%" src="http://lh4.ggpht.com/_kV9ZnGnZL7M/S8vCK2GlfpI/AAAAAAAADj0/FZmu94XZ7DA/s800/Diminishing%20Returns%20-%20Combined.png" alt="combined productivity" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;
In this model, it takes some time to get going, but once the team is going, they're getting a lot of good stuff done. But eventually they end up working on less important or more difficult things. When should the management start moving people to new projects? I don't think you want to switch as soon as you pass the maximum effectiveness, because there's plenty more to do that's valuable. But eventually the things they're working on are just not that important compared to the contributions they could be making on another team, and I think that effect will overtake the effect of people becoming more knowledgeable about their current project. I just don't know how to identify that point in time.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4120592377624109607?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4120592377624109607/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4120592377624109607' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4120592377624109607'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4120592377624109607'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2010/04/diminishing-returns-in-project.html' title='Diminishing returns in a project'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://lh5.ggpht.com/_kV9ZnGnZL7M/S8vCLL3tWII/AAAAAAAADj8/5Ds1OkSrtew/s72-c/Diminishing%20Returns%20-%20Productivity.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3087608955037815499</id><published>2009-12-01T09:21:00.000-08:00</published><updated>2011-08-31T11:50:36.981-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='structure'/><title type='text'>iPhone vs. gPhone navigation model</title><content type='html'>&lt;p&gt;
I've had an iPhone for a long time. I tried a G1 “gPhone” and thought it was slow and unpolished (I've heard Cyanogen's mod helps a lot with the speed), so I went back to my iPhone. But after trying out the G1 for a bit longer, I've discovered the model is quite different, and possibly better, than the iPhone's model. Here are some scenarios:
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;
You're on a web page, you see a link to Youtube, and you click it. The iPhone takes you to the YouTube app. After you watch the video, you press the home button, then go back to the web, and it returns you to the page you were on. Seems reasonable.
&lt;/p&gt;
&lt;p&gt;

You're browsing maps, and you search for something. You click one of the icons, and it takes you a details page. On there is a link to a web site for a restaurant. You click it. It takes you into the browser. You want to go back to the map, so you press the home button, then go back to the map. It returns you to the details page. You click on the back arrow to get back to the map.
&lt;/p&gt;
&lt;p&gt;

You're in the App Store app, you scan the top 25, and click to see 26–50. You find an interesting app, and click it. Read the reviews, decide to install, and click install. It returns to the home page while installing, interrupting your use of the App Store app. Not that big a deal though, since you can just go back into the app and resume browsing. Except it's lost your place. And not only that, it's no longer showing 26–50, so you have to scroll down, click expand, and then find your place.
&lt;/p&gt;
&lt;p&gt;

Some apps, such as Yelp and Echofon, want to avoid you leaving the app, so they embed a browser inside the app. But this means you can't access the usual browser features like bookmarking and emailing links.
&lt;/p&gt;
&lt;p&gt;

The “gPhone” (Android) seems to be designed differently when it comes to navigation between apps. There's a physical back button on the phone, and it seems to get used everywhere. Let's see the same scenarios on the gPhone:
&lt;/p&gt;
&lt;p&gt;

You're on a web page, you see a link to Youtube, and you click it. The gPhone takes you to the YouTube app. After you watch the video, you press the back button, and it takes you back to the browser.
&lt;/p&gt;
&lt;p&gt;

You're browsing maps, and you search for something. You click one of the icons, and it takes you a details page. On there is a link to a web site for a restaurant. You click it. It takes you into the browser. You want to go back to the map, so you press the back button. You're now on the details page. You press the back button again and it takes you back to the map.
&lt;/p&gt;
&lt;p&gt;

You're in the Marketplace app, you scan the list. You find an interesting app, and click it. Read the reviews, decide to install, and click install. It installs in the background. You continue navigating. When the app installation finishes, there's a note in the notification area at the top.
&lt;/p&gt;
&lt;p&gt;

It's not just clever handling of the back button the part of the apps. Later on I'm in the calendar app, and check notifications. I see the app has installed, and click on that. It takes me to that app. I press the back button. It takes me back to the calendar.
&lt;/p&gt;
&lt;p&gt;

The back button is deeply integrated into the system. It wasn't apparent to me when I first tried out the G1. But this is a fundamentally different model from the iPhone. Navigation feels like a browser, where you visit something and then go back, and not like an OS, where you go back to your “desktop” and “launch” an app. I think the difference will be more noticeable in a deeper scenario, such as being in email, then viewing a web page, then viewing a map, then emailing the store, then going back, back, back, to the email you were on. But I haven't tried this to see if the gPhone really handles this case.  
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3087608955037815499?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3087608955037815499/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3087608955037815499' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3087608955037815499'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3087608955037815499'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/12/iphone-vs-gphone-navigation-model.html' title='iPhone vs. gPhone navigation model'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3309436138978967398</id><published>2009-11-11T08:44:00.000-08:00</published><updated>2011-08-31T11:51:12.918-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Experiences with my Macbook Air</title><content type='html'>&lt;p&gt;Nearly two years ago, &lt;a href="http://amitp.blogspot.com/2008/03/why-i-got-macbook-air.html"&gt;I got a Macbook Air&lt;/a&gt;. It's been nearly two years, and here are my thoughts:
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;ol&gt;
 &lt;li&gt;
     Portability is really nice. Yes, I'm more productive with a big screen and big keyboard and so on, but I really enjoy using the computer everywhere. The Air is lighter than most laptops, and as a result I've found that I use it while sitting on the couch, while laying in bed, while sitting outside, etc. I move it around a lot. Being 2 pounds lighter than the Macbook Pro makes quite a difference.
 &lt;/li&gt;

 &lt;li&gt;
     The battery life is acceptable but not great. It lasts 2–4 hours, even though the battery is nearly two years old.  If I'm at my desk I leave it plugged in, and I usually don't plug it in anywhere else. I do run out of battery life at times, and I end up taking it back to my desk. It'd be nice to have more battery life but at the same time I don't want to carry any more weight, and 2–4 hours seems like a reasonable tradeoff. I'm too lazy to carry around a second battery even if the battery were swappable, so being unswappable doesn't really matter to me.
 &lt;/li&gt;

 &lt;li&gt;
     The 64GB SSD is great. It's fast. I don't want to go back to a regular hard drive. However, 64GB is a little small for me. Snow Leopard helped; it freed up quite a lot of space. But I think I need 120GB to fit all my data. I also like that I can move the machine around without worrying about hard drive crashes.
 &lt;/li&gt;

 &lt;li&gt;
     I really don't miss the CD/DVD drive. The only time I've needed one was to upgrade to Snow Leopard.
 &lt;/li&gt;

 &lt;li&gt;
     I occasionally need ethernet. I have to carry around a USB/ethernet adapter, and when I have that plugged in I can't plug in any other USB device.
 &lt;/li&gt;

 &lt;li&gt;
     The built-in sound is pretty bad. There's a speaker underneath the right side of the keyboard, and when you're typing your hand blocks it. When I'm at my desk I use external speakers but I wish the laptop speakers were stereo and better placed. If Airtunes worked for non-iTunes apps without hackery, I'd use that.
 &lt;/li&gt;

 &lt;li&gt;
     Over time the machine got slower, to the point where I couldn't watch Youtube videos anymore. That's pretty bad. But after reading lots of message boards, I learned that the problem isn't the CPU. It's the cooling (heatsink, fan). &lt;strong&gt;When the system becomes hot, it slows the CPU down to a crawl.&lt;/strong&gt;
 &lt;/li&gt;

 &lt;li&gt;

     Along the same lines, I was frustrated that my &lt;a href="http://simblob.blogspot.com/"&gt;Flash game experiments&lt;/a&gt; were so slow on the Air, but after some careful measurements I determined that it's the overheating, not the CPU, that's to blame.
 &lt;/li&gt;

 &lt;li&gt;
     I finally had the dreaded &lt;a href="http://support.apple.com/kb/TS2948"&gt;Macbook Air hinge problem&lt;/a&gt;. Apple's finally covering this under warranty, and they agreed to repair my computer. Except that my case has two minor dents in it, and they're unwilling to repair it unless I pay $250-500 to have the dents fixed. Ughhhh. I told them no. I'm not getting AppleCare again.
 &lt;/li&gt;

 &lt;li&gt;

     Also something I learned on message boards, &lt;strong&gt;vacuuming the vents&lt;/strong&gt; helps the cooling. This was a huge improvement; the computer is now fast enough for most things I do. Oddly, after vacuuming, my hinge seems better.
 &lt;/li&gt;

 &lt;li&gt;
     I'm a fan of matte screens but this came with a glossy screen. And it really was nice. I can use it outdoors in sunlight!  It turns out the glare on the Air is much lower than on the Macbook Pro.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;My original (rev. A) Macbook Air has had its problems but it's been a good machine for my needs. My main complaints are about the overheating, the slow video, the high price, and the small SSD. It looks like rev B. (October 2008) solved these issues. I don't know if the new machines still have the hinge problem. My minor complaints are about battery life, the sound, and ethernet, and none of those have been addressed in the new version. The screen and CPU speed have been much better than I expected.
&lt;/p&gt;
&lt;p&gt;Compared to a middle-of-the-line Pro, the Air now has the same video card, a larger cache, and an anti-glare screen that I can use outside. I don't need a faster CPU or more RAM. If I were sitting at my desk most of the time, then the Pro's better speakers, more convenient ports, larger screen, and lower cost would be reasons to get that instead. Or just get a desktop machine. But I really enjoy the portability, so if I were looking at a Mac laptop today, I'd get the Air over the Pro.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3309436138978967398?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3309436138978967398/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3309436138978967398' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3309436138978967398'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3309436138978967398'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/11/experiences-with-my-macbook-air.html' title='Experiences with my Macbook Air'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-7844241281133909086</id><published>2009-09-05T11:54:00.000-07:00</published><updated>2011-08-31T11:51:27.264-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Bash Prompts on the Mac</title><content type='html'>&lt;p&gt;
For a while now I've used colored prompts in bash. I typically make the machine name one color, the path another color, and the username bright red if I'm root. On some systems I show the date and time, the exit code of the previous command, whether I'm inside screen, or the ssh status.  &lt;a href="http://www.faqs.org/docs/Linux-HOWTO/Bash-Prompt-HOWTO.html"&gt;Other people&lt;/a&gt; have put the git branch, number of processes, job count, tty, system load, disk space, working files, or mailbox status into their prompts.
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;p&gt;
On the Mac though, once I upgraded to Leopard, the prompts interacted badly with the line-editing. I tried various things but just couldn't get them to work, and I really wanted line editing, so I gave up on the colored prompts.
&lt;/p&gt;
&lt;p&gt;
However, I recently figured out a fix: set the language environment variable. Which one? I tried a few and ended up with this:
&lt;/p&gt;
&lt;pre class=snippet&gt;export LC_CTYPE=C
&lt;/pre&gt;
&lt;p&gt;
Does anyone know why this helps?
&lt;/p&gt;
&lt;p&gt;
Here's how I set my bash prompt (from &lt;code&gt;.bashrc&lt;/code&gt;):
&lt;/p&gt;
&lt;pre class=snippet&gt;# Username (if root or remote)
if [ "$(whoami)" = "root" ]; then
    PS1="\[\e[41;1;37m\] root"
elif [ -n "$SSH_CLIENT" ]; then
    PS1="\[\e[30;107m\]\u"
else
    PS1=""
fi

# Machine (if remote)
if [ -n "$SSH_CLIENT" ]; then
    PS1="$PS1@$hostname:"
fi

# Current directory
PS1="$PS1\[\e[34m\]\w/ \[\e[0m\]\$ "

# Current date and time
PS1="\[\e[0;90m\] \d \[\e[1m\]\t\[\e[0m\]\r\n$PS1"

# Screen name (if inside a screen)
if [ -n "$STY" ]; then
    PS1=" \[\e[32m\]$STY\[\e[0m\]$PS1"
fi

# Display a smiley for success/failure 
PS1="\`if [ \$? = 0 ]; then echo \[\e[42\;37m\]:\\);\
 else echo \[\e[41\;37m\]:\\(; fi\`\[\e[0m\] $PS1"
&lt;/pre&gt;
&lt;p&gt;
Now that I have colors working again, I'll probably read &lt;a href="http://www.reddit.com/r/programming/comments/9he4v/share_your_bashrc_vimrc_or_other_settings_file_i/"&gt;what other people have done&lt;/a&gt; and adopt interesting features.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-7844241281133909086?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/7844241281133909086/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=7844241281133909086' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7844241281133909086'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7844241281133909086'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/09/bash-prompts-on-mac.html' title='Bash Prompts on the Mac'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-4785216114466305649</id><published>2009-06-28T20:24:00.001-07:00</published><updated>2011-08-31T11:51:48.541-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Future anti-predictions 2</title><content type='html'>&lt;p&gt;I'm quite optimistic about the future, but I seem to be &lt;a href="http://amitp.blogspot.com/2009/03/future-anti-predictions.html"&gt;posting
anti-predictions&lt;/a&gt;
   instead of predictions. Perhaps I'll post positive predictions
   someday, but today I have some more negative ones:
&lt;/p&gt;
&lt;a name='more'&gt;&lt;/a&gt;
&lt;ol&gt;
 &lt;li&gt;&lt;p&gt;&lt;strong&gt;Quantum Computers&lt;/strong&gt;. Yes, I know that there's a now &lt;a href="http://www.sciencedaily.com/releases/2009/06/090628171949.htm"&gt;quantum computer chip&lt;/a&gt; but I'm pretty pessimistic anyway. Quantum computers let you explore 2&lt;sup&gt;N&lt;/sup&gt; states with N quantum bits; it would take 2&lt;sup&gt;N&lt;/sup&gt; regular bits to do the same. However, I think the difficulty of maintaining the entangled quantum state will be proportional to 2&lt;sup&gt;N&lt;/sup&gt; — that is, adding one quantum bit entangled with all the existing ones will double the difficulty of preventing decoherence. To explore a large search space, it will be far easier to build more very simple conventional processor than to build one very complex quantum processor.
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;&lt;strong&gt;DNA Computers&lt;/strong&gt;. &lt;a href="http://en.wikipedia.org/wiki/DNA_computing"&gt;Making DNA compute&lt;/a&gt; for us seems like a cool idea. We can grow this stuff in vats and have hugely parallel computers. The problems here are that (a) you have to get the problem transmitted to all the DNA in the vat, (b) there's no guarantee of finding the answer, and (c) DNA just isn't a great medium for the kinds of controlled programs we want to write. Here too I think it will be far easier to build a simple massively parallel computer from electronic parts than to build a DNA computer. DNA does have the advantage of easy replication, but conventional computers will also benefit from self-assembly.
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;&lt;strong&gt;Practical Teleportation&lt;/strong&gt;. There have been experiments showing that teleportation is possible. The basic approach is to entangle two particles at the quantum level, and then destroy the original, leaving  you with the “teleported” one. It's pretty cool. But it suffers the same problem as quantum computers: there's a &lt;em&gt;huge&lt;/em&gt; amount of complexity involved in teleporting real objects (unlike movie teleportation, I don't think it matters too much whether they're biological or not), and I'm rather pessimistic about being able to entangle a large number of particles simultaneously.
&lt;/p&gt;

 &lt;/li&gt;

 &lt;li&gt;&lt;p&gt;&lt;strong&gt;Faster than Light Travel&lt;/strong&gt;.  Physicists seem to think that faster than light travel is possible using wormholes. The idea is that you bend space and time in such a way that where you are and where you want to be are “close” together in another dimension, and then you leap across. I think this is possible in theory. But bending the universe is going to take far too much energy and cause too much collateral damage for this to work in practice. Instead, we'll have to hope for existing wormholes, and there won't be any that are useful.
&lt;/p&gt;

 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;So there you go. Another fit of negativity from me. I really should start collecting positive thoughts about the future.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4785216114466305649?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4785216114466305649/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4785216114466305649' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4785216114466305649'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4785216114466305649'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/06/future-anti-predictions-2.html' title='Future anti-predictions 2'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-6670525306567020347</id><published>2009-06-22T20:23:00.000-07:00</published><updated>2011-04-30T09:01:47.361-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='structure'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Fun with user styles</title><content type='html'>&lt;p&gt;Long ago (1997), Internet Explorer 4 gave us user style sheets, in the
   accessibility options.  You could point the browser at your CSS file,
   and it would merge the user styles with the author styles.  As with
   many features in IE4, other browsers adopted this feature too (Mozilla
   in 2002, Opera in 2003, I think).
&lt;/p&gt;
&lt;p&gt;User styles are quite neat. However, having to edit a file somewhere
   and then reload the browser is sort of a pain.  The
   &lt;a href="https://addons.mozilla.org/en-US/firefox/addon/2108"&gt;Stylish&lt;/a&gt; addon
   for Firefox makes user styles much easier:
&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;
     You can edit the styles per site instead of globally.
 &lt;/li&gt;

 &lt;li&gt;
     You can organize your CSS into named sections.
 &lt;/li&gt;

 &lt;li&gt;
     You can share these sections with others.
 &lt;/li&gt;

 &lt;li&gt;
     You can browse &lt;a href="http://userstyles.org/"&gt;userstyles.org&lt;/a&gt; to find CSS shared by others.
 &lt;/li&gt;

 &lt;li&gt;

     You can install user styles from others with just a few clicks.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I just keep forgetting to write my own styles.  Tonight I got fed up with MyWay's 700-pixel fixed width &lt;a href="http://tv.myway.com/grid.jsp"&gt;TV listings&lt;/a&gt;:
&lt;/p&gt;
&lt;p style="max-width:100%; overflow:hidden"&gt;
&lt;a href="http://3.bp.blogspot.com/_kV9ZnGnZL7M/SkBANL6UsYI/AAAAAAAAA5c/DlEmBOUkStA/s1600-h/MyWay+TV+Before.png"&gt;&lt;img src="http://3.bp.blogspot.com/_kV9ZnGnZL7M/SkBANL6UsYI/AAAAAAAAA5c/DlEmBOUkStA/s1600/MyWay+TV+Before.png" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;I used &lt;a href="http://getfirebug.com/"&gt;Firebug&lt;/a&gt; to look at the structure of the site, and after navigating nested tables with no &lt;code&gt;class&lt;/code&gt; or &lt;code&gt;id&lt;/code&gt; names to hang my CSS onto, I decided to use &lt;a href="http://www.w3.org/TR/CSS2/selector.html#attribute-selectors"&gt;CSS attribute selectors&lt;/a&gt; to address the two tables that I wanted:

&lt;/p&gt;
&lt;pre&gt;&lt;code&gt;@-moz-document domain("tv.myway.com") {
  table[width="700"] {
    width: 100% ! important;
  }

  table[bgcolor="888888"] {
    background-color: #fff ! important;
    padding: 2px;
  }

  table[bgcolor="888888"] td {
    border: 1px solid #bbb;
    font-family: tahoma ! important;
    font-size: small ! important;
    -moz-box-shadow: 1px 1px 2px #bbb;
  }

  table[bgcolor="888888"] td a {
    font-weight: bold;
    color: #000 ! important;
    text-decoration: none ! important;
  }
}
&lt;/code&gt;&lt;/pre&gt;&lt;p&gt;Here's the result:
&lt;/p&gt;
&lt;p style="max-width:100%; overflow:hidden"&gt;
&lt;a href="http://3.bp.blogspot.com/_kV9ZnGnZL7M/SkBAO0s9aOI/AAAAAAAAA5k/45BW-6EMrUQ/s1600-h/MyWay+TV+After.png"&gt;&lt;img src="http://3.bp.blogspot.com/_kV9ZnGnZL7M/SkBAO0s9aOI/AAAAAAAAA5k/45BW-6EMrUQ/s1600/MyWay+TV+After.png" /&gt;&lt;/a&gt;
&lt;/p&gt;

&lt;p&gt;Try out user styles. If you don't know CSS, you can explore
   &lt;a href="http://userstyles.org/"&gt;userstyles.org&lt;/a&gt;; if you do, you can also try
   writing your own.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-6670525306567020347?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/6670525306567020347/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=6670525306567020347' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6670525306567020347'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6670525306567020347'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/06/fun-with-user-styles.html' title='Fun with user styles'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kV9ZnGnZL7M/SkBANL6UsYI/AAAAAAAAA5c/DlEmBOUkStA/s72-c/MyWay+TV+Before.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-355458747328686579</id><published>2009-06-13T16:52:00.000-07:00</published><updated>2009-06-13T16:52:36.582-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>We need infinite energy</title><content type='html'>&lt;p&gt;
[Warning: my thoughts on this topic are still not entirely clear. I sat on this post for a week but I couldn't find better words, so I decided to post anyway.]&lt;/p&gt;
&lt;p&gt;When I think about being “green”, I think of three things:
&lt;/p&gt;
&lt;ol&gt;
 &lt;li&gt;
     &lt;strong&gt;Clean&lt;/strong&gt;: solar, wind, wave energy instead of coal, oil, and
 sometimes nuclear.  Part of this is to reduce pollution, but lately it's about reducing CO&lt;sub&gt;2&lt;/sub&gt; released into the atmosphere.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;Sustainability&lt;/strong&gt;: renewable energy, better agricultural practices, and sometimes population reduction/stability. This is to avoid depleting resources.
 &lt;/li&gt;

 &lt;li&gt;
     &lt;strong&gt;Conservation&lt;/strong&gt; (mostly of energy): less driving, less air travel, less lighting, less water, less energy. This is to reduce the impact of our activities on the planet.
 &lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I think all of these could use refinement.
&lt;/p&gt;
&lt;p&gt;I'm a big fan of &lt;strong&gt;Clean&lt;/strong&gt;. Pollution in general is getting too little attention these days, and CO&lt;sub&gt;2&lt;/sub&gt; gets too much. CO&lt;sub&gt;2&lt;/sub&gt; is not a poison; it's a good gas to have. Our problem is that we're way out of balance. We're producing far more than we use, so it's building up in the atmosphere. We need to get back into balance, but that doesn't mean &lt;em&gt;zero&lt;/em&gt;. Pollution on the other hand we should be at &lt;em&gt;zero&lt;/em&gt;. But it doesn't need to be zero production; it's okay to produce if you can clean it up. For example, algae, fungi, and bacteria can be used to clean up some types of pollution, and titanium dioxide can do wonders. Here again balance is the key. Produce as much as is used, and we're good. That's different from saying produce zero.
&lt;/p&gt;
&lt;p&gt;I'm a fan of &lt;strong&gt;Sustainability&lt;/strong&gt; but I think it's secondary to, and a
   consequence of, balance. I think depleting non-renewable resources is fine, as long
   as we do it knowing we're using it up, and we start coming up with a sustainable solution. We might decide to use oil, but
   deciding not to use it because we're going to use it up is not a
   compelling reason. Not having any oil and not using any oil are
   essentially the same. I think for now we should continue using oil,
   especially for waxes, lubricants, and biodegradable plastics.
&lt;/p&gt;
&lt;p&gt;I'm less of a fan of energy &lt;strong&gt;Conservation&lt;/strong&gt;, in part because I think
   it addresses the wrong issue. (Raw material conservation is a separate
   issue.) The problem isn't turning the lights on. The problem is the
   impact that causes, because the electricity is generated in ways that
   pollute or produce CO&lt;sub&gt;2&lt;/sub&gt;. Do you turn off your solar-powered
   yard lights when you don't need them? Doesn't it sound silly? Turning
   off your incandescent bulb powered by a wind farm seems almost as
   silly. Solar, wind, and wave energy are abundant—in fact, literally
   tons of photons fall on the Earth every hour. And if we don't use that
   energy, it's lost. If we had abundant clean, cheap energy, would we
   still feel bad about using incandescent lights? I think we would,
   because we're trained to, but we shouldn't. There are still good
   reasons to use less energy, but they're about cost rather than
   environment.
&lt;/p&gt;
&lt;p&gt;Historically, asking people to switch to a worse lifestyle at lower
   cost (public transit in suburbs, abstaining from sex, eating boring
   food, not going on vacations, using unpleasant lighting, etc.) doesn't
   seem to be as effective as asking people to switch to a better
   lifestyle at higher cost. The EV1 and original Insight were
   “sacrifice” cars. You had to give something up (range, comfort, size),
   but you could feel good about sacrificing for the sake of the
   environment. The Prius is quite different. It is comfortable, is
   roomy, has nice features, and has good range. You're not sacrificing
   lifestyle when going from a $16k car to a $20k Prius, but it does cost
   more. And the Prius is &lt;em&gt;far&lt;/em&gt; more successful than the EV1 or original
   Insight. We should focus on abdundant clean, somewhat sustainable
   energy. I think we'll improve the environment much quicker by giving
   people lots of clean energy than to tell them to sacrifice.  In
   addition, lots of other problems, like cleaning water and reducing
   pollution, become much easier to solve when we have lots of energy.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-355458747328686579?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/355458747328686579/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=355458747328686579' title='14 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/355458747328686579'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/355458747328686579'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/06/we-need-infinite-energy.html' title='We need infinite energy'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>14</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1632947366399275137</id><published>2009-06-09T08:26:00.000-07:00</published><updated>2011-10-03T10:09:51.532-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Firefox cookie management with sqlite</title><content type='html'>&lt;p&gt;
I try to &lt;a href="http://amitp.blogspot.com/2006/03/firefox-cookie-management.html"&gt;keep my Firefox cookie file clean&lt;/a&gt;. I used to run a script on &lt;code&gt;cookies.txt&lt;/code&gt; to remove most cookies and keep only the ones for sites I visit often and trust. This was simple when the cookie file format was plain text. However, Firefox has been moving files to the sqlite format, and my script no longer works.
&lt;/p&gt;
&lt;p&gt;
Sqlite seems to be pretty nice.  The first thing I needed to do was figure out what format &lt;code&gt;cookies.sqlite&lt;/code&gt; used.  I ran &lt;code&gt;select * from sqlite_master&lt;/code&gt; using the command line interface and it told me there was a table named &lt;code&gt;moz_cookies&lt;/code&gt; with &lt;code&gt;(id INTEGER PRIMARY KEY, name TEXT, value TEXT, host TEXT, path TEXT,expiry INTEGER, lastAccessed INTEGER, isSecure INTEGER, isHttpOnly INTEGER)&lt;/code&gt; as columns. Pretty straightforward. I used this information, plus the Python &lt;code&gt;sqlite3&lt;/code&gt; module (standard with Python 2.5) to write a script to clean up my Firefox cookies:
&lt;/p&gt;
&lt;pre&gt;#!/usr/bin/python
# &lt;b&gt;Change this to where your cookies file is&lt;/b&gt;
COOKIE_FILE = ('/Users/amitp/Library/Application Support'
    '/Firefox/Profiles/&lt;s&gt;foobar&lt;/s&gt;/cookies.sqlite')
HOSTS = [  # &lt;b&gt;keep only cookies from these hosts&lt;/b&gt;
    u'.blogger.com',
    u'www.blogger.com',
    u'.delicious.com',
    u'.discus.com',
    u'discus.com',
    u'blobs.discus.com',
    u'.github.com',
    # … other hosts omitted in this example code
    ]

# &lt;b&gt;Connect and then issue commands&lt;/b&gt;
# &lt;b&gt;through the “cursor” object&lt;/b&gt;
import sqlite3
connection = sqlite3.connect(COOKIE_FILE)
cursor = connection.cursor()

# &lt;b&gt;Remove Google Analytics cookies from all sites&lt;/b&gt;
cursor.execute('DELETE FROM moz_cookies WHERE name IN'
          ' ("__utma", "__utmb", "__utmc", "__utmz")')

# &lt;b&gt;Remove any cookies from non-approved hosts&lt;/b&gt;
cursor.execute(
   'DELETE FROM moz_cookies WHERE host NOT IN (%s)'
    % (','.join(len(HOSTS) * ['?'])),
    HOSTS)

# &lt;b&gt;Commit changes to disk,&lt;/b&gt;
# &lt;b&gt;locking the file during the process&lt;/b&gt;
connection.commit()

# &lt;b&gt;Print the cookies we have left&lt;/b&gt;
print 'After:'
rows = list(cursor.execute(
          'SELECT host, name FROM moz_cookies'))
for row in rows:
    print '%30s : %s' % row
&lt;/pre&gt;
&lt;p&gt;
The script opens the &lt;code&gt;cookies.sqlite&lt;/code&gt; file (unlike &lt;code&gt;cookies.txt&lt;/code&gt;, it appears to be safe to open &lt;em&gt;and edit&lt;/em&gt; this file while Firefox is running!), removes most cookies, commits the changes, and prints out the remaining cookies.
&lt;/p&gt;
&lt;p&gt;
Lots of the Firefox profile information has been moved into the sqlite format (instead of the &lt;a href="http://amitp.blogspot.com/2005/05/mozillafirefox-profile-directory-mess.html"&gt;mess we had before&lt;/a&gt;), so I should explore some of the other files to see what might be fun to play with.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1632947366399275137?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1632947366399275137/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1632947366399275137' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1632947366399275137'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1632947366399275137'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/06/firefox-cookie-management-with-sqlite.html' title='Firefox cookie management with sqlite'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-2107498336531884319</id><published>2009-03-08T13:41:00.000-07:00</published><updated>2011-01-29T11:22:47.518-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Future anti-predictions</title><content type='html'>&lt;p&gt;
Perhaps I'm just tired of waiting for my flying car or hoverboard, but I'm not so optimistic that we'll see certain technologies become popular.
&lt;/p&gt;
&lt;ul&gt;

&lt;li&gt;&lt;strong&gt;Cars that drive themselves.&lt;/strong&gt; There's lots of research and good arguments about safety and efficiency and congestion. There are already commercial products for parallel parking, distance-controlled cruise control, and lane detection. But I think the real problem is liability. If there's an accident with a car you drive, it's a local problem (you). If a big company's car crashes while driving automatically, there's the potential for a very large lawsuit. Society benefits from automated driving but these companies pay for it. Early adopter individuals don't benefit enough that the companies can charge more. Such an arrangement makes it much less likely that these systems will leave the research phase. I also think congestion is much more likely to be addressed by variable pricing and better information than by automated driving.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;3D displays.&lt;/strong&gt; There's been a recent increase in 3D TV, movies, and video games, but most of the technology doesn't seem any better than the last time 3D flared up in popularity. The image in your eye is inherently 2 dimensional. If it were 3 dimensional you'd be able to see behind and inside things (&lt;a href="http://www.amazon.com/dp/0554354128/"&gt;Flatland&lt;/a&gt; is an interesting read if you want to understand this better). To see 3D in your brain you need to have separate images in the left and right eye. You can do this with glasses: color filters (red/blue, used for TV), circular polarized light filters (used in movie theaters), or timed shutters (used in video games). Or you can do this without glasses, by using the difference in viewing angle between the eyes (Philips WowVX for example), but this requires either a single viewer or all viewers to be roughly the same distance from the display. You can also produce 3D effects at a different level of the brain, by viewing different angles (either &lt;a href="http://www.well.com/user/jimg/stereo/stereo_list.html"&gt;statically with animation&lt;/a&gt; or &lt;a href="http://www.youtube.com/watch?v=Jd3-eiid-Uw"&gt;dynamically with head tracking&lt;/a&gt;). The problem is that all of these systems have limitations that exceed the marginal benefit of 3D, once the novelty wears off. So they'll all be used in specialized situations like medical imagery, advertising in malls, and a small number of TV/movie/game applications. But I think 3D displays are not going to be widespread.
&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;Humanoid robots.&lt;/strong&gt; 
Humans are better than computers at some things: creativity, language, pattern recognition, art, design, reasoning. Computers are better than humans at some things: calculations, memorization, repetitive motion, fast sensors. People seem to think that the future is about making robots that look and work like us, but there's no point. We have plenty of humans. We will build robots that do the things we're not good at. And that means there's no particular reason to use a humanoid form. The future of robots is not humanoid. I think humans with machine parts will become commonplace, but they won't be robots replacing or competing with us; they'll be enhancing us.
&lt;/li&gt;

&lt;/ul&gt;
&lt;p&gt;
In general though I'm quite optimistic about the future. I just think the things that actually succeed won't be the commonplace predictions you see in movies and TV.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-2107498336531884319?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/2107498336531884319/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=2107498336531884319' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2107498336531884319'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2107498336531884319'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2009/03/future-anti-predictions.html' title='Future anti-predictions'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-8897347403302432540</id><published>2008-11-11T08:13:00.000-08:00</published><updated>2009-01-10T19:11:29.858-08:00</updated><title type='text'>Time loops: The Terminator</title><content type='html'>&lt;p&gt;
In the Terminator series (movies and TV show), there are some odd time loops.
&lt;/p&gt;
&lt;ul class=spaced&gt;
&lt;li&gt;
John Connor sends Kyle Reese back in time.  Kyle and Sarah have a son, John Connor.  But John sent Kyle back in time only because of Skynet.  Without Skynet, John wouldn't exist.  The &lt;a href="http://en.wikipedia.org/wiki/Temporal_paradox"&gt;timeline protection hypothesis&lt;/a&gt; suggests John can't kill Skynet.
&lt;/li&gt;
&lt;li&gt;
Skynet sends a Terminator back in time.  The Terminator's arm and CPU are left behind.  The technology in that CPU is what Dyson uses to build the beginnings of Skynet. But Skynet sent the Terminator back in time only because of John Connor. Without John, Skynet wouldn't exist. The timeline protection hypothesis suggests that Skynet cannot destroy John.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
How did we get into this circular timeline in the first place? I think it's reasonable for the initial timeline to exist without the loop. John could be someone else's son. Skynet could be developed without the Terminator's CPU. But once they start messing with time, they got into this circular dependency, where they only exist because of each other. I'm not sure they can get out of it though. It's similar to the grandfather paradox, except there are two parties trying to kill each other.
&lt;/p&gt;
&lt;p&gt;
The Matrix series, which coincidentally also was about war between machines and humans, might give us a way out of the Terminator paradox. Agent Smith was trying to destroy Neo, and to do so he was willing to destroy the world. Neo sacrificed himself, which meant Smith no longer had a purpose, and Smith was destroyed at the same time as Neo. So perhaps John and Skynet have to destroy each other simultaneously. Or perhaps, as in The Matrix, the humans and machines call a truce, and both John and Skynet stop fighting far in the future, but only after the war that leads to both of them being created.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-8897347403302432540?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/8897347403302432540/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=8897347403302432540' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/8897347403302432540'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/8897347403302432540'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2008/11/time-loops-terminator.html' title='Time loops: The Terminator'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-6758157412844296257</id><published>2008-05-26T17:45:00.001-07:00</published><updated>2011-10-03T14:21:34.271-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Emacs: full screen on Mac OS X</title><content type='html'>&lt;p&gt;
&lt;strong&gt;Note:&lt;/strong&gt; [2011-01-10] The methods for toggling full screen vary by version. I've reorganized this post to document what I've used for various versions of Emacs:
&lt;/p&gt;
&lt;dl&gt;
&lt;dt&gt;
&lt;a href="http://homepage.mac.com/zenitani/emacs-e.html"&gt;Carbon Emacs&lt;/a&gt; 22.2
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
You can run &lt;kbd&gt;M-x mac-toggle-max-window&lt;/kbd&gt; to toggle full screen mode, &lt;em&gt;with no menubar&lt;/em&gt;.  This is handy enough that I've bound it to &lt;kbd&gt;&lt;kbd&gt;⌘ Cmd&lt;/kbd&gt;+&lt;kbd&gt;Return&lt;/kbd&gt;&lt;/kbd&gt;, which is similar to what some Linux and Windows apps use to toggle full screen mode.
&lt;/p&gt;
&lt;pre class=snippet&gt;
(define-key global-map [(alt return)] 
  'mac-toggle-max-window)
&lt;/pre&gt;
&lt;/dd&gt;
&lt;dt&gt;
Carbon Emacs 22.5
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
They seem to have removed the function from 22.2, but you can get it back with this code from &lt;a href="http://groups.google.com/group/carbon-emacs/browse_thread/thread/1945355952b13c5d"&gt;Vebjorn Lsoja&lt;/a&gt;:
&lt;/p&gt;
&lt;pre class=snippet&gt;
(defun mac-toggle-max-window ()
  (interactive)
  (set-frame-parameter nil 'fullscreen 
    (if (frame-parameter nil 'fullscreen)
      nil
      'fullboth))) 
&lt;/pre&gt;
&lt;/dd&gt;
&lt;dt&gt;
&lt;a href="http://emacsformacosx.com/"&gt;GNU (Cocoa/Nextstep) Emacs 23&lt;/a&gt;
&lt;/dt&gt;
&lt;dd&gt;
&lt;p&gt;
Neither approach above works with this version. Instead I'm using &lt;a href="https://github.com/jmjeong/jmjeong-emacs/blob/master/vendor/maxframe.el"&gt;a patched version of maxframe.el&lt;/a&gt;, and this function from the EmacsWiki page:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
(defvar maxframe-maximized-p nil "maxframe is in fullscreen mode")
(defun toggle-maxframe ()
  "Toggle maximized frame"
  (interactive)
  (setq maxframe-maximized-p (not maxframe-maximized-p))
  (cond (maxframe-maximized-p (maximize-frame))
        (t (restore-frame))))
(define-key global-map [(alt return)] 'toggle-maxframe)
&lt;/pre&gt;
&lt;p&gt;
Unfortunately this doesn't hide the menubar or titlebar.
&lt;/p&gt;
&lt;/dd&gt;
&lt;/dl&gt;
&lt;p&gt;
For other versions, check the &lt;a href="http://www.emacswiki.org/emacs/FullScreen"&gt;EmacsWiki page&lt;/a&gt; to see if there's a method that works on the version you run, or check &lt;a href="http://www.emacswiki.org/emacs/CustomizeAquamacs#toc2"&gt;this page&lt;/a&gt; for Aquamacs.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-6758157412844296257?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/6758157412844296257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=6758157412844296257' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6758157412844296257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6758157412844296257'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2008/05/emacs-full-screen-on-mac-os-x.html' title='Emacs: full screen on Mac OS X'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1834385678789282261</id><published>2008-03-23T11:36:00.000-07:00</published><updated>2008-03-23T12:25:39.702-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>Setting the Carbon Tax</title><content type='html'>&lt;p&gt;
The &lt;a href="http://en.wikipedia.org/wiki/Carbon_tax"&gt;carbon tax&lt;/a&gt; is a tax on CO&lt;sub&gt;2&lt;/sub&gt; emissions.  It aligns incentives of business (profit) and society (stable climate) by giving businesses an opportunity to make more money if they find ways to reduce their CO&lt;sub&gt;2&lt;/sub&gt; emissions. 
&lt;/p&gt;
&lt;p&gt;
One open question with the carbon tax is how to choose the tax rate. Several countries already have a carbon tax, but they seem to set it at a fixed rate, or increase it by a fixed amount each year. Even the Carbon Tax Center says, &lt;a href="http://www.carbontax.org/faq/"&gt;“There is no magic formula or right number”&lt;/a&gt;.  I think they're approaching it wrong.  &lt;strong&gt;Carbon taxes are essentially prices on carbon emissions.&lt;/strong&gt;  Governments shouldn't set prices, and they shouldn't set carbon tax rates either.  The market should do it, with a little help from the government.
&lt;/p&gt;
&lt;p&gt;
First, we should decide what level of CO&lt;sub&gt;2&lt;/sub&gt; emissions are “sustainable”. You can think of this as the “supply” of available emissions. There is no need to go below this level, although doing so will not be harmful.  We should be able to continue emitting at the sustainable level for thousands of years.  This level is then set as the eventual &lt;strong&gt;sustainable target&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
Our current emissions are rather high. We can think of this as “demand”. Since demand is higher than supply, we need to raise prices (the carbon tax rate, currently 0% in the U.S.). We need to decide when we want to reach the sustainable level, and then interpolate target levels from the current level to the sustainable target. This might be a straight line for simplicity, but could also be an S-curve or exponential decay.
&lt;/p&gt;
&lt;p&gt;
For example, let's say that the current CO&lt;sub&gt;2&lt;/sub&gt; emissions are 6 billion metric tons, and we decide that 1 billion metric tons, combined with more forests, is sustainable.  Let's further suppose that we want to reach this target in 10 years.  That means we need to reduce emissions by 0.5 billion metric tons each year, so we set our target for 2009 to 5.5, 2010 to 5.0, 2011 to 4.5, etc., until 2018, at 1.0 billion metric tons.
&lt;/p&gt;
&lt;p&gt;
Each year (or perhaps every month), we look at the current level of emissions and the target level, and increase or decrease the carbon tax rate.  If we're emitting more than the target, we'll increase the tax rate. If we're emitting less (which may happen in a few years, if all the businesses are competing to increase profits by reducing emissions), then we decrease the tax rate.  &lt;em&gt;By altering the tax rate in this way, we can stay close to the target.&lt;/em&gt;
&lt;/p&gt;
&lt;p&gt;
The problem on the business side is that if the tax rates change every month, there's a lot of uncertainty (just as for any prices that change suddenly every month), and it's hard to change plans that quickly. What will likely develop is an insurance market. Insurers will sell insurance that the tax rate won't go up much, and businesses will buy the insurance to hedge against sudden increases.  &lt;strong&gt;Does this eliminate the incentives for businesses&lt;/strong&gt;?  No!  They're now paying insurance &lt;em&gt;and&lt;/em&gt; taxes. The &lt;strong&gt;cost of insurance&lt;/strong&gt; is set by the likelihood at the tax rates will go up. The insurance industry is in the best position to guess this, because they'll be visiting the businesses to determine how quickly emission reductions are going into place.  The insurance companies will then be able to predict the future emissions, and set insurance rates based on that.  Since they're the ones making payouts when businesses (collectively) don't reduce emissions, the insurance companies will then have an incentive to push businesses to act sooner.  They also have the incentive to share techniques across businesses. They make more money when businesses collectively reduce emissions.
&lt;/p&gt;
&lt;p&gt;
Most carbon tax proposals use a fixed price and &lt;em&gt;hope&lt;/em&gt; that the output will decline. Most  cap-and-trade proposals use a hard limit on emissions, and a variable, potentially volatile price.
The variable carbon tax rate proposal combines aspects of both approaches. It uses variable prices, but they're varying less often; it uses a target instead of a hard cap, which allows businesses to buy more time; and it generates revenue for society.  With a market based scheme, incentive are aligned. Society will want reduced emissions, businesses will want to reduce tax rates (by reducing emissions), and insurance companies will want to reduce payouts (by convincing businesses to reduce emissions). If businesses fail to reduce emissions, they pay an ever increasing compensation to society for the delay. Furthermore, the open question of what to set the tax to, which is open to lobbying, is replaced by the question of how much to change the tax, which I think is harder to game. This scheme also tells you when we've achieved our goal: emissions are at the sustainable target level.  Even at this level, we continue the carbon tax to prevent emissions from going up, and we continue to take in revenue from those businesses that produce emissions. This will keep our emissions near the sustainable level.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1834385678789282261?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1834385678789282261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1834385678789282261' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1834385678789282261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1834385678789282261'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2008/03/setting-carbon-tax.html' title='Setting the Carbon Tax'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1965034115899340140</id><published>2008-03-11T08:50:00.000-07:00</published><updated>2008-03-22T14:44:26.659-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Why I got a MacBook Air</title><content type='html'>&lt;p style="float:right;width:250px;text-align:center"&gt;&lt;a href="http://www.flickr.com/photos/amitp/2352892158/" title="Carrying case for the MacBook Air by amitp, on Flickr"&gt;&lt;img border="1" src="http://farm3.static.flickr.com/2262/2352892158_28fed18de6_m.jpg" width="240" height="176" alt="Carrying case for the MacBook Air" /&gt;&lt;/a&gt;&lt;br /&gt;My Air in its carrying case&lt;/p&gt;
&lt;p&gt;
I bought a MacBook Air. You know, that small puny computer that's been called a toy. The one that's overpriced. The one that fits in a manila envelope. Ha ha. I'm not going to review the product, but instead I wanted to explain why I ended up getting one. I wouldn't have gotten one if my MacBook hadn't deteriorated (due to my abuse), but since it was time to buy a computer, I spent a month evaluating how I use the computer, and ended up choosing the Air.
&lt;/p&gt;
&lt;p&gt;
I've always been someone who enjoys the biggest, fastest, most powerful computer he can get. Until a few years ago, that's what I got. Back when people used CRTs, I got a 21" Sony that could display 2048x1536. I love high resolution (and still do) and love big screens (still do). Dual core? 64 bit? Lots of RAM? Love it! However…
&lt;/p&gt;
&lt;p&gt;
Four years ago at work, I was assigned to a project in which I had to work in several different offices. They gave me a laptop for this. Eww. Tiny keyboard, slow processor, tiny screen, only 1400x1050 resolution. At the time Linux wasn't suitable for laptops so I got Windows on a Thinkpad. When I was in my main office I used my Linux workstation with a nice 20" LCD running at 1600x1200. But when I was away from there, I used the laptop with Cygwin + ssh + X to run things on my desktop, but display them on the laptop. It was less productive than having the big screen and full keyboard, but it was more productive than having nothing.
&lt;/p&gt;
&lt;p&gt;
Then I discovered something. &lt;strong&gt;Portability is nice.&lt;/strong&gt; Really nice. Really, really nice. I wasn't just working on that laptop in a few offices. I could work on the couch with the laptop in my lap. I could take it to meetings and show people the UI design on a projector. I could take it home and work from home. I could sit outside (if the lighting was right). The ability to move around was worth a lot to me. I found that although at my desk, the laptop is less productive than my desktop machine, the ability to move around (for example, find a quiet space away from distractions) made me more productive overall.
&lt;/p&gt;
&lt;p&gt;
About two years ago I realized that even when I was back at my desk, I was still using my laptop. I almost never used the desktop machine directly. I did use it all the time for running programs. The laptop was a “dumb terminal” (X11 plus browser) for my desktop machine, and I could take it anywhere.
&lt;/p&gt;
&lt;p&gt;
Once I realized how nice portability was, I decided to get a laptop at home. I wasn't thrilled with the idea of getting Windows, especially given that they'd be transitioning everyone from XP (which was reasonable) to Vista (which I'd heard horror stories about). So I decided to switch to Mac. I would've never switched when they had Mac OS 9 on PowerPC chips, but once they had a Unix base and on Intel chips, it became a reasonable option for me. I got a MacBook Pro. I've been reasonably happy with it.
&lt;/p&gt;
&lt;p&gt;
Just as I transitioned from desktop to laptop at work, I found that I use the laptop for everything at home.  Everything except games.  For games I want Windows XP, a full sized trackball, a full sized keyboard, a big screen, a fast CPU, a fast graphics card, and nice speakers. I got none of this on the laptop. But for browsing, email, programming, editing, photos, music, and just about everything else, the laptop is great. So I now have a gaming desktop machine for games (and photos — I love Picasa on Windows and find iPhoto on Mac to be unpleasant) and a laptop for everything else.
&lt;/p&gt;
&lt;p&gt;
At this point, a faster laptop wouldn't be any better, because I already have all the speed I need. I want: more battery life, lower weight, a screen that can be used outdoors, and higher reliability. Unfortunately none of the laptops I looked at were great. I'm sticking with Mac for now, but unfortunately the lightweight Mac laptops don't have great battery life (my Thinkpad got 7 hours, and newer ones can get 11). The Air does have a lower weight than my current laptop. With the flash drive I'm hoping for higher reliability, especially since I move around a lot when using the computer, and a majority of my crashes have been while moving the machine around. I generally prefer matte screens to glossy, but I've talked to several people who use glossy and say that it's much nicer than it initially seems. 64 GB is slightly small (100 GB is more than I need), but after going through my data and removing all the waste (like Apple's Mail app keeping two copies of all my emails, and the iPod sync program keeping a second, bloated copy of all of my photos), I think it'll be fine.
&lt;/p&gt;
&lt;p&gt;
The Air seems like a reasonable upgrade for me, not for the usual things people want (CPU, graphics, RAM, disk, etc.), but for the things that matter to me (weight, size, reliability, portability).  The standard complaints about the Air don't bother me: &lt;strong&gt;slow&lt;/strong&gt; (it's as fast as my computer was two years ago, and somehow that didn't seem slow to me), &lt;strong&gt;battery isn't swappable&lt;/strong&gt; (In 4 years I've never taken the battery out of my laptops), &lt;strong&gt;it's expensive&lt;/strong&gt; (it does seem a little high, but that's always how it goes with early adopters, so if you're price sensitive, wait a few years), &lt;strong&gt;no DVD player or ethernet or firewire&lt;/strong&gt; (I already don't use these).
&lt;/p&gt;
&lt;p&gt;
My priorities have changed over the years. I used to want big: high speed, big storage, big screen, big computer, big keyboard, big mouse, high pixel count. Now I want small: low power consumption, low weight, easy to move around, ability to use anywhere. &lt;strong&gt;I can put the big stuff on servers&lt;/strong&gt;; all I really want to carry around is a terminal — I can access my data remotely. The Air seems to be a good step in that direction.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1965034115899340140?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1965034115899340140/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1965034115899340140' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1965034115899340140'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1965034115899340140'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2008/03/why-i-got-macbook-air.html' title='Why I got a MacBook Air'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://farm3.static.flickr.com/2262/2352892158_28fed18de6_t.jpg' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1117994384423397141</id><published>2008-02-04T15:06:00.000-08:00</published><updated>2011-01-29T11:22:47.518-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='speculation'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>The future of food</title><content type='html'>&lt;p&gt;
Imagine a world in which the way food tastes and the nutrition are
independent.  You could eat vitamin-fortified soylent green and make
it taste like pizza or bacon or ice cream or chocolate cake.
It's just like those dreams programming language people have of having surface syntax
independent of the parse tree, so that you can have many different
syntaxes on the same program. It's like those movies where the evil villain wears pink. 
&lt;/p&gt;
&lt;p&gt;
In the future, what you see, smell, taste, feel, and hear doesn't have to match what's on the inside.
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://www.baconsalt.com/"&gt;Bacon Salt&lt;/a&gt; is one of the early pioneers in this future of food.  I hope to see many more.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1117994384423397141?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1117994384423397141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1117994384423397141' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1117994384423397141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1117994384423397141'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2008/02/future-of-food.html' title='The future of food'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-9219738510590201602</id><published>2007-12-25T09:17:00.001-08:00</published><updated>2007-12-25T10:54:47.385-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='giving'/><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><title type='text'>Economics of giving to charities</title><content type='html'>&lt;p&gt;
It's that time of year when lots of people are giving to various charities, and I've been thinking about, if I decided to give, how I would decide.  My mental economic model for businesses is that businesses engage in trade.  Trade is the exchange of one thing for a more valuable thing.  On both sides.  From that I've tried to build a model for charities and philanthropy.
&lt;/p&gt;
&lt;h3&gt;Economics of trade&lt;/h3&gt;
&lt;p&gt;
Suppose you (running a business) have a sandwich that you're selling for $2.  It's very likely that the sandwich is worth &lt;em&gt;less&lt;/em&gt; than $2 to you.  If it was worth more than $2, you'd rather keep the sandwich, so you wouldn't be selling it.  So let's say it's worth $1 to you.  Now suppose I have $2 and decide to buy a sandwich from you.  It's very likely that the sandwich is worth &lt;em&gt;more&lt;/em&gt; than $2 to me.  If it was worth less than $2, I'd rather keep $2 than buy the sandwich.  So let's say it's worth $3 to me.  Both of us have chosen to trade something less valuable for something more valuable.  Before the trade, the sum total of what we had was $1 (your sandwich) + $2 (my money) = $3.  After the trade, we have $2 (your money) + $3 (my sandwich) = $5.  &lt;strong&gt;Trades generate value out of thin air&lt;/strong&gt;.  The world is now $2 richer because of this trade.  Free markets make for wealthy countries because people aren't prevented from trading.
&lt;/p&gt;

&lt;h3&gt;Model for Gifts&lt;/h3&gt;
&lt;p&gt;
If you think about trades, they work because both sides have the right incentives. When they both choose to trade, the world is better off.  When either chooses not to trade, there's no harm done.  Yes, there are some cases where the world is better off if they trade, but they don't both choose to trade, but in those situations a change in price will enable the trade, and both will end up benefiting.
&lt;/p&gt;
&lt;p&gt;
With giving gifts, not only charities but also Christmas gifts, birthday gifts, etc., the person paying and the person receiving the sandwich are not the same.  It's much harder to ensure that the trade is actually increasing wealth in the world.  Suppose I buy you a sandwich, and I paid $2 for it.  I don't know how much it's worth to you. You could say that it's worth $5 to you, but since it's not your money on the line, there's no incentive for you to say the true value. Suppose it's worth nothing to you.  So before the trade, the seller has $1 (sandwich), I have $2 (money), and you have $0, a total of $3.  After the trade, the seller has $2 (money), I have $0, and you have $0 (sandwich), a total of $2.
&lt;/p&gt;
&lt;p&gt;
Gift giving opens up the possibility that a trade makes the world worse off economically.  There are &lt;a href="http://www.happiness-project.com/happiness_project/2007/12/even-though-its.html"&gt;other reasons to give gifts&lt;/a&gt; of course, but just keep in mind that economically they're not so good.
&lt;/p&gt;
&lt;p&gt;
Christmas and Birthday gifts are rare; the most common source of economic loss from giving is kids (and to a lesser extent, spouses).  Kids might say they really want the $150 pair of shoes, but since they're not the ones working 20 extra hours to buy those shoes, they have no incentive not to make the trade.  They make that sad face, or whine, or tell you that all their friends have those shoes, or nag you a great deal.  They know how to manipulate parents.  Lots and lots of inefficient trades are made by or for kids, causing parents to struggle to make ends meet.  
&lt;/p&gt;
&lt;p&gt;
These inefficient trades also can occur with charities.  If you're giving to a charity and they “do good” with that money, you don't know whether what they did was worth more than what you gave.  You end up judging based on how good it makes you feel, which means charities have an incentive to make you feel good, through special events (seeing lots of people involved in a “special event” makes you much more likely to give money), pictures of needy people (seeing a few  people makes that emotional connection that you don't get if you read about helping millions), and other tactics.  My view of charities, until recently, has been that there's a high potential for inefficiency and emotional manipulation, just as with kids. I've been trying to form a model that would help me make decisions about whether to give, and to whom, that isn't just to make me feel good, but something that will actually do good.
&lt;/p&gt;

&lt;h3&gt;Externalities&lt;/h3&gt;
&lt;p&gt;
There's something I left out of the model of trades.  There's more than just the two parties involved.  Maybe the business polluted to make that sandwich.  Maybe I littered instead of throwing the sandwich wrapper away.  The trade didn't take into account these “externalities” — effects on the rest f the world outside the seller and the buyer.
&lt;/p&gt;
&lt;p&gt;
The standard solution to this is to estimate those effects and charge people for them. Let's take an extreme example, with $5 of pollution for a sandwich. (I think this is extreme for sandwiches but there are probably other industries for which it's reasonable to say the damage to the environment is higher than the value of the product.)  Before the trade, there was $1 (your sandwich) + $2 (my money) + $5 (rest of world) = $8, and after the trade there was $2 (your money) + $3 (my sandwich) + $0 (rest of world) = $5.  Although the seller and buyer are better off, the trade made the world worse.  If we could charge the seller $5 for polluting, the price of the sandwich would be $7 instead of $2.  And at $7, I wouldn't buy the sandwich, since it's only worth $3 to me.  The trade would be stopped, which is just what we wanted here.  To make money, the business needs to figure out how to reduce pollution.
&lt;/p&gt;
&lt;p&gt;
I like the charging-for-pollution solution better than laws against pollution, or trade-and-cap systems (I'll have to make another post about that).  With a law, the business's incentive is to fight the law, doing as little as possible, because they still make more money if they pollute.  Whereas with charging, the businesses makes more money by not pollution.  Since profit motivates business, I want the system to give more profit when the business pollutes less.  However it's often impractical to measure the impact of pollution, and that's why we have simplistic black-and-white laws in place.
&lt;/p&gt;

&lt;h3&gt;Model for Philanthropy&lt;/h3&gt;
&lt;p&gt;
We have this artificial line between business and charity. We even call the charities “non-profits”, to distinguish them from businesses (even though some businesses don't make a profit).  And there's the sense that charities do good for the world and businesses are bad.  I think the world is more complicated than that.  There's a whole set of potential projects that have both business and philanthropic aspects.  For example, microfinance can generate profits and help lots of people at the same time.  Tesla Motors might not ever make money, but it could jump-start the market for cleaner cars. Neither counts as a charity; you're not just handing out money.  But there's the potential for it to do &lt;em&gt;more good&lt;/em&gt; than a charity.  The tax laws in the U.S. encourage giving to charity over investing in a “socially reponsible” business that does good things for the world.
&lt;/p&gt;
&lt;p&gt;
If I'm going to do something with money that I don't need, I want to put it into a place that gives the highest &lt;em&gt;return on investment&lt;/em&gt;.  But in the case of philanthropy, in that return I need to consider not only what I get back, but also what good it does for the world.  Externalities are a way of looking at this.  Normally an externality is something negative.  But there are also positive externalities.  If I invested in a business that makes less profit than other businesses, but generates a lot of good in the world, that's a positive externality.  The return on investment &lt;em&gt;for me&lt;/em&gt; might be low, but the return &lt;em&gt;to the world&lt;/em&gt; could be high.  Whether it's classified as an investment or a charity isn't relevant (except there are tax implications that affect the return on investment); I want to find things that have a high rate of return. There's also regular shopping. Just as I might avoid “sweatshop“ products, I might favor products that have positive externalities.
&lt;/p&gt;

&lt;h3&gt;Giving&lt;/h3&gt;
&lt;p&gt;
Unfortunately, I haven't found much that can guide me to high-return philanthropy. Businesses report cost and revenue but not externalities. Charities report costs and donations but not the effects they have. I started following &lt;a href="http://www.givewell.net/"&gt;GiveWell&lt;/a&gt; a while ago because they seemed to be the only ones that came even close to what I was looking for.  I was pleased to see they got mainstream press recently.  They tend to pick things that are more tangible, and they seem to consider “saving lives” separately from economic benefit, but in general I like what they're saying and doing.  I like that they &lt;a href="http://givewell.net/faq#Overhead-ratio"&gt;focus on benefits more than cost efficiency&lt;/a&gt;, and they're trying to &lt;a href="http://givewell.net/node/38"&gt;compare different approaches&lt;/a&gt; to see what's most effective.  I'm also following &lt;a href="http://www.acumenfund.org/"&gt;Acumen Fund&lt;/a&gt;, which tries to help people through investments rather than charity.
&lt;/p&gt;
&lt;p&gt;
Businesses looking for customers use emotions, marketing, sales tactics, and they come to you.  When they get investors they use numbers, and you tend to go to them. I want to see the numbers side of philanthropic organizations. I don't want them contacting me to tell me how they're “doing good”. I assume almost all of them are doing good. What I'm really trying to decide, by building an economic model, is &lt;em&gt;where&lt;/em&gt; to invest. It may be giving to a charity; it may be investing in a business; it may be buying products. It'll probably be all three. The main problem I see is that there isn't enough information, for businesses or charities, and that there's this artificial line drawn between the two.  There should be a unified way of thinking about business and charity that finds the best of both, and allows for new types of organizations that don't fit into the current system. Good information about externalities would change the world.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-9219738510590201602?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/9219738510590201602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=9219738510590201602' title='11 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9219738510590201602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9219738510590201602'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/12/economics-of-giving-to-charities.html' title='Economics of giving to charities'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>11</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-9158670195938730231</id><published>2007-12-01T22:10:00.000-08:00</published><updated>2007-12-01T22:55:51.920-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Verizon and an open network</title><content type='html'>&lt;p&gt;
The &lt;a href="http://gigaom.com/2007/11/27/verizon-wireless-to-open-its-network-platform/"&gt;Verizon announcement&lt;/a&gt;, and Kindle, are making me think we might actually see a revolution in wireless communication technology.
&lt;/p&gt;
&lt;p&gt;
Back in the early days of electric companies, they were light companies. They sent electricity to your house just for lights, and later offered other services at different prices. They gave away light bulbs and made it back in monthly charges. But eventually they made electric outlets that would accept lots of things.  Once lots of electric products were developed, people used electricity for a lot more things. And they stopped subsidizing light bulbs. The electric companies made &lt;em&gt;more&lt;/em&gt; money not by charging more for the existing light bulbs but because people did more with electricity.
&lt;/p&gt;
&lt;p&gt;
Cell phone companies have built a huge infrastructure that's only for cell phones. They sell a very small number of services (voice, SMS, web, GPS), all at different prices. They practically give away cell phones and then charge you monthly to make up for it. Just as with electric companies, there's no way the phone company's going to come up with all the possible things you'll want to do with wireless communications. If they open it up I think they'll make a lot more money, because there will be lots more products that work on their networks. I want my thermometer to send me data wirelessly. I want my microwave to read the current time wirelessly instead of me having to set it. I want my car to send a message to my air conditioning system to turn itself on when I'm getting close to home. I want the rain sensor in my yard to send a message to my car windows to close themselves. My cell phone company will never produce every product, but if they sell access to the network, someone will develop some cool products that use the network. Kindle is an example of such a device.
&lt;/p&gt;
&lt;p&gt;
I've seen some complaints on the blogs that this is a big scam for Verizon to make more money by charging per byte. I think they &lt;em&gt;should&lt;/em&gt; be charging by the byte. When they control the service, they are able to control the byte-to-service ratio. They average the cost of the bytes across customers and give you a single price for “unlimited” voice. But then they and the ISPs hate you if you use more than average. But I think consumers are better off in the long run paying by the byte. And I think consumers are better off if the phone companies stop giving away the cell phones, and instead lower the monthly charges. I think voice-only folk will end up paying less, because the money will come from the higher bandwidth products that people come up with. Just as with electricity or shipping/mail, it makes little sense to offer unlimited service for a fixed fee. That will lead to overconsumption and hard limits (like Comcast shutting off consumers who use a lot of bandwidth). I'd rather have people pay for bandwidth, so that we choose what to use and not worry about being shut off. Does FedEx stop shipping your packages if you ship lots of them? No! They treat you even nicer! In a world where people pay per byte, the ISPs will &lt;em&gt;want&lt;/em&gt; customers who use a lot. This is the “fat head” of data transmission. Other devices can use very little, without making it too expensive. I'm not going to buy a cell phone plan at $20/month for my thermometer or microwave. If I only paid by the byte, it'd be incredibly cheap to transmit the time and temperature once in a while, and those devices will become feasible. This is the “long tail” of data transmission.
&lt;/p&gt;
&lt;p&gt;
I also wanted to mention that when people talk about “3G” they are thinking about the higher bitrate. But it also provides always-on service that can be used simultaneously with voice. I  suspect (just as with broadband) that always-on is what will change society more than higher bandwidth. Phone companies thought videophones (high bandwidth, not always on) would be the big thing, but it turned out SMS text messaging (low bandwidth, always on) was what was really took off.
Twitter and IM are going to be used more than Second Life or World of Warcraft. Flash games in your web browser are being played more than Playstation 3 games.
&lt;/p&gt;
&lt;p&gt;
I think it's reasonable for electric companies to initially offer only a small set of products, like lighting. It's the low hanging fruit. And it lets them build out their system and make sure everything works. Once the infrastructure is there, it makes sense to open it up.  I think the same is true for the cell networks. It makes sense to start with something more limited, so you can work out all the details and build the infrastructure. Once it's established, it's time to open it up to even more products, so that you can make even more money. I'm happy to see Verizon's announcement (I haven't seen details yet). I hope they've thought about the history of electric companies, and are thinking about a world in which every device uses the network, and cell phones are just one of many.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-9158670195938730231?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/9158670195938730231/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=9158670195938730231' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9158670195938730231'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9158670195938730231'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/12/verizon-and-open-network.html' title='Verizon and an open network'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-4932263847840336938</id><published>2007-11-01T22:20:00.000-07:00</published><updated>2007-11-01T23:03:06.290-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes Season 2: Evil and dumb</title><content type='html'>&lt;p&gt;
  It seems that many of the main characters in Heroes, Season 2, are
  becoming either &lt;em&gt;evil&lt;/em&gt; or &lt;em&gt;dumb&lt;/em&gt;, and they're coming
  in pairs. Last season &lt;strong&gt;Jessica&lt;/strong&gt; was evil and
  &lt;strong&gt;Niki&lt;/strong&gt; as dumb. Let's go through the list for season
  2:
&lt;/p&gt;
&lt;ul&gt;
  &lt;li&gt;&lt;strong&gt;Kensei&lt;/strong&gt; is becoming evil, and &lt;strong&gt;Hiro&lt;/strong&gt; is becoming dumb.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Nathan&lt;/strong&gt; might be evil, and &lt;strong&gt;Matt&lt;/strong&gt; is dumb.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;West&lt;/strong&gt; seems to be somewhat evil (and somewhat dumb), and &lt;strong&gt;Claire&lt;/strong&gt; is really dumb.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Noah&lt;/strong&gt; has returned to evil, and &lt;strong&gt;The Haitian&lt;/strong&gt; I'm not sure about.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Elle&lt;/strong&gt; is evil, but has no dumb counterpart (yet); maybe she'll pair up with &lt;strong&gt;Peter&lt;/strong&gt;, who's not really dumb, but has lost his memory.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Maya&lt;/strong&gt; is turning to evil, and &lt;strong&gt;Alejandro&lt;/strong&gt; I'm not sure about. Or maybe &lt;strong&gt;Sylar&lt;/strong&gt; is the evil one and Maya is dumb.&lt;/li&gt;
  &lt;li&gt;&lt;strong&gt;Niki/Jessica&lt;/strong&gt; has turned into evil Jessica, and she's working with &lt;strong&gt;Mohinder&lt;/strong&gt;, who's dumb.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
What if Niki/Jessica was the first to experience some sort of evil/dumb pair virus that will spread throughout the hero community?  I know, it's a ridiculous theory.  I can't even fit Angela, Molly, Micah, Monica, or the mysterious Adam into this list.  But every time I see one of the above characters it does seem to me that they're getting more evil or more dumb.
&lt;/p&gt;
&lt;p&gt;
I'm also starting to think Bob may be the only &lt;em&gt;good&lt;/em&gt; hero. But then, I'm probably the only one who thought Linderman was good. He was the one who wanted to save the world (from losing 93% of the population) by setting off a small bomb (losing 0.07% of the population). Evil means but a good end. Except he's dead now, the bomb didn't go off, and now the world is in trouble.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4932263847840336938?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4932263847840336938/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4932263847840336938' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4932263847840336938'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4932263847840336938'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/11/heroes-season-2-evil-and-dumb.html' title='Heroes Season 2: Evil and dumb'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-107721439901538847</id><published>2007-10-15T17:59:00.000-07:00</published><updated>2007-11-01T14:01:41.410-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='structure'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Feeds are not enough</title><content type='html'>&lt;p&gt;
There are lots of types of information I want to search and
browser, but it's typically information that I want to see right
now. I also want to be notified about new information and changes
to information. Emails, text messages, and pager alerts are ways
to send this information to me. Feeds are a little different in
that they're controlled by the receiver pulling information
rather than the sender pushing it. All of these systems allow
senders to transmit messages to receivers. However all of them
treat each message separately.
&lt;/p&gt;
&lt;p&gt;
What I really want is information, not a set of messages. The
messages should be grouped and summarized. Gmail for example
groups messages into conversations. Facebook groups and
summarizes friend updates. For example instead of separately
telling me, “A is a friend of D”, “B is a friend of D”, and “C is
a friend of D”, Facebook will tell me “A, B, and C are friends of
D”.  They can do this because they know the structure, not only
text, of messages, and also because they know when I last read
messages.
&lt;/p&gt;
&lt;p&gt;
There are lots more things I'd like to see along these lines. For
example if I receive 100 messages telling me my site is down, and
I'm away from my computer, I'd like them to be combined
together. Or if the site is back up maybe those messages should
go away, replaced by a note saying the site went down and back
up. If I get a traffic alert it should expire when the traffic
clears up again. If I read news every hour I want to see what's
new in the past hour but if I read news once a week I want to see
the week's biggest stories, not the 168 hours of updates. When I
come back from vacation I shouldn't have lots of low-importance
and redundant messages. Group and summarize. Show me what's
important. Don't overwhelm me with every individual message.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-107721439901538847?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/107721439901538847/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=107721439901538847' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/107721439901538847'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/107721439901538847'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/10/feeds-are-not-enough.html' title='Feeds are not enough'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-939395707537845445</id><published>2007-09-21T13:09:00.000-07:00</published><updated>2009-01-10T19:12:22.696-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='typography'/><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Online map sites</title><content type='html'>&lt;p&gt;
I love maps. I especially love online maps. They let me zoom, pan, and change the features being displayed. Google Maps was truly wonderful after using Mapquest, etc., for so many years. Microsoft and Yahoo also have draggable maps now.
&lt;/p&gt;
&lt;p&gt;
I was planning a trip to Mount Saint Helens recently and tried out some online maps:
&lt;/p&gt;
&lt;ul class=spaced&gt;
&lt;li&gt;
Google:
&lt;a href="http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQsuTuy_8I/AAAAAAAAAEI/LmJWassE9KM/s1600-h/Picture+2.png"&gt;&lt;img src="http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQsuTuy_8I/AAAAAAAAAEI/LmJWassE9KM/s400/Picture+2.png"  alt="Google map of Mt. St. Helens" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Yahoo:
&lt;a href="http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQs-Tuy_9I/AAAAAAAAAEQ/eJzoivc3YZE/s1600-h/Picture+1.png"&gt;&lt;img src="http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQs-Tuy_9I/AAAAAAAAAEQ/eJzoivc3YZE/s400/Picture+1.png"  alt="Yahoo map of Mt. St. Helens" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
Microsoft (Live):
&lt;a href="http://1.bp.blogspot.com/_kV9ZnGnZL7M/RvQtQDuy_-I/AAAAAAAAAEY/97W05l9G2Fw/s1600-h/Picture+4.png"&gt;&lt;img src="http://1.bp.blogspot.com/_kV9ZnGnZL7M/RvQtQDuy_-I/AAAAAAAAAEY/97W05l9G2Fw/s400/Picture+4.png"  alt="Microsoft map of Mt. St. Helens" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There are three things I really want to know when visiting Mount Saint Helens:
&lt;/p&gt;
&lt;ol class=spaced&gt;
&lt;li&gt;&lt;strong&gt;Roads&lt;/strong&gt;. I want to know how to get there. Only Google shows the roads clearly. Yahoo shows dark gray on medium green, which is barely visible. Microsoft shows dark gray on medium gray, which is even worse, and nearly impossible to find unless you already know where to look. Just try to find the western end of NF-99 on Microsoft's maps. None of the services offered as much information as the park maps.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Terrain&lt;/strong&gt;. I want to know where the volcano is and where the crater is. Only Microsoft shows this at all, and it shows it beautifully. I can see the ravines and mountains and river valleys. It's great! Yahoo and Google show nothing about terrain in their maps. Instead, you have to switch to Satellite view, which works for this volcano, but no match for the clarity of Microsoft's maps. (I'm sure terrain slows down Microsoft map loading quite a bit though; maybe it should be an optional layer.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Stops.&lt;/strong&gt; I want to know where I can stop, take pictures, go on a hike, etc. None of the three mapping sites I tried have this information; I instead got some of it from the park map. Another way to get this data would be from geotagged images; if I could see the most popular spots for photos, I'd know where I should go.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The other thing you might notice from these three maps is that Microsoft's typography is excellent. Google has a nice font but surrounds the text with bright yellow or white to increase contrast, which is quite distracting. Yahoo's text is decent and has less distracting contrast. But Microsoft's text is really nice. Instead of a white border they use a subtle white shading to increase contrast. It's very clean. They also use different fonts for different types of features — compare “WASHINGTON”, “Mount St Helens National Volcanic Monument”, “Spirit Lake”, and “Mount St Helens 8365 ft”. It looks more like a “traditional” map than Google or Yahoo.
&lt;/p&gt;
&lt;p&gt;
In the end I used the park map for roads and features, Google maps for driving times and directions, Microsoft maps for getting a general sense of where the scenic areas are, and my Rand McNally U.S. Atlas (paper, not online) to find out which routes were marked “scenic”.
&lt;/p&gt;
&lt;p&gt;
I also visited the Seattle area, and compared the maps:
&lt;/p&gt;
&lt;ul class=spaced&gt;
&lt;li&gt;
&lt;a href="http://maps.google.com/maps?f=q&amp;amp;ll=47.608941,-122.22599&amp;amp;spn=0.136101,0.282898&amp;amp;z=12&amp;amp;om=1"&gt;Google&lt;/a&gt;:

&lt;a href="http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQ2dTuy__I/AAAAAAAAAEg/IbnAJUoytVI/s1600-h/Picture+5.png"&gt;&lt;img  src="http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQ2dTuy__I/AAAAAAAAAEg/IbnAJUoytVI/s400/Picture+5.png" alt="Google map of Seattle area" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://maps.yahoo.com/#mvt=m&amp;amp;trf=0&amp;amp;lon=-122.224617&amp;amp;lat=47.621091&amp;amp;mag=6"&gt;Yahoo&lt;/a&gt;:

&lt;a href="http://4.bp.blogspot.com/_kV9ZnGnZL7M/RvQ2mjuzAAI/AAAAAAAAAEo/lyvSn1IJsYE/s1600-h/Picture+7.png"&gt;&lt;img src="http://4.bp.blogspot.com/_kV9ZnGnZL7M/RvQ2mjuzAAI/AAAAAAAAAEo/lyvSn1IJsYE/s400/Picture+7.png"  alt="Yahoo map of Seattle area" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;a href="http://maps.live.com/default.aspx?v=2&amp;amp;cp=47.613685~-122.22496&amp;amp;style=r&amp;amp;lvl=12&amp;amp;tilt=-90&amp;amp;dir=0&amp;amp;alt=-1000&amp;amp;scene=3702509&amp;amp;encType=1"&gt;Microsoft&lt;/a&gt;:

&lt;a href="http://3.bp.blogspot.com/_kV9ZnGnZL7M/RvQ2xTuzABI/AAAAAAAAAEw/A9Cozbb1N08/s1600-h/Picture+6.png"&gt;&lt;img src="http://3.bp.blogspot.com/_kV9ZnGnZL7M/RvQ2xTuzABI/AAAAAAAAAEw/A9Cozbb1N08/s400/Picture+6.png"  alt="Microsoft map of Seattle area" /&gt;&lt;/a&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
In urban areas Microsoft continues to have good typography with labels that are easier to read than Google's or Yahoo's. They also seem to be placing the labels more intelligently to avoid drawing over important areas. Microsoft also has labels for more items on the map. The terrain doesn't play a role here, although the east side of Mercer island has terrain that explains why the roads curve so much. &lt;strong&gt;Google's roads are easiest to see.&lt;/strong&gt; Yahoo shows each city in its own color, which can be useful at times, and it also makes highway entrances easy to see. Microsoft shows more roads (faintly), which gives me a better sense of which areas are sparse/industrial and which areas are dense/residential.
&lt;/p&gt;
&lt;p&gt;
Which site do I use most often?
&lt;/p&gt;
&lt;p&gt;
In general I get more information out of Microsoft's maps than Google's or Yahoo's, but Microsoft has a few annoying implementation details that keep me from using their maps more: (a) their awful browser detection script rejects me unless I lie about my user agent, and (b) I get a stupid dialog box asking me to install a Windows 3d plugin … even though I'm not wanting 3d, nor am I using Windows.  There are things about each of the three that I like, but in the end I'm still using Google's maps most often. It's fast and the roads are easy to see, especially in cities.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2007-11-30] Google now has a “terrain” map mode that gives me what I liked from Microsoft Maps:
&lt;/p&gt;
&lt;iframe width="425" height="350" frameborder="0" scrolling="no" marginheight="0" marginwidth="0" src="http://maps.google.com/maps?f=q&amp;amp;t=p&amp;amp;om=1&amp;amp;ie=UTF8&amp;amp;ll=46.210725,-122.154236&amp;amp;spn=0.143975,0.175781&amp;amp;z=12&amp;amp;output=embed&amp;amp;s=AARTsJprVSi6pHZf307zYjWUE5xJtwlSYw"&gt;&lt;/iframe&gt;
&lt;p&gt;
&lt;small&gt;&lt;a href="http://maps.google.com/maps?f=q&amp;amp;sll=37.0625,-95.677068&amp;amp;sspn=80.982705,90&amp;amp;t=p&amp;amp;om=1&amp;amp;ll=46.280292,-122.197151&amp;amp;spn=0.083048,0.145912&amp;amp;z=12&amp;amp;source=embed"&gt;Go to Google Maps&lt;/a&gt;&lt;/small&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-939395707537845445?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/939395707537845445/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=939395707537845445' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/939395707537845445'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/939395707537845445'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/09/online-map-sites.html' title='Online map sites'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://2.bp.blogspot.com/_kV9ZnGnZL7M/RvQsuTuy_8I/AAAAAAAAAEI/LmJWassE9KM/s72-c/Picture+2.png' height='72' width='72'/><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3467765002221519876</id><published>2007-08-05T17:30:00.000-07:00</published><updated>2009-01-10T19:13:02.513-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><title type='text'>The Price of Gas</title><content type='html'>&lt;p&gt;
      Prices are typically driven by supply and demand. I was curious
      about the price of gasoline. When I buy a gallon of gasoline,
      &lt;em&gt;I&lt;/em&gt; pay for it, but &lt;em&gt;others&lt;/em&gt; pay for it
      too. My purchase increases the aggregate demand. Higher demand
      means higher prices. Higher prices means other people pay more
      for gas.
    &lt;/p&gt;

    &lt;p&gt;
      How much more do others have to pay?
    &lt;/p&gt;

    &lt;p&gt;
      I can't calculate exactly but with some simplifying assumptions
      I can make an estimate:
    &lt;/p&gt;

    &lt;ol class=spaced&gt;
      &lt;li&gt;Limit this calculation to the United States. There are
      complex issues that influence gas prices around the world, some
      economic and some political, and it's much simpler to make this
      estimate with just one country. This would ordinarily not work,
      except the next assumption makes it possible:
      &lt;/li&gt;
      &lt;li&gt;
        Gasoline supply in the U.S. is limited by refining capacity in
        the U.S. With “maintenance”, “shutdowns”, “inspections”,
        fires, and other capacity issues, I believe it's reasonable to
        say the supply — at least in the short term — is fixed, and
        that everything that is produced is consumed.
      &lt;/li&gt;
    &lt;/ol&gt;

    &lt;p&gt;
      In other words, if I buy one extra gallon of gas, other
      Americans need to buy one less gallon. What would it take to
      make them buy less? Raise the price. By how much?
    &lt;/p&gt;

    &lt;p&gt;
      Let's call the total quantity consumed by everyone else Q. Let's
      call the current price P. We want to know how much the price has
      to go up to make Q go down by 1. If everyone else (collectively)
      buys 1 gallon les, then I can buy that gallon. The key to the
      relationship between P and Q is the &lt;a
      href="http://en.wikipedia.org/wiki/Price_elasticity_of_demand"&gt;price
      elasticity of demand&lt;/a&gt;:
    &lt;/p&gt;

    &lt;p&gt;
      &lt;em&gt;e&lt;/em&gt; = %&amp;Delta;Q / %&amp;Delta;P = (&amp;Delta;Q/Q)/(&amp;Delta;P/P)
    &lt;/p&gt;

    &lt;p&gt;
      What I really want to know is when I spend $D on gas, how much
      more do other Americans have to spend? Spending $D means
      &amp;Delta;Q = D/P, which can also be written as D =
      &amp;Delta;Q&amp;times;P. What everyone else has to spend is
      Q&amp;times;&amp;Delta;P. So let's compute Q&amp;times;&amp;Delta;P. First,
      let's rearrange &lt;em&gt;e&lt;/em&gt;:
    &lt;/p&gt;

    &lt;p&gt;
      &lt;em&gt;e&lt;/em&gt; = (&amp;Delta;Q/Q)/(&amp;Delta;P/P) = (&amp;Delta;Q&amp;times;P) / (Q&amp;times;&amp;Delta;P)
    &lt;/p&gt;

    &lt;p&gt;
      So Q&amp;times;&amp;Delta;P = (&amp;Delta;Q&amp;times;P)/e = D/e.
    &lt;/p&gt;

    &lt;p&gt;
      When I spend an extra $D on gas, others have to spend an extra
      $D/e on gas. That's the answer I was looking for.
    &lt;/p&gt;

    &lt;p&gt;
      Except … what's the value of &lt;em&gt;e&lt;/em&gt;?
    &lt;/p&gt;

    &lt;p&gt;
      There are various estimates: &lt;a
      href="http://www.mackinac.org/article.aspx?ID=1247"&gt;0.2&lt;/a&gt;, &lt;a
      href="http://citeseer.ist.psu.edu/260177.html"&gt;0.01&lt;/a&gt;, &lt;a
      href="http://www.env-econ.net/2006/05/inelastic_short.html"&gt;0.1&lt;/a&gt;,
      &lt;a
      href="http://www.econ.ucdavis.edu/faculty/knittel/papers/gas_demand_083006.pdf"&gt;0.034
      to 0.077 in 2001-2006&lt;/a&gt;, and &lt;a
      href="http://economics.about.com/od/priceelasticityofdemand/a/gasoline_elast.htm"&gt;0.26&lt;/a&gt;.
      When I spend an extra $40 on gas, other Americans have to spend
      between $153 and $4000. I'm not sure which to believe, but I'm
      going to guess it's around 0.1, which means others have to spend
      an extra $400 on gas.  Where does that money go? To the oil companies.
    &lt;/p&gt;

    &lt;p&gt;
      Let's look at it in reverse: if you found a way to spend $40
      less on gas (maybe carpooling, planning errands better, or
      driving less aggressively), not only would you save that $40,
      the oil companies would miss out on $400 (maybe as much as
      $4000), because you'd be helping other Americans spend less on
      gas.
    &lt;/p&gt;

    &lt;p&gt;
      I'm not even going to try estimating how much more everyone pays
      when someone drives a big SUV instead of a fuel efficient car…
    &lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3467765002221519876?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3467765002221519876/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3467765002221519876' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3467765002221519876'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3467765002221519876'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/08/price-of-gas.html' title='The Price of Gas'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-2451563990597678087</id><published>2007-07-29T08:38:00.000-07:00</published><updated>2007-07-30T13:56:07.412-07:00</updated><title type='text'>Dividing a range into segments</title><content type='html'>&lt;p&gt;
Suppose you want to divide a numeric range (such as 0–1 or 0–23 or 1–365) into even segments. If you know how many segments you have, it's easy; you divide by N. But if you don't know how many segments you will have, and you can't go back once you've divided something, it gets trickier. If you divide into 3 equal segments and need 3, you're at the optimal point.  But if you instead need 4 and have already divided into 3 segments, you end up subdividing one segment of length 1/3 into 2, leaving you with 4 segments of length 1/6, 1/6, 1/3, and 1/3.
&lt;/p&gt;
&lt;p&gt;
There's a clever division scheme involving the &lt;a href="http://en.wikipedia.org/wiki/Golden_ratio"&gt;golden ratio&lt;/a&gt;:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Rescale your range to be from 0–1.&lt;/li&gt;
&lt;li&gt;The i&lt;sup&gt;th&lt;/sup&gt; division occurs at i * &amp;phi;&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
It's so simple. Why does this work? I don't know. But it's pretty neat.
&lt;/p&gt;
&lt;p&gt;
I first ran across this when I was looking for a way to pick sample points in 1 year of data. I wanted a set that would be roughly evenly spaced, because I wanted to draw a timeseries chart with the results, but I didn't know how much time it would take to analyze the points. So I analyzed one at a time, using the golden ratio to guide me.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-2451563990597678087?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/2451563990597678087/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=2451563990597678087' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2451563990597678087'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2451563990597678087'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/06/choosing-evenly-spaced-points.html' title='Dividing a range into segments'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1360814864114530733</id><published>2007-07-02T17:49:00.000-07:00</published><updated>2007-07-02T18:05:47.202-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Playing with Amazon EC2 and S3</title><content type='html'>&lt;p&gt;
I've been playing with Amazon's S3 and EC2, and they look potentially useful. S3 is the storage system. You pay for storage and transfers. EC2 is the computation system. You pay for virtual computers. Their &lt;a href="http://docs.amazonwebservices.com/AWSEC2/2007-01-19/GettingStartedGuide/"&gt;Getting Started Guide for EC2&lt;/a&gt; is pretty good. It describes step by step how to set up your development environment, then gives you a starter virtual machine to play with. I followed the instructions and got Apache and SSH.
&lt;/p&gt;
&lt;p&gt;
The big advantage of EC2 over running your own servers is that you can get more capacity quickly. In fact it's called &lt;em&gt;Elastic&lt;/em&gt; Cloud for that reason. If you're running a web service on a conventional hosting system and then are mentioned on Digg, you're either going to run out of capacity, or you're paying for extra capacity that you're not using most of the time. With EC2, you can monitor for the Digg Effect and add more virtual machines to handle the extra traffic, then release them when the Diggers move on. You only pay when you use the machines.
&lt;/p&gt;
&lt;p&gt;
For my own projects though, I'm never going to get hit by Digg. I was hoping to use EC2 as a cheap low-capacity server. I misunderstood the pricing though. I thought it was $0.10/CPU-hour, but it's actually $0.10/clock-hour. When my server is sitting idle, I'm still getting charged. At $0.10/hour, that's over $70/month, and that's a bit too much to pay for an idle server. I'll instead use my Mac Mini at home.
&lt;/p&gt;
&lt;p&gt;
I might still use S3 for off-site backup. I have regular backups at home, but all the backups are … at home. If anything happens to my home, I lose all copies of all my data. S3 charges for storage, uploads, and downloads, and I estimate that after I upload all my photos, I'd pay $4.50/month. That's pretty reasonable for off-site backup. I haven't investigated whether there are off-the-shelf backup solutions for S3. I want something portable (Linux, Windows, Mac) and command line (so I can automate it). I might end up writing my own quick&amp;amp;dirty scripts for this.
&lt;/p&gt;
&lt;p&gt;
If you're starting a web service, you should definitely take a look at S3 and EC2. They're fairly cheap, and the reliability and flexibility may be worth a lot to your company.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1360814864114530733?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1360814864114530733/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1360814864114530733' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1360814864114530733'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1360814864114530733'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/07/playing-with-amazon-ec2-and-s3.html' title='Playing with Amazon EC2 and S3'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1453566155129705141</id><published>2007-06-30T12:55:00.001-07:00</published><updated>2007-09-18T10:54:12.071-07:00</updated><title type='text'>Fun YouTube videos</title><content type='html'>&lt;p&gt;
YouTube is full of strange and fun videos. Here are some that I've seen recently (original titles and descriptions; I didn't write these descriptions):
&lt;/p&gt;
&lt;dl&gt;

&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=1PJTq2xQiQ0"&gt;Ship floating on nothing! :: Physikshow Uni Bonn&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Get enchanted by a aluminium foil ship floating above ground on sulphur hexafluoride (gas significantly denser than air) at the Physikshow of the University ...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=lWWKBY7gx_0"&gt;Le Grand Content&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;A Film by Clemens Kogler together with Karo Szmit. Voice by Andre Tschinder.Le Grand Content examines the omnipresent Powerpoint-culture in search for its ph...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=m6JLzOHJzbU"&gt;Strange Weather Phenomenon in Newfoundland&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Recorded in Miles Cove, Newfoundland, Canada. Not sure on the exact date this was filmed, but apparently it was in the spring of the year, in 2003. Miles Cov...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://youtube.com/watch?v=NLlGopyXT_g"&gt;The Machine is Us/ing Us (Final Version)&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;&amp;quot;Web 2.0&amp;quot; in just under 5 minutes.http://mediatedcultures.netThis is a slightly revised and cleaned up version of the video that was featured on YouTube in F...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=3Ufs9Wx0VXQ"&gt;Wil Wheaton praises Sony's 1,000,000/1 Contrast OLED TV's&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;OLED = organic light-emitting diode.This is an amazing new technology that will enable extremely thin TV's with a contrast ratio that is about 100 times grea...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=cdbYsoEasio"&gt;The Wilhelm Scream Compilation&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;A video I found several years ago, with clips of films using the scream that is found in most George Lucas films...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=cW44BpXpjYw"&gt;LineRider &amp;quot;Discarded&amp;quot; A Line Rider Short by TechDawg&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;HiRes @ http://www.iridethelines.comA Short new Line Rider Adventure by TechDawg!  This track contained 13,028 lines, yet is only around 2 minutes in length....&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=OYZnsO2ZgWo"&gt;Crow Makes Tools&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;This bird fashions a hook out of a hairpin to get the food out of the tube.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://youtube.com/watch?v=l69Vi5IDc0g"&gt;Will It Blend? - Glow Sticks&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Need a 12 hour lantern, but all you have are some glow sticks and a Blendtec Total Blender? Well look no further MacGyver, that's all you need.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=8Nwdeq80H2Q"&gt;Vertical truck&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Look at this truck. It can climb an almost 100% vertical wall.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=HdesIbwOYAA"&gt;Happydent White Commercial&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Commercial about how Indian light up their city.Presented by Happydent White Chewing Gum&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=avNa1qTsR1s"&gt;Staplerfahrer Klaus&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Aufklärungsvideo über die Folgen, bei nicht Einhaltung der Vorschriften.... ;-)&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=V40ScvJeFxg"&gt;LEGO Mindstorms NXTway-G Balancing Robot&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;NXT balancing robot using the HiTechnic Gyro Sensor.  Designed and developed by Roy Watanabe, Waseda University Japan.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=ynCsFZ3AS3E"&gt;Don's Guns&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Creepy adverstisement&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=FE02TxLlRQU"&gt;Amazing unloading excavator&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The Thais has their way of unloading excavator&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=1gvGDsIYrrQ"&gt;Speed Painting with Ketchup and French Fries&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;What do you do with fresh McDonald's French Fries and 10 packets of Ketchup? You paint with them of course.   50 min speed painting plays in 4 mins.  Ketchup...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=c0Qs6GPK3Cc"&gt;Silent Movie Star Wars (Brilliant)&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Star Wars from the 20's&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=crfrKqFp0Zg"&gt;beatboxing flute super mario brothers theme&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Beatboxing Flute player Greg Patillo covers all the mario themes like nothing you've heard (unless you've been wandering through washington square park and h...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=pPfJhUgliSs"&gt;Atari 2600 - Centipede&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Atari 2600 TV AdvertismentUploaded By Locke2007 of MechaMetropolis.co.uk&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=IVKRkA9Xm8Y"&gt;Ritterschlag&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Animated short about damsels in distress and dragons&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=epUk3T2Kfno"&gt;Otters holding hands&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Vancouver Aquarium:  two sea otters float around, napping, holding hands.  SO CUTE!&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=S9kVhtpfLmw"&gt;TAMESHIGIRI~Tomato~&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Cut The Tomato with the Nihontou(日本刀). on HighSpeedCamera. 斬手:修心流居合術兵法 修心館々長町井勲 撮影協力：株式会社ノビテック...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=GX4_3cV_3Mw"&gt;Leaping Shampoo&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Scientists of the University of Twente in The Netherlands won a prestigious place in the 'Hall of Fame' of videos about fluid-in-motion. They have made a vid...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://youtube.com/watch?v=xPxDw7ajfGE"&gt;baby duck feed the carp (Nishiki-Goi, Koi)&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;baby duck feeding carps.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=VczbbiRmDik"&gt;The Original Human SPACE INVADERS Performance&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;SPACE INVADERS is the 2nd video performance of the GAME OVER Project, directed by the Swiss artist Guillaume REYMOND (NOTsoNOISY creative agency). This stop-...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=uZfrFX36Hkc"&gt;OLEDS demonstration&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Check out all of the cool ways you could use organic lighting; imagine wallpaper that lights up!!  Demonstration from GE's global research center.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=kVcHhJD9bh0"&gt;Technological Terror&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;On Monday, April 23 2007, the Academy of Motion Picture Arts and Sciences screened Star Wars as part of their Great to Be Nominated series. Before the start ...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=krXP_TUZqsk"&gt;First McDonalds Commercial - Creeepy!&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;The first McDonalds TV Commercial. I wouldnb't let my kids anywhere NEAR that creepy clown thing!&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=MX6aerxQPOs"&gt;Slow motion high FPS compilation&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;A compilation of videos shot with high FPS cameras and then put into slow motion.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=voAntzB7EwE"&gt;colour changing card trick&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;From www.quirkology.com.  Created by Richard Wiseman&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=Ul0gfCyeiyM"&gt;The killer tortoise&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;A tortoise in our garden defends it's territory against invading cats.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=yXnkzeCU3bE"&gt;Gravity Wave&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Lapse of gravity wave action from the Tama, Iowa KCCI-TV webcam on 6 May 2007.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=iIg0sCHRE8o"&gt;Robotic Automated Parking Garage info @ www.aparcalo.com&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Check out this crazy new parking system from New Zealand, its incredible. It is called U-Parkit by Ahu developments.  Here is a website, www.aparcalo.com&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=Y6nshKhqyqU"&gt;Millimetres Matter&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Someone has built a tiny pie-throwing trebuchet to prove that millimetres matter! www.millimetresmatter.com&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=rn8ULJGboOE"&gt;Line Rider Super Mario Bros. 1-1&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;This is all but an exact copy of the first level on super mario bros. for the nintendo entertainment system. Every cloud, bush, etc. is only pixels away from...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=AlPqL7IUT6M"&gt;Struck in tsunami&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Real Tsunami&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=ypMl2RFTC9Y"&gt;Cat eats with fork and chopsticks&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;This cat, as raised by a woman who is batshiat crazy, eats with a fork and chopsticks.&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=sjqr6dycBcI"&gt;Falkirk Wheel&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Falkirk Wheel&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=s-DqZ8jAmv0"&gt;Blaise Aguera y Arcas: Photosynth demo&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Using photos of oft-snapped subjects (like Notre Dame) scraped from around the Web, Photosynth creates breathtaking multidimensional spaces with zoom and nav...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://youtube.com/watch?v=D02XvWhQzT8"&gt;Stargate Atlantis meets Line Rider -- Go Rodney!&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;Two of my favorite things, together at last! Follow Rodney on the whackiest sled ride in the Pegasus galaxy...(5945 lines).Higher quality at http://acko.net/...&lt;/dd&gt;
&lt;dt&gt;&lt;a href="http://www.youtube.com/watch?v=7uAA-B-PZpA"&gt;Child Genius&lt;/a&gt;&lt;/dt&gt;&lt;dd&gt;How can you encourage a child ?&lt;/dd&gt;

&lt;/dl&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1453566155129705141?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1453566155129705141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1453566155129705141' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1453566155129705141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1453566155129705141'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/06/fun-youtube-videos.html' title='Fun YouTube videos'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-6819202895717770746</id><published>2007-06-02T17:30:00.000-07:00</published><updated>2007-06-02T18:03:04.014-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs 22 release - June 2, 2007</title><content type='html'>&lt;p&gt;
Yes, after many many years, and several failed predictions, Emacs 22 is finally released!  Find Emacs 22.1 on &lt;a href="http://www.gnu.org/software/emacs/"&gt;GNU's site&lt;/a&gt; and see the list of changes in the &lt;a href="http://www.gnu.org/software/emacs/NEWS.22.1"&gt;NEWS&lt;/a&gt; file. The main features that I can think of: Mac OS X support, Unicode support, Cygwin support, the use of &lt;code&gt;~/.emacs.d/init.elc&lt;/code&gt; instead of &lt;code&gt;~/.emacs&lt;/code&gt; (for faster startup times), separate colors for active/inactive modelines, colors in terminal mode, highlighting of active minibuffers, grep highlighting, drag and drop, mouse support in xterms, &lt;code&gt;tramp&lt;/code&gt; for remote file access, an included python mode, IRC, &lt;code&gt;org-mode&lt;/code&gt; for keeping notes and appointments, a URL library, the super powerful calc mode, an RSS reader, better keyboard macros, &lt;a href="http://steve-yegge.blogspot.com/2006/06/shiny-and-new-emacs-22.html"&gt;better search and replace&lt;/a&gt;, word wrapping mode (only works with fixed width fonts), spreadsheet package, as-you-type compile checking (&lt;code&gt;flymake&lt;/code&gt;), and Subversion support.  I especially like the &lt;code&gt;ido&lt;/code&gt; package, which enhances buffer switching and file opening.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-6819202895717770746?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/6819202895717770746/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=6819202895717770746' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6819202895717770746'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6819202895717770746'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/06/emacs-22-release-june-2-2007.html' title='Emacs 22 release - June 2, 2007'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-727660068509665261</id><published>2007-05-25T12:02:00.001-07:00</published><updated>2007-05-25T12:35:16.833-07:00</updated><title type='text'>Wrong Number</title><content type='html'>&lt;p&gt;
With my home phone, I sometimes get “wrong number” calls. Someone dialed the wrong number, or someone gave out the wrong number, or someone forgot to dial the area code.  I also get these types of emails.  Other people make a typo when giving out their email address, or they use the wrong domain, or they just don't know their own email address.  Here are some examples of emails that should've gone to someone else:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Relatives emailing me about a party (but they're not &lt;em&gt;my&lt;/em&gt; relatives)&lt;/li&gt;
&lt;li&gt;Construction projects in Dubai emailing me about my workers being lazy&lt;/li&gt;
&lt;li&gt;Business partners in China emailing me about ceramic manufacturing&lt;/li&gt;
&lt;li&gt;London Business School emailing me updates about classes I can take&lt;/li&gt;
&lt;li&gt;Citibank India emailing me &lt;strong&gt;financial information about my account&lt;/strong&gt; (this has happened for three different people, all of whom accidentally used my email address)&lt;/li&gt;
&lt;li&gt;Someone emailing me the design for the anchor bolts he wants me to manufacture&lt;/li&gt;
&lt;li&gt;A hotel chain emailing me about work I'm doing for their new hotel&lt;/li&gt;
&lt;li&gt;A mattress company emailing me about mattresses I've ordered for that hotel&lt;/li&gt;
&lt;li&gt;Someone asking me for a job at my company&lt;/li&gt;
&lt;li&gt;Someone who wanted a refund for the flight I booked for him&lt;/li&gt;
&lt;li&gt;A pizza restaurant emailing me NDAs I need to sign before I can meet with them&lt;/li&gt;
&lt;li&gt;A company that was pleased with my interviews and offered me a job paying $55,000/year, plus a Blackberry and a TiVo (!)&lt;/li&gt;
&lt;li&gt;A London jobs site sending me updates on on jobs I've applied to&lt;/li&gt;
&lt;li&gt;Monster.com India sending me updates on legal jobs&lt;/li&gt;
&lt;li&gt;A pregnancy site sending me information about my 27th week of pregnancy&lt;/li&gt;
&lt;li&gt;A photo site sending me my password&lt;/li&gt;
&lt;li&gt;A dating site sending me potential matches&lt;/li&gt;
&lt;li&gt;An email asking about various legal cases I'm involved with&lt;/li&gt;
&lt;li&gt;Yahoo sending me accounts for which my email is listed as the secondary email address&lt;/li&gt;
&lt;li&gt;Someone sending me pictures from a hike I went on&lt;/li&gt;
&lt;li&gt;Invites from several social networking sites from people I don't know&lt;/li&gt;
&lt;li&gt;Someone asking me to send my software to an address in … Nigeria&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Citibank India especially worries me. They didn't try to verify my email address. What you're &lt;em&gt;supposed&lt;/em&gt; to do if you run a web service with accounts:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Let me sign up online.&lt;/li&gt;
&lt;li&gt;Mark the account “unverified”.&lt;/li&gt;
&lt;li&gt;Send me an email with a verification code or link.&lt;/li&gt;
&lt;li&gt;Only once I verify the email address should you mark the account “verified”.&lt;/li&gt;
&lt;li&gt;Only send sensitive information to verified accounts.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Citibank India and Monster India do not do this.  You should also never send passwords to people over email; send them a link that lets them reset their password.
&lt;/p&gt;
&lt;p&gt;
I'm not sure why I get so many “wrong number” emails, but my guess is that it's because there are lots and lots of people named Amit Patel, and if you search for that name, you end up with me, so people assume I'm the Amit Patel they're looking for. If I'm getting repeated emails or if it seems like an important email, I'll send them an explanation of how they have the wrong email address; other times I just delete the email.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-727660068509665261?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/727660068509665261/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=727660068509665261' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/727660068509665261'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/727660068509665261'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/05/wrong-number.html' title='Wrong Number'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-7343978260782450970</id><published>2007-05-22T08:05:00.001-07:00</published><updated>2009-01-10T19:13:16.137-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes: Kaito Nakamura is immortal?</title><content type='html'>&lt;p&gt;
Kaito Nakamura (Hiro's father) likely has some power. I think his power is immortality. Here's why:
&lt;/p&gt;
&lt;ol class=spaced&gt;
&lt;li&gt;In Landslide, he mentions to Hiro that he's been waiting for generations for some spirit/power to manifest, and didn't think it was in Hiro, but now he sees that it is. Has his family been waiting this long, or has Kaito himself been waiting?&lt;/li&gt;
&lt;li&gt;In the preview for Season 2, Hiro sees a samurai warrior on a horse. It looks like George Takei's eyes in there. It is just family resemblance, or is it Kaito himself in there?&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Immortality is also time-related, so maybe there's a time theme to the powers in that family.
&lt;/p&gt;
&lt;p&gt;
Another power I'm waiting for is the ability to see alternative futures. Linderman somehow knew that he needed to get Niki and DL together so that he could use Micah's power to help Nathan win the election. If Niki and DL hadn't gotten together, even Isaac's power wouldn't have predicted that Micah would be born or that he would have the power he does. I think we need a different sort of foretelling power than what Isaac has; it's possible Kaito has this. My top choice for Kaito's power though is still immortality.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2007-09-30] Given the events of Four Months Later, both in revealing Kensei, and in the events on top of the Duveaux Building, it seems unlikely that Kaito is immortal. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2007-11-09] My original theory was that Kaito was Kensei, and immortal, but although Kaito is not Kensei, it looks like Kensei is indeed immortal. And he's probably trying to destroy the world in an attempt to put his broken hearted self out of his misery.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-7343978260782450970?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/7343978260782450970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=7343978260782450970' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7343978260782450970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7343978260782450970'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/05/heroes-kaito-nakamura-is-immortal.html' title='Heroes: Kaito Nakamura is immortal?'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3858234220279395826</id><published>2007-05-21T17:08:00.000-07:00</published><updated>2011-10-03T13:58:48.481-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: highlighting parentheses</title><content type='html'>&lt;p&gt;
Emacs has several packages for dealing with &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/CategoryParentheses"&gt;parentheses&lt;/a&gt;. Emacs comes with ways to highlight the matching parenthesis when you're on one; try &lt;code&gt;show-paren-mode&lt;/code&gt;. One of the newer add-on packages is Nikolaj Schumacher's &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/HighlightParentheses"&gt;highlight-parentheses&lt;/a&gt; mode, which
shows the parentheses that enclose the current cursor position.  I tried modifying it to highlight the containing expressions instead of only their parentheses:
&lt;/p&gt;
&lt;pre class=snippet&gt;
(defun hl-paren-highlight ()
  "Highlight the parentheses around point."
  &lt;span style="background-color: #99ff99;"&gt;(unless (= (point) hl-paren-last-point)
    &lt;/span&gt;&lt;span style="background-color: #ccff99;"&gt;(save-excursion
      &lt;/span&gt;&lt;span style="background-color: #ffcc99;"&gt;(let ((pos (point))
            (match-pos (point))
            (level -1)
            (max (1- (length hl-paren-overlays))))
        &lt;/span&gt;&lt;span style="background-color: #ff9999;"&gt;(while (and match-pos (&amp;lt; level max))
          &lt;/span&gt;&lt;span style="background-color: #ff99cc;"&gt;(setq match-pos
                &lt;/span&gt;&lt;span style="background-color: #cc99ff;"&gt;(when &lt;/span&gt;&lt;span style="background-color: #9999ff;"&gt;(setq pos &lt;/span&gt;&lt;span style="background-color: #99ccff;"&gt;(cadr &lt;/span&gt;&lt;span style="background-color: #99ffcc;"&gt;(syn&lt;span style="background-color:red;color:white"&gt;t&lt;/span&gt;ax-ppss pos)&lt;/span&gt;&lt;span style="background-color: #99ccff;"&gt;)&lt;/span&gt;&lt;span style="background-color: #9999ff;"&gt;)&lt;/span&gt;&lt;span style="background-color: #cc99ff;"&gt;
                  (ignore-errors (scan-sexps pos 1)))&lt;/span&gt;&lt;span style="background-color: #ff99cc;"&gt;)&lt;/span&gt;&lt;span style="background-color: #ff9999;"&gt;
          (when match-pos
            (if (eq 'expression hl-paren-type)
                (hl-paren-put-overlay pos match-pos (incf level))
              (hl-paren-put-overlay pos (1+ pos) (incf level))
              (hl-paren-put-overlay (1- match-pos) match-pos 
                (incf level)))
            ))&lt;/span&gt;&lt;span style="background-color: #ffcc99;"&gt;
        (while (&amp;lt; level max)
          (hl-paren-put-overlay nil nil (incf level))))&lt;/span&gt;&lt;span style="background-color: #ccff99;"&gt;)&lt;/span&gt;&lt;span style="background-color: #99ff99;"&gt;
    (setq hl-paren-last-point (point)))&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;
Unfortunately, as you can see, it's a mess. I tried better colors (white, gray, etc.) but I just couldn't make it usable.  So I gave up on highlighting the regions and went back to highlighting just the parentheses. It's a bit better:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
(&lt;span style="color: #0000cd;"&gt;defun&lt;/span&gt; &lt;span style="color: #2244d0; font-style: italic;"&gt;hl-paren-highlight&lt;/span&gt; ()
  &lt;span style="color: #448844; background-color: #e8e8e8;"&gt;"Highlight the parentheses around point."&lt;/span&gt;
  &lt;span style=" background-color: #99ff99;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;unless&lt;/span&gt; (= (point) hl-paren-last-point)
    &lt;span style=" background-color: #ccff99;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;save-excursion&lt;/span&gt;
      &lt;span style=" background-color: #ffcc99;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;let&lt;/span&gt; ((pos (point))
            (match-pos (point))
            (level -1)
            (max (1- (length hl-paren-overlays))))
        &lt;span style=" background-color: #ff9999;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;while&lt;/span&gt; (and match-pos (&amp;lt; level max))
          &lt;span style=" background-color: #ff99cc;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;setq&lt;/span&gt; match-pos
                &lt;span style=" background-color: #cc99ff;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;when&lt;/span&gt; &lt;span style=" background-color: #9999ff;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;setq&lt;/span&gt; pos &lt;span style=" background-color: #99ccff;"&gt;(&lt;/span&gt;cadr &lt;span style=" background-color: #99ffcc;"&gt;(&lt;/span&gt;syn&lt;span style="background-color:red;color:white"&gt;t&lt;/span&gt;ax-ppss pos&lt;span style=" background-color: #99ffcc;"&gt;)&lt;/span&gt;&lt;span style=" background-color: #99ccff;"&gt;)&lt;/span&gt;&lt;span style=" background-color: #9999ff;"&gt;)&lt;/span&gt;
                  (&lt;span style="color: #0000cd;"&gt;ignore-errors&lt;/span&gt; (scan-sexps pos 1))&lt;span style=" background-color: #cc99ff;"&gt;)&lt;/span&gt;&lt;span style=" background-color: #ff99cc;"&gt;)&lt;/span&gt;
          (&lt;span style="color: #0000cd;"&gt;when&lt;/span&gt; match-pos
            (&lt;span style="color: #0000cd;"&gt;if&lt;/span&gt; (eq &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;expression hl-paren-type)
                (hl-paren-put-overlay pos match-pos (incf level))
              (hl-paren-put-overlay pos (1+ pos) (incf level))
              (hl-paren-put-overlay (1- match-pos) match-pos 
                (incf level)))
            )&lt;span style=" background-color: #ff9999;"&gt;)&lt;/span&gt;
        (&lt;span style="color: #0000cd;"&gt;while&lt;/span&gt; (&amp;lt; level max)
          (hl-paren-put-overlay nil nil (incf level)))&lt;span style=" background-color: #ffcc99;"&gt;)&lt;/span&gt;&lt;span style=" background-color: #ccff99;"&gt;)&lt;/span&gt;
    (&lt;span style="color: #0000cd;"&gt;setq&lt;/span&gt; hl-paren-last-point (point))&lt;span style=" background-color: #99ff99;"&gt;)&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;
However it's still a bit too … colorful.  So I changed it to simply make the enclosing parentheses bold:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
&lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;defun&lt;/span&gt; &lt;span style="color: #2244d0; font-style: italic;"&gt;hl-paren-highlight&lt;/span&gt; ()
  &lt;span style="color: #448844; background-color: #e8e8e8;"&gt;"Highlight the parentheses around point."&lt;/span&gt;
  &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;unless&lt;/span&gt; (= (point) hl-paren-last-point)
    &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;save-excursion&lt;/span&gt;
      &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;let&lt;/span&gt; ((pos (point))
            (match-pos (point))
            (level -1)
            (max (1- (length hl-paren-overlays))))
        &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;while&lt;/span&gt; (and match-pos (&amp;lt; level max))
          &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;setq&lt;/span&gt; match-pos
                &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;when&lt;/span&gt; &lt;b&gt;(&lt;/b&gt;&lt;span style="color: #0000cd;"&gt;setq&lt;/span&gt; pos &lt;b&gt;(&lt;/b&gt;cadr &lt;b&gt;(&lt;/b&gt;syn&lt;span style="background-color:red;color:white"&gt;t&lt;/span&gt;ax-ppss pos&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
                  (&lt;span style="color: #0000cd;"&gt;ignore-errors&lt;/span&gt; (scan-sexps pos 1))&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
          (&lt;span style="color: #0000cd;"&gt;when&lt;/span&gt; match-pos
            (&lt;span style="color: #0000cd;"&gt;if&lt;/span&gt; (eq &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;expression hl-paren-type)
                (hl-paren-put-overlay pos match-pos (incf level))
              (hl-paren-put-overlay pos (1+ pos) (incf level))
              (hl-paren-put-overlay (1- match-pos) match-pos 
                (incf level)))
            )&lt;b&gt;)&lt;/b&gt;
        (&lt;span style="color: #0000cd;"&gt;while&lt;/span&gt; (&amp;lt; level max)
          (hl-paren-put-overlay nil nil (incf level)))&lt;b&gt;)&lt;/b&gt;&lt;b&gt;)&lt;/b&gt;
    (&lt;span style="color: #0000cd;"&gt;setq&lt;/span&gt; hl-paren-last-point (point))&lt;b&gt;))&lt;/b&gt;
&lt;/pre&gt;
&lt;p&gt;
That's nicer, although perhaps too subtle. I added more bolding:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
(&lt;span style="color: #0000cd;"&gt;defun&lt;/span&gt; &lt;span style="color: #2244d0; font-style: italic;"&gt;hl-paren-highlight&lt;/span&gt; ()
  &lt;span style="color: #448844; background-color: #e8e8e8;"&gt;"Highlight the parentheses around point."&lt;/span&gt;
  &lt;span style=" font-weight: bold;"&gt;(unless&lt;/span&gt; (= (point) hl-paren-last-point)
    &lt;span style=" font-weight: bold;"&gt;(save-excursion&lt;/span&gt;
      &lt;span style=" font-weight: bold;"&gt;(let&lt;/span&gt; ((pos (point))
            (match-pos (point))
            (level -1)
            (max (1- (length hl-paren-overlays))))
        &lt;span style=" font-weight: bold;"&gt;(while&lt;/span&gt; (and match-pos (&amp;lt; level max))
          &lt;span style=" font-weight: bold;"&gt;(setq&lt;/span&gt; match-pos
                &lt;span style=" font-weight: bold;"&gt;(when&lt;/span&gt; &lt;span style=" font-weight: bold;"&gt;(setq&lt;/span&gt; pos &lt;span style=" font-weight: bold;"&gt;(cadr&lt;/span&gt; &lt;span style=" font-weight: bold;"&gt;(syn&lt;span style="background-color:red;color:white"&gt;t&lt;/span&gt;ax-ppss&lt;/span&gt; pos&lt;span style=" font-weight: bold;"&gt;)))&lt;/span&gt;
                  (&lt;span style="color: #0000cd;"&gt;ignore-errors&lt;/span&gt; (scan-sexps pos 1))&lt;span style=" font-weight: bold;"&gt;))&lt;/span&gt;
          (&lt;span style="color: #0000cd;"&gt;when&lt;/span&gt; match-pos
            (&lt;span style="color: #0000cd;"&gt;if&lt;/span&gt; (eq &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;expression hl-paren-type)
                (hl-paren-put-overlay pos match-pos (incf level))
              (hl-paren-put-overlay pos (1+ pos) (incf level))
              (hl-paren-put-overlay (1- match-pos) match-pos&lt;span style="background-color: #eeeeff;"&gt; &lt;/span&gt;
                (incf level)))
            )&lt;span style=" font-weight: bold;"&gt;)&lt;/span&gt;
        (&lt;span style="color: #0000cd;"&gt;while&lt;/span&gt; (&amp;lt; level max)
          (hl-paren-put-overlay nil nil (incf level)))&lt;span style=" font-weight: bold;"&gt;))&lt;/span&gt;
    (setq hl-paren-last-point (point))&lt;span style=" font-weight: bold;"&gt;)&lt;/span&gt;)
&lt;/pre&gt;
&lt;p&gt;
It bolds the parentheses and also the first s-expression inside the opening parenthesis. It doesn't understand when the parentheses begin &lt;a href="http://amitp.blogspot.com/2007/04/lisp-vs-python-syntax.html"&gt;a form&lt;/a&gt; (instead of all the other uses of parentheses), so it sometimes highlights the first s-expression even when it's not special in any way. Despite this wart, I like this form of highlighting so far. 
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2007-05-29] However, there is one more thing I wanted. I de-emphasize parentheses by using a lighter color for them; I want the enclosing parentheses to be bold and black. However I want the enclosing first s-expressions to be bold, but not necessarily black. Note in the above example the keywords are normally blue, but when enclosing the current point they are black. I fixed this by adding separate highlighting for the enclosing parentheses and the first s-expression:
&lt;/p&gt;
    &lt;pre class="snippet"&gt;
&lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd; font-weight: bold;"&gt;defun&lt;/span&gt; &lt;span style="color: #2244d0; font-style: italic;"&gt;hl-paren-highlight&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
  &lt;span style="color: #448844; background-color: #e8e8e8;"&gt;"Highlight the parentheses around point."&lt;/span&gt;
  &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd; font-weight: bold;"&gt;unless&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;= &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;point&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt; hl-paren-last-point&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
    &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd; font-weight: bold;"&gt;save-excursion&lt;/span&gt;
      &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd; font-weight: bold;"&gt;let&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;pos &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;point&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
            &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;match-pos &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;point&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
            &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;level -1&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
            &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;max &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;1- &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;length hl-paren-overlays&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
        &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd; font-weight: bold;"&gt;while&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;and match-pos &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&amp;lt; level max&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
          &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;setq&lt;/span&gt; match-pos
                &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd; font-weight: bold;"&gt;when&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;setq&lt;/span&gt; pos &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;cadr&lt;/span&gt; &lt;span style="color: #000000; font-weight: bold;"&gt;(&lt;/span&gt;&lt;span style="font-weight: bold;"&gt;syn&lt;span style="background-color:red;color:white"&gt;t&lt;/span&gt;ax-ppss&lt;/span&gt; pos&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;
                  &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;ignore-errors&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;scan-sexps pos 1&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;
          &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;when&lt;/span&gt; match-pos
            &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;if&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;eq &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;expression hl-paren-type&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
                &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;hl-paren-put-overlay pos match-pos &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;incf level&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
              &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;hl-paren-put-overlay pos &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;1+ pos&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;incf level&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
              &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;hl-paren-put-overlay &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;1- match-pos&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt; match-pos&lt;span style="background-color: #eeeeff;"&gt; &lt;/span&gt;
                &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;incf level&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
            &lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;
        &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;while&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&amp;lt; level max&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
          &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;hl-paren-put-overlay nil nil &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;incf level&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;
    &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq hl-paren-last-point &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;point&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;&lt;span style="color: #000000; font-weight: bold;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
I'm pretty happy with this variant of &lt;code&gt;highlight-parentheses.el&lt;/code&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3858234220279395826?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3858234220279395826/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3858234220279395826' title='7 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3858234220279395826'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3858234220279395826'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/05/emacs-highlighting-parentheses.html' title='Emacs: highlighting parentheses'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>7</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-9189421312930013615</id><published>2007-05-14T09:32:00.000-07:00</published><updated>2007-05-14T09:54:21.967-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='environment'/><title type='text'>New EPA mileage ratings: what do you get?</title><content type='html'>&lt;p&gt;
For &lt;a href="http://amitp.blogspot.com/2005/09/gas-mileage-rant.html"&gt;my car&lt;/a&gt;, after  experimenting with different driving styles to see what works best, I'm now getting 26–27 mpg city and 31–32 mpg highway at 75mph and 32–33 mpg at 65mph.  The EPA rating for my car is 25 city / 31 highway.  However the EPA is now lowering all of their estimates to match the average driver, and with the &lt;a href="http://www.fueleconomy.gov/feg/calculatorCompareSideBySide.jsp?column=1&amp;amp;id=22091"&gt;new estimates&lt;/a&gt;, my car is listed as 22 city, 29 highway&lt;sup&gt;*&lt;/sup&gt;.  This might make people feel better about their own driving habits instead of making them think about improving them.
&lt;/p&gt;
&lt;p&gt;
High gas prices are what leads many people to look at gas mileage, but gas prices are not that important. Everyone looks at gas prices because they're printed in big bold numbers at every gas station. Fewer people look at the gas mileage. Learn techniques for using less gas while driving. When the light turns red, take your foot off the gas. Watch for light timing (many lights are timed so that if you drive at the speed limit, you'll get more greens.) For city driving, don't accelerate quickly, and don't drive so fast. Your driving habits make more of a difference than which gas station you go to. And even fewer people look at how much they drive.  Plan ahead. Reduce the number of trips you take, and combine multiple errands together into one trip. Move closer to your workplace (this is one reason renters are better off than home buyers—a topic for another blog post). If you're looking to save money on gas, how much you drive is probably the place you should be looking first. Keep track of miles (or gallons) per week.
&lt;/p&gt;
&lt;p&gt;
It's nice to see the EPA adjusting the ratings, but the lower estimates don't match what I've measured with my own driving. The old estimates match closer.
&lt;/p&gt;
&lt;p&gt;
&lt;sup&gt;*&lt;/sup&gt; &lt;small&gt;This is just an estimate that doesn't take into account wind resistance. My car's coefficient of drag is 0.31, and as a result my real-world highway gas mileage is higher than the estimates. It might be better to take into account &lt;a href="http://en.wikipedia.org/wiki/Drag_coefficient#Cd_in_automobiles"&gt;drag area&lt;/a&gt; as well.&lt;/small&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-9189421312930013615?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/9189421312930013615/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=9189421312930013615' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9189421312930013615'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9189421312930013615'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/05/new-epa-mileage-ratings-what-do-you-get.html' title='New EPA mileage ratings: what do you get?'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-5615988972900506060</id><published>2007-05-04T21:39:00.000-07:00</published><updated>2007-05-04T21:56:28.626-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes: Linderman, Sylar</title><content type='html'>&lt;p style="margin-bottom:1in"&gt;
Spoilers! Spoilers!
&lt;/p&gt;
&lt;p&gt;
If you've seen &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/.07%25"&gt;0.07%&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href="http://en.wikipedia.org/wiki/Five_Years_Gone"&gt;Five Years Gone&lt;/a&gt;&lt;/em&gt;, you'll know that everything has gone crazy. People with powers are being hunted in the future.
&lt;/p&gt;
&lt;p&gt;
But we already expected that.
&lt;/p&gt;
&lt;p&gt;
Linderman, in &lt;em&gt;0.07%&lt;/em&gt;, says that he wants to help the world unite.  When I saw that episode, I wondered, “unite against what?”  Either Linderman is stupid, and thinks the world will be great, or he's smart, and thinks the world will unite &lt;em&gt;against people with powers&lt;/em&gt;. In Five Years Gone we see that indeed, the world united against people with powers. I suspect Linderman knew this would happen.
&lt;/p&gt;
&lt;p&gt;
We also hear from Linderman that he used to know other people with powers, but they turned to the dark side. He may not think highly of other people with powers.
&lt;/p&gt;
&lt;p&gt;
We also learn that Linderman is behind &lt;a href="http://en.wikipedia.org/wiki/Primatech_Paper_Company"&gt;Primatech Paper&lt;/a&gt;, which is trying to track down and sometimes kill people with powers, even though Linderman has powers.
&lt;/p&gt;
&lt;p&gt;
In Five Years Gone we hear that the &lt;em&gt;Linderman Act&lt;/em&gt; is what led to persecution of people with powers. If it was named after Linderman or funded by Linderman, it would be consistent with Linderman not liking other people having powers.
&lt;/p&gt;
&lt;p&gt;
So I think some experience in Linderman's life led him to think other people with powers are dangerous, and that he needs to save the world by eliminating everyone else with powers.
&lt;/p&gt;
&lt;p&gt;
Sylar too is quite interested in eliminating everyone else with powers. From the very beginning he's been killing them. With his first victim, he talked about “fixing” Davis by killing him.  When Sylar became President, he talked about making tough decisions to save the world. He also talked about eliminating all competition.
&lt;/p&gt;
&lt;p&gt;
So it seems that both Linderman and Sylar have the same objective: remove everyone else with powers. They both talk about “helping”. Sylar's job was fixing things; Linderman's job was healing people.  Sylar and Linderman seem similar in many respects.
&lt;/p&gt;
&lt;p&gt;
I'm also quite impressed by Heroes in that I can't predict what's going to happen, so I'm likely wrong about Linderman too.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-5615988972900506060?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/5615988972900506060/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=5615988972900506060' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5615988972900506060'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5615988972900506060'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/05/heroes-linderman-sylar.html' title='Heroes: Linderman, Sylar'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1909965258045766845</id><published>2007-04-30T11:50:00.000-07:00</published><updated>2011-10-03T13:44:39.553-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: buffer tabs</title><content type='html'>&lt;p&gt;
Tabs to show overlapping windows are becoming more common these days, especially in terminals, browsers, and chat programs. The idea is that a single window can contain several … buffers.  Emacs already has this, and has had this for a long time.  It's just that by default Emacs doesn't have visible tabs to show the buffers.  XEmacs and SXEmacs can show tabs with “buffer tabs”; for GNU Emacs 21 you need to install &lt;a href="http://www.emacswiki.org/cgi-bin/wiki/TabBarMode"&gt;TabBar mode&lt;/a&gt; (thanks to &lt;a href="http://www.ficml.org/jemimap/wordpress/2004/10/11/tabbar/"&gt;Jemima&lt;/a&gt; for finding this), which gives you tabs like this:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://3.bp.blogspot.com/_kV9ZnGnZL7M/RjY7lvCgMeI/AAAAAAAAABI/Uqr3dJEYPH8/s1600-h/Picture+1.png"&gt;&lt;img src="http://3.bp.blogspot.com/_kV9ZnGnZL7M/RjY7lvCgMeI/AAAAAAAAABI/Uqr3dJEYPH8/s400/Picture+1.png" border="1" alt="screenshot of tabbar-mode" id="BLOGGER_PHOTO_ID_5059296750865494498" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Well, it doesn't look like that by default. The standard settings give each tab a 3d button appearance. I wanted something simpler, so I changed the settings:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;set-face-attribute
 &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-default-face nil
 &lt;span style="color: #008b00;"&gt;:background&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"gray60"&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;set-face-attribute
 &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-unselected-face nil
 &lt;span style="color: #008b00;"&gt;:background&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"gray85"&lt;/span&gt;
 &lt;span style="color: #008b00;"&gt;:foreground&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"gray30"&lt;/span&gt;
 &lt;span style="color: #008b00;"&gt;:box&lt;/span&gt; nil&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;set-face-attribute
 &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-selected-face nil
 &lt;span style="color: #008b00;"&gt;:background&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"#f2f2f6"&lt;/span&gt;
 &lt;span style="color: #008b00;"&gt;:foreground&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"black"&lt;/span&gt;
 &lt;span style="color: #008b00;"&gt;:box&lt;/span&gt; nil&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;set-face-attribute
 &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-button-face nil
 &lt;span style="color: #008b00;"&gt;:box&lt;/span&gt; &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #008b00;"&gt;:line-width&lt;/span&gt; 1 &lt;span style="color: #008b00;"&gt;:color&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"gray72"&lt;/span&gt; &lt;span style="color: #008b00;"&gt;:style&lt;/span&gt; released-button&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;set-face-attribute
 &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-separator-face nil
 &lt;span style="color: #008b00;"&gt;:height&lt;/span&gt; 0.7&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;

&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;tabbar-mode 1&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;define-key global-map &lt;span style="color: #8080b0;"&gt;[&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;alt j&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-backward&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;define-key global-map &lt;span style="color: #8080b0;"&gt;[&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;alt k&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;]&lt;/span&gt; &lt;span style="color: #0000ee;"&gt;'&lt;/span&gt;tabbar-forward&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
This makes the currently selected tab match my default background (&lt;code&gt;#f2f2f6&lt;/code&gt;), removes the 3d borders, and adds a bit of space between the tabs. I also define &lt;kbd&gt;&lt;kbd&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;J&lt;/kbd&gt;&lt;/kbd&gt; and &lt;kbd&gt;&lt;kbd&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;K&lt;/kbd&gt;&lt;/kbd&gt; to switch tabs; I use the same keys in other tabbed apps, because they're easier to type than moving my hands to the arrow keys.
&lt;/p&gt;
&lt;p&gt;
TabBar-mode looks neat, but I'm not sure how useful it will be.  In Emacs I have lots of buffers—more than will fit as tabs. The main thing I like so far are the keys for cycling between related buffers, but as the number of buffers grows it becomes faster to switch directly to the buffer I want.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Edit:&lt;/strong&gt; [2010-11-20] I like tabbar-mode but I also find myself using other buffer switching quite a bit. I'm using tabbar &lt;em&gt;within&lt;/em&gt; a project, and &lt;code&gt;ido-switch-buffer&lt;/code&gt; for moving between projects. I've changed the tabbar groups to show only buffers in the same directory:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
(defun my-tabbar-buffer-groups (buffer)
  &lt;span style="color: #008b00;"&gt;"Put files in the same directory into the same tab bar"&lt;/span&gt;
    (with-current-buffer (get-buffer buffer)
      (list (expand-file-name default-directory))))
(setq tabbar-buffer-groups-function 
      'my-tabbar-buffer-groups)&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1909965258045766845?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1909965258045766845/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1909965258045766845' title='27 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1909965258045766845'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1909965258045766845'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/04/emacs-buffer-tabs.html' title='Emacs: buffer tabs'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://3.bp.blogspot.com/_kV9ZnGnZL7M/RjY7lvCgMeI/AAAAAAAAABI/Uqr3dJEYPH8/s72-c/Picture+1.png' height='72' width='72'/><thr:total>27</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-5811760368114846226</id><published>2007-04-17T15:40:00.000-07:00</published><updated>2009-01-10T19:13:55.971-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='programming'/><title type='text'>Lisp vs. Python: Syntax</title><content type='html'>&lt;p&gt;
I've met lots of people who complain about Lisp and lots of people (especially Lisp folks) who complain about Python.  Lisp is very elegant. There's something nice about its syntax (don't laugh!). The uniformity lets you do all sorts of neat things once you have macros.  The basic syntactic construct in Lisp is the list, &lt;code&gt;(a b c …)&lt;/code&gt;, and it can mean lots of things:
&lt;/p&gt;
&lt;ol class=spaced&gt;
&lt;li&gt;Sometimes &lt;code&gt;(f x)&lt;/code&gt; is a function call, and &lt;code&gt;f&lt;/code&gt; is the name of the function, and &lt;code&gt;x&lt;/code&gt; is evaluated as an argument.&lt;/li&gt;
&lt;li&gt;Sometimes &lt;code&gt;(f x)&lt;/code&gt; is a macro invocation, and &lt;code&gt;f&lt;/code&gt; is the name of the macro, and &lt;code&gt;x&lt;/code&gt; may be treated specially (it's up to the macro to decide).&lt;/li&gt;
&lt;li&gt;Sometimes &lt;code&gt;(f x)&lt;/code&gt; is a binding. For example, &lt;code&gt;(let (&lt;b&gt;(f x)&lt;/b&gt;) …)&lt;/code&gt; binds a new variable &lt;code&gt;f&lt;/code&gt; to the value &lt;code&gt;x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sometimes &lt;code&gt;(f x)&lt;/code&gt; is a list of names. For example, &lt;code&gt;(lambda &lt;b&gt;(f x)&lt;/b&gt; …)&lt;/code&gt; creates a function that has parameters named &lt;code&gt;f&lt;/code&gt; and &lt;code&gt;x&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sometimes &lt;code&gt;(f x)&lt;/code&gt; is a literal list. For example, &lt;code&gt;(quote &lt;b&gt;(f x)&lt;/b&gt;)&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Sometimes &lt;code&gt;(f x)&lt;/code&gt; is interpreted in some other way because it's enclosed inside a macro. How it's interpreted depends on the macro definition.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
The ability to use the same syntactic form for so many different things give you great power. You can define all sorts of cool things this way. I'm writing a pattern matcher that uses list expressions to define patterns and macros to interpret those list expressions. Macros are great for writing elegant, concise code.
&lt;/p&gt;
&lt;p&gt;
The trouble is that you can't easily tell just by looking at &lt;code&gt;(f x)&lt;/code&gt; how to interpret it. It could do anything. You'd think maybe a text editor like Emacs (which uses Lisp as its native language) would be able to help you in some way. But no. Emacs can't tell either. So how can you, the person reading the code, figure it out? Well, you can, but it takes a lot of effort. You can't determine the syntactic meaning of code (e.g., whether it's a definition or an expression) by looking at the code locally; you have to know a lot more of the program to figure it out.  Lisp's syntactic strength is at the same time a weakness.
&lt;/p&gt;
&lt;p&gt;
Python on the other hand has no macros and doesn't give you much to write concise, abstract, elegant code. There's a lot of repetition and many times it's downright verbose. But where Lisp is nice to write and hard to read, Python makes the opposite tradeoff. It's easy to read. You can determine how to interpret something—a string, a list, a function call, a definition—just by looking at the code locally. You never have to worry that somewhere in some other module someone defined a macro that changes the meaning of everything you're reading. By restricting what people can write, the job of the reader becomes easier.
&lt;/p&gt;
&lt;p&gt;
Lisp seems to be optimized for writing code; Python seems to be optimized for reading it. Which you prefer may depend on how often you write new code vs. read unfamiliar code; I'm not entirely sure. What bothers me the most though is not that these two languages do different things, but that the people who argue about it seem to think that there is one “best” answer, and don't see that this is a tradeoff. When I'm writing code I prefer Lisp; when I'm reading code I prefer Python. I think this is an inherent tradeoff—any added flexibility for the writer means an added burden for the reader, and there is no answer that will be right for everyone.
&lt;/p&gt;
&lt;p&gt;
–Amit
&lt;/p&gt;
&lt;p&gt;
P.S. When I read debates online, I have a bias towards the people who view these things as tradeoffs and a bias against the people who say there's only one right answer and everyone else is stupid or clueless. This has sadly pushed me away from Lisp, the Mac, and other systems that I think are really good but have fanatical communities. When you're in a debate, consider that the other person might not be stupid, and there might be good reasons for his or her choices. You'll not only learn something about their position, but you'll be more likely get people to listen to you and adopt your point of view.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-5811760368114846226?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/5811760368114846226/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=5811760368114846226' title='33 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5811760368114846226'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/5811760368114846226'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/04/lisp-vs-python-syntax.html' title='Lisp vs. Python: Syntax'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>33</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-1691443670393940870</id><published>2007-04-09T23:18:00.000-07:00</published><updated>2011-10-03T13:59:04.611-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: color in shell buffers</title><content type='html'>&lt;p&gt;
In shell buffers inside Emacs (&lt;kbd&gt;M-x shell&lt;/kbd&gt;), many programs want to use color in useful ways. For example, &lt;code&gt;grep&lt;/code&gt; can highlight the portion of the line that matches the search pattern. Here's what I use to make Emacs and XEmacs show colors in shell windows:
&lt;/p&gt;
&lt;pre class=snippet&gt;
&lt;span style="color: #4499cc;"&gt;;;; &lt;/span&gt;&lt;span style="color: #006699;"&gt;Shell mode
&lt;/span&gt;(setq ansi-color-names-vector &lt;span style="color: #4499cc;"&gt;; &lt;/span&gt;&lt;span style="color: #006699;"&gt;better contrast colors
&lt;/span&gt;      [&lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"black"&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"red4"&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"green4"&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"yellow4"&lt;/span&gt;
       &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"blue3"&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"magenta4"&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"cyan4"&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"white"&lt;/span&gt;])
(add-hook 'shell-mode-hook 'ansi-color-for-comint-mode-on)
&lt;/pre&gt;
&lt;p&gt;
I also use these settings to turn off word wrap and to make the prompt read-only:
&lt;/p&gt;
&lt;pre class=snippet&gt;
(add-hook 'shell-mode-hook 
     '(&lt;span style="color: #0000cd;"&gt;lambda&lt;/span&gt; () (toggle-truncate-lines 1)))
(setq comint-prompt-read-only t)
&lt;/pre&gt;
&lt;p&gt;
Shell mode is handy but I find that I often just switch to a terminal window, mainly because I can pipe commands through &lt;code&gt;less&lt;/code&gt;. If the output is very short, either Emacs or a terminal is fine. If it's of medium length, Emacs is usually nicer, since it lets me search and cut and paste easily. If the command has very long output, the terminal is nicer, because &lt;code&gt;less&lt;/code&gt; lets me see just parts of the output. I haven't found a way in Emacs to deal with processes that output lots of lines.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-1691443670393940870?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/1691443670393940870/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=1691443670393940870' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1691443670393940870'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/1691443670393940870'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/04/emacs-color-in-shell-buffers.html' title='Emacs: color in shell buffers'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-944888208259759273</id><published>2007-04-09T23:02:00.000-07:00</published><updated>2011-10-03T14:04:58.044-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: better completion</title><content type='html'>&lt;p&gt;
Emacs already has decent completion capabilities. Any time there's a list of possible answers, you can press &lt;kbd&gt;&lt;kbd&gt;Tab&lt;/kbd&gt;&lt;/kbd&gt; for completion. When there's more than one possible completion, it brings up a list for you.
&lt;/p&gt;
&lt;p&gt;
I like to see the list of possible completions without pressing &lt;kbd&gt;&lt;kbd&gt;Tab&lt;/kbd&gt;&lt;/kbd&gt; or &lt;kbd&gt;&lt;kbd&gt;?&lt;/kbd&gt;&lt;/kbd&gt;. In XEmacs, I use two packages, &lt;code&gt;&lt;a href="http://www.emacswiki.org/cgi-bin/wiki/IswitchBuffers"&gt;iswitchb&lt;/a&gt;&lt;/code&gt; and &lt;code&gt;&lt;a href="http://www.emacswiki.org/cgi-bin/wiki/IcompleteMode"&gt;icomplete&lt;/a&gt;&lt;/code&gt; to get a list of completions as I type, at least for switching buffers and for minibuffer inputs:
&lt;/p&gt;
&lt;pre class=snippet&gt;
(&lt;span style="color: #0000cd;"&gt;require&lt;/span&gt; '&lt;span style="color: #5f9ea0;"&gt;iswitchb&lt;/span&gt;)
(setq iswitchb-buffer-ignore '(&lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"^ "&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"*Buffer"&lt;/span&gt;))
(add-hook
 'iswitchb-define-mode-map-hook
 '(&lt;span style="color: #0000cd;"&gt;lambda&lt;/span&gt; ()
    (define-key iswitchb-mode-map &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;" "&lt;/span&gt; 'iswitchb-next-match)
    (define-key iswitchb-mode-map [del] 'iswitchb-prev-match)
    (define-key iswitchb-mode-map [bs] 'iswitchb-prev-match)
    (define-key iswitchb-mode-map [right] 'iswitchb-next-match)
    (define-key iswitchb-mode-map [left] 'iswitchb-prev-match)))

(icomplete-mode 1)
&lt;/pre&gt;
&lt;p&gt;
In Emacs22, I use &lt;code&gt;&lt;a href="http://www.emacswiki.org/cgi-bin/wiki/InteractivelyDoThings"&gt;ido&lt;/a&gt;&lt;/code&gt; instead of &lt;code&gt;iswitchb&lt;/code&gt;. It works for both switching buffers and for opening files:
&lt;/p&gt;
&lt;pre class=snippet&gt;
(setq ido-confirm-unique-completion t)
(setq ido-default-buffer-method 'samewindow)
(setq ido-use-filename-at-point t)
(ido-mode t)
(ido-everywhere t)

(set-face-background 'ido-first-match &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"white"&lt;/span&gt;)
(set-face-foreground 'ido-subdir &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"blue3"&lt;/span&gt;)

(icomplete-mode 1)
&lt;/pre&gt;
&lt;p&gt;
If you're really into the power of completion, be sure to check out the &lt;code&gt;&lt;a href="http://www.emacswiki.org/cgi-bin/wiki/Icicles"&gt;icicles&lt;/a&gt;&lt;/code&gt; package by Drew Adams. It has a &lt;em&gt;lot&lt;/em&gt; more features, and it has some things that look incredibly useful. It works for buffers, files, and the minibuffer, and it allows you to chain together multiple commands in powerful ways.
&lt;/p&gt;
&lt;p&gt;
If &lt;code&gt;icicles&lt;/code&gt; looks so good, why am I using &lt;code&gt;ido&lt;/code&gt; and &lt;code&gt;icomplete&lt;/code&gt;? It's because they come with Emacs22. The bar is higher for third party packages because it's an added dependency. I can't just tell a friend to put something into their &lt;code&gt;.emacs&lt;/code&gt;; I have to tell them to download it and add to their &lt;code&gt;load-path&lt;/code&gt; and so on. I wish there was a standard Emacs package system. I do plan to try out &lt;code&gt;icicles&lt;/code&gt; and other packages once I've finished exploring the standard set of packages that comes with Emacs22.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-944888208259759273?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/944888208259759273/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=944888208259759273' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/944888208259759273'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/944888208259759273'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/04/emacs-better-completion.html' title='Emacs: better completion'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-4424724623578259396</id><published>2007-04-03T09:51:00.000-07:00</published><updated>2007-04-03T10:19:14.652-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Eliminate Time Zones</title><content type='html'>&lt;p&gt;
Regular readers of this blog know that &lt;a href="http://theory.stanford.edu/~amitp/rants/daylight-savings-time/"&gt;I hate Daylight Saving Time&lt;/a&gt;.  I also hate time zones, although to a lesser extent.
&lt;/p&gt;
&lt;p&gt;
Take a look at Indiana. &lt;a href="http://en.wikipedia.org/wiki/Time_in_Indiana"&gt;What time it is in Indiana&lt;/a&gt; depends on:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;The date. The rules changed in 1942, 1945, 1949, 1957, 1961, 1966, 1968, 1969, 1973, 1974, 1975, …. They changed again as recently as March 11, 2007.&lt;/li&gt;
&lt;li&gt;The county. The rules are different in each county.&lt;/li&gt;
&lt;li&gt;The season. Some counties at some times have observed Daylight Saving Time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
(Thanks to &lt;a href="http://www.current.tv/google/GC02876"&gt;Google Current&lt;/a&gt; for bringing this to my attention. Just watch the beginning.) What time it is in Indiana depends on Federal law, State law, and the choice of County. But the rules are so confusing that sometimes people just do their own thing.
&lt;/p&gt;
&lt;p&gt;
Even worse, Indiana just can't win:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;They want the state to be on the same time zone.&lt;/li&gt;
&lt;li&gt;They want the northwest part of the state to match Chicago, which is Central Time.&lt;/li&gt;
&lt;li&gt;They want the southeast part of the state to match Cincinnati, which is Eastern Time.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The only solution is for Chicago and Cincinnati to be on the same time zone.
&lt;/p&gt;
&lt;p&gt;
Long ago every town had its own time.  Time zones &lt;a href="http://wwp.greenwichmeantime.com/info/time-zones-history.htm"&gt;were introduced as rail travel became more common&lt;/a&gt;, and people interacted with others outside of their own town more often.  As more of the country becomes connected through trade, transportation, the media, and the Internet, the burden of different people being on different times increases.  Just as we switched from every town having its own time to &lt;a href="http://www.worldtimezone.com/"&gt;every zone having its own time&lt;/a&gt;, I think we need to switch to the entire country having its own time (just like China and India and most of Western Europe). Eventually, as air and high-speed rail travel becomes commonplace and we begin to live in space colonies, we will have to abolish time zones altogether and use UTC.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4424724623578259396?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4424724623578259396/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4424724623578259396' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4424724623578259396'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4424724623578259396'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/04/eliminate-time-zones.html' title='Eliminate Time Zones'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-453399123994696313</id><published>2007-03-20T23:52:00.000-07:00</published><updated>2009-01-10T19:14:54.253-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Speciation from inbreeding</title><content type='html'>&lt;p&gt;
Disclaimer: I am not a biologist. I'm interested in this topic but I haven't studied it that much. These are my random thoughts on how a species can form:
&lt;/p&gt;
&lt;p&gt;
It seems to me that we only “need” new species when things are going badly. In these stressful situations, the population of an existing species will decline. A small population is more likely to lead to inbreeding/incest. What happens with &lt;a href="http://en.wikipedia.org/wiki/Inbreeding"&gt;inbreeding&lt;/a&gt;?  We get &lt;em&gt;increased mutations&lt;/em&gt;. The history of royalty in Europe has some examples (hemophilia, six fingered folk, etc.). It's exactly when things are going badly with a species that &lt;a href="http://en.wikipedia.org/wiki/Speciation"&gt;a new species has a chance&lt;/a&gt;, and I think it's no coincidence that mutation rates are higher then.
&lt;/p&gt;
&lt;p&gt;
More specifically, I think susceptibility to mutation is &lt;em&gt;an evolved characteristic&lt;/em&gt;. Species that “fixed” the problem with genetic errors would not evolve, and would eventually be wiped out. Only the species that had mutations would survive. Secondly, I think the mutation rate varies, and it responds to stress and inbreeding, not by accident, but because a variable mutation rate evolved as well. When a population no longer fits well into the environment, it needs to increase the mutation rate so that it can turn itself into a new species.
&lt;/p&gt;
&lt;p&gt;
A consequence of this line of thinking is that when populations are large, we should rarely see new species form. We &lt;a href="http://www.talkorigins.org/faqs/faq-speciation.html"&gt;shouldn't see many new species forming&lt;/a&gt; until the environment changes drastically.
&lt;/p&gt;
&lt;p&gt;
I also think in extreme cases, a very small population might lead to asexual reproduction with a high mutation rate. Species that allowed for asexual reproduction in rare cases are more likely to survive.
&lt;/p&gt;
&lt;p&gt;
If small populations lead to new species, what would we observe?
&lt;/p&gt;
&lt;ul class=spaced&gt;
&lt;li&gt;If there are several populations of a species, and one of them mutates into a new species, we will see a new species and call it a “branch” on the tree of life.&lt;/li&gt;
&lt;li&gt;If on the other hand the small population is the &lt;em&gt;only&lt;/em&gt; surviving instance of a species, then as it turns into a new species, the old species will be wiped out. There may be no record of it. In the tree of life, we would only see two distinct species if the creatures are physically different and if both populations left fossils.
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I think most new species are of the latter form, and never show up in the fossil record. How could I call this a new species then? If we had a time machine and brought a creature of the first form forwards in time, and it tried to breed with a creature of the second form, we'd be able to decide whether the old and new creatures are genetically compatible. If they are, I'd say they are the same species. But in a lot of cases, they won't be able to interbreed, and we have a new species. We can't really test this without a time machine.
&lt;/p&gt;
&lt;p&gt;
To summarize: I think that variable-rate mutation is an evolved behavior that shows itself when populations are small and stressed, and that there have been a &lt;em&gt;lot&lt;/em&gt; more species than the ones we see in the fossil record.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-453399123994696313?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/453399123994696313/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=453399123994696313' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/453399123994696313'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/453399123994696313'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/03/speciation-from-inbreeding.html' title='Speciation from inbreeding'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-2815916993994871659</id><published>2007-03-20T16:11:00.000-07:00</published><updated>2007-04-09T23:52:55.158-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: move autosave and backup files elsewhere</title><content type='html'>&lt;p&gt;
One thing that really bugs me about Emacs is the way it clutters up my directories with backup files (filenames ending in &lt;code&gt;~&lt;/code&gt;) and autosave files (filenames starting with &lt;code&gt;#&lt;/code&gt;).  Fortunately there's an easy way to move them elsewhere.  Unfortunately the technique isn't consistent across Emacs versions.  In GNU Emacs 21, you can set &lt;code&gt;backup-directory-alist&lt;/code&gt; and &lt;code&gt;auto-save-file-name-transforms&lt;/code&gt;.  In XEmacs 21, you can set &lt;code&gt;bkup-backup-directory-info&lt;/code&gt; and &lt;code&gt;auto-save-directory&lt;/code&gt;.  Here's what I do in GNU Emacs:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;defvar&lt;/span&gt; &lt;span style="color: #00008b;"&gt;user-temporary-file-directory&lt;/span&gt;
  &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;concat temporary-file-directory user-login-name &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"/"&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;make-directory user-temporary-file-directory t&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq backup-by-copying t&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq backup-directory-alist
      &lt;b&gt;`&lt;/b&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"."&lt;/span&gt; . &lt;b&gt;,&lt;/b&gt;user-temporary-file-directory&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
        &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;b&gt;,&lt;/b&gt;tramp-file-name-regexp nil&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq auto-save-list-file-prefix
      &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;concat user-temporary-file-directory &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;".auto-saves-"&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq auto-save-file-name-transforms
      &lt;b&gt;`&lt;/b&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #666666; background-color: #e8e8e8;"&gt;".*"&lt;/span&gt; &lt;b&gt;,&lt;/b&gt;user-temporary-file-directory t&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
Here's what I do in XEmacs:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;require&lt;/span&gt; '&lt;span style="color: #5f9ea0;"&gt;auto-save&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="background-color: #eeeeff;"&gt; &lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;require&lt;/span&gt; '&lt;span style="color: #5f9ea0;"&gt;backup-dir&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="background-color: #eeeeff;"&gt; &lt;/span&gt;

&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #0000cd;"&gt;defvar&lt;/span&gt; &lt;span style="color: #00008b;"&gt;user-temporary-file-directory&lt;/span&gt;
  &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;concat &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;temp-directory&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt; &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;"/"&lt;/span&gt; &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;user-login-name&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;make-directory user-temporary-file-directory t&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq backup-by-copying t&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq auto-save-directory user-temporary-file-directory&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq auto-save-list-file-prefix&lt;span style="background-color: #eeeeff;"&gt; &lt;/span&gt;
         &lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;concat user-temporary-file-directory &lt;span style="color: #666666; background-color: #e8e8e8;"&gt;".auto-saves-"&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;setq bkup-backup-directory-info
      &lt;b&gt;`&lt;/b&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;(&lt;/span&gt;t &lt;b&gt;,&lt;/b&gt;user-temporary-file-directory full-path&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;&lt;span style="color: #8080b0;"&gt;)&lt;/span&gt;
&lt;/pre&gt;
&lt;p&gt;
I'm much happier with Emacs temporary files being kept out of my way.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-2815916993994871659?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/2815916993994871659/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=2815916993994871659' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2815916993994871659'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2815916993994871659'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/03/emacs-move-autosave-and-backup-files.html' title='Emacs: move autosave and backup files elsewhere'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-4369981095918734839</id><published>2007-03-20T14:47:00.000-07:00</published><updated>2011-10-03T13:46:20.932-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><title type='text'>Emacs: don't kill unsaved buffers</title><content type='html'>&lt;p&gt;
Long ago, I added a key to Emacs to quickly close a buffer. I used to use &lt;kbd&gt;&lt;kbd&gt;Alt&lt;/kbd&gt;+&lt;kbd&gt;F3&lt;/kbd&gt;&lt;/kbd&gt;, because that's what I used with Turbo Pascal.  These days I use &lt;kbd&gt;&lt;kbd&gt;Cmd&lt;/kbd&gt;+&lt;kbd&gt;W&lt;/kbd&gt;&lt;/kbd&gt; to match the Macintosh key for closing windows.  The trouble is that when it's easy to close buffers, I do it often, and I occasionally close a buffer I shouldn't have closed. The solution is to make Emacs ask me for confirmation if the buffer hasn't been saved.
&lt;/p&gt;
&lt;p&gt;
In both GNU Emacs and XEmacs, the answer is in a variable named &lt;code&gt;kill-buffer-query-functions&lt;/code&gt;:
&lt;/p&gt;
&lt;pre&gt;
kill-buffer-query-functions is a variable defined 
in `C source code'.

Documentation:
List of functions called with no args to query before 
killing a buffer. The buffer being killed will be current 
while the functions are running. If any of them returns nil,
the buffer is not killed.
&lt;/pre&gt;
&lt;p&gt;
Emacs will call each function listed in &lt;code&gt;kill-buffer-query-functions&lt;/code&gt; before killing a buffer. If any of these functions returns &lt;code&gt;nil&lt;/code&gt;, Emacs will not kill the buffer. So I defined a function that would ask for confirmation if the buffer hadn't been saved:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
(defun &lt;span style="color:#2244d0"&gt;ask-before-killing-buffer&lt;/span&gt; ()
  (cond
   ((and buffer-file-name (buffer-modified-p))
    (y-or-n-p (format "Buffer %s modified; kill anyway? " 
                  (buffer-name))))
   (t t)))
(add-to-list 'kill-buffer-query-functions 
             'ask-before-killing-buffer)
&lt;/pre&gt;
&lt;p&gt;
I then extended this function to not kill the &lt;code&gt;*scratch*&lt;/code&gt; buffer, and ask for confirmation before killing shell buffers that have an active process:
&lt;/p&gt;
&lt;pre class="snippet"&gt;
(defun &lt;span style="color:#2244d0"&gt;ask-before-killing-buffer&lt;/span&gt; ()
  (let ((buffer (current-buffer)))
    (cond
     ((equal (buffer-name) "*scratch*")
      &lt;span style="color:#006699"&gt;;; Never kill *scratch*&lt;/span&gt;
      nil)
     ((and buffer-file-name (buffer-modified-p))
      &lt;span style="color:#006699"&gt;;; If there's a file associated with the buffer, 
      ;; make sure it's saved&lt;/span&gt;
      (y-or-n-p (format "Buffer %s modified; kill anyway? " 
                    (buffer-name))))
     ((get-buffer-process buffer)
      &lt;span style="color:#006699"&gt;;; If there's a process associated with the buffer, 
      ;; make sure it's dead&lt;/span&gt;
      (y-or-n-p (format "Process %s active; kill anyway? "
                    (process-name (get-buffer-process buffer)))))
     (t t))))
(add-to-list 'kill-buffer-query-functions 
             'ask-before-killing-buffer)
&lt;/pre&gt;
&lt;p&gt;
The ironic thing is that since I wrote that function, I haven't accidentally tried to close a buffer...
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4369981095918734839?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4369981095918734839/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4369981095918734839' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4369981095918734839'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4369981095918734839'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/03/emacs-dont-kill-unsaved-buffers.html' title='Emacs: don&apos;t kill unsaved buffers'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3687575979505244091</id><published>2007-03-11T12:24:00.000-07:00</published><updated>2008-12-10T04:29:04.813-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='economics'/><title type='text'>Paradox of Choice</title><content type='html'>&lt;p&gt;
I've been reading &lt;em&gt;&lt;a href="http://www.amazon.com/Paradox-Choice-Why-More-Less/dp/0060005696/"&gt;The Paradox of Choice&lt;/a&gt;&lt;/em&gt;, a book about more choices not always being better. There's also a &lt;a href="http://video.google.com/videoplay?docid=6127548813950043200"&gt;one hour talk by the author&lt;/a&gt;. It made me think about how we might &lt;em&gt;model&lt;/em&gt; choices, either for understanding our own behavior or for writing simulation games. The author of the book argues that at an abstract level people understand the benefit of additional choices but ignore their costs, whereas in practice people are affected by those costs, albeit not always in a rational way.
&lt;/p&gt;
&lt;p&gt;
To model the &lt;strong&gt;benefit&lt;/strong&gt; of choice, I'm going to say that if there are N-1 choices, and you are presented with 1 additional choice, your benefit has increased. By how much? It's only a benefit if the new choice was better. Since there are now N choices, let's say the probability the new one is better is 1/N. If it is better, by how much is it better? I think you can build an expectation function based on the distribution (for example, a gaussian distribution), but I'm going to be simplistic and say the benefit is constant. The new item is always 1 unit of value better than the old one. In practice I think the benefit decreases as the number of choices goes up, so I'm being generous here. So the added benefit of the N&lt;sup&gt;th&lt;/sup&gt; choice is the probability it's better multiplied by the amount it's better: 1/N * 1.  To determine the total benefit, we have to sum from choice 1 to choice N, and we end up with something approximately equal to the logarithm: ln(N).
&lt;/p&gt;
&lt;p&gt;
To model the &lt;strong&gt;cost&lt;/strong&gt; of choice, I'm going to say that you have to make the comparison between the new item and the old items, even if the new item isn't better. You might compare to each of the old items, giving a cost of N, or maybe you only compare to the best of the previous items, giving a cost of 1.  I'm going to be generous here and say the added cost is just 1. The total cost then is 1 for each new item, or a total of N.
&lt;/p&gt;
&lt;p&gt;
So now we have a model in which both the benefits and costs go up as the number of choices increases.  Each additional choice brings smaller and smaller benefits but larger and larger costs.  Here's a plot of what this might look like:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://4.bp.blogspot.com/_kV9ZnGnZL7M/RfRYSvcLS4I/AAAAAAAAAA8/SFqTvy2NvCU/s1600-h/Picture+1.png"&gt;&lt;img  border="1" src="http://4.bp.blogspot.com/_kV9ZnGnZL7M/RfRYSvcLS4I/AAAAAAAAAA8/SFqTvy2NvCU/s400/Picture+1.png"  alt="graph showing (number of choices) vs. (benefit minus cost)" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Initially having choices greatly adds to your well-being.  However, the rising costs eventually overtake the diminishing benefits, and the &lt;strong&gt;total value of having choices goes down&lt;/strong&gt;.  This seems to be the main message of the book: that additional choices do not always make us better off.
&lt;/p&gt;
&lt;p&gt;
When I defined the model, I decided to be generous. The incremental benefit is 1 in my model, but it's probably decreasing as the number of choices goes up. This means the total benefit is lower than in my model. The incremental cost is 1 in my model, but it's probably increasing as the number of choices goes up, because people at some level will compare to all the alternatives, not just one. This means the total cost is higher than in my model. So the graph above is optimistic; in reality it probably drops even faster.
&lt;/p&gt;
&lt;p&gt;
Note that the graph has no scale. That's because I think the costs and benefits will depend a great deal on the situation. When buying toothpaste, the benefit of more choices is pretty limited. But when choosing a job or spouse, it makes a much larger impact on your life. The main point is that additional choices will eventually not be worth the cost of evaluating them, so at some point you should just make your decision and not worry about it anymore.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3687575979505244091?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3687575979505244091/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3687575979505244091' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3687575979505244091'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3687575979505244091'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/03/paradox-of-choice.html' title='Paradox of Choice'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://4.bp.blogspot.com/_kV9ZnGnZL7M/RfRYSvcLS4I/AAAAAAAAAA8/SFqTvy2NvCU/s72-c/Picture+1.png' height='72' width='72'/><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-7393532564769311281</id><published>2007-02-27T09:11:00.000-08:00</published><updated>2007-03-11T12:49:29.777-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes: Peter Petrelli, Hiro Nakamura</title><content type='html'>&lt;p&gt;
I have a theory about Peter. I think &lt;strong&gt;he's going to explode&lt;/strong&gt;, just as his visions and Isaac's paintings show. I have a theory about Hiro. I think &lt;strong&gt;he's going to travel through time, trying to fix everything&lt;/strong&gt;, after Peter destroys the city.
&lt;/p&gt;
&lt;p&gt;
Let's look at what happens to people with powers:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Shanti&lt;/strong&gt; dies as a child, of unknown causes, but likely related to her power.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claire&lt;/strong&gt;'s life is turned upside down.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simone&lt;/strong&gt; is shot.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Isaac&lt;/strong&gt; loses Simone, twice.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hiro&lt;/strong&gt; brings the family shame (a big deal in Japanese culture).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Matt&lt;/strong&gt; loses his job, then steals diamonds.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Nathan&lt;/strong&gt; is shady, but it's not clear (yet) how his powers influenced him.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Peter&lt;/strong&gt; is becoming increasingly dangerous, and is going to blow up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;The Haitian&lt;/strong&gt; causes brain damage.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Hana&lt;/strong&gt; loses her job and now distrusts everyone.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Micah&lt;/strong&gt; steals from an ATM.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Niki&lt;/strong&gt; turns into evil Jessica.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;DL&lt;/strong&gt; is on the run from the law.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Meredith&lt;/strong&gt; loses her daughter and went into hiding (not sure why).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Claude&lt;/strong&gt; is shot and went into hiding.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Ted&lt;/strong&gt; loses his wife and then blows himself up.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Eden&lt;/strong&gt;'s life is pretty messed up before Bennet, and she's recovering, but she ends up shooting herself.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Gabriel&lt;/strong&gt; (Sylar) goes on a killing spree after finding he has powers.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Charlie&lt;/strong&gt; is killed by Sylar (for eidetic memory).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Brian Davis&lt;/strong&gt; is killed by Sylar (for telekinesis).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Zane Taylor&lt;/strong&gt; is killed by Sylar (for liquefaction).&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Dale Smither&lt;/strong&gt; is killed by Sylar (for super hearing).&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
What's the theme here?  Having powers leads you and people around you to get hurt.  For many of them, power corrupts. Take a look at Micah, DL, Niki, Hana, Meredith, Claude, Ted, Eden, Gabriel,  and maybe Claire, and you'll see good people who are led astray by their powers.  The other characters aren't necessarily corrupt but just having those powers has led to trouble.
&lt;/p&gt;
&lt;p&gt;
Basically, &lt;strong&gt;these powers hurt everyone&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
The most dramatic will be when all the heroes end up in New York City, and Peter blows them and the city up in the season finale. Everyone will die.
&lt;/p&gt;
&lt;p&gt;
The only solution to all of this is to &lt;em&gt;stop people from having their powers&lt;/em&gt;, or at least teach them how to use powers responsibly.  It's already too late to do this in the current timeline.  The solution lies in the past.  Hiro is the only one who can go back in time to fix everything.  So he will, at the end of this season. That's my theory.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-7393532564769311281?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/7393532564769311281/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=7393532564769311281' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7393532564769311281'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/7393532564769311281'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/02/heroes-peter-petrelli-hiro-nakamura.html' title='Heroes: Peter Petrelli, Hiro Nakamura'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3391729558131840944</id><published>2007-02-20T21:24:00.000-08:00</published><updated>2007-02-20T21:33:38.720-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes: Claire Bennet</title><content type='html'>&lt;p&gt;
In Heroes episodes 15 and 16 (&lt;a href="http://en.wikipedia.org/wiki/Run%21_%28Heroes%29"&gt;Run&lt;/a&gt; and &lt;a href="http://en.wikipedia.org/wiki/Unexpected_%28Heroes%29"&gt;Unexpected&lt;/a&gt;), Claire starts to believe her father and the Haitian are behind her mother's memory loss. I think &lt;strong&gt;Claire's going to leave Texas and head to New York&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
What's keeping her in Texas?
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Her father&lt;/strong&gt;. However, she's starting to hate her father for what he's done to her mother. She wants to get away from him. (I wonder what he'll do to the Haitian now that he knows Claire's memory wasn't wiped.)&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Her mother&lt;/strong&gt;. Claire is really worried about her mother.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Her brother Lyle&lt;/strong&gt;. His memory was wiped, and he's not making much of an appearance in the show anymore.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Her friend Zach&lt;/strong&gt;. His memory was wiped as well, and he's also not making much of an appearance in the show.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Her biological mother, Meredith&lt;/strong&gt;. She's gotten some money from Nathan, and she's heading to Mexico, so she won't be in Texas for much longer.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Only her mother is keeping Claire in Texas. I think her mother will die very soon, and Claire will no longer have any need to stay in Texas. She'll head to New York to find Peter, and eventually meet her father Nathan.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3391729558131840944?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3391729558131840944/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3391729558131840944' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3391729558131840944'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3391729558131840944'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/02/heroes-claire-bennet.html' title='Heroes: Claire Bennet'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3226900350647793643</id><published>2007-02-20T20:59:00.000-08:00</published><updated>2007-02-20T21:38:23.552-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes: Simone Duveaux</title><content type='html'>&lt;p&gt;
&lt;strong&gt;Spoiler warning:&lt;/strong&gt;&lt;br /&gt;&lt;br /&gt;&lt;br /&gt;
&lt;/p&gt;
&lt;p style="margin-top:5em"&gt;
On episode 16, &lt;a href="http://en.wikipedia.org/wiki/Unexpected_%28Heroes%29"&gt;Unexpected&lt;/a&gt;, Simone Duveaux dies.  I think she's going to come back.
&lt;/p&gt;
&lt;p&gt;
Let's start with Simone's father, Charles Duveaux. Before he died he mentioned that he saw himself and Peter flying around the city.  He didn't know that Peter could fly.  Why would he have dreamed this?  I think &lt;em&gt;Charles has the power of visions&lt;/em&gt;.  Peter, being around Charles, absorbed that power.  That's why Peter is able to see visions (for example, of Nathan flying out of the car before it crashed).  This is similar to but separate from Isaac's power of &lt;em&gt;painting&lt;/em&gt; the future (which may be prediction or may be causing it—not sure!).
&lt;/p&gt;
&lt;p&gt;
We also know that having a power is genetic (from Chandra's research), and that it's inherited (Micah, Claire, and that little girl that Matt saved).  The specific power is not inherited, just that they have one.
&lt;/p&gt;
&lt;p&gt;
Putting the two together, &lt;strong&gt;Simone very likely has a power&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
What power would she have?  She liked Isaac when he had a drug problem, and liked Peter when he was in trouble.  She likes people in trouble.  She wants to help them.  I think her power involves helping others, perhaps healing them, perhaps projecting powers onto them.  If it's the power of projection, her power probably is not of much use, since she has no other power to project.  But when Peter absorbs that power, he might be able to project Claire's power of healing onto Simone.  And that would bring Simone back from the dead.
&lt;/p&gt;
&lt;p&gt;
Why am I convinced Simone should come back?  Ignoring the Neo/Trinity to Peter/Simone parallel (did you see how Peter stopped bullets?), the main issue is that Simone was in Peter's future vision when Peter blows up. I think Isaac was pulling Simone away from Peter in that vision. So I think she needs to be alive. On the other hand, the visions are not predictions, and don't have to be taken literally. Charles's vision for example never came true; it was merely expressing the idea of flight, and the details weren't accurate.
&lt;/p&gt;
&lt;p&gt;
While it's possible that Simone will stay dead, I'm betting Peter won't show up for several epsiodes, then he'll bring her back to life, and then she'll leave the storyline for other reasons.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3226900350647793643?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3226900350647793643/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3226900350647793643' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3226900350647793643'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3226900350647793643'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/02/heroes-simone-duveaux.html' title='Heroes: Simone Duveaux'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-9217985109684001602</id><published>2007-02-07T23:07:00.000-08:00</published><updated>2009-01-10T19:15:13.714-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Comics</title><content type='html'>&lt;p&gt;
I believe in coincidences, but this is a bit strange:
&lt;/p&gt;
&lt;ol class=spaced&gt;
&lt;li&gt;A few months ago someone recommended I read &lt;a href="http://en.wikipedia.org/wiki/Understanding_Comics"&gt;Understanding Comics&lt;/a&gt; by Scott McCloud, not for the comics part of it, but for the ideas about storytelling. I read it a few weeks ago.&lt;/li&gt;
&lt;li&gt;I've been watching &lt;a href="http://en.wikipedia.org/wiki/Heroes_(TV_series)"&gt;Heroes&lt;/a&gt;, which is a TV show that works like a comic book story.&lt;/li&gt;
&lt;li&gt;For Christmas I received a &lt;a href="http://www.amazon.com/gp/product/B000BBAL1G/ref=pd_cp_e_title/102-4717102-9595357"&gt;Wacom Drawing Tablet&lt;/a&gt;, and I've started to learn how to draw.&lt;/li&gt;
&lt;li&gt;I've been playing the demo of &lt;a href="http://www.gamespot.com/pc/rpg/silverfall/"&gt;Silverfall&lt;/a&gt;, which is a game that has hand-drawn art with &lt;a href="http://media.pc.ign.com/media/791/791205/img_3986018.html"&gt;black outlines around the characters&lt;/a&gt; that reminds me a little of comic strips.&lt;/li&gt;
&lt;li&gt;I found out that my Mac comes with a program called &lt;a href="http://plasq.com/comiclife"&gt;Comic Life&lt;/a&gt;, which lets me assemble individual drawings into a comic strip with speech bubbles.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Is the universe trying to tell me something?  Maybe I should try making some comic strips…
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-9217985109684001602?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/9217985109684001602/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=9217985109684001602' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9217985109684001602'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/9217985109684001602'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/02/comics.html' title='Comics'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-6897466671658845759</id><published>2007-01-31T21:32:00.000-08:00</published><updated>2011-10-03T13:47:28.895-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='typography'/><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac OS X Keyboard Characters</title><content type='html'>&lt;p&gt;
Sure, you Mac switchers already know about &lt;a href="http://rixstep.com/2/20040510,00.shtml"&gt;Mac OS X Keyboard Shortcuts&lt;/a&gt;, mostly using the &lt;kbd&gt;&lt;kbd&gt;⌘&lt;/kbd&gt;&lt;/kbd&gt; Command Key.  If you're a typography geek like me, you'll want to explore all the useful characters (not commands) hidden behind the &lt;kbd&gt;&lt;kbd&gt;⌥&lt;/kbd&gt;&lt;/kbd&gt; &lt;a href="http://en.wikipedia.org/wiki/Option_key"&gt;Option Key&lt;/a&gt;.
&lt;/p&gt;
&lt;table class="standard"&gt;
&lt;thead&gt;&lt;tr&gt;&lt;th&gt;⌥ + key&lt;/th&gt;&lt;th&gt;produces this:&lt;/th&gt;&lt;th&gt;…&lt;/th&gt;&lt;/tr&gt;&lt;/thead&gt;
&lt;tbody&gt;
&lt;tr&gt;&lt;th&gt;[&lt;/th&gt;&lt;td&gt;open double quote&lt;/td&gt;&lt;td&gt;“&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;{&lt;/th&gt;&lt;td&gt;close double quote&lt;/td&gt;&lt;td&gt;”&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;]&lt;/th&gt;&lt;td&gt;open single quote&lt;/td&gt;&lt;td&gt;‘&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;}&lt;/th&gt;&lt;td&gt;close single quote&lt;/td&gt;&lt;td&gt;’&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;-&lt;/th&gt;&lt;td&gt;en-dash&lt;/td&gt;&lt;td&gt;–&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;_&lt;/th&gt;&lt;td&gt;em-dash&lt;/td&gt;&lt;td&gt;—&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;2&lt;/th&gt;&lt;td&gt;trademark&lt;/td&gt;&lt;td&gt;™&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;r&lt;/th&gt;&lt;td&gt;registered&lt;/td&gt;&lt;td&gt;®&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;g&lt;/th&gt;&lt;td&gt;copyright&lt;/td&gt;&lt;td&gt;©&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;;&lt;/th&gt;&lt;td&gt;ellipsis&lt;/td&gt;&lt;td&gt;…&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;/&lt;/th&gt;&lt;td&gt;divide&lt;/td&gt;&lt;td&gt;÷&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;*&lt;/th&gt;&lt;td&gt;degree&lt;/td&gt;&lt;td&gt;°&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;R&lt;/th&gt;&lt;td&gt;permille&lt;/td&gt;&lt;td&gt;‰&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;=&lt;/th&gt;&lt;td&gt;not equals&lt;/td&gt;&lt;td&gt;≠&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;+&lt;/th&gt;&lt;td&gt;plus minus&lt;/td&gt;&lt;td&gt;±&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;5&lt;/th&gt;&lt;td&gt;infinity&lt;/td&gt;&lt;td&gt;∞&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;8&lt;/th&gt;&lt;td&gt;big bullet&lt;/td&gt;&lt;td&gt;•&lt;/td&gt;&lt;/tr&gt;
&lt;tr&gt;&lt;th&gt;(&lt;/th&gt;&lt;td&gt;small bullet&lt;/td&gt;&lt;td&gt;·&lt;/td&gt;&lt;/tr&gt;
&lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;
There are some more, but I don't find them as useful. The keys probably vary by keyboard type; I use the US keyboard (not US Extended, which doesn't seem very useful). The best way to learn these is to go into System Preferences → International → Input Menu → Show input menu in menubar.  Then go to the input menu in the menubar (a country flag) → Keyboard Viewer.  Also fun to play with is the Character Palette; it lets you put in lots more characters, like ☛☆☺⏏℻♪.  Exactly why these characters even exist in Unicode, I'll never know.
&lt;/p&gt;
&lt;p&gt;
The typography geek in me says that the ⌥ Option Key is the best thing about switching to the Mac.  Sure, some of you get the AltGr key in Windows and Linux, but I never figured out how to make it work. On the Mac, the Option key works out of the box, even on the US keyboard.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update&lt;/strong&gt; [2009-05-09]: Recent versions of Linux/X11 can emulate the Mac keyboard setup. In Gnome, go to Preferences → Keyboard → Layouts, then Add the USA/Macintosh layout, Remove the USA layout. Then go to Layout Options and set both Windows keys to be “third level choosers”. The Windows key will then act like the Option key on the Mac.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-6897466671658845759?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/6897466671658845759/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=6897466671658845759' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6897466671658845759'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/6897466671658845759'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/01/mac-os-x-keyboard-characters.html' title='Mac OS X Keyboard Characters'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-3642281302868797569</id><published>2007-01-30T11:54:00.000-08:00</published><updated>2008-12-10T04:29:05.018-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='heroes'/><title type='text'>Heroes: character connections</title><content type='html'>&lt;p&gt;
I got a late start to watching &lt;a href="http://heroeswiki.com/"&gt;Heroes&lt;/a&gt;, and I've been trying to put everything together.  One thing I've been interested in is how many connections already existed at the time the story starts.  For example, Peter is connected to Nathan (brother), who is connected to Linderman (father's dealings), who is connected to Niki (owes money), who is connected to Ando (webcam), who is connected to Hiro (coworker).  I tried assembling the pre-existing connections (many of which are not revealed in the first episode):
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://1.bp.blogspot.com/_kV9ZnGnZL7M/RcQ-DvGQymI/AAAAAAAAAAo/L9Wr21Uq5b4/s1600-h/Heroes+Character+Connections.png"&gt;&lt;img width="600" src="http://1.bp.blogspot.com/_kV9ZnGnZL7M/RcQ-DvGQymI/AAAAAAAAAAo/L9Wr21Uq5b4/s800/Heroes+Character+Connections.png" border="1" alt="Heroes character connections before story began" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The weird thing is, I can't find a pre-existing connection between the two groups.  One one side is Hiro, Niki, Linderman, Peter, etc., and on the other side is Mr. Bennet, Claire, Mohinder, Sylar, etc.  There are a few new connections made after the story begins—Nathan and Mohinder, Peter and Claire, Isaac and Eden, Matt and Mr. Bennet—but I can't find a way to connect them.  I keep thinking Mr. Bennet and Linderman must be connected somehow, but if they are, I must've missed the connection.
&lt;/p&gt;
&lt;p&gt;
There is of course the matter of Claire's biological father.  The candidates I've read on the blogs are Nathan, Linderman, Sylar, and Mr. Bennet himself.  &lt;strong&gt;Having Claire's father be Linderman or Nathan would make everyone connected&lt;/strong&gt;, which seems like something the creators of Heroes would do.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-3642281302868797569?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/3642281302868797569/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=3642281302868797569' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3642281302868797569'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/3642281302868797569'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/01/heroes-character-connections.html' title='Heroes: character connections'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><media:thumbnail xmlns:media='http://search.yahoo.com/mrss/' url='http://1.bp.blogspot.com/_kV9ZnGnZL7M/RcQ-DvGQymI/AAAAAAAAAAo/L9Wr21Uq5b4/s72-c/Heroes+Character+Connections.png' height='72' width='72'/><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-2339687990308723456</id><published>2007-01-25T16:56:00.000-08:00</published><updated>2011-04-15T21:53:36.375-07:00</updated><title type='text'>What are people searching for?</title><content type='html'>&lt;p&gt;
On the navigation bar of my pages, I have a search box for searching all of my pages.  It's labeled “Search site:”.  The implementation uses &lt;a href="http://www.google.com/coop/cse/overview"&gt;Google's Custom Search Engines&lt;/a&gt;.  Google recently added a &lt;a href="http://googlecustomsearch.blogspot.com/2007/01/new-statistics-page.html"&gt;statistics page&lt;/a&gt; that tells me how many people use the search box each day and what the most popular queries are.  Knowing these queries helps me improve the site.  I look at the results of each query and determine if I'm missing information that people are looking for.
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://www.google.com/chart?cht=lb&amp;amp;chs=600x275&amp;amp;chly=90&amp;amp;chd=s%3AGddXJJXolbhFKikjqcKGdtqswHI6lXVKHM29s3kQGlmTXOCFRVYKMCBMGIOICABEBCCFDBGIVOCEnSXHTCHCOLSNCEIMP&amp;amp;chl=Oct+2006%7CNov+2006%7CDec+2006%7CJan+2007&amp;amp;chc=coop&amp;amp;sig=OPyUmy2kGSAaqGNL3OOKfYuxfKw" /&gt;
&lt;/p&gt;
&lt;p&gt;
What are the most popular queries?
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;code&gt;myspace.com&lt;/code&gt; – 207&lt;/li&gt;
&lt;li&gt;&lt;code&gt;www.myspace.com&lt;/code&gt; — 203&lt;/li&gt;
&lt;li&gt;&lt;code&gt;http://youring.net&lt;/code&gt; – 40&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Why would people search for these things on &lt;em&gt;my site&lt;/em&gt;?  I don't know, but I'm pretty sure it's spam!  Especially suspicious is the two variants of &lt;code&gt;myspace&lt;/code&gt; having almost the same count.  It's as if the spam bot ran one search and then the other.  Blogspot doesn't make its logs available to users, so I can't easily see what's going on here.  Are the queries from the same IP address?  What's the user agent?  I don't know.
&lt;/p&gt;
&lt;p&gt;
If your blog has been hit by this extremely weird form of spam, and you have server logs that let you investigate, please let me know what you find!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-2339687990308723456?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/2339687990308723456/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=2339687990308723456' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2339687990308723456'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/2339687990308723456'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/01/what-are-people-searching-for.html' title='What are people searching for?'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-869609126113561019</id><published>2007-01-20T10:45:00.000-08:00</published><updated>2011-10-03T13:49:00.234-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='emacs'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Weekend project: XEmacs to Emacs</title><content type='html'>&lt;p&gt;
First, a bit of history.
&lt;/p&gt;
&lt;p&gt;
I started using GNU Emacs in 1990.  The latest version at the time was version 18.  It had almost no support for menus, the mouse, fonts, colors, dialog boxes, drag &amp;amp; drop, etc.  It was basically a text-only application.  In these respects it was a step back from the editors I had been using in DOS, Windows, Mac, and OS/2.  However, Emacs was what people used at school, and I needed to use it for some of my classes, so I learned it.  I found that it was quite powerful, and I learned how to customize it to match my needs better. One of the things I liked best was automatic indentation. When you press &lt;kbd&gt;&lt;kbd&gt;Tab&lt;/kbd&gt;&lt;/kbd&gt; it will indent the line correctly based on what you're typing now and what you had typed earlier in the file. I want this on every line. Most of my classmates press &lt;kbd&gt;&lt;kbd&gt;Return&lt;/kbd&gt;&lt;/kbd&gt; and then &lt;kbd&gt;&lt;kbd&gt;Tab&lt;/kbd&gt;&lt;/kbd&gt; every line. I'm too lazy for that, so I changed &lt;kbd&gt;&lt;kbd&gt;Return&lt;/kbd&gt;&lt;/kbd&gt; to do the indentation (for Emacs users among you: &lt;code&gt;(global-set-key "\r" 'reindent-then-newline-and-indent)&lt;/code&gt; does the trick). So now whenever I typed normally, it would automatically indent each line properly. A simple change but it made a big difference, and it encouraged me to learn more about Emacs customization.
&lt;/p&gt;
&lt;p&gt;
I was still annoyed by the lack of colors, though.  Colors in particular are quite useful when programming, because they can be used to highlight langauge constructs (keywords, punctuation, identifiers, expressions, definitions, etc.). It makes programs easier to read, and you can quickly spot errors as you type them because they show up in the wrong color. My classmates who had never used non-Unix editors had no idea what they were missing, but I did, and I kept looking for a way to have colors in Emacs. It was 1990, after all, six years after the introduction of Macintosh. Why should I be stuck in a black-and-white text-only world with only a single font? Ugh!
&lt;/p&gt;
&lt;p&gt;
Well, &lt;a href="http://www.jwz.org/doc/emacs-timeline.html"&gt;Emacs 18 had come out in 1986&lt;/a&gt;.  The Mac didn't even have color back then (but at least it had multiple fonts, which could have served the same purpose).  Where was Emacs 19, I wondered, and would it have the features I wanted?  As I looked around I found something intriguing: a version of Emacs called Epoch, maintained by someone named Marc Andreesen.  I tried it out and I loved it.  It had colors and fonts and supported multiple windows (what a concept!). I finally had a version of Emacs that gave me what I had been looking for.  (Side note: Marc went on to write Mosaic, and then started a company called Netscape.)
&lt;/p&gt;
&lt;p&gt;
Meanwhile, a few people were trying to work on Emacs 19, but work was apparently going very slowly, and a company named Lucid had been working on their own version of Emacs 19, called &lt;a href="http://www.xemacs.org/Documentation/21.5/html/internals_3.html"&gt;Lucid Emacs 19&lt;/a&gt;.  Lucid's version progressed much faster than GNU Emacs 19 (thanks to Lucid's uber-hacker, Jamie Zawinski), and this was the beginning of &lt;a href="http://www.jwz.org/doc/lemacs.html"&gt;the big split between Emacs and XEmacs&lt;/a&gt;.  Around 1992 or 1993 I switched from Epoch to Lucid Emacs 19, and it was everything I wanted out of an Emacs system. When GNU Emacs 19 came out, I tried it, but it was missing so much. The menubar didn't match the standard Mac/Windows menubar, the scrollbar acted weird, you couldn't use multiple fonts, and lots of things in the UI seemed wrong to me. My impression was that GNU Emacs 19 had a UI designed for long-time Emacs users, and Lucid Emacs 19 was designed for the rest of us (DOS, Windows, Mac users). I stuck with Lucid Emacs, which later became XEmacs.  (Side note: Jamie went on to a company called Netscape.)
&lt;/p&gt;
&lt;p&gt;
While in school I found plenty of ways to procrastinate, and one of them was learning to customize my environment instead of working on my class project. I spent some time trying out and customizing window managers (twm, ctwm, vtwm, mwm, etc.), but most of my time I spent learning and customizing XEmacs. I tried out lots of extension packages and wrote my own customization. My classmates benefited from my procrastination, as I shared the best of what I had learned with them. Some of the Emacs customizations I developed back then are still in use.
&lt;/p&gt;
&lt;p&gt;
Over the years I've continued to do learn, extend, and customize, and I've built up more and more XEmacs customization.  A few years ago I tried running GNU Emacs, and my customization didn't work, and it didn't look easy to fix.  XEmacs and GNU Emacs have diverged enough that the things I've learned for XEmacs weren't working in GNU Emacs.  So I gave up on ever using GNU Emacs again.
&lt;/p&gt;
&lt;p&gt;
The problem is that XEmacs development has slowed quite a bit.  The “stable” version, XEmacs 21.4, came out in 2001.  Features like anti-aliased fonts, support for the Mac, and UTF-8 are not available in that version.  I've been using the development version, 21.5, and it has partial support for those things.  One of the developers left XEmacs to work on his own version of Emacs, called SXEmacs (which looks neat).  GNU Emacs on the other hand seems to be progressing faster, and is catching up in many ways to XEmacs.  The stable version of GNU Emacs is also a few years old, so people who care about features run the development version (GNU Emacs 22).
&lt;/p&gt;
&lt;p&gt;
The other problem is that last year, when I got a Mac, I found that none of the versions of XEmacs available on the Mac were satisfying.  I tried out Aquamacs, which is GNU Emacs 22 for the Mac, and I liked it, except that none of my customizations worked.  Non-Emacs editors like TextMate seem somewhat limited, and would require me to unlearn 15 years of Emacs. I had a tough choice to make: after 15 years of being on the XEmacs side of the Emacs/XEmacs split, should I switch back?  After talking to several people about their experiences with both, I decided that I should at least consider it.  GNU Emacs 22 seems like it has caught up with XEmacs in some ways (not all), and it's ahead of it in other ways.
&lt;/p&gt;
&lt;p&gt;
I still love XEmacs. I like that it uses a package system, so you can choose packages, install new ones, and upgrade a package without upgrading XEmacs. The package system in XEmacs is somewhat like packages in popular Linux distributions. For example, I can download a new version of the Python editing package when that package is released, instead of installing it manually or waiting until a new version of Emacs is available. GNU Emacs doesn't seem to have anything like this.  I like the XEmacs philosophy for colors/fonts (they are properties of how you &lt;em&gt;look&lt;/em&gt; at a file) more than the GNU Emacs philosophy (that they are properties of the file itself).  I like that XEmacs has abstract data types like hash tables.  I like that XEmacs uses more readable names of key and mouse commands, like &lt;code&gt;[(ctrl x) (alt tab)]&lt;/code&gt; instead of &lt;code&gt;"C-x A-\t"&lt;/code&gt;. I like that the XEmacs colorization package, &lt;code&gt;font-lock&lt;/code&gt;, was more capable than the Emacs package, &lt;code&gt;hilit19&lt;/code&gt;, although these days GNU Emacs also uses &lt;code&gt;font-lock&lt;/code&gt;. I like that XEmacs had a menu structure more like other apps, although GNU Emacs seems to have adopted this too. I like that XEmacs can run as a “server”, where I can connect to it remotely and access all my open files from multiple machines (I've heard that GNU Emacs will get this at some point). I like that default XEmacs packages have historically seemed more advanced than GNU Emacs versions (for example, &lt;code&gt;psgml&lt;/code&gt; seems much more advanced than &lt;code&gt;html-helper-mode&lt;/code&gt;, and &lt;code&gt;vm&lt;/code&gt; was more advanced than &lt;code&gt;rmail&lt;/code&gt;). I like that XEmacs came with more packages standard. I like that XEmacs supported proportional fonts and multiple sized fonts in the same document (GNU Emacs seems to do that now, but it took them ten years).  I like the XEmacs experiments (embedding XEmacs inside other apps, embedding other apps inside XEmacs, GTK support, incremental garbage collector, ability to run as a window manager, embedding images inside documents). I really like XEmacs. But I want really good Mac support, nice fonts, and UTF-8 support, so I'm going to try out GNU Emacs again.
&lt;/p&gt;
&lt;p&gt;
This weekend's project is to look at GNU Emacs 22 (the Aquamacs version) much more closely.  I'll try porting some of my XEmacs customizations to GNU Emacs.  I'll look for GNU Emacs packages that do things similar to the XEmacs packages I had been using.  And over the next few months I'll use both XEmacs (at work) and GNU Emacs (at home) and see how it goes.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-869609126113561019?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/869609126113561019/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=869609126113561019' title='6 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/869609126113561019'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/869609126113561019'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2007/01/weekend-project-xemacs-to-emacs.html' title='Weekend project: XEmacs to Emacs'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>6</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-4075954673500785790</id><published>2006-12-16T22:53:00.000-08:00</published><updated>2006-12-16T23:18:27.307-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Review: Oggz, Laserpod, Mathmos Color Bubble</title><content type='html'>&lt;p&gt;
I've been looking for interesting lights to use at night. I wanted something colorful, not too distracting, and ideally, portable. I bought 3 Oggz, a Laserpod, and a Mathmos Color Bubble.
&lt;/p&gt;
&lt;h3&gt;Oggz&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/amitp/31967698/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/22/31967698_dfb9d10af1.jpg" width="500" height="375" alt="Oggz" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
Oggz are soft egg-shaped lights that you can hold in your hand. They slowly change colors, from blue to green to red and back (this is not configurable). There's a switch on the bottom to turn them on and off. You can place them on the base to have them run continually, or you can just pick them up and take them with you (the battery lasts 6–8 hours). When you put them back on the base they'll recharge. There are a few downsides of the Oggz:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;You can't adjust the color changing. It would've been nice to have a way to pause it, so that you could keep it at a certain color.&lt;/li&gt;
&lt;li&gt;The switch at the bottom is not easy to turn on in the dark. I used the Oggz as nightlights for a while, and until you turn them on you can't see the switch, which you need for turning them on.&lt;/li&gt;
&lt;li&gt;The red light is much darker than the green and blue.  This means the overall brightness changes, not just the color.  This is especially unwelcome when you're using it as a nightlight, because your eyes adjust to the blue and green brightness, and then you get plunged into darkness when it cycles to red.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Despite these minor problems, I do like the Oggz.
&lt;/p&gt;
&lt;h3&gt;Laserpod&lt;/h3&gt;
&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/amitp/31967680/" title="Photo Sharing"&gt;&lt;img src="http://static.flickr.com/21/31967680_73a886a88c.jpg" width="500" height="375" alt="Laserpod" /&gt;&lt;/a&gt;
&lt;/p&gt;
&lt;p&gt;
The Laserpod contains a red laser and blue LEDs, plus a diffraction crystal and a cover. The lights rotate slowly. You can use it in several modes:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Uncovered, the Laserpod will project lights onto the ceiling. It's not bright enough to see except at night with all the lights off. Covered, the Laserpod will project lights onto a frosted dome (it comes with two, one tall and one short). When covered it's easier to see the patterns.&lt;/li&gt;
&lt;li&gt;Red light only, you will get the laser beam, which is either bright points or laser lines. You can also turn on blue LEDs to add to the ambience, but they don't project any sharp patterns. There is no mode to use the blue LEDs without the red laser.&lt;/li&gt;
&lt;li&gt;Unfiltered, the Laserpod will project its laser as points onto the ceiling or one of the covers. It's more interesting to use the diffraction crystal, which will turn the points into cool patterns. You can also use your own objects; I tried a small crystal I have and was able to split the laser points into lots of dots moving around on the ceiling.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Pictured is the Laserpod with only the red laser on, the diffraction crystal, and the tall cover. That's my favorite of the many ways of using it. Unfortunately the motor can be loud at times, so I can't leave this on at night when going to sleep, and it's dark enough that it's not really useful to leave this on during the day or in the evening with other lights on. So I find that I rarely ever have an occasion to use it. For the high price, the noise, and the lack of brightness, I cannot recommend the Laserpod.
&lt;/p&gt;
&lt;h3&gt;Mathmos Color Bubble&lt;/h3&gt;
&lt;p&gt;
I don't have a picture of this, but you can see one at &lt;a href="http://www.thinkgeek.com/gadgets/lights/5ad0/"&gt;ThinkGeek&lt;/a&gt;.  I was hoping for something that addressed the flaws of the Oggz. The Mathmos bubble can be turned on or off with just a squeeze, according to the product literature. However, it's a bit tougher than that because the squeeze has to be on a particular side of the sphere. Given that spheres have no sides, it becomes hard to find the right place when it's dark. It's always blue, not changing colors or brightness, so it's a better nightlight than the Oggz. Unlike the Oggz, which can be recharged simply by putting them down, the Mathmos has to be plugged in with a special cable. The Mathmos has a nice soft feel like the Oggz, but it's significantly heavier. The Oggz are light enough and feel durable enough that I am comfortable throwing them across the room; the Mathmos is heavy enough that I won't play with it the same way.
&lt;/p&gt;
&lt;h3&gt;Conclusion&lt;/h3&gt;
&lt;p&gt;
I like the Oggz most of all. They're much cheaper than the Mathmos and there are three of them, not just one.  The egg shape is a little nicer than a sphere.  The Laserpod is the most expensive of all, and after the initial coolness wore off, it just hasn't been enjoyable.  &lt;strong&gt;I recommend the Oggz.&lt;/strong&gt;
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-4075954673500785790?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/4075954673500785790/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=4075954673500785790' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4075954673500785790'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/4075954673500785790'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/12/review-oggz-laserpod-mathmos-color.html' title='Review: Oggz, Laserpod, Mathmos Color Bubble'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-116482267762476667</id><published>2006-11-29T09:48:00.000-08:00</published><updated>2006-11-29T20:37:33.926-08:00</updated><title type='text'>China, the Dollar, and Christmas</title><content type='html'>&lt;p&gt;
China recently stated that they had too many dollars, and were looking to diversify.  China has over half a trillion dollars, and if they start selling them, the dollar will drop.  The announcement alone caused the dollar to drop in value.
&lt;/p&gt;
&lt;p&gt;
If the dollar drops in value, China will get less from selling them.  &lt;em&gt;It doesn't make sense for China to announce something that will make the dollar drop.&lt;/em&gt;  They should instead quietly sell dollars.
&lt;/p&gt;
&lt;p&gt;
So why did they announce it?  My theory is that they want the dollar to drop but are not intending to sell dollars for a few months, during which the dollar will recover.
&lt;/p&gt;
&lt;p&gt;
If the dollar drops in value, it will take more dollars to buy things from China.  Normally, that would mean that fewer goods would be bought.  However, it's Christmas shopping season right now, and parents are going to buy toys for their kids no matter what.  Furthermore, they're shopping around.  That means retail stores (and online stores) have to keep prices low—they can't raise them to reflect the lower value of the dollar (and thus increased cost of goods).  With prices staying low and Christmas coming up in a few weeks, demand will remain high.
&lt;/p&gt;
&lt;p&gt;
Since the amount of goods bought will stay the same, the cost paid by retailers has gone up, and the price paid by consumers has stayed the same, the big winner in all of this is China, and the losers are the retailers.  A portion of their profits will go to currency exchange. If I were playing the stock market, I'd short the retailers that sell lots of goods from China.
&lt;/p&gt;
&lt;p&gt;
If I were in charge of the Chinese currency, I'd make some announcement right after Thanksgiving about my wanting to get rid of dollars, but I wouldn't actually sell any dollars.  That way I can  get even more dollars from all the Christmas shoppers than I normally would have. A few months later I'd quietly sell dollars. I certainly wouldn't announce that I'm going to sell dollars right before I sell them. That'd be dumb.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-116482267762476667?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/116482267762476667/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=116482267762476667' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116482267762476667'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116482267762476667'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/11/china-dollar-and-christmas.html' title='China, the Dollar, and Christmas'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-116395830319824757</id><published>2006-11-19T09:36:00.000-08:00</published><updated>2006-11-26T12:28:27.416-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Second Life: Svarga</title><content type='html'>&lt;p&gt;
If you're in &lt;a href="http://secondlife.com"&gt;Second Life&lt;/a&gt;, you should check out Svarga [&lt;a href="http://slurl.com/secondlife/Svarga/128.0/128.0"&gt;SLUrl&lt;/a&gt;]. It's an exotic jungle island with pathways, towers, musical instruments, isolation room, fountains, temple compound, secret underground chamber, lookout posts, a second island, and even its &lt;a href="http://nwn.blogs.com/nwn/2006/05/god_game.html"&gt;own ecosystem&lt;/a&gt; (birds, bees, flowers, plants, trees, weather).  There are lots of details that are easily missed the first time through.  When you get there, be sure to take the guided tour by sitting on the hovering tour chair.
&lt;/p&gt;
&lt;p&gt;
Svarga is my favorite place in Second Life. Unfortunately &lt;a href="http://jennyfursblogshite.blogspot.com/2006/09/save-svarga-part-one.html"&gt;it may not be around for much longer&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-116395830319824757?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/116395830319824757/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=116395830319824757' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116395830319824757'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116395830319824757'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/11/second-life-svarga.html' title='Second Life: Svarga'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-116214667466527925</id><published>2006-10-29T10:28:00.000-08:00</published><updated>2006-12-13T17:50:13.616-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Daylight Savings Time</title><content type='html'>&lt;p&gt;
Twice a year I get annoyed by Daylight Savings Time.  This year I got annoyed enough that I started to write a rant about why we should get rid of it, and then I started to find reasons we should keep it. By the time I was finished with my rant, I decided I prefer a different solution: let's keep it year round!
&lt;/p&gt;
&lt;p&gt;
&lt;img src="http://theory.stanford.edu/~amitp/rants/daylight-savings-time/summer.png" /&gt;
&lt;/p&gt;
&lt;p&gt;
Here's my my rant: &lt;a href="http://theory.stanford.edu/~amitp/rants/daylight-savings-time/"&gt;Daylight Savings Time&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-116214667466527925?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/116214667466527925/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=116214667466527925' title='41 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116214667466527925'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/116214667466527925'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/10/daylight-savings-time.html' title='Daylight Savings Time'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>41</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115920125795343413</id><published>2006-09-25T08:44:00.000-07:00</published><updated>2011-04-15T21:57:09.050-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>New site redesign notes</title><content type='html'>&lt;p&gt;
In my &lt;a href="http://amitp.blogspot.com/2006/09/new-site-design-and-implementation_24.html"&gt;last post&lt;/a&gt;, I described the new implementation of my web pages and hinted that there was a new design as well.  You can compare the &lt;a href="http://web.archive.org/web/20050330090815/http://www-cs-students.stanford.edu/~amitp/gameprog.html"&gt;old design&lt;/a&gt; to the &lt;a href="http://www-cs-students.stanford.edu/~amitp/gameprog.html"&gt;new design&lt;/a&gt; to see:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;There's a &lt;em&gt;lot&lt;/em&gt; less color. This is probably the biggest change. I like bold colors, but it was too much; it overwhelmed the page and made the headers (which also used the same color) harder to pick out. Section headers are now black (with just a small square of color); the page border is now subdued. &lt;/li&gt;
&lt;li&gt;The text is more tightly packed. (I changed the &lt;a href="http://webtypography.net/Rhythm_and_Proportion/Vertical_Motion/2.2.1/"&gt;leading&lt;/a&gt; from 1.5 to 1.25.) I have mixed feelings about this; I may change it back.&lt;/li&gt;
&lt;li&gt;Text &lt;a href="http://webtypography.net/Rhythm_and_Proportion/Vertical_Motion/2.2.2/"&gt;matches the line spacing of the main text&lt;/a&gt; as much as possible. I'm a little skeptical of this rule, as it seems to result from limitations in printing presses, but a friend of mine who really knows his typography recommends it.&lt;/li&gt;
&lt;li&gt;There's a print-friendly version of the style using &lt;code&gt;@media screen&lt;/code&gt; style rules to enclose sections designed for regular screens and &lt;code&gt;@media print&lt;/code&gt; style rules to enclose sections designed for printing. The navigation bar, sans-serif body font, shadows, and colored backgrounds are removed for printing. I didn't write any rules for other media types.&lt;/li&gt;
&lt;li&gt;There's more whitespace on the left, except to the left of headings.&lt;sup&gt;*&lt;/sup&gt;  This makes headings a little easier to pick out.&lt;/li&gt;
&lt;li&gt;The page contents have a soft shadow around them; preformatted text has a soft shadow inside.&lt;sup&gt;*&lt;/sup&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
The items with a &lt;sup&gt;*&lt;/sup&gt; are enabled by the implementation; they were not something I could easily do with CSS alone. Each section is now a container with both a title and contents:
&lt;/p&gt;
&lt;pre&gt;
&amp;lt;x:section title="Header"&amp;gt;
  &amp;lt;p&amp;gt;
    Paragraph 1.
  &amp;lt;/p&amp;gt;
  &amp;lt;p&amp;gt;
    Paragraph 2.
  &amp;lt;/p&amp;gt;
&amp;lt;/x:section&amp;gt;
&lt;/pre&gt;
&lt;p&gt;
In HTML, the sections are implicit&amp;mdash;they are whatever occurs between headers. In the my XML content, the sections are explicit. That way I can apply a style to the &lt;em&gt;section&lt;/em&gt;, such as adding a margin to the left. This is something I've long wanted through various redesigns. Sometimes I want a border; sometimes I want a horizontal line separating sections; sometimes I want them to be a different color. Now that I have each section marked, I can choose a combination of HTML tags and CSS rules to achieve the effect I want.
&lt;/p&gt;
&lt;p&gt;
I treated the document in the same way as the sections. In HTML, the header and footer are &lt;em&gt;inside&lt;/em&gt; the document body. This means any style rules that apply to the body contents (such as margins) also apply to the header and footer. I often want the header and footer to span the entire width of the document, so this makes the HTML messier. With XSLT, I can create a new document body (with &lt;code&gt;&amp;lt;div&amp;gt;&lt;/code&gt;) and move the header and footer outside of it. To get the shadow effect, I use three &lt;code&gt;div&lt;/code&gt;s, each with a different border color.  Preformatted text gets surrounded by three &lt;code&gt;div&lt;/code&gt;s as well.  XSLT lets me inject new elements that are used purely for formatting.
&lt;/p&gt;
&lt;p&gt;
I tried using serifs for the body font but it was too much of a change for me, and it doesn't work as well on lower dpi screens.  There are still a few things to clean up, including the rendering in Internet Explorer, but overall I'm pretty happy with the style.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115920125795343413?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115920125795343413/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115920125795343413' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115920125795343413'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115920125795343413'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/09/new-site-redesign-notes.html' title='New site redesign notes'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115916626570814431</id><published>2006-09-24T23:20:00.000-07:00</published><updated>2006-10-31T13:05:11.046-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>New site design and implementation</title><content type='html'>&lt;p&gt;
As long as I've been writing web pages, I've experimented with ways to manage them.  Long ago I used the C preprocessor to give me server-side includes and simple macros.  It was a mess, since the C preprocessor parses &lt;a href="http://groups.google.com/group/comp.infosystems.www.authoring.site-design/browse_thread/thread/2897a2d722fde76d/e924378431bb8f2e?lnk=st&amp;amp;rnum=1#e924378431bb8f2e"&gt;single quotes and double slashes&lt;/a&gt; (for C character constants and C++ comments), and both of those occur in other contexts in web pages.  Later on I built something that could automatically build navigation trees for each page. I also experimented with but never fully adopted a system that would let me &lt;a href="http://theory.stanford.edu/~amitp/GameProgramming/astar.curl"&gt;write HTML in a simpler syntax&lt;/a&gt;. I built tools that would take multiple text files and assemble them into a larger page. I also tried using third party tools, like LaTeX2HTML. I eventually abandoned all of these systems.  They were too complex and introduced dependencies between input files, and I then had to manage &lt;em&gt;those&lt;/em&gt; dependencies.
&lt;/p&gt;
&lt;p&gt;
The last time I had the web page management itch, I wrote down what I wanted out of any new system I set up:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Portable&lt;/strong&gt;. I want to depend on as few external tools as possible, so that I could run this on a variety of systems, including Windows, Linux, Mac, and the restricted environment where my web pages are hosted.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Straightforward&lt;/strong&gt;. I had abandoned several of my previous systems because they imposed restrictions on what I could put into my document. I'm comfortable with HTML, and I'd like to just write HTML as much as possible. The more abstractions I put in between my system and the final output, the more restrictive and complex it will be.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Fast&lt;/strong&gt;. Several of my previous systems had to analyze &lt;em&gt;all&lt;/em&gt; of my documents in order to rebuild &lt;em&gt;any&lt;/em&gt; of them. In particular, navigation trees require analyzing other nodes in order to create the links. If I only edit one document, I want my system to regenerate only one HTML file. Therefore this rule requires that I do not put in navigation trees.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Simple&lt;/strong&gt;. I'm lazy. I don't want to write a complicated system to manage my pages. I just want to get the low hanging fruit and not worry about solving all the problems.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Static&lt;/strong&gt;. I have to produce static HTML; I don't have a web host where I can run web apps or CGI scripts.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I ended up learning and using XSLT.  I do not particularly like XSLT, but it's a reasonable tool to start with. When HTML and XML documents are viewed as trees, XSLT is used to transform (rearrange, erase, and add) tree nodes.
&lt;/p&gt;
&lt;p&gt;
The first step was to &lt;strong&gt;extract&lt;/strong&gt; the content out of my existing web pages. Each page has a mix of template and content. The extrator separated them. I had written these pages in different styles over a period of ten years, so the headers, navigation, HTML style, etc. are not consistent. Some of the pages were generated by other tools I had used. While looking at the old HTML, I decided that I would not be able to treat them uniformly. I added to my requirements:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Optional&lt;/strong&gt;. Some pages will use the new system and some pages will not. I will not migrate everything at once.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I wrote XSLT to extract content out of &lt;em&gt;some&lt;/em&gt; of my web pages. I grouped the pages by their implementation and style. I handled the extraction in four ways:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;If the page already fit my extractor, I left it alone.&lt;/li&gt;
&lt;li&gt;If the page with some minor changes would fit my extractor, I made those changes to the page.&lt;/li&gt;
&lt;li&gt;If the page would fit the extractor with minor changes, I made those changes to the extractor.&lt;/li&gt; 
&lt;li&gt;If the page would require major changes to either it or the extractor, I excluded it.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I thus had a set of pages (some modified), a set of pages to exclude, and an extractor. The extracted content was in the form of XML files (which were mostly HTML, with some XML meta information.) I tested them by inspection; it was hard to tell whether I got things right until the second step: &lt;strong&gt;injection&lt;/strong&gt;. In the second step, I combined the content of each page and a new template I had written, producing HTML. I then compared the new pages with the old pages, side by side, in several browsers, until I was reasonably happy with the results. I rapidly iterated, each time fixing the extactor, the injector, or the old HTML (so that it'd extract better). Any pages I couldn't fix at this step I wrote down for later fixing.
&lt;/p&gt;
&lt;p&gt;
To summarize, during this stage of development I had &lt;em&gt;old pages&lt;/em&gt;, an &lt;em&gt;extractor&lt;/em&gt;, a set of &lt;em&gt;content pages&lt;/em&gt; (the results of the extractor), an &lt;em&gt;injector&lt;/em&gt;, and &lt;em&gt;new pages&lt;/em&gt; (the results of the injector). Some pages I had excluded from the entire process, and others I had marked as needing repair. I also had a set of things I'd like to do that XSLT couldn't handle.
&lt;/p&gt;
&lt;p&gt;
After testing the output extensively, I was finally ready to make the switch. Tonight I replaced the old pages with the new ones. I no longer run the extractor. This means the content pages are no longer being overwritten, so I can now edit those pages instead of the old web pages. I went through the list of pages that needed repairs and fixed them. I tested every page on the new site, fixed up a few minor leftover problems, and pushed the pages to the live site.
&lt;/p&gt;
&lt;p&gt;
I'm much happier with the new system. It's not a series of hacks and it's not custom code. It's using XML and a very simple shell script. It runs on Windows, Mac, and Linux. There is still more to do though. Not all of my pages use the new system or my new style sheet. Some parts of my site, including the blog, will continue to use an external content management system, so I will apply my new stylesheet and template without using the XML injector. There are a few more minor features that I want to implement, and there are more pages to clean up. I'm not in a rush to do any of this; it'll probably take a month or two. I've also been reluctant to edit my pages until now, because any changes I made had to be duplicated on the development pages (which I had modified to make the extractor work). Now that the new pages are up, I can resume working on the content of my pages.
&lt;/p&gt;
&lt;p&gt;
I do recommend that people look into XSLT, but I think it's not sufficient for most needs. It does handle a large set of simple cases though; I'll fill in the gaps with some Python or Ruby scripts. If you find things on my site that don't work properly, let me know; I'm sure there are bugs remaining.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115916626570814431?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115916626570814431/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115916626570814431' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115916626570814431'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115916626570814431'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/09/new-site-design-and-implementation_24.html' title='New site design and implementation'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115834699262962470</id><published>2006-09-15T11:55:00.000-07:00</published><updated>2011-04-15T21:54:31.014-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Advice for naming products</title><content type='html'>&lt;p&gt;
In the age of the search engine, my naming advice: make sure people can search for your product.  That means don't use a common word (you have to compete with all the pages already using it): Word, Excel, Windows, Apple, Office, Backpack, Ask, Live. Don't use a misspelled common word (users, upon hearing the name, will not know how to spell your variant): Novell, Digg, Topix, Froogle.  Don't use capitalization or punctuation to stand out (search engines and search engine users often ignore capitalization and punctuation): C#, .NET, del.icio.us.  Don't use names that aren't even in Unicode (the artist formerly known as "the artist formerly known as Prince").  It's okay but not great to use a common word that isn't commonly used on the web: Amazon, Dell, Ta-Da, Macintosh, Mac, Safari, Basecamp.  It is fine to use misspellings of uncommon words, but you need to make sure people learn to use your spelling: Google, Flickr.  It's better to use two easily spelled words mashed together: PlayStation, MicroSoft, WordPerfect, SketchUp, HotMail, FireFox; or to attach a short distinguishing mark to a common word: eBay, 43Things, GMail, 3Com, iPod, XBox, 30Boxes, 37Signals. If you're going to come up with a brand new word, make sure it's easy to spell once you hear it: Netscape, Akamai, Comcast, Honda, Lego. Don't use a name that's a subset of another name unless the product is a variant of the shorter name: Mac Pro, MacBook, MacBook Pro.
&lt;/p&gt;
&lt;p&gt;
Don't pick a name like &lt;em&gt;Zune&lt;/em&gt; unless you have enough marketing muscle to teach everyone that it's Zune, not Zoon.  Try searching for &lt;a href=http://www.google.com/search?q=zoon&gt;&lt;code&gt;zoon&lt;/code&gt;&lt;/a&gt; and see what you get. As of this post, the first page of search results doesn't mention Microsoft Zune at all. Every search for &lt;code&gt;zoon&lt;/code&gt; is a lost chance to get a customer.
&lt;/p&gt;
&lt;p&gt;
Many of the above names succeeded despite being bad because they got started before the web became big.  But if you're starting a brand new product and call it "Word", I think you'll be shooting yourself in the foot.  &lt;strong&gt;If you make it hard for people to find you, you'll have fewer customers&lt;/strong&gt; and you'll make it hard to get the network effects that would bring in even more customers.
&lt;/p&gt;
&lt;p&gt;
It would be interesting to see if there's a correlation between names and popularity, but it would probably be impossible to study this without examining parallel universes.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115834699262962470?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115834699262962470/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115834699262962470' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115834699262962470'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115834699262962470'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/09/advice-for-naming-products.html' title='Advice for naming products'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115570377264613564</id><published>2006-08-15T21:47:00.000-07:00</published><updated>2006-09-03T14:31:50.983-07:00</updated><title type='text'>Bogus bank privacy statements</title><content type='html'>&lt;p&gt;
I saw this in a bank privacy statement:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
INFORMATION WE DISCLOSE
&lt;/p&gt;
&lt;p&gt;
We do not disclose Customer Information about our present or former customers to third parties except as permitted by law.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
So all they're really saying here is that they're not breaking the law. But that's all. They're willing to give out private information &lt;em&gt;as much as possible&lt;/em&gt; (without breaking the law).  Ugh!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115570377264613564?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115570377264613564/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115570377264613564' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115570377264613564'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115570377264613564'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/08/bogus-bank-privacy-statements.html' title='Bogus bank privacy statements'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115509649635543284</id><published>2006-08-08T21:06:00.000-07:00</published><updated>2006-08-11T23:10:59.140-07:00</updated><title type='text'>Privacy Laws</title><content type='html'>&lt;p&gt;
Here's an idea: privacy-invading laws (RFID passports, GPS tolls, speed monitoring) should apply to lawmakers for one year before they apply to the general public.  I think lawmakers would have to think about the laws more carefully if they were the ones being watched.  We can consider it &amp;ldquo;beta testing&amp;rdquo;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115509649635543284?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115509649635543284/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115509649635543284' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115509649635543284'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115509649635543284'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/08/privacy-laws.html' title='Privacy Laws'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115502172773352673</id><published>2006-08-08T00:12:00.000-07:00</published><updated>2006-11-20T21:17:36.210-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='project'/><title type='text'>Paint.NET is nice</title><content type='html'>&lt;p&gt;
I usually use &lt;a href="http://www.gimp.org/"&gt;The Gimp&lt;/a&gt; for image manipulation. It's like Photoshop in that it's a complex interface designed for complex tasks. Most of my needs are simple though. They're more complex than what Microsoft Paint can handle but nowhere near what Gimp can handle. I recently tried &lt;a href="http://www.getpaint.net/"&gt;Paint.NET&lt;/a&gt; after reading some good reviews, and I'm really happy with it.  It's very easy to use and has a nice interface. All I've done so far is cropping, working with layers, painting in various colors, and adding text.  Next time I need to manipulate an image, I'll likely to use Paint.NET instead of Gimp.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115502172773352673?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115502172773352673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115502172773352673' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115502172773352673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115502172773352673'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/08/paintnet-is-nice.html' title='Paint.NET is nice'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115496781932461141</id><published>2006-08-07T09:19:00.000-07:00</published><updated>2006-10-18T18:33:37.436-07:00</updated><title type='text'>Stupid commercial: HP</title><content type='html'>&lt;p&gt;
Hewlett Packard is running a commercial for their color printers and scanners. In the commercial, a child is at school, giving a report about planets. His speech is of the form, “I scanned this planet in from a magazine,” … “I printed this out on an HP XXXX color printer,” etc.  He never says anything about the planets. All he did is scan some pages from a magazine and print them out. Throughout his speech he gets applause.
&lt;/p&gt;
&lt;p&gt;
Is this what school reports are supposed to be? &lt;em&gt;There’s no content!&lt;/em&gt; Maybe HP is trying to appeal to &lt;em&gt;people who don’t think&lt;/em&gt;. Argh!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115496781932461141?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115496781932461141/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115496781932461141' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115496781932461141'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115496781932461141'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/08/stupid-commercial-hp.html' title='Stupid commercial: HP'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115488620953637129</id><published>2006-08-06T10:10:00.000-07:00</published><updated>2006-11-08T19:17:40.433-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac OS X window management: Spooky</title><content type='html'>&lt;p&gt;
To make the use of my computer screen space, I move windows to the edge of the screen.  That way there's no wasted space between the edge of the window and the edge of the screen.  In Windows, I use &lt;a href="http://www.thewonderfulicon.com/"&gt;The Wonderful Icon&lt;/a&gt; for this.  In Linux, I used the Sawfish window manager (but I see no way to do this in Metacity, the preferred GNOME window manager).  In Mac OS X, I've been manually moving windows around.  Today I found &lt;a href="http://www.doernte.net/software"&gt;Spooky&lt;/a&gt;, a set of scripts that let you move and resize windows to the screen edge.
&lt;/p&gt;
&lt;p&gt;
Spooky isn't user friendly.  It's a set of scripts that you have to modify.  Here's what I did:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Put Spooky into a folder.&lt;/li&gt;
&lt;li&gt;Turn on “access” for universal devices (see the Spooky readme).&lt;/li&gt;
&lt;li&gt;Edit the Spooky starter script to fix what appears to be a script error. I changed
&lt;pre class=snippet&gt;
do shell script
  ("defaults write net.doernte.spooky 
        &lt;strong&gt;\"pathToSpooky\" " &amp;amp; spookyFile&lt;/strong&gt;)
&lt;/pre&gt;
&lt;p&gt;
to
&lt;/p&gt;
&lt;pre class=snippet&gt;
do shell script
  ("defaults write net.doernte.spooky 
        &lt;strong&gt;pathToSpooky \"" &amp;amp; spookyFile &amp;amp; "\""&lt;/strong&gt;)
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;Copy the Spooky starter script to one script for each action (see the Spooky readme):
&lt;pre class=snippet&gt;
for action in maximize centerWindow growWindow 
              shrinkWindow maxBottomLeft
              maxBottomRight maxBottom maxLeft maxRight 
              maxTopLeft maxTopRight
              maxTop moveBottomLeft moveBottomRight 
              moveBottom moveLeft moveRight
              moveTopLeft moveTopRight moveTop zoomWindow; do
     cp spooky\ starter.scpt spooky.$action.scpt; 
done
&lt;/pre&gt;
&lt;/li&gt;
&lt;li&gt;I then had to edit each of these scripts in Script Editor, uncommenting out the line corresponding to the action for that script.  In &lt;code&gt;spooky.moveTop.scpt&lt;/code&gt; for example I uncommented out &lt;code&gt;spooky("moveTop")&lt;/code&gt;.  I would've liked to automate this using perl, but Applescripts are stored in some binary format (why?!).
&lt;/li&gt;
&lt;li&gt;Finally, I assigned hotkeys to run the scripts using Quicksilver's custom triggers.  This was quite a pain, as Quicksilver didn't pick up these applications, so I had to drag each action manually into a custom trigger. I gave them the keybindings suggested in the Spooky readme.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
Although setting things up was more of a pain than I'm used to, now that they're set up, I'm much happier. For my browser, which I want on the right side of the screen, I use &lt;kbd&gt;Ctrl-Right&lt;/kbd&gt;, &lt;kbd&gt;Ctrl-Shift-Down&lt;/kbd&gt;, &lt;kbd&gt;Ctrl-Shift-Up&lt;/kbd&gt; to position and size it. For my work window (usually Emacs), the sequence is similar except I start with &lt;kbd&gt;Ctrl-Left&lt;/kbd&gt;.  I'm much happier having windows go to the edge of the screen; now I don't have to precisely position and size them with the mouse.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115488620953637129?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115488620953637129/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115488620953637129' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115488620953637129'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115488620953637129'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/08/mac-os-x-window-management-spooky.html' title='Mac OS X window management: Spooky'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-115458006068903719</id><published>2006-08-02T21:10:00.000-07:00</published><updated>2006-10-08T10:55:48.330-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='mac'/><title type='text'>Mac Appearance: Limit Choice</title><content type='html'>&lt;p&gt;
The Mac seems to limit your choices when it comes to its appearance. Maybe that's what makes it &amp;ldquo;easy&amp;rdquo; to use. For example, I use a solid desktop background. What does Windows offer me? A color selection dialog that lets me choose one of 16,777,216 colors. What does Linux (GNOME) offer me? A color selection dialog that lets me choose any color, or a gradient between two colors (281,474,976,710,656 possibilities). What does Mac offer me? &lt;strong&gt;A choice of 10 colors.&lt;/strong&gt;  Four blues, four grays, one dark green, and one lavender. That's it. No reds. No yellows. No browns. No oranges.  I guess Steve Jobs doesn't like those colors.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2006-08-07] There's a way to &lt;a href="http://www.macosxhints.com/article.php?story=20021002055217828"&gt;trick the Mac into letting you choose a color&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The color scheme is even more restricted. Classic Windows lets you separately color titlebars, controls, windows, tooltips, etc. There are 3, 121,748,550, 315,992,231, 381,597,229, 793,166,305, 748,598,142, 664,971,150, 859,156,959, 625,371,738, 819,765,620, 120,306,103, 063,491,971, 159,826,931, 121,406,622, 895,447,975, 679,288,285, 306,290,176  color combinations. On the Mac, there are &lt;strong&gt;two&lt;/strong&gt;: blue and gray. On Windows though &lt;a href="http://placidsystems.com/blog/2006/08/how-many-of-your-windows-apps-use.html"&gt;most apps don't really honor a lot of the color settings&lt;/a&gt;, so it's not a fair comparison.
&lt;/p&gt;
&lt;p&gt;
My main complaint isn't so much the lack of choice as the usability issue. I use a custom Windows color scheme to &lt;em&gt;highlight the active window&lt;/em&gt;. It's really important to me. (I also use a custom Firefox style to highlight the active form control.) I easily lose track of the active window. On the Mac, the active window has a gray titlebar with black text. The inactive window has a gray titlebar with gray text. The difference is subtle. It's hard for me to keep track of the window focus. &lt;em&gt;It's harder to use,&lt;/em&gt; in order to make it pretty.
&lt;/p&gt;
&lt;p&gt;
There's a great Mac app called &lt;a href="http://www.lachoseinteractive.net/en/products/doodim/"&gt;Doodim&lt;/a&gt; that provides an incredibly useful feature for people like me: it darkens all but the focused window. This is better than anything I've seen on Windows or Linux. &lt;strong&gt;I love this app!&lt;/strong&gt; Unfortunately it's somewhat slow on my Intel Mac because it's a PowerPC application, and it's running under emulation. I'm also using &lt;a href="http://www.nullriver.com/index/products"&gt;MenuShade&lt;/a&gt;, which darkens the menubar when you're not using it. I tried out some apps similar to Doodim (FocusLayer and Zazen) but they didn't work as well for me. I wish Doodim's functionality was built into the OS.
&lt;/p&gt;
&lt;p&gt;
The Mac approach to limiting choice seems to be largely about the &lt;em&gt;appearance&lt;/em&gt;. When it comes to functionality, it's much better.  With keyboard shortcuts, the Mac gives me far more choices than Windows or Linux. I'm impressed (but I'd like a little more&amp;mdash;there are odd restrictions on which keys I'm allowed to use). Underneath it all, the Unix (BSD) foundation is there and gives me even more power. I'm quite happy to see Python, Ruby, Apache, and so on installed (although I do wonder why they use old versions of Ruby and Apache). I'll take a while to get used to the differences.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-115458006068903719?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/115458006068903719/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=115458006068903719' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115458006068903719'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/115458006068903719'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/08/mac-appearance-limit-choice.html' title='Mac Appearance: Limit Choice'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114332284337863112</id><published>2006-06-23T13:36:00.000-07:00</published><updated>2006-11-10T17:06:47.676-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Review: Deck Legend Keyboard</title><content type='html'>&lt;p&gt;
I've been looking for a new keyboard for about a year now. I'm picky about keyboards. I want them to have a good feel: when the key is sent to the computer, I want to feel something in the key.  I was reading reviews on Dans Data and found this:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
It's a proper long-travel keyboard with good tactile feedback - not quite as positive as buckling spring, but rather quieter - and impressive durability stats.
&lt;/p&gt;
&lt;p&gt;
&amp;mdash;from &lt;a href="http://www.dansdata.com/deck.htm"&gt;this review of the Deck Keyboard&lt;/a&gt;.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
That seemed promising.  Dan's site also includes &lt;a href="http://www.dansdata.com/clickykeyboards.htm"&gt;this page about &amp;ldquo;clicky&amp;rdquo; keyboards&lt;/a&gt;, so I know he has good taste in keyboards.  That review, along with &lt;a href="http://www.deckkeyboards.com/reviews.php"&gt;several others&lt;/a&gt;, convinced me to buy the Deck Legend keyboard, even though it wasn't in any stores, and I couldn't try it out first.  I also liked the company's attitude.  They give you instructions on disassembly, removing keycaps, adding lighting, and so on.  And they don't void the warranty for modding.  I wasn't planning to do any of these things, but it made me feel better about the company.
&lt;/p&gt;
&lt;p&gt;
Plus, it has cool lighting. Each key is individually lit by an LED. There's also brightness control. And you can install custom keycaps like a skull &amp;amp; bones.  It's a &amp;ldquo;cool&amp;rdquo; keyboard.
&lt;/p&gt;
&lt;p&gt;
So I ordered it.
&lt;/p&gt;
&lt;p&gt;
Unfortunately the keyboard doesn't feel good to me.  It feels very mushy, and there's no feedback when a key has been pressed.  At all.  In short, &lt;strong&gt;this keyboard feels awful&lt;/strong&gt;.  When I press down on a key, it sends a signal to the computer with no "click", and then the key goes "thud" at the bottom.
&lt;/p&gt;
&lt;p&gt;
I returned it.
&lt;/p&gt;
&lt;p&gt;
This makes me quite sad. I really like the company and this keyboard seemed promising. I'm now hunting for another keyboard but haven't found anything really nice. The Logitech Dinovo looks interesting, except the reviews say that it drops keystrokes (it's wireless) and the shift and spacebar keys are hard to press after a few months.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114332284337863112?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114332284337863112/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114332284337863112' title='9 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114332284337863112'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114332284337863112'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/06/review-deck-legend-keyboard.html' title='Review: Deck Legend Keyboard'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>9</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114991675146300402</id><published>2006-06-09T22:16:00.000-07:00</published><updated>2006-09-08T15:42:19.296-07:00</updated><title type='text'>Naming disorders</title><content type='html'>&lt;p&gt;
Who comes up with names for disorders?  &lt;em&gt;Intermittent Explosive Disorder&lt;/em&gt; sounds more like a bowel problem than an anger problem.  If you think you have it, you can take &lt;a href="http://www.seedmagazine.com/news/2006/06/serenity_now.php"&gt;Simmadoun&lt;/a&gt; as treatment.  Or you can just take a deep breath and relax.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114991675146300402?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114991675146300402/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114991675146300402' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114991675146300402'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114991675146300402'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/06/naming-disorders.html' title='Naming disorders'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113307562406473410</id><published>2006-06-05T23:13:00.000-07:00</published><updated>2006-10-14T17:01:27.726-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Environmentally friendly gold mining</title><content type='html'>&lt;p&gt;
Gold mining involves digging up tons of rock from the ground, using chemicals like cyanide, and then tossing all the rock somewhere.  I took a scenic drive along CA-hwy 49 over the weekend, and saw some mining equipment.  I also read about a mine that still has gold, but it's too expensive (and probably would raise lots of environmental concerns).
&lt;/p&gt;
&lt;p&gt;
Someday I'd like all gold mines to use &lt;a href="http://www.sciencedaily.com/releases/1998/04/980428035128.htm"&gt;gold mining bacteria&lt;/a&gt;.  They &lt;a href="http://www.gi.alaska.edu/ScienceForum/ASF11/1188.html"&gt;pull the gold out of the ore&lt;/a&gt; while leaving the ore in place.  Let's dump tons of these bacteria down into the gold mines, let them do their work, and then pull up all the gold.  Whee!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2006-07-14] &lt;a href="http://edition.cnn.com/2006/TECH/science/07/13/gold.from.dust.ap/index.html?section=cnn_topstories"&gt;Researchers have found gold-harvesting bacteria&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113307562406473410?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113307562406473410/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113307562406473410' title='8 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113307562406473410'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113307562406473410'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/06/environmentally-friendly-gold-mining.html' title='Environmentally friendly gold mining'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>8</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114391040640965677</id><published>2006-04-01T08:15:00.000-08:00</published><updated>2006-10-24T21:54:32.040-07:00</updated><title type='text'>Schmap: clever marketing</title><content type='html'>&lt;p&gt;
The Schmap map/guide folk have done something incredibly clever.  They searched Flickr for Creative Commons licensed photos, then emailed the photographers asking for permission to use the photos in their Schmap guides.  At first I thought, cool, I'm honored to have &lt;a href="http://www.flickr.com/photos/amitp/9576484/"&gt;my Las Vegas photo&lt;/a&gt; in there.  The next thing I thought was cool, they're using Creative Commons for business purposes.  Today I realized that there's something much bigger than saving money: they're getting free marketing.  Lots of bloggers use flickr.  These bloggers are posting about being selected for Schmap: &lt;a href="http://www.bonamassablog.us/archives/2006/04/map_schmap.html"&gt;1&lt;/a&gt;, &lt;a href="http://fraserspeirs.livejournal.com/1018293.html"&gt;2&lt;/a&gt;, &lt;a href="http://blog.bustikated.net/bm5k/2006/04/schmap-boston-photo-short-list.cfm"&gt;3&lt;/a&gt;,  &lt;a href="http://dragonballyee.blogs.com/philly/2006/03/schmaps.html"&gt;4&lt;/a&gt;, &lt;a href="http://bytheway.themagpieinstinct.com/archives/2006/03/30221524_and_i_thought_i_was_special.php"&gt;5&lt;/a&gt;, &lt;a href="http://www.joegratz.net/archives/2006/02/23/schmap/"&gt;6&lt;/a&gt;, &lt;a href="http://www.aquick.org/blog/2006/03/01/taking-advantage-of-the-commons/"&gt;7&lt;/a&gt;, &lt;a href="http://blogs.bootsnall.com/MNTim/?p=10"&gt;8&lt;/a&gt;, &lt;a href="http://www.idowens.com/2006/03/05/need-directions-look-to-schmap/"&gt;9&lt;/a&gt;, &lt;a href="http://smhyla.blogspot.com/2006/03/schmap-wants-to-use-my-pics.html"&gt;10&lt;/a&gt;, &lt;a href="http://vidiot.typepad.com/telescreen/2006/03/i_post_my_pictu.html"&gt;11&lt;/a&gt;, &lt;a href="http://www.smartarded.com/?p=112"&gt;12&lt;/a&gt;, &lt;a href="http://jasonpearce.com/blog/2006/03/01/creative-commons-noncommercial/"&gt;13&lt;/a&gt;, &lt;a href="http://www.bainbooks.com/2006/03/ny-shortlisted-by-schmap.html"&gt;14&lt;/a&gt;, &lt;a href="http://pakgwei.livejournal.com/18676.html"&gt;15&lt;/a&gt;, &lt;a href="http://www.ebbybrett.co.uk/blog/2006/03/01/schmapp/"&gt;16&lt;/a&gt;, &lt;a href="http://blog.360.yahoo.com/blog-Koiy.8g5erBQbNe3hOk-?p=315"&gt;17&lt;/a&gt;.  It's a mix of people being flattered, confused, and offended.
&lt;/p&gt;
&lt;p&gt;
There's &lt;a href="http://www.flickr.com/groups/central/discuss/72057594072528281/"&gt;some controversy&lt;/a&gt; over whether the ad-supported Schmap application is allowed to use Creative Commons &amp;ldquo;non-commercial&amp;rdquo; photos.  I do think ad-supported makes it commercial.  The Creative Commons non-commercial license lets you use the material for non-commercial purposes &lt;em&gt;without asking permission&lt;/em&gt;  But by asking permission, I think they can use them despite the non-commercial restriction.  They're basically asking for a license to use the photos, and they're not using them under the Creative Commons license.  There are also some folk unhappy about Schmap using Creative Commons material but then not licensing their own content under Creative Commons.  I don't have a problem with that part.  I don't see Creative Commons as being viral.  Another issue is whether amateur photography will disrupt the market for professionals.  I think it might, but maybe it should.  It shouldn't be illegal or immoral for me to give my photos or my programs or my movies or my books or my source code or my music or my services away for free or at any cost I choose.
&lt;/p&gt;
&lt;p&gt;
I think the main reason they asked permission is so that people would blog about Schmap.  And it worked.  If they had used their own photos, or used Creative Commons commercial licensed photos without asking (which would be legal), nobody would've heard of Schmap.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114391040640965677?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114391040640965677/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114391040640965677' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114391040640965677'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114391040640965677'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/04/schmap-clever-marketing.html' title='Schmap: clever marketing'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114339568288757447</id><published>2006-03-26T09:30:00.000-08:00</published><updated>2006-06-04T21:00:10.260-07:00</updated><title type='text'>Feeds are too primitive</title><content type='html'>&lt;p&gt;
When I find an article or blog post I like, some sites and most blogs allow me to subscribe to a &amp;ldquo;feed&amp;rdquo; (implemented with RSS or Atom), so that I can receive more articles and blog posts.  The feed is better than an email subscription because &lt;em&gt;I&lt;/em&gt; control the subscription.  With email, the sender has a list of who subscribe; with feeds, I have a list of what I subscribe to.  Leaving this up to the sender means a spammer can subscribe me without permission (and this happens to me all the time).  It means someone can put in the wrong email address, and I end up receiving their email (this happened to me recently, and I started receiving email about my being in the 27&lt;sup&gt;th&lt;/sup&gt; week of pregnancy).  With feeds these things don't happen, because I control the list.
&lt;/p&gt;
&lt;p&gt;
I think the bigger promise with feeds is the possibility to subscribe in new ways.  Right now, I can subscribe to a &lt;em&gt;site's&lt;/em&gt; feed.  If I see an post I like, I can subscribe to receive other posts from the &lt;em&gt;same site&lt;/em&gt;.  This assumes that if I like one post from the site, I'll like other posts from that site.  Sometimes this is true; sometimes it isn't, especially when the author mixes many topics in the same blog (as I do).  If I've marked a set of posts (A) I like, there are many ways to guess what other posts (B) I'll like:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Posts textually similar, but not identical to, to the ones I marked: words(A) and words(B) overlap, but not completely&lt;/li&gt;
&lt;li&gt;Posts that link to the same articles as the posts I marked: X &amp;isin; (links(A) &amp;cap; links(B)) but X is not commonly linked to&lt;/li&gt;
&lt;li&gt;Posts that are linked to by the same pages as the posts I marked: for many pages X, A &amp;isin; links(X) and B &amp;isin; links(X)&lt;/li&gt;
&lt;li&gt;Posts that share the same tags as the posts I marked: tags(A) and tags(B) overlap&lt;/li&gt;
&lt;li&gt;Posts that are marked by the same people: my set A and your set A overlap, so tell me which posts didn't overlap&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
There's some remixing going on already with Feedburner, Google Reader, and others, but I want to see more automated creation of feeds based on &lt;em&gt;sets of posts&lt;/em&gt; as the input, rather than &lt;em&gt;feeds&lt;/em&gt; as the input.  To build the kinds of things I'd like requires someone to analyze text, tags, and links for every post.  It's a lot of work, which is probably why it hasn't been done.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114339568288757447?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114339568288757447/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114339568288757447' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114339568288757447'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114339568288757447'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/03/feeds-are-too-primitive.html' title='Feeds are too primitive'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114300460935093123</id><published>2006-03-21T21:09:00.000-08:00</published><updated>2006-07-28T22:13:31.470-07:00</updated><title type='text'>Why Sun is doomed</title><content type='html'>&lt;p&gt;
If you have a Sun workstation, an ATI Radeon 7000 with 32 MB of video RAM &lt;a href="http://www.cdw.com/shop/products/default.aspx?EDC=625567"&gt;costs $300&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
If you have a PC, ATI Radeon 7000 with 32 MB of video RAM costs around $30.
&lt;/p&gt;
&lt;p&gt;
Why does Sun charge 10 times as much for essentially the same thing?  I don't know.  If that doesn't convince you that Sun is doomed, read 
&lt;a href="http://joyeur.com/2006/03/20/the-sun-doesnt-shine-on-me"&gt;this story&lt;/a&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114300460935093123?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114300460935093123/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114300460935093123' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114300460935093123'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114300460935093123'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/03/why-sun-is-doomed.html' title='Why Sun is doomed'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114283659189889948</id><published>2006-03-19T22:36:00.000-08:00</published><updated>2006-08-12T14:46:35.700-07:00</updated><title type='text'>Decision making</title><content type='html'>&lt;p&gt;
Gut instinct isn't a good way to make these decisions.  There are a lot of counterintuitive things in life.  The &lt;a href="http://decisioneducation.org/"&gt;Decision Education Foundation&lt;/a&gt; teaches kids to make better decisions, but it's at a small scale.  Analysis and good decision making should be taught in all schools.  It's more important than teaching long division or art history or a foreign language.  It's probably more important than teaching chemistry or history.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114283659189889948?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114283659189889948/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114283659189889948' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114283659189889948'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114283659189889948'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/03/decision-making.html' title='Decision making'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114283656808074509</id><published>2006-03-19T22:25:00.000-08:00</published><updated>2006-06-27T21:27:07.740-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Reducing dependence on foreign oil</title><content type='html'>&lt;p&gt;
The United States imports more than half the oil it consumes.  There are a lot of people here who say we should do X Y Z to &amp;ldquo;reduce the dependence on foreign oil&amp;rdquo;.  The problem is that X Y Z usually involves reducing demand.
&lt;/p&gt;
&lt;p&gt;
If we reduce demand, prices will go down.
&lt;/p&gt;
&lt;p&gt;
If prices go down, the oil that costs the most to produce will be the first to be dropped.  What oil is that?  The domestic oil.
&lt;/p&gt;
&lt;p&gt;
So if we reduce demand, a &lt;em&gt;larger&lt;/em&gt; portion of our oil will be foreign.  We'll shut down domestic oil production, which will &lt;em&gt;increase&lt;/em&gt; our dependence on foreign oil.  If our oil supply ever gets cut off, we'll be in more trouble than if we had been using more oil, because our infrastructure will have decayed.
&lt;/p&gt;
&lt;p&gt;
To keep prices high, we need to make sure that our reducing demand doesn't lower the price of oil much.  The way to do that is to encourage China to consume more oil.  That will drive the price &lt;em&gt;up&lt;/em&gt;, which will reduce consumption here in the U.S., without leading us to shut down production of oil.  Maybe we'll even become an oil exporter. (Ha!)
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114283656808074509?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114283656808074509/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114283656808074509' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114283656808074509'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114283656808074509'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/03/reducing-dependence-on-foreign-oil.html' title='Reducing dependence on foreign oil'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-114283341148253835</id><published>2006-03-19T21:34:00.000-08:00</published><updated>2006-06-22T19:54:35.346-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Firefox cookie management</title><content type='html'>&lt;p&gt;
There are way too many sites that send me cookies.  I don't really want to keep them.  However, many sites don't work at all without cookies.  I've decided to do three things:
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;Allow sites to set cookies&lt;/strong&gt;, because many sites require cookies.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Don't allow third-party cookies&lt;/strong&gt;, because that's mainly used for tracking people across sites.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Erase most cookies when I close the browser&lt;/strong&gt;; I allow only cookies from a small set of sites to remain between browser sessions.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
I've been using this cookie policy for several years and am happy with it.  My Firefox settings are:
&lt;/p&gt;
&lt;div&gt;
&lt;a href="http://photos1.blogger.com/blogger/1918/147/1600/Cookie-Management.1.jpg"&gt;&lt;img style="max-width:90%" src="http://photos1.blogger.com/blogger/1918/147/1600/Cookie-Management.0.jpg" /&gt;&lt;/a&gt;
&lt;/div&gt;
&lt;p&gt;
First, I allow cookies &lt;span style="background-color:#eee79d"&gt;for the originating site only&lt;/span&gt;, which turns off third-party cookies.  I keep cookies &lt;span style="background-color:#eee79d"&gt;until I close Firefox&lt;/span&gt;.  I also set &lt;span style="background-color:#9af0ed"&gt;Exceptions&lt;/span&gt; and set each site whose cookies I want to keep to &lt;span style="background-color:#9af0ed"&gt;Allow&lt;/span&gt;.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-114283341148253835?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/114283341148253835/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=114283341148253835' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114283341148253835'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/114283341148253835'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/03/firefox-cookie-management.html' title='Firefox cookie management'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113894899975776187</id><published>2006-02-02T22:37:00.000-08:00</published><updated>2006-11-08T22:27:23.883-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Firefox 1.5 open new windows in tabs</title><content type='html'>&lt;p&gt;
With Firefox 1.0, I used &amp;ldquo;single window mode&amp;rdquo; to force all new windows to instead open in new tabs.  With Firefox 1.5, &lt;em&gt;most&lt;/em&gt; new windows are redirected to tabs but any window with a custom size will still get its own window.  I (and many others) prefer that &lt;em&gt;all&lt;/em&gt; new windows be turned into tabs.  To do this, go to &lt;code&gt;about:config&lt;/code&gt; and set the &lt;a href="http://kb.mozillazine.org/Browser.link.open_newwindow.restriction"&gt;&lt;code&gt;browser.link.open_newwindow.restriction&lt;/code&gt;&lt;/a&gt; variable to &lt;code&gt;0&lt;/code&gt;.  This was changed as a result of &lt;a href="https://bugzilla.mozilla.org/show_bug.cgi?id=313300"&gt;bug 313300&lt;/a&gt;; they felt that &lt;code&gt;2&lt;/code&gt; (resized windows don't become tabs) was a better default.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113894899975776187?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113894899975776187/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113894899975776187' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113894899975776187'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113894899975776187'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/02/firefox-15-open-new-windows-in-tabs.html' title='Firefox 1.5 open new windows in tabs'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113820041740313832</id><published>2006-01-25T06:36:00.000-08:00</published><updated>2006-02-25T22:51:16.670-08:00</updated><title type='text'>The long tail can sting</title><content type='html'>&lt;p&gt;
If you read the blogs, you'll learn how the long tail is great for business.  The long tail can also be a curse.  Consider developer communities.  If you have a long tail of developers, it's harder to coordinate with all of them.  The long tail of developers typically will attach itself to the dominant development platforms (C/C++, Intel x86, DOS/Windows), whereas other platforms (Java, PowerPC, Mac) have small development communities.  The dominant platforms cannot coordinate with all the developers, so they must &lt;strong&gt;retain backwards compatibility&lt;/strong&gt;.  Their strategy is not to abandon their old systems, but to extend them.  C was extended to C++.  Intel 8086 was extended to 286 and 386 (remember "real mode" and "protected mode"?) and then later x86 was emulated inside Pentiums.  DOS was extended to Windows and then replaced by NT, which still could run DOS programs.  In all of these cases, the platforms have become incredibly ugly due to the backwards compatibility.  Ask developers if C++ or Java is cleaner, if x86 or PowerPC is cleaner, if Windows or Mac is cleaner, and the answer will be clear: the system that was more recently designed is cleaner and more pleasant to work with.  However most developers are still tied to the ugly systems.  Why?  Because backwards compatibility is the path to success.  When you have that long tail of developers, you can't afford to abandon them, so you bend over backwards to keep their old programs working.  I can still run Windows programs I worked on in 1993.  I can't run Mac programs from 1993 in any nice way.  I can still run 8086 programs on a Pentium IV without emulation.  I can't run 6800 programs on a PowerPC without emulation.  I can compile most C libraries in a C++ compiler.  I can't compile C code in a Java compiler.  The most popular systems have this curse.
&lt;/p&gt;
&lt;p&gt;
This leaves me pessimistic about ever having clean successful systems.  The successful systems are laden with backwards compatibility requirements.  Those requirements make the system unclean.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113820041740313832?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113820041740313832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113820041740313832' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113820041740313832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113820041740313832'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/01/long-tail-can-sting.html' title='The long tail can sting'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113773002201399054</id><published>2006-01-19T20:03:00.000-08:00</published><updated>2006-01-22T08:12:02.403-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Volume control - an operating system's job</title><content type='html'>&lt;p&gt;
What should an operating system do?  It should manage computer resources.  It runs programs, controls access to hard drives and speakers and graphics, allows you to manage files, and so on.
&lt;/p&gt;
&lt;p&gt;
Something I want from the operating system is &lt;strong&gt;volume control&lt;/strong&gt; per application.  By default, I want only the focused appliation to play sounds.  If another application wants to play sounds, I'd like control over the volume.
&lt;/p&gt;
&lt;p&gt;
The prime use of this, I think, would be to control your web browser's volume while you are surfing the web.  I don't like most pages that play music or sounds.  I especially don't like it when I have multiple pages up and they want to play their own music.  I'd like to play music in a music player while surfing the web, and with only a single volume control, I can't do this.
&lt;/p&gt;
&lt;p&gt;
Operating system makers: please add volume control to every window's titlebar!
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update [2006-01-21]&lt;/strong&gt;: I just read that &lt;a href="http://blog.tokash.org/2006/01/12/per-application-volume-in-vista/"&gt;Windows Vista will have per-application volume control&lt;/a&gt;.  Hooray!  Unfortunately it won't be in the titlebar.  It'll be up to each application to create a widget to integrate volume into their own app, and you can also control volume from a separate window.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113773002201399054?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113773002201399054/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113773002201399054' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113773002201399054'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113773002201399054'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/01/volume-control-operating-systems-job.html' title='Volume control - an operating system&apos;s job'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113622423666851409</id><published>2006-01-02T09:36:00.000-08:00</published><updated>2006-06-03T09:27:13.680-07:00</updated><title type='text'>Sirius radio security risk</title><content type='html'>&lt;p&gt;
I contacted Sirius satellite radio customer support, and they emailed back asking me to send them &lt;strong&gt;my password&lt;/strong&gt; in clear text email.  They also want the last four digits of my credit card number.  Ick.
&lt;/p&gt;
&lt;p&gt;
Sirius seems to have some &lt;a href="http://www.orbitcast.com/archives/sirius-security-risk.html"&gt;other bad security practices&lt;/a&gt; too.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113622423666851409?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113622423666851409/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113622423666851409' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113622423666851409'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113622423666851409'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2006/01/sirius-radio-security-risk.html' title='Sirius radio security risk'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113372201512983165</id><published>2005-12-04T10:45:00.000-08:00</published><updated>2005-12-04T10:47:52.430-08:00</updated><title type='text'>Amusing EULA</title><content type='html'>&lt;p&gt;
When installing the demo for the game &lt;em&gt;Space Hack&lt;/em&gt;, the license agreement is:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
YOU SHOULD CAREFULLY READ THE FOLLOWING END USER LICENSE AGREEMENT BEFORE INSTALLING THIS SOFTWARE PROGRAM. BY INSTALLING OR OTHERWISE USING THE SOFTWARE PROGRAM, YOU AGREE TO BE BOUND BY THE TERMS OF THIS AGREEMENT.  IF YOU DO NOT AGREE TO THE TERMS OF THIS AGREEMENT, TOUGH…
&lt;/p&gt;
&lt;p&gt;
Queue the lawyers!
&lt;/p&gt;
&lt;p&gt;
[... legalese snipped ...]
&lt;/p&gt;
&lt;p&gt;
Phew! Now that that’s over, get playing!
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
Unfortunately, reading it and understanding it are two very different things.  It's still written in legal language and not plain language that the end user can understand.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113372201512983165?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113372201512983165/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113372201512983165' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113372201512983165'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113372201512983165'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/12/amusing-eula.html' title='Amusing EULA'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113349129959277237</id><published>2005-12-01T18:38:00.000-08:00</published><updated>2011-10-03T13:59:25.556-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Gmail as database</title><content type='html'>&lt;p&gt;
I've been using Gmail's labels for a very simple database.  I email myself contact information (address, phone number, email address) for my friends, using the person's name as the subject line.  Then I label the email with &lt;code&gt;contact&lt;/code&gt;.  When I want to look up the person's contact information, I can search &lt;kbd&gt;name label:contact&lt;/kbd&gt;.
&lt;/p&gt;
&lt;p&gt;
This also works for recipes.  Email yourself each recipe as a separate email message, using the name of the dish as the subject line.  Then label them with &lt;code&gt;recipe&lt;/code&gt;.  When you want to find a recipe in your database, search for &lt;kbd&gt;dish/ingredients label:recipe&lt;/kbd&gt;.
&lt;/p&gt;
&lt;p&gt;
What are other ways to use gmail as a lightweight database?
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113349129959277237?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113349129959277237/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113349129959277237' title='4 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113349129959277237'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113349129959277237'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/12/gmail-as-database.html' title='Gmail as database'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>4</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113306926279412958</id><published>2005-11-26T20:59:00.000-08:00</published><updated>2006-11-07T00:58:24.210-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Faster delivery service</title><content type='html'>&lt;p&gt;
For many years now I've pondered what's next in delivery services.  In 1973, FedEx gave us overnight delivery.  With faster delivery you not only make more shipments of the same type of items you had been shipping (&amp;ldquo;depth&amp;rdquo;), you also ship things you would have never shipped before (&amp;ldquo;width&amp;rdquo;).  Instead of trying to capture more of the pie, FedEx expanded the pie, both width and depth, made lots of money, and made their customers happy.
&lt;/p&gt;
&lt;p&gt;
The next step for delivery services is to again dramatically improve delivery times.  There are lots of times I'd like to buy something online, but the delivery time is too long, so I end up going to a store.  For example, when I went on a cruise to Alaska, I wanted to buy a digital camera.  We were leaving for the cruise the next day, so I didn't want to order online.  If delivery were faster, I would've ordered online.  This is what I call &amp;ldquo;depth&amp;rdquo; expansion of the business&amp;mdash;more deliveries of  the type of items people ship anyway.
&lt;/p&gt;
&lt;p&gt;
There are some items that I would not consider ordering online from a faraway place.  The main example is prepared food.  If I want a pizza, I will order from a local store but not from Amazon.com, because pizza delivery via FedEx is too slow.  If delivery took an hour instead of a day, people would be willing to ship meals.  I could order a Philly cheese steak sandwich from .. Philadelphia.  This is what I call &amp;ldquo;width&amp;rdquo; expansion of the business&amp;mdash;delivery of items that people would have never shipped with a slower delivery system.
&lt;/p&gt;
&lt;p&gt;
To get faster delivery, we need something that goes much faster than trucks.  To get my sandwich from Philadelphia to California in one hour will require something travelling 3000 miles per hour.  Unfortunately this is faster than the speed of sound.  Supersonic travel is expensive and complicated.  If we can lower the air pressure, we can reduce the air resistance and lower the cost of moving a shipment.  (Surprisingly, air pressure does not affect the speed of sound.)  Thus, the solution is to use evacuated (near-vacuum) tubes.
&lt;/p&gt;
&lt;p&gt;
A network of evacuated tubes running throughout the country would allow fast delivery of small packages.  These tubes would be connected together at hubs, which would function somewhat like Internet routers.  The RFID tags in each package would be used by the hub to route it to the best tube.  As with the Internet, the package hubs could adapt to route around congestion.  However, unlike Internet packets, we don't want to lose packages.
&lt;/p&gt;
&lt;p&gt;
The cost of building evacuated tubes to every household is incredibly high.  Initially, the deliveries would be made to central locations in each community, perhaps post offices.  Either the post office can then deliver packages to your home/office, or you can go there to pick it up.  The next stage would likely be to build tubes to higher density locations like office buildings, skyscrapers, and apartment complexes.    Lower density locations like single family homes would most likely be the last to receive delivery tubes.  In older locations where new infrastructure is not being upgraded, tubes might be attached to the inside top of sewage tunnels.
&lt;/p&gt;
&lt;p&gt;
I think getting sandwiches from Philadelphia to California is unlikely to be practical.  However, having a sandwich delivered from across town in a matter of minutes could become commonplace.  If you want a book, Amazon could print it at a local printer and then have that book delivered to you within minutes.  EBay sellers could send their small goods through this network.  If shipping on EBay became fast and convenient, we might see everyone participate.  It could be the P2P of physical goods.
&lt;/p&gt;
&lt;p&gt;
The initial cost of such a system is very high.  The value of a delivery system is that you can ship anywhere.  It does little good to have tubes running to only a few cities, although it might be feasible to use existing delivery services in conjunction with the tube system.  Once the system is built, he marginal cost is lower than with FedEx, because the entire system can be automated.  In addition, the demand will be much higher than the current demand for shipping services.  I think eventually this system would be very profitable.
&lt;/p&gt;
&lt;p&gt;
Go ahead and laugh at this idea.  They laughed at &lt;a href="http://www.fortune.com/fortune/fsb/specials/innovators/smith.html"&gt;the idea of overnight delivery&lt;/a&gt; too.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113306926279412958?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113306926279412958/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113306926279412958' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113306926279412958'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113306926279412958'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/11/faster-delivery-service.html' title='Faster delivery service'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113306735006070049</id><published>2005-11-26T20:39:00.000-08:00</published><updated>2011-04-15T21:59:25.154-07:00</updated><title type='text'>Trusting software too much</title><content type='html'>&lt;p&gt;
Google shows &lt;a href="http://www.google.com/search?q=koki-anna"&gt;41 search results for &lt;code&gt;"Koki Anna"&lt;/code&gt;&lt;/a&gt;.  Why?  Because a certain word processor flags U.N. Secretary General's name, &lt;strong&gt;Kofi Annan&lt;/strong&gt;, as a misspelling, then suggests &lt;strong&gt;Koki Anna&lt;/strong&gt; as a correction.  So you end up seeing documents that have the wrong spelling of his name, &lt;em&gt;including a page on the U.N.'s own web site&lt;/em&gt;.  How embarassing!
&lt;/p&gt;
&lt;p&gt;
I have mixed feelings about this.  Part of me is old-fashioned and thinks everyone should learn spelling, grammar, arithmetic, etc.  But part of me thinks as human beings get augmented with computers (including PDAs and cell phones), we shouldn't bother learning mechanical tasks like arithmetic and spelling.  Computers are better at following rules.  Human brains are better at breaking rules.  Memorization is a very inefficient use of our brains.  We should spend our brainpower on creativity, learning patterns, and designing things.  Until that day comes, however, we should all learn how to spell.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113306735006070049?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113306735006070049/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113306735006070049' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113306735006070049'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113306735006070049'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/11/trusting-software-too-much.html' title='Trusting software too much'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113140687278658127</id><published>2005-11-07T15:37:00.000-08:00</published><updated>2005-11-14T20:12:37.126-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Less right clicks, use the Away Page!</title><content type='html'>&lt;p&gt;
It sounds like there's an auto-update to the AIM (AOL Instant Messenger) client that advertises their new &amp;ldquo;&lt;a href="http://buddyinfo.aim.com/away"&gt;Away Page&lt;/a&gt;&amp;rdquo; feature.  The advertisement (in the AIM client) says &amp;ldquo;&lt;strong&gt;Less right clicks, use the Away Page!&lt;/strong&gt;&amp;rdquo;  However, it's spooky, and it looks like a virus.  As far as I can tell, it's not, but I'm not finding much information on the web about it.
&lt;/p&gt;
&lt;p&gt;
I'm glad I don't use the regular AIM client.  (I use &lt;a href="http://gaim.sourceforge.net/"&gt;Gaim&lt;/a&gt;, which is available for Windows and Linux.)
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; my gaim isn't working for me anymore.  I wonder if it's related to the &amp;ldquo;Less right clicks&amp;rdquo; thing.  I spent an hour trying to figure it out, then gave up and switched to Google Talk.  The buddies I care most about have switched too.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113140687278658127?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113140687278658127/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113140687278658127' title='15 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113140687278658127'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113140687278658127'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/11/less-right-clicks-use-away-page.html' title='Less right clicks, use the Away Page!'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>15</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113002663151924650</id><published>2005-10-22T16:51:00.000-07:00</published><updated>2006-11-22T04:10:01.196-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Decouple nutrition and taste</title><content type='html'>&lt;p&gt;
When choosing what to eat, there are usually tradeoffs between taste and nutrition.
&lt;/p&gt;
&lt;p&gt;
Good nutrition: water, beans, fresh fruits, whole grain foods.
&lt;/p&gt;
&lt;p&gt;
Bad nutrition: soda, beef, cheese, salt, chocolate.
&lt;/p&gt;
&lt;p&gt;
Why do I have to make those choice?  Why can't I have nutritious chocolate?  The problem is that after many millions of years of evolution, primates prefer food that lets them fatten themselves up, because they're more likely to survive through famines.  And evolution only weeds out bad habits that kill you when you're young.  So we ended up liking foods that will kill us in the long run.  But this is a solvable problem.
&lt;/p&gt;
&lt;p&gt;
I'm starting to notice more things in the world where there are two options, and both of them are unpleasant (e.g., either you have heart disease or you give up fatty foods).  In cars, either you give up gas mileage or you give up horsepower.  For energy, you either give up comfort (air conditioning, etc.) or you hurt the environment.  With programming, you either have slow reusable code or you have fast messy code.  For cameras, you have high resolution still pictures or low resolution movies.  &lt;strong&gt;I don't want to make the tradeoff anymore.&lt;/strong&gt;  I want the best of both.
&lt;/p&gt;
&lt;p&gt;
With food, let's decouple nutrition and taste.  The simplest (but perhaps ugly) way to do this would be to divert food after it has hit the mouth (where it contributes to taste) but before it hits the stomach (where it contributes to nutrition).  We could then feed supplements into your stomach.
&lt;/p&gt;
&lt;p&gt;
Since the supplements are much smaller than real food and they don't need as much digestion, we can downsize the stomach and intestines and maybe some other organs.  You could use that space to keep all the diverted food.  You could use any additional for storage, like Bender on Futurama.
&lt;/p&gt;
&lt;p&gt;
Every once in a while you'd have to remove the supplement cartridge and plug in a new one.  Unfortunately Lexmark will use DRM to prevent you from refilling your nutritional supplement cartridge.
&lt;/p&gt;
&lt;p&gt;
That way I could eat all the unhealthy food I want and it won't impact my health.  No tradeoffs, other than the Lexmark issue.  Don't settle for less.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113002663151924650?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113002663151924650/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113002663151924650' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113002663151924650'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113002663151924650'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/10/decouple-nutrition-and-taste.html' title='Decouple nutrition and taste'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-113002490539538673</id><published>2005-10-22T16:27:00.000-07:00</published><updated>2006-09-29T21:26:59.703-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Car shades are a pain</title><content type='html'>&lt;p&gt;
Car sun shades are very useful.  You can put them up when you leave your car to keep the sun out.  This keeps your car cooler, reduces the amount of gas you use slightly (because you don't need to run your air conditioner so much to undo the heating), and helps protect your seats and dashboard.
&lt;/p&gt;
&lt;p&gt;
The problem is that they are manually operated.  The popular silver shades are unrolled and placed in the windshield.  There are also black perforated shades that can be pulled out.  They're manually operated because it's too expensive for third parties to automate this stuff into every type of car.
&lt;/p&gt;
&lt;p&gt;
Carmakers should automate sun shades.  When the car is off, you should be able push a button to have a sunshade come up.  For the windshield it could be set up just like the windshield wiper&amp;mdash;an arm comes up and spreads out a folding shade.  For the side windows it could be like the power windows&amp;mdash;a reflective cover comes up from the door.  Someday we'll use windows that can become opaque.  Right now it's too expensive, but maybe in five years it will be reasonable.
&lt;/p&gt;
&lt;p&gt;
If we had automated sun shades, far more people would use them.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2006-07-30] &lt;a href="http://www.kk.org/cooltools/archives/001312.php"&gt;These car shades&lt;/a&gt; are a step in the right direction.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-113002490539538673?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/113002490539538673/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=113002490539538673' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113002490539538673'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/113002490539538673'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/10/car-shades-are-pain.html' title='Car shades are a pain'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112766793775241832</id><published>2005-09-25T09:49:00.000-07:00</published><updated>2008-06-16T22:26:36.047-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>The Singularity is Not Near</title><content type='html'>&lt;p&gt;
I'm reading Ray Kurzweil's book, &lt;em&gt;The Singularity Is Near&lt;/em&gt;, and finding it somewhat persuasive.  However every once in a while something just looks wrong, and that upsets the persuasivity.
&lt;/p&gt;
&lt;p&gt;
In Chapter 1, he shows various &amp;ldquo;significant&amp;rdquo; events in history, like the invention of writing, the development of fire, the Cambrian explosion, etc.  He uses the timing of these events to show that change is accelerating:
&lt;/p&gt;
&lt;p&gt;
&lt;a href="http://en.wikipedia.org/wiki/Image:PPTCanonicalMilestones.jpg"&gt;&lt;img  style="max-width:100%" src="http://upload.wikimedia.org/wikipedia/commons/2/2b/PPTCanonicalMilestones.jpg" /&gt;&lt;/a&gt;
&lt;br /&gt;
Image courtesy of &lt;a href="http://en.wikipedia.org/"&gt;Wikipedia&lt;/a&gt;.
&lt;/p&gt;
&lt;p&gt;
The thing that occurred to me when looking at the choice of events is that it's a natural tendency to view the world logarithmically.  For example, if you ask most Americans about places in the world, they will be able to name the places very close to where they live, the towns nearby, the state, the large cities in the USA, a few very large cities around the world, a few large or important countries around the world, and then places like &amp;ldquo;Africa&amp;rdquo; and &amp;ldquo;Asia&amp;rdquo;.  If you plot the places on a logarithmic chart, you'll get something close to a straight line.  If people name astronomical objects, it will be the ones close to us (like planets), the Sun, some nearby stars, and maybe some galaxies.  But it won't be some planet in some other galaxy.  If people name biological variants, it'll first be the ones close to us (various races of humans), then types of mammals and maybe reptiles, then &amp;ldquo;fish&amp;rdquo;, then &amp;ldquo;bacteria&amp;rdquo;.  It won't start with various species of bacteria or fish.  This is because things that are physically or conceptually farther away are resolved in the brain at a lower &amp;ldquo;resolution&amp;rdquo;.  The closer something is to you, the finer granularity you use to distinguish it from other things.
&lt;/p&gt;
&lt;p&gt;
The same is true for time.  For example, Kurzweil's choice of events includes the Cambrian explosion at a very coarse granularity.  It doesn't include development of limbs, eyes, skeletal system, muscles, or other events that &lt;em&gt;would've been considered significant if the list was developed back then&lt;/em&gt;.  Those changes are all grouped together.  Similarly, if the list had been developed around the time multicellular life developed, it would have included significant achievements like the development of cell walls, a nucleus, ribosomes, etc.
&lt;/p&gt;
&lt;p&gt;
Things that are farther away are resolved in the brain at a lower &amp;ldquo;resolution&amp;rdquo;.  The brain's use of variable resolution means that changes from the past are grouped together into larger units, and that makes it look like change was occurring more slowly in the past.  I do believe that change is accelerating, but it's not accelerating as quickly as Kurzweil believes.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112766793775241832?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112766793775241832/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112766793775241832' title='12 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112766793775241832'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112766793775241832'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/singularity-is-not-near.html' title='The Singularity is Not Near'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>12</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112762724729988257</id><published>2005-09-24T22:25:00.000-07:00</published><updated>2006-09-22T11:08:10.016-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>The Singularity is Near?</title><content type='html'>&lt;p&gt;
Something I don't understand from Ray Kurzweil's arguments about the &amp;ldquo;&lt;a href="http://en.wikipedia.org/wiki/Technological_singularity"&gt;Singularity&lt;/a&gt;&amp;rdquo;: he says that we're in the &amp;ldquo;knee&amp;rdquo; of the growth curve:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
... exponential growth is seductive, starting out slowly and virtually unnoticable, but beyond the knee of the curve it turns explosive and profoundly transformative.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
There's a big problem with this idea.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;&lt;big&gt;Exponential curves do not have knees.&lt;/big&gt;&lt;/strong&gt;
&lt;/p&gt;
&lt;p&gt;
Exponential curves are scale-free.  If you replot them at a different scale, the knee will appear to be in a different place.  Furthermore, the knee will always appear to be near the right edge of the curve, so you'll always think the knee just occurred recently.
&lt;/p&gt;
&lt;p&gt;
I searched Google to find any page on how to define the &amp;ldquo;knee&amp;rdquo; of an exponential curve, but did not find one.  I only found one page that even mentions the issue.  Why aren't people pointing this out?  Am I missing something?  Only &lt;a href="http://www.flickr.com/photos/jurvetson/"&gt;Steve Jurvetson&lt;/a&gt;, in &lt;a href="http://jurvetson.blogspot.com/2004/09/accelerating-change-and-societal-shock.html#c109451307291454223"&gt;a comment on his own blog&lt;/a&gt;, says:
&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;
For almost any issue, the “knee in the curve” occurred in the recent past, and history before that seemed pretty flat. But, of course, there is no knee or inflection point or “hockey stick” in an exponential curve (when plotted on log paper, this more obvious). Roll the clock forward 5 years, plot again, and the perceived “knee” on a linear graph will have moved forward 5 years.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
I'm only on page 10 in Kurzweil's new book, &lt;em&gt;The Singularity is Near&lt;/em&gt; (which I received at the Accelerating Change 2005 conference), and his opening argument is suspect.  This is going to leave a bad taste in my mouth as I read the rest of the book.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112762724729988257?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112762724729988257/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112762724729988257' title='10 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112762724729988257'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112762724729988257'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/singularity-is-near.html' title='The Singularity is Near?'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>10</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112758620110364287</id><published>2005-09-24T11:10:00.000-07:00</published><updated>2006-07-20T03:12:40.916-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Firefox customization: fixing Google Groups</title><content type='html'>&lt;p&gt;
Something that really annoys me about Google Groups is that it wastes tons of horizontal space.  As a result, you can't read 80 column wide messages without wrapping, unless you have a full screen browser.  I don't use a full screen browser.
&lt;/p&gt;
&lt;p&gt;
With Firefox 1.5 and Mozilla 1.8, there's a feature that allows custom CSS rules for specific domains, specific URLs, or specific URL prefixes.  You can also do this with older versions of Firefox and Mozilla with the &lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?id=563"&gt;UriId&lt;/a&gt; extension.  It's like Greasemonkey, but for CSS instead of Javascript.  In &lt;code&gt;&lt;a href="http://kb.mozillazine.org/Profile_folder#Firefox"&gt;userContent.css&lt;/a&gt;&lt;/code&gt;, you can add rules of these forms:
&lt;/p&gt;
&lt;pre&gt;
@-moz-document domain(www.flickr.com), domain(flickr.com) { ... }
@-moz-document url(http://www.flickr.com/photos/amitp/) { ... }
@-moz-document url-prefix(http://www.flickr.com/photos/amitp/) { ... }
&lt;/pre&gt;
&lt;p&gt;
Using this feature, I &amp;ldquo;fixed&amp;rdquo; the thing that annoyed me about Google Groups. 
&lt;/p&gt;
&lt;pre&gt;
@-moz-document domain(groups.google.co.uk), domain(groups.google.com) {
  #rn {
    display: inline ! important;
  }
}
&lt;/pre&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112758620110364287?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112758620110364287/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112758620110364287' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112758620110364287'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112758620110364287'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/firefox-customization-fixing-google.html' title='Firefox customization: fixing Google Groups'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112728179485407737</id><published>2005-09-20T21:58:00.000-07:00</published><updated>2006-06-21T02:39:02.106-07:00</updated><title type='text'>Amusing things at Accelerating Change 2005</title><content type='html'>&lt;p&gt;
Some of the amusing things I saw written on the wall at the &lt;a href="http://accelerating.org/ac2005/"&gt;Accelerating Change 2005 conference&lt;/a&gt;:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;First Post!!1!!1&lt;/li&gt;
&lt;li&gt;When do I get my flying car?&lt;/li&gt;
&lt;li&gt;What is the name of this decade? &lt;i&gt;The &amp;ldquo;aughts&amp;rdquo;&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;Is aging a disease?&lt;/li&gt;
&lt;li&gt;What if the hokey pokey &lt;em&gt;is&lt;/em&gt; all it's about?&lt;/li&gt;
&lt;li&gt;This sentence enjoys you reading this.&lt;/li&gt;
&lt;li&gt;Not everyone here is liberal!&lt;/li&gt;
&lt;li&gt;I want a flying pony!&lt;/li&gt;
&lt;li&gt;What is the matrix?&lt;/li&gt;
&lt;li&gt;Will the computers like us?&lt;/li&gt;
&lt;li&gt;Do you care more about beer than the survival of humankind? How much money do you spend on beer? &lt;i&gt;Enough to survive the transportation to the Vogon destroyer.&lt;/i&gt;&lt;/li&gt;
&lt;li&gt;The end is near!&lt;/li&gt;
&lt;li&gt;99% of people have no idea about singularity or exponential growth.&lt;/li&gt;
&lt;li&gt;In the 10 seconds it took you to laugh about cryonics you died.&lt;/li&gt;
&lt;/ul&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112728179485407737?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112728179485407737/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112728179485407737' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112728179485407737'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112728179485407737'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/amusing-things-at-accelerating-change.html' title='Amusing things at Accelerating Change 2005'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112693511848612475</id><published>2005-09-16T21:49:00.000-07:00</published><updated>2009-08-17T08:37:47.263-07:00</updated><title type='text'>Gas Mileage Rant</title><content type='html'>&lt;p&gt;
Ten years ago, when I bought my last car, it got roughly 35 mpg (highway).  Saturn's gas mileage was going up every model year.  I got the 1995 SL2 and was quite happy with it.  I was spending just $25 per month on gas.  Back then, I saw things were improving every year, and I thought, ten years from now, just about every car will get 35 mpg and I'll find a sporty car that gets at least 40.
&lt;/p&gt;
&lt;p&gt;
Little did I know then how bad things would get.  The first sign for me was when Saturn dropped their SL2 line (which was getting 38 mpg by then) and introduced the new larger, less sporty, lower gas mileage Ion, getting only 33.  Ugh!  But that was minor compared to people switching to SUVs.  Double Ugh!
&lt;/p&gt;
&lt;p&gt;
Now in 2005 I'm looking for something better than average.  It needs to be sporty, have neat technology, and a simple user interface.  I'm very annoyed that few cars get 40 mpg, and &lt;em&gt;very&lt;/em&gt; few sporty cars get good gas mileage.  I ended up choosing the &lt;a href="http://del.icio.us/amitp/a3"&gt;Audi A3&lt;/a&gt;, which isn't quite as good as my old Saturn, but it's sportier and safer.  It gets the same mileage in the city (despite it being 30% heavier, in part due to all the airbags, antilock brakes, traction control, etc.) and worse on the highway.  But it's still over 30 mpg highway, which makes me feel a little better.
&lt;/p&gt;
&lt;p&gt;
But I'm still angry that 30 mpg is not commonplace.  And &lt;a href="http://sfgate.com/cgi-bin/article.cgi?f=/c/a/2005/09/16/DDGKGENKUB1.DTL"&gt;now I see that I'm not the only one who feels this way&lt;/a&gt;.  I disagree with the author of that article though: I don't blame carmakers or the government for this.  Carmakers do what we tell them to do &lt;em&gt;with our money&lt;/em&gt;.  If consumers choose gas mileage over size, carmakers will make cars with better gas mileage.  After all, they're competing for our dollars.  They'll do what &lt;em&gt;we&lt;/em&gt; tell them to do.  Not what we tell them to do with our words, but what we tell them to do with our actions.  Our words are, &amp;ldquo;gas costs too much&amp;rdquo; but our actions are, &amp;ldquo;I'm going to keep buying gas no matter what you charge&amp;rdquo; which translates to &amp;ldquo;I'm willing to pay even more.&amp;rdquo;  If Americans choose size over efficiency, they're saying that efficiency isn't as important as size, so carmakers should focus on size.  That's what carmakers (and all businesses in a free market) should do: provide what the consumer really wants, not what they say they want.
&lt;/p&gt;
&lt;p&gt;
Large, bulky vehicles are not the choice I'm making though.  I've chosen small, sporty, nimble, and better mileage.  Will others choose the same?  It's possible that &lt;a href="http://www.treehugger.com/files/2005/09/hey_we_sometime.php"&gt;high gas prices will get people thinking about fuel efficient cars again&lt;/a&gt;.  I hope so.  You don't need to pay a premium for a hybrid.  Take a look at the Toyota Corolla (32/41), Scion xA (32/37), Pontiac Vibe (30/36), Dodge Neon (29/36), or Honda Civic (36/44).  If you really &amp;ldquo;need&amp;rdquo; an SUV, consider the Toyota RAV4 (24/30), Saturn VUE (23/29), or Honda CRV (23/29).
&lt;/p&gt;
&lt;p&gt;
Even though I generally feel the government should not be forcing people to buy certain kinds of cars, I do think the government should play a role in some aspects of cars, especially when consumers are unable to make good decisions or when others have to pay the costs.  Example: all of the above quoted mpg numbers are somewhat bogus, because the EPA's tests do not reflect realistic driving conditions.  For one thing, they take place in a building and not on the road, so wind resistance (coefficient of drag) does not play a role.  Instead, the EPA &lt;a href="http://www.fueleconomy.gov/feg/how_tested.shtml"&gt;assumes all vehicles have the same air resistance, and uses that to compute the mpg numbers&lt;/a&gt;.  The government's role here should be to provide realistic mileage numbers so that consumers can make better choices.  I also think there are costs (like pollution, carbon dioxide, and noise) that are not paid by the person who chooses the car, and that the government's role here is to transfer those costs to the decisionmaker.  Gasoline taxes are part of this, but there should be fees or taxes for emissions, carbon dioxide, and noise as well.  The cost of accidents is borne by insurance companies, but government should require that car owners have sufficient insurance.  The goal should be to get the best outcome for society via choices freely made by businesses and individuals.  When there's an inefficiency (primarily because one party benefits while another party pays the cost), government should step in and make sure the costs and benefits are apparent and assigned to a decisionmaker.  But that's it.  I don't think government should be telling us to buy certain kinds of cars or to eat low-fat yogurt or to stop smoking.  Government should make sure the benefits and costs of a decision are paid by the decisionmaker and not by someone else.  Government should make sure we have the information we need to make good decisions ourselves.
&lt;/p&gt;
&lt;p&gt;
Do your research. Make good choices.  My Audi A3 should arrive at the end of November.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112693511848612475?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112693511848612475/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112693511848612475' title='5 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112693511848612475'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112693511848612475'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/gas-mileage-rant.html' title='Gas Mileage Rant'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>5</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112689839281009552</id><published>2005-09-16T11:43:00.000-07:00</published><updated>2005-09-16T12:20:33.496-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='future'/><title type='text'>Space Pulleys</title><content type='html'>&lt;p&gt;
With all the talk of space elevators, I had to bring up what I think is a better approach.  The &lt;em&gt;space pulley&lt;/em&gt; is basically two elevators, one going up while one goes down. When you need to launch something into orbit, you put your satellite on the elevator at the bottom, and someone up at the space station puts something even heavier on the elevator at the top.  Gravity pulls the heavy object down and the pulley lifts your object up.  We use friction to keep the speeds reasonable.
&lt;/p&gt;
&lt;p&gt;
What would we want to bring down?
&lt;/p&gt;
&lt;p&gt;
The first thing is space junk.  There's lots of it up there, and you can sell it on eBay.
&lt;/p&gt;
&lt;p&gt;
The second thing, once you've exhausted space junk, is asteroids.  With these, you can lift up really heavy satellites (which will become the space junk of the future), and you can bring down some raw materials which will be worth plenty in the commodities markets.
&lt;/p&gt;
&lt;p&gt;
The third thing, which might be harder to find, is comets.  You can bring some comets down in Egypt to provide fresh water to irrigate the rest of the country.
&lt;/p&gt;
&lt;p&gt;
You might also want to bring things down to harness the gravitational energy.  As with hydroelectric dams, you can generate energy when things fall.
&lt;/p&gt;
&lt;p&gt;
Don't tell me it's impractical.  The description of my blog is &lt;em&gt;Amit has crazy thoughts&lt;/em&gt;, so I'm required to post things like this!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112689839281009552?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112689839281009552/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112689839281009552' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112689839281009552'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112689839281009552'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/space-pulleys.html' title='Space Pulleys'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112688847311512473</id><published>2005-09-16T09:16:00.000-07:00</published><updated>2005-09-16T09:34:33.140-07:00</updated><title type='text'>Weird recruitment emails</title><content type='html'>&lt;p&gt;
Over the past few months I've gotten several emails from recruiters telling me they liked the resume I've posted to the web.  I haven't had a resume on the web for about six years, so I've asked each of them where they saw my resume.  If my resume from six years ago is still posted somewhere, I want to know, because I need to update it.
&lt;/p&gt;
&lt;p&gt;
Each of the recruiters sent back an email without a location of the resume.  One person said she didn't remember.  This recruiter also used "pls" instead of "please".  One person said they had no resume (even though the initial email said that's how they found me), and instead it was some white papers which I "c0-authored" (note the "0").  And one person said they found it through a Google search, even though there are thousands of Amit Patels and there isn't a resume found on Google that links to me.  One mentioned my academic background in AI (I studied programming languages, not AI).  One asked me if I was interested in a job as a marketing manager for a "stone factory in Japan".
&lt;/p&gt;
&lt;p&gt;
Do the companies who have hired these recruiters realize how bad this looks?  I'm not interested in your company if you can't even tell me how you found me, what skills of mine you're interested in, or if you are confusing me with someone else.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112688847311512473?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112688847311512473/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112688847311512473' title='2 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112688847311512473'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112688847311512473'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/weird-recruitment-emails.html' title='Weird recruitment emails'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>2</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112562497190323864</id><published>2005-09-01T18:33:00.000-07:00</published><updated>2006-10-31T11:52:10.676-08:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='howto'/><title type='text'>Font size in Gtk apps under Windows</title><content type='html'>&lt;p&gt;
There are some apps for Windows and Linux that use the &lt;em&gt;Gtk&lt;/em&gt; cross-platform library.  I'm using Gaim (chat/IM) and Gimp (paint) in Windows, and both use Gtk.  Unfortunately Gtk is primarily a Linux library; using it in Windows is sometimes awkward.  In particular, there's no obvious way to change the font size or colors.  That's because in Linux (with Gnome) you use Gnome to change the default colors and fonts.  But in Windows, I'm not using Gnome, so there's no obvious way to do this.
&lt;/p&gt;
&lt;p&gt;
The solution is to find your home directory (&lt;code&gt;C:\Documents and Settings\username&lt;/code&gt;) and create a text file named &lt;code&gt;.gtkrc-2.0&lt;/code&gt; containing this:
&lt;/p&gt;
&lt;pre&gt;
style "win32-font" {
  font_name = "tahoma 12"
}
class "*" style "win32-font"
&lt;/pre&gt;
&lt;p&gt;
Then restart your Gtk-based app.  Thanks to &lt;a href="http://www.async.com.br/faq/pygtk/index.py?req=edit&amp;amp;file=faq21.007.htp"&gt;the PyGtk FAQ&lt;/a&gt; for this tip.  Note that this also works in Linux.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update [2006-01-26]&lt;/strong&gt;: It turns out Windows Explorer (the GUI shell) does not let you create files named &lt;code&gt;.gtkrc-2.0&lt;/code&gt;.  You can either use the DOS window for this, or Save As in your editor (e.g., Notepad).
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112562497190323864?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112562497190323864/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112562497190323864' title='19 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112562497190323864'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112562497190323864'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/09/font-size-in-gtk-apps-under-windows.html' title='Font size in Gtk apps under Windows'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>19</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112493952781461023</id><published>2005-08-24T20:08:00.000-07:00</published><updated>2006-11-08T12:33:02.433-08:00</updated><title type='text'>Online commerce - eleven years ago</title><content type='html'>&lt;p&gt;
I was amused back in 1994 when I heard that &lt;a href="http://groups.google.com/group/comp.infosystems.www.providers/browse_frm/thread/148706ce3387c126/93ca49eb30a97428?rnum=1"&gt;Pizza Hut was taking orders on the Internet&lt;/a&gt;.  I had been on the Internet for many years, but ordering something online (especially pizza!) seemed incredibly strange to me.
&lt;/p&gt;
&lt;p&gt;
It's been eleven years since then.  Look how much you can order online now!  I'm impressed that Pizza Hut was one of the first companies experimenting with "e-commerce".  And despite my friends thinking I'm uncool or have no taste, I really do like Pizza Hut's pizza.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112493952781461023?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112493952781461023/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112493952781461023' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112493952781461023'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112493952781461023'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/08/online-commerce-eleven-years-ago.html' title='Online commerce - eleven years ago'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112412429070364970</id><published>2005-08-15T09:39:00.000-07:00</published><updated>2005-08-15T09:44:50.710-07:00</updated><title type='text'>Friendly lawyer speak</title><content type='html'>&lt;p&gt;
&lt;a href="https://home.ingdirect.com/secure/terms_popup.html"&gt;ING Direct's terms and conditions&lt;/a&gt; are friendlier than I'd expect.  Examples, emphasis mine:
&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;
If an item you deposit is returned to us unpaid or is otherwise charged back to us, we will charge it back to your account. Generally, you can't withdraw a deposit for 5 business days. However, when you first open your account, you won't be able to withdraw any money for the first 10 business days. As with all non-cash deposits, interest will begin to accrue no later than 2 business days after the banking day on which the funds were deposited. &lt;em&gt;(Here's an example - if you make a deposit on a Sunday, we will process it on Monday, and interest will begin to accrue no later than Wednesday.) &lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;Here Comes the REALLY Hardcore Legal Stuff&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
&lt;em&gt;And Finally! Wow, that was a lot of reading. Congratulations for finishing this!&lt;/em&gt;
&lt;/li&gt;
&lt;li&gt;
Pursuant to Federal law, you're only allowed to take money out of your OSA 6 times per monthly statement cycle ("Cycle"). If you repeatedly make more than 6 withdrawals during a Cycle, we may close your account. Under Federal law, we must reserve the right to require you to give us at least 7 days written notice before you take money out of your OSA. &lt;em&gt;(This hardly ever happens but legally we have to say it!)&lt;/em&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;
I wish more companies were like this!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112412429070364970?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112412429070364970/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112412429070364970' title='0 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112412429070364970'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112412429070364970'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/08/friendly-lawyer-speak.html' title='Friendly lawyer speak'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>0</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112401276445868891</id><published>2005-08-14T02:19:00.000-07:00</published><updated>2005-08-14T02:46:06.343-07:00</updated><title type='text'>Activity vs. Passivity</title><content type='html'>&lt;p&gt;
When I think about the things that make me happy, it seems that there are two basic categories.  There's &lt;em&gt;surface&lt;/em&gt; happiness, which comes from things like watching a TV show or eating a good meal, and &lt;em&gt;deep&lt;/em&gt; happiness, which comes from things like building a water fountain or writing a program.
&lt;/p&gt;
&lt;p&gt;
The surface happiness comes from things that are pleasurable or exciting or novel.  These things tend to be something I'm consuming.  The happiness tends to last a short time.  I need a constant stream of these to keep me happy.  I've noticed that I can suffer withdrawal/crash symptoms if I have a lot of these and then I suddenly don't.  For example, one weekend I went to Calistoga with my wife and coworkers.  It was lots of fun.  But when I got back home I was depressed, and I wouldn't have been if I had never gone on that trip.
&lt;/p&gt;
&lt;p&gt;
The deep happiness comes from things that took effort.  These things tend to be something I'm producing.  Actively creating something takes longer but the happiness lasts longer too.  I don't need as many of these to keep me happy, and the entire process of creation makes me happy, not only the end result.  For example, a few years ago I wanted a small water fountain for the backyard.  My mom bought me a fountain and I set it up.  It was fun for a short time. But it didn't make me happy. I decided to read about fountain pumps, water filtering, etc., and then bought some parts myself and built my own fountain.  That made me much happier, even though the end result was pretty similar.  The process matters.
&lt;/p&gt;
&lt;p&gt;
The difference between my two types of happiness can be labeled &lt;em&gt;passive&lt;/em&gt; vs. &lt;em&gt;active&lt;/em&gt;, but I think there's more to it than that.  Although actively producing generally leads to deeper happiness than  passively consuming, I think the real difference is in meaningful decision making.  When I play Diablo, I'm pretty active, but most of that activity doesn't involve meaningful decisions.  The "hack and slash" part of the game is pretty mindless; only the strategy for character development involves decisions that matter.  When I play Civilization, my decisions matter much more.  When I'm finished playing Diablo, I certainly had &lt;em&gt;fun&lt;/em&gt;, but when I'm finished with Civilization, I feel a sense of &lt;em&gt;accomplishment&lt;/em&gt;.  Both take effort and require activity but one makes me happier than the other.
&lt;/p&gt;
&lt;p&gt;
Another thing that seems to make a difference for me is when I use something in a way it wasn't intended to be used.  With the fountain, I used saran wrap, which is not a normal building material for fountains.  When I use something for what it was designed for, it feels like someone else has made the decision, whereas when I use it for something else, I'm the one who made the decision of how it will be used.
&lt;/p&gt;
&lt;p&gt;
I do need both types of happiness, just as I need both &lt;a href="http://www.straightdope.com/classics/a981204b.html"&gt;fast and slow muscle&lt;/a&gt;, but for me, producing things yields much better, much longer lasting happiness than consuming things.
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112401276445868891?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112401276445868891/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112401276445868891' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112401276445868891'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112401276445868891'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/08/activity-vs-passivity.html' title='Activity vs. Passivity'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112287382534513681</id><published>2005-07-31T22:09:00.000-07:00</published><updated>2006-06-27T03:42:50.950-07:00</updated><category scheme='http://www.blogger.com/atom/ns#' term='review'/><title type='text'>Current.TV is clueless</title><content type='html'>&lt;p&gt;
I went to &lt;a href="http://www.current.tv/"&gt;Current.TV's web site&lt;/a&gt; to see what this new TV station was about, what kind of material they showed, and whether I received it.
&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;&lt;strong&gt;What is it about?&lt;/strong&gt; They have an &lt;em&gt;about&lt;/em&gt; link at the bottom. It has &lt;a href="http://www.current.tv/about/"&gt;a reasonable page about them&lt;/a&gt;.  &lt;strong&gt;Good&lt;/strong&gt;.&lt;/li&gt;

&lt;li&gt;&lt;strong&gt;What kinds of shows are on it?&lt;/strong&gt; The main portion of their home page shows what's on now and what's coming on soon.  You can click on a time and it'll show you what's on.  However there's just the name of the show and no description.  Furthermore, the show name (image) is clickable, but nothing happens when you click (at least in Firefox).  It's done in Flash and has lots of graphics and animation but nothing useful.  &lt;strong&gt;Bad&lt;/strong&gt;, but it's possible they just haven't finished the implementation.  &lt;/li&gt;
&lt;li&gt;&lt;strong&gt;How do I watch?&lt;/strong&gt; I wanted to know whether I received this channel.  I clicked on &lt;em&gt;find the channel here&lt;/em&gt;.  It's a pop-up window.  It states, &amp;ldquo;To find out if you get CURRENT, please identify your cable or satellite provider.&amp;rdquo;  So far so good.  I put in my cable provider.  It then wants my name, address, phone number, email address, and year of birth.  &lt;strong&gt;Bad&lt;/strong&gt;.  It considers 1900 to be an invalid birth year.  After I fill out the form, it gives me this:
&lt;blockquote&gt;
&lt;p&gt;
Welcome to CURRENT - a new conversation with TV. Thanks to Comcast we can connect with each other and really interact. Who knew it could be so good? Check out the Studio to find out how to start the convo. Looking forward to it.
&lt;/p&gt;
&lt;p&gt;
If you do not currently subscribe to Comcast and are interested in getting CURRENT, please call 1-800-945-2288.
&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;
This is &lt;em&gt;completely useless&lt;/em&gt;.  What does it even mean?  It didn't answer my question.  It ends up telling me what to do if I do &lt;em&gt;not&lt;/em&gt; subscribe to Comcast, even though I told it that &lt;em&gt;I have Comcast&lt;/em&gt;.  (That's Comcast's 1-800 number.)  &lt;strong&gt;Bad&lt;/strong&gt;.
&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;
Why don't they tell you what kind of programming is on?  Why are they trying to discourage and confuse me when I try to find out how to watch them?  So far I'm not impressed.  When it comes to their web site, they seem clueless.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2005-07-31] I discovered (after discovering that &amp;ldquo;Current TV&amp;rdquo; is very hard to search for) that Comcast does have Current TV in my area, but it costs extra.  Comcast's confusing site does not tell me how much it will cost, nor which package includes it, but from reading various message boards I think I figured out what I would need to order.  It's $23.86/month extra to get Current TV.  I'm not going to pay that much.  Why isn't it in the standard cable package?
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2005-08-01] For Comcast viewers, they no longer have the form you have to fill out to find out how to watch.  And it no longer has the confusing message about Comcast. Yay. For other folk, you still get the stupid form.
&lt;/p&gt;
&lt;p&gt;
&lt;strong&gt;Update:&lt;/strong&gt; [2005-08-02] It turns out not only have they fixed the form, they've &lt;a href="http://current.tv/blog/items/97673.htm"&gt;admitted that it was bad&lt;/a&gt;.  Double Yay!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112287382534513681?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112287382534513681/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112287382534513681' title='1 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112287382534513681'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112287382534513681'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/07/currenttv-is-clueless.html' title='Current.TV is clueless'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>1</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112153617947157208</id><published>2005-07-16T10:38:00.000-07:00</published><updated>2005-07-16T10:49:39.480-07:00</updated><title type='text'>Ambulance boxes</title><content type='html'>&lt;p&gt;
There are cities that allow ambulances and other emergency vehicles to control the traffic lights (turning them green so the ambulance can get to the emergency faster).  This is done with a device called a MIRT (&lt;dfn&gt;MIRT = mobile infrared transmitter&lt;/dfn&gt;).  Eventually troublemakers get a MIRT and start causing trouble.  People love to drive around and never get a red light.
&lt;/p&gt;
&lt;p&gt;
It occurred to me that the problem is that all the MIRTs are the same.  If each MIRT used some sort of encryption, where each ambulance had its own private key, then each traffic light would know which ambulance was passing by.  When a device was stolen, its key could be removed from the list of valid keys, and all copies of that device would be disabled at once.
&lt;/p&gt;
&lt;p&gt;
To make this work, you need all the traffic lights to receive updates periodically.  This could either be networking (WiMax?) or it could be someone driving around with a special device that can update the keys through the MIRT.  Of course, if someone stole &lt;em&gt;that&lt;/em&gt; device, it's trouble!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112153617947157208?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112153617947157208/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112153617947157208' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112153617947157208'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112153617947157208'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/07/ambulance-boxes.html' title='Ambulance boxes'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry><entry><id>tag:blogger.com,1999:blog-5304409.post-112123700138922494</id><published>2005-07-12T23:40:00.000-07:00</published><updated>2005-07-12T23:45:10.510-07:00</updated><title type='text'>AC/DC converters can store charge</title><content type='html'>&lt;p&gt;
&lt;img align=right style="margin: 1em" src="http://photos3.flickr.com/4937608_24584c42b4_m.jpg" width="240" height="180" alt="Fiber optic lamp" /&gt;
&lt;/p&gt;
&lt;p&gt;
I had unplugged my &lt;a href="http://www.flickr.com/photos/amitp/4937608/"&gt;bedside lamp&lt;/a&gt; a few days ago.  I had forgotten that I unplugged it, and tried turning it on tonight.  It turned on momentarily, then went out.  At first I thought the bulb might have gone out, but then I realized &lt;strong&gt;it was unplugged&lt;/strong&gt;.
&lt;/p&gt;
&lt;p&gt;
So why did it turn on momentarily? The AC/DC converter must have stored some charge in there and kept it for the past few days.  Scary!
&lt;/p&gt;&lt;div class="blogger-post-footer"&gt;&lt;img width='1' height='1' src='https://blogger.googleusercontent.com/tracker/5304409-112123700138922494?l=amitp.blogspot.com' alt='' /&gt;&lt;/div&gt;</content><link rel='replies' type='application/atom+xml' href='http://amitp.blogspot.com/feeds/112123700138922494/comments/default' title='Post Comments'/><link rel='replies' type='text/html' href='http://www.blogger.com/comment.g?blogID=5304409&amp;postID=112123700138922494' title='3 Comments'/><link rel='edit' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112123700138922494'/><link rel='self' type='application/atom+xml' href='http://www.blogger.com/feeds/5304409/posts/default/112123700138922494'/><link rel='alternate' type='text/html' href='http://amitp.blogspot.com/2005/07/acdc-converters-can-store-charge.html' title='AC/DC converters can store charge'/><author><name>Amit</name><uri>http://www.blogger.com/profile/12159325271882018300</uri><email>noreply@blogger.com</email><gd:image rel='http://schemas.google.com/g/2005#thumbnail' width='32' height='32' src='http://4.bp.blogspot.com/_kV9ZnGnZL7M/TM2pLUy7aqI/AAAAAAAAD98/b4D2THaPBhM/s1600-R/red_blob.gif'/></author><thr:total>3</thr:total></entry></feed>
