<?xml version="1.0" encoding="utf-8" standalone="yes" ?>
<feed xmlns="http://www.w3.org/2005/Atom">

	<title>Planet PLUG</title>
	<link rel="self" href="http://planet.phillylinux.org/atom.xml"/>
	<link href="http://planet.phillylinux.org/"/>
	<id>http://planet.phillylinux.org/atom.xml</id>
	<updated>2008-11-20T15:30:15+00:00</updated>
	<generator uri="http://www.planetplanet.org/">Planet/2.0 +http://www.planetplanet.org</generator>

	<entry xml:lang="en">
		<title type="html">Elizabeth Bevilacqua Debian Installation Over SSH (Lenny RC1)</title>
		<link href="http://princessleia.com/journal/?p=1357"/>
		<id>http://princessleia.com/journal/?p=1357</id>
		<updated>2008-11-16T21:37:47+00:00</updated>
		<content type="html">&lt;p&gt;The &lt;a href=&quot;http://www.debian.org/devel/debian-installer/News/2008/20081112&quot;&gt;Debian Installer lenny release candidate 1 was released on November 12th&lt;/a&gt;, which inspired me to check it out and give the installation over ssh a try. Installation over ssh has been supported since the Etch installer, but I embarrassingly have to admit that I didn&amp;#8217;t know about it until just recently, and it was just last month that I tried it out for the first time. So this post is more of a &amp;#8220;Look, this thing exists and is neat and easy!&amp;#8221; than a formal how-to for something tricky.&lt;/p&gt;
&lt;p&gt;The screenshots and CD I burned were from Lenny (Testing) which I downloaded &lt;a href=&quot;http://www.debian.org/devel/debian-installer/&quot;&gt;here&lt;/a&gt; this morning, but this is also supported in Debian Etch in a similar way.&lt;/p&gt;
&lt;p&gt;Boot from the CD and in the Installer boot menu select &amp;#8220;Advanced options &amp;gt;&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_1.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_1_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Then select &amp;#8220;Expert install&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_2.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_2_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;The installer will load up and you will be presented with the Debian installer main menu.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_3.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_3_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Since the default language and keyboard are fine to get me going (I can reconfigure them later once I get this going over ssh), I skipped these and went straight for &amp;#8220;Detect and mount CD-ROM&amp;#8221;. When it asked me if I wanted to &lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_4.jpg&quot;&gt;Start PC card services&lt;/a&gt; I selected &amp;#8220;No&amp;#8221; since I&amp;#8217;m not using any PCMCIA cards.&lt;/p&gt;
&lt;p&gt;The next option on the menu is &amp;#8220;Load installer components from CD&amp;#8221;, which you want to select. Browse the list, but for my basic needs the only thing I needed to load up was &amp;#8220;network-console: Continue installation remotely using SSH&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_5.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_5_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Now you&amp;#8217;ll need to get networking going. Select &amp;#8220;Detect network hardware&amp;#8221; and then &amp;#8220;Configure the network&amp;#8221;.&lt;/p&gt;
&lt;p&gt;Next you want to &amp;#8220;Continue installation remotely using SSH&amp;#8221;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_6.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_6_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;This will generate SSH host keys and have you set a remote installation password. Once it has these set up you will be presented with a screen giving you an installer@ipaddress location for the install and an SSH fingerprint. Use these to ssh into the installer!&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_7.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_7_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;Finally - log in from your remote PC and complete the installation.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_8.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/ssh_installer_8_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;I went back and configured keyboard to confirm it was correct and languages so I could add a couple of locales, so don&amp;#8217;t forget to do this if you need to change something about your configuration.&lt;/p&gt;</content>
		<author>
			<name>pleia2</name>
			<uri>http://princessleia.com/journal</uri>
		</author>
		<source>
			<title type="html">pleia2's blog » plug</title>
			<link rel="self" href="http://princessleia.com/journal/?cat=7&amp;feed=atom"/>
			<id>http://princessleia.com/journal/?feed=atom</id>
			<updated>2008-11-17T03:45:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">JonathanD New Job</title>
		<link href="http://sogeekithurts.com/?q=node/3"/>
		<id>http://sogeekithurts.com/3 at http://sogeekithurts.com</id>
		<updated>2008-11-15T14:03:34+00:00</updated>
		<content type="html">&lt;p&gt;Well, it seems I've finally found a new job.  I'll be starting next week, and it should be an awesome opportunity.  More updates to follow!&lt;/p&gt;</content>
		<author>
			<name>JonathanD</name>
			<uri>http://sogeekithurts.com</uri>
		</author>
		<source>
			<title type="html">sogeekithurts.com</title>
			<link rel="self" href="http://sogeekithurts.com/?q=rss.xml"/>
			<id>http://sogeekithurts.com/?q=rss.xml</id>
			<updated>2008-11-20T15:30:10+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">JonathanD Who Am I?</title>
		<link href="http://sogeekithurts.com/?q=node/2"/>
		<id>http://sogeekithurts.com/2 at http://sogeekithurts.com</id>
		<updated>2008-11-13T18:10:28+00:00</updated>
		<content type="html">&lt;p&gt;Welcome to my site.  Yes, it's a goofy name, but I'm a bit of a goofy person. So let me summarize who I am and what I do briefly.&lt;br /&gt;
I am:&lt;br /&gt;
* A single father of two amazing boys.&lt;br /&gt;
* The family Geek (I love those calls asking how to forward an email.)&lt;br /&gt;
* A systems/storage engineer with over 5 years of IT experience.&lt;br /&gt;
* That guy who can't go anywhere without his laptop (Really, though, I just superglued it to my arm!)&lt;br /&gt;
* A freenode staffer. (Since I am a useless coder this makes me feel a bit better about using stuff other people made for free.)&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://sogeekithurts.com/?q=node/2&quot; target=&quot;_blank&quot;&gt;read more&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>JonathanD</name>
			<uri>http://sogeekithurts.com</uri>
		</author>
		<source>
			<title type="html">sogeekithurts.com</title>
			<link rel="self" href="http://sogeekithurts.com/?q=rss.xml"/>
			<id>http://sogeekithurts.com/?q=rss.xml</id>
			<updated>2008-11-20T15:30:10+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Flag variables in Bourne shell programs</title>
		<link href="http://blog.plover.com/prog/sh-flags.html"/>
		<id>tag:blog.plover.com,2008:/prog/sh-flags</id>
		<updated>2008-11-12T17:37:00+00:00</updated>
		<content type="html" xml:lang="en">Who the heck still programs in Bourne shell?  Old farts like me,
occasionally.  Of course, almost every time I do I ask myself why I
didn't write it in Perl.  Well, maybe this will be of some value
to some fart even older than me..&lt;p&gt;

Suppose you want to set a flag variable, and then later you want to
test it.  You probably do something like this:&lt;p&gt;

&lt;pre&gt;
        if &lt;i&gt;some condition&lt;/i&gt;; then
            IS_NAKED=1
        fi

        ...

        if [ &quot;$IS_NAKED&quot; == &quot;1&quot; ]; then
          &lt;i&gt;flag is set&lt;/i&gt;
        else
          &lt;i&gt;flag is not set&lt;/i&gt;
        fi
&lt;/pre&gt;

Or maybe you use &lt;tt&gt;${IS_NAKED:-0}&lt;/tt&gt; or some such
instead of &lt;tt&gt;&quot;$IN_NAKED&quot;&lt;/tt&gt;.  Whatever.&lt;p&gt;

Today I invented a different technique.  Try this on instead:&lt;p&gt;

&lt;pre&gt;
        IS_NAKED=false
        if &lt;i&gt;some condition&lt;/i&gt;; then
            IS_NAKED=true
        fi

        ...

        &lt;span class=&quot;emph&quot;&gt;if $IS_NAKED;&lt;/span&gt; then
          &lt;i&gt;flag is set&lt;/i&gt;
        else
          &lt;i&gt;flag is not set&lt;/i&gt;
        fi
&lt;/pre&gt;

The arguments both for and against it seem to be obvious, so I won't
make them.&lt;p&gt;

I have never seen this done before, but, as I concluded
and R.J.B.&amp;nbsp;Signes
independently agreed, it is obvious once you see it.&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">mikegrb Ruby’s not Ready</title>
		<link href="http://michael.thegrebs.com/2008/11/11/rubys-not-ready/"/>
		<id>http://michael.thegrebs.com/?p=138</id>
		<updated>2008-11-12T03:28:20+00:00</updated>
		<content type="html">&lt;p&gt;Was looking for a specific essay about some of the issues with Ruby to point my boss to and stumbled across this instead, still haven&amp;#8217;t quite finished reading it yet but good stuff.  Increases my desire to further my Python skillz.&lt;/p&gt;
&lt;p&gt;&lt;a href=&quot;http://glyphobet.net/blog/essay/228&quot;&gt;Ruby&amp;#8217;s not Ready at glyphobet&lt;/a&gt;&lt;/p&gt;</content>
		<author>
			<name>mikegrb</name>
			<uri>http://michael.thegrebs.com</uri>
		</author>
		<source>
			<title type="html">hmmm.... » geek</title>
			<link rel="self" href="http://michael.thegrebs.com/tag/geek/feed"/>
			<id>http://michael.thegrebs.com/tag/geek/feed</id>
			<updated>2008-11-12T03:30:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Another note about Gabriel's Horn</title>
		<link href="http://blog.plover.com/math/gabriels-horn-2.html"/>
		<id>tag:blog.plover.com,2008:/math/gabriels-horn-2</id>
		<updated>2008-11-11T05:53:00+00:00</updated>
		<content type="html" xml:lang="en">&lt;img src=&quot;http://pic.blog.plover.com/math/gabriels-horn-2/bars-2.png&quot; align=&quot;right&quot; /&gt;

I forgot to mention &lt;a href=&quot;http://blog.plover.com/math/gabriels-horn.html&quot;&gt;in the
original article&lt;/a&gt; that I think referring to Gabriel's Horn as
&quot;paradoxical&quot; is straining at a gnat and swallowing a camel.&lt;p&gt;

Presumably people think it's paradoxical that the thing should have a
finite volume but an infinite surface area.  But since the horn is
infinite in extent, the infinite surface area should be no
surprise.&lt;p&gt;

The surprise, if there is one, should be that an infinite object might
contain a merely finite volume.  But we swallowed &lt;i&gt;that&lt;/i&gt; gnat a long
time ago, when we noticed that the infinitely wide series of bars
below covers only a finite area when they are stacked up as on the
right.&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/math/gabriels-horn-2/bars-1.png&quot; /&gt;&lt;/p&gt;

The pedigree for &lt;i&gt;that&lt;/i&gt; paradox goes at least back to Zeno, so perhaps
Gabriel's Horn merely shows that there is still some life in it, even after
2,400 years.&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Org-Mode has changed my life!</title>
		<link href="http://yonkeltron.com/2008/11/10/org-mode-has-changed-my-life/"/>
		<id>http://yonkeltron.com/?p=356</id>
		<updated>2008-11-11T03:16:29+00:00</updated>
		<content type="html">&lt;p&gt;As I move more and more of my life into Emacs, the best editor ever to grace God&amp;#8217;s silicon earth, I discover new jewels of computing elegance and productivity. One of the most recent additions to my arsenal is org-mode, the most fantastic tool for keeping my life in order. Initially, I was excited because it &lt;a href=&quot;http://orgmode.org/org.html#TODO-Items&quot;&gt;supports todo lists very well&lt;/a&gt;. After that, I realized what a powerful tool it is for outlines, managing dates and even publishing. I began by reading the &lt;a href=&quot;http://www.linuxjournal.com/article/9116&quot;&gt;LJ article by Abhijeet Chavan&lt;/a&gt; and continued on to watch the &lt;a href=&quot;http://www.youtube.com/watch?v=oJTwQvgfgMM&quot;&gt;Google Tech Talk by &lt;span&gt;Carsten Dominik&lt;/span&gt;&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;Right now, I&amp;#8217;m doing most of my planning, outlining and writing in org-mode. Since org-mode enables you to have an &lt;a href=&quot;http://orgmode.org/org.html#Agenda-Views&quot;&gt;agenda view&lt;/a&gt; which gathers your todo items from multiple files, I can keep tasks associated with their relevant contexts. So, when planning a blog post, I have the research todo items in with my other notes and might keep them &lt;a href=&quot;http://orgmode.org/org.html#Tags&quot;&gt;tagged&lt;/a&gt; as such.&lt;/p&gt;
&lt;p&gt;One of the coolest things about org-mode is that org files are just plain text. All of the fun stuff is added when Emacs uses org-mode to edit the org files themselves. Thus, org-mode files are exceedingly portable and can be read and edited anywhere. However, org-mode has several fantastic exporter engines which allow you to convert org files to a multitude of formats. My personal favorite is org-export-as-html which will convert the file to an HTML document, preserving hierarchy, numbering, bulleting, links and loads more. So, I&amp;#8217;m writing all of my important stuff using org-mode and then just exporting it to HTML to be printed and shared. It makes all of my handouts for meetings and workshops look really sweet and the pages include some JavaScript to make web-viewing easier as well.&lt;/p&gt;
&lt;p&gt;Additionally, I&amp;#8217;m really enjoying using features like the table editor which &lt;a href=&quot;http://orgmode.org/org.html#Tables&quot;&gt;automagically builds plain-text tables&lt;/a&gt; (that&amp;#8217;s right kids, ASCII-only tables!) and takes care of nastiness like resizing, etc. Although I don&amp;#8217;t have a real use for it yet, tables can have formulas which allow them to be used like lightweight spreadsheets and such.&lt;/p&gt;
&lt;p&gt;Other neat features include (but are not limited to):&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&quot;http://orgmode.org/org.html#Hyperlinks&quot;&gt;Hyperlinks&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://orgmode.org/org.html#Properties-and-Columns&quot;&gt;Property drawers&lt;/a&gt; (key-value data)&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://orgmode.org/org.html#Dates-and-Times&quot;&gt;Dates and times&lt;/a&gt;, with one of the best date-input methods in all of Emacs&lt;/li&gt;
&lt;li&gt;&lt;a href=&quot;http://orgmode.org/org.html#Visibility-cycling&quot;&gt;Selective display of document hierarchy using the tab key&lt;/a&gt; as a catch-all trigger for cycling through visibility options.&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Really, it does lots more so for more info, look over &lt;a href=&quot;http://orgmode.org/manual/index.html&quot;&gt;The Org Manual&lt;/a&gt;, check out &lt;a href=&quot;http://orgmode.org&quot;&gt;the website&lt;/a&gt; or view the &lt;a href=&quot;http://orgmode.org/worg/&quot;&gt;Worg&lt;/a&gt;, a sort of distributed wiki-like project using git to sync org files.&lt;/p&gt;
&lt;p&gt;Org-mode made it into Emacs22 and is included by default thereafter. However, the version that came with the &lt;a href=&quot;http://packages.debian.org/lenny/emacs22&quot;&gt;emacs22 package on Debian Lenny&lt;/a&gt; wasn&amp;#8217;t exactly up-to-date so I installed the &lt;a href=&quot;http://packages.debian.org/lenny/org-mode&quot;&gt;org-mode package&lt;/a&gt; and it all worked fine.&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Gabriel's Horn is not so puzzling</title>
		<link href="http://blog.plover.com/math/gabriels-horn.html"/>
		<id>tag:blog.plover.com,2008:/math/gabriels-horn</id>
		<updated>2008-11-10T21:12:00+00:00</updated>
		<content type="html" xml:lang="en">Take the curve &lt;i&gt;y&lt;/i&gt; = 1/&lt;i&gt;x&lt;/i&gt; for &lt;i&gt;x&lt;/i&gt; &amp;ge; 1.
Revolve it around the &lt;i&gt;x&lt;/i&gt;-axis, generating a trumpet-shaped
surface, &quot;Gabriel's Horn&quot;.

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/math/gabriels-horn/Horn.png&quot; /&gt;&lt;/p&gt;

Elementary calculations, with calculus, allow one to show that
although the Horn has finite volume, it has an infinite surface area.
This is considered paradoxical, because it says that although an
infinite amount of paint is required to cover the interior surface of
the horn, the entire interior can be filled up with a &lt;i&gt;finite&lt;/i&gt;
amount of paint.&lt;p&gt;

The calculations themselves do not lend much insight into what is
going on here.  But I recently read a crystal-clear explanation that I
think should be more widely known.&lt;p&gt;



Take out some Play-Doh and roll out a snake.  The surface area of the
snake (neglecting the two ends, which are small) is the product of the
length and the circumference; the circumference is proportional to the
diameter.  The volume is the product of the length and the
cross-sectional area, which is proportional to the square of the
diameter.&lt;p&gt;

&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;Elementary Calculus: An Infinitesimal Approach&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/0871509116&quot;&gt;&lt;img src=&quot;http://www.powells.com/cgi-bin/imageDB.cgi?isbn=0871509116&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;Elementary Calculus: An Infinitesimal Approach&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/0871509116&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/0871509116&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;

Now roll the snake with your hands so that it becomes half as thick as
it was before.  Its diameter decreases by half, so its cross-sectional
area decreases to one-fourth.  Since the volume must remain the same,
the snake is now four times as long as it was before.  And the surface
area, which is the product of the length and the diameter, has
doubled.&lt;p&gt;

As you continue to roll the snake thinner and thinner, the volume
stays the same, but the surface area goes to infinity.&lt;p&gt;

Gabriel's Horn does exactly the same thing, except without the rolling, because
the parts of the Horn that are far from the origin look exactly the
same as very long snakes.&lt;p&gt;

There's nothing going on in the Gabriel's Horn example that isn't also happening
in the snake example, except that in the explanation of Gabriel's Horn, the
situation is obfuscated by calculus.&lt;p&gt;

I read this explanation in H.&amp;nbsp;Jerome Keisler's caclulus textbook.
Keisler's book is an ordinary undergraduate calculus text, except that
instead of basing everything on limits and on limiting processes, it
is based on nonstandard analysis and explicit infinitesimal
quantities.  &lt;a href=&quot;http://www.math.wisc.edu/~keisler/calc.html&quot;&gt;Check it out; it is
available online for free&lt;/a&gt;.  (The discussion of Gabriel's Horn is in chapter 6,
page 356.)&lt;p&gt;

[ Addendum 20081110: &lt;a href=&quot;http://blog.plover.com/math/gabriels-horn-2.html&quot;&gt;A bit
more about this&lt;/a&gt;.&amp;nbsp;]&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Addenda to recent articles 200810</title>
		<link href="http://blog.plover.com/addenda/200810.html"/>
		<id>tag:blog.plover.com,2008:/addenda/200810</id>
		<updated>2008-11-10T17:04:00+00:00</updated>
		<content type="html" xml:lang="en">&lt;ul&gt;

&lt;li&gt;&lt;a name=&quot;numerals&quot;&gt;I&lt;/a&gt; discussed &lt;a href=&quot;http://blog.plover.com/math/ordinals.html&quot;&gt;representing
ordinal numbers in the computer&lt;/a&gt; and expressed doubt that the
following representation truly captured the awesome complexity of the
ordinals:&lt;p&gt;



&lt;pre&gt;
        data Nat = Z | S Nat
        data Ordinal = Zero
                     | Succ Ordinal
                     | Lim (Nat &amp;rarr; Ordinal)
&lt;/pre&gt;

In particular, I asked 
&quot;What about &amp;Omega;, the first uncountable ordinal?&quot;  Several readers
pointed out that the answer to this is quite obvious:  Suppose
&lt;i&gt;S&lt;/i&gt; is some countable sequence of (countable) ordinals.  Then the
limit of the sequence is a countable union of countable sets, and so
is countable, and so is not &amp;Omega;.  Whoops!  At least my intuition
was in the right direction.&lt;p&gt;

Several people helpfully pointed out that the notion I was looking for
here is the &quot;cofinality&quot; of the ordinal, which I had not heard of
before.  Cofinality is fairly simple.  Consider some ordered set &lt;i&gt;S&lt;/i&gt;.  Say
that an element &lt;i&gt;b&lt;/i&gt; is an &quot;upper bound&quot; for an element &lt;i&gt;a&lt;/i&gt;
if &lt;i&gt;a&lt;/i&gt; &amp;le; &lt;i&gt;b&lt;/i&gt;.  A subset of &lt;i&gt;S&lt;/i&gt; is
&lt;i&gt;cofinal&lt;/i&gt; if it contains an upper bound for every element of
&lt;i&gt;S&lt;/i&gt;.  The &lt;i&gt;cofinality&lt;/i&gt; of &lt;i&gt;S&lt;/i&gt; is the minimum
cardinality of  its cofinal subsets, or, what is pretty much the
same thing, the minimum order type of  its cofinal subsets.&lt;p&gt;



So, for example, the cofinality of &amp;omega; is &amp;alefsym;&lt;sub&gt;0&lt;/sub&gt;, or, in the language
of order types, &amp;omega;.  But the cofinality of &amp;omega; + 1 is only 1
(because the subset {&amp;omega;} is cofinal), as is the cofinality of
any successor ordinal.  My question, phrased in terms of cofinality,
is simply whether any ordinal has uncountable cofinality.  As we saw,
&amp;Omega; certainly does.&lt;p&gt;

But some uncountable ordinals have countable cofinality.  For example,
let &amp;omega;&lt;sub&gt;&lt;i&gt;n&lt;/i&gt;&lt;/sub&gt; be the smallest ordinal with
cardinality &amp;alefsym;&lt;sub&gt;&lt;i&gt;n&lt;/i&gt;&lt;/sub&gt; for each &lt;i&gt;n&lt;/i&gt;.  In
particular, &amp;omega;&lt;sub&gt;0&lt;/sub&gt; = &amp;omega;, and &amp;omega;&lt;sub&gt;1&lt;/sub&gt; =
&amp;Omega;.  Then &amp;omega;&lt;sub&gt;&amp;omega;&lt;/sub&gt; is uncountable, but has
cofinality &amp;omega;, since it contains a countable cofinal subset
{&amp;omega;&lt;sub&gt;0&lt;/sub&gt;, &amp;omega;&lt;sub&gt;1&lt;/sub&gt;, &amp;omega;&lt;sub&gt;2&lt;/sub&gt;, ...}.
This is the kind of bullshit that set theorists use to occupy their
time.&lt;p&gt;

A couple of readers brought up George Boolos, who is disturbed by
extremely large sets in something of the same way I am.  Robin Houston
asked me to consider the ordinal number which is the least fixed point
of the &amp;alefsym; operation, that is, the smallest ordinal number
&amp;kappa; such that |&amp;kappa;| = &amp;alefsym;&lt;sub&gt;&amp;kappa;&lt;/sub&gt;.  Another
way to define this is as the limit of the sequence 0, &amp;alefsym;&lt;sub&gt;0&lt;/sub&gt;
&amp;alefsym;&lt;sub&gt;&amp;alefsym;&lt;sub&gt;0&lt;/sub&gt;&lt;/sub&gt;, ... .  M.&amp;nbsp;Houston describes &amp;kappa; as
&quot;large enough to be utterly mind-boggling, but not so huge as to defy
comprehension altogether&quot;.  I agree with the &quot;utterly mind-boggling&quot;
part, anyway.  And yet it has countable cofinality, as witnessed by
the limiting sequence I just gave.&lt;p&gt;

M.&amp;nbsp;Houston says that Boolos uses &amp;kappa; as an example of a set
that is so big that he cannot agree that it really exists.  Set theory
says that it does exist, but somewhere at or before that point, Boolos
and set theory part ways.  M.&amp;nbsp;Houston says that a relevant essay,
&quot;Must we believe in set theory?&quot;  appears in &lt;cite&gt;Logic, Logic, and
Logic&lt;/cite&gt;. I'll have to check it out.&lt;p&gt;

My own discomfort with uncountable sets is probably less nuanced, and
certainly less well thought through.  This is why I presented it as a
fantasy, rather than as a claim or an argument.  Just the sort of
thing for a future blog post, although I suspect that I don't have
anything to say about it that hasn't been said before, more than once.&lt;p&gt;

Finally, a pseudonymous Reddit user brought up &lt;a href=&quot;http://www.cs.chalmers.se/~coquand/ordinal.ps&quot;&gt;a paper of
Coquand, Hancock, and Setzer&lt;/a&gt; that discusses just which ordinals
&lt;i&gt;are&lt;/i&gt; representable by the type defined above.  The answer turns
out to be all the ordinals less than &amp;omega;&lt;sup&gt;&amp;omega;&lt;/sup&gt;.  But
in Martin-L&amp;ouml;f's type theory (about which more this month, I hope)
you can actually represent up to &amp;epsilon;&lt;sub&gt;0&lt;/sub&gt;.  The paper is
&lt;a href=&quot;http://www.cs.chalmers.se/~coquand/ordinal.ps&quot;&gt;&lt;cite&gt;Ordinals
in Type Theory&lt;/cite&gt;&lt;/a&gt; and is linked from &lt;a href=&quot;http://www.cs.chalmers.se/~coquand/type.html&quot;&gt;here&lt;/a&gt;.&lt;p&gt;

Thanks to Robin Houston, Luke Palmer, Simon Tatham, Tim McKenzie,
J&amp;aacute;nos Kr&amp;aacute;mar, Vedran &amp;#268;a&amp;#269;i&amp;#263;, and
Reddit user &quot;apfelmus&quot; for discussing this with me.&lt;p&gt;

&lt;li&gt;&lt;a name=&quot;numerals&quot;&gt;Regarding&lt;/a&gt; &lt;a href=&quot;http://blog.plover.com/lang/numeral-words.html&quot;&gt;homophones of
numeral words&lt;/a&gt;, several readers pointed out that in non-rhotic
dialects, &quot;four&quot; already has four homophones, including &quot;faw&quot; and
&quot;faugh&quot;.  To which I, as a smug rhotician, reply &quot;feh&quot;.&lt;p&gt;

One reader wondered what should be done about homophones of
&quot;infinity&quot;, while another observed that a start has already been
made on &quot;googol&quot;.  These are just the sort of issues my proposed
Institute is needed to investigate.&lt;p&gt;

One clever reader pointed out that &quot;half&quot; has the homophone &quot;have&quot;.  Except
that it's not really a homophone.  Which is just right!&lt;p&gt;

&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/li&gt;&lt;/ul&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd A proposed correction to an inconsistency in English orthography</title>
		<link href="http://blog.plover.com/lang/numeral-words.html"/>
		<id>tag:blog.plover.com,2008:/lang/numeral-words</id>
		<updated>2008-11-10T17:04:00+00:00</updated>
		<content type="html" xml:lang="en">English contains exactly zero homophones of &quot;zero&quot;, if one ignores the
trivial homophone &quot;zero&quot;, as is usually done.&lt;p&gt;

English also contains exactly one homophone of &quot;one&quot;, namely &quot;won&quot;.&lt;p&gt;

English does indeed contain two homophones of &quot;two&quot;: &quot;too&quot; and
&quot;to&quot;.&lt;p&gt;

However, the expected homophones of &quot;three&quot; are missing.  I propose to
rectify this inconsistency.   This is sure to make English orthography
more consistent and therefore easier for beginners to learn.&lt;p&gt;

I suggest the following:&lt;p&gt;

&lt;blockquote&gt;
        thrie&lt;br /&gt;
        threigh&lt;br /&gt;
        thurry&lt;br /&gt;
&lt;/blockquote&gt;

I also suggest the founding of a well-funded institute with the
following mission:&lt;p&gt;

&lt;ol&gt;
&lt;li&gt;Determine the meanings of these three new homophones
&lt;li&gt;Conduct a public education campaign to establish them in common
use
&lt;li&gt;Lobby politicians to promote these new words by legislation,
educational standards, public funding, or whatever other means are appropriate
&lt;li&gt;Investigate the obvious sequel issues: &quot;four&quot; has only &quot;for&quot; and
&quot;fore&quot; as homophones; what should be done about this?
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

Obviously, the director of this institute should be a thoughtful,
far-seeing individual who will not allow his good judgement to be
clouded by the generous
salary.   I refer, of course, to myself.&lt;p&gt;

Happy Halloween.  All Hail Discordia.&lt;p&gt;

[ Addendum 20081106: &lt;a href=&quot;http://blog.plover.com/addenda/200810.html#numerals&quot;&gt;Some readers inexplicably
had nothing better to do than to respond to this ridiculous
article&lt;/a&gt;.&amp;nbsp;]&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Representing ordinal numbers in the computer and elsewhere</title>
		<link href="http://blog.plover.com/math/ordinals.html"/>
		<id>tag:blog.plover.com,2008:/math/ordinals</id>
		<updated>2008-11-10T17:04:00+00:00</updated>
		<content type="html" xml:lang="en">Lately I have been reading Andreas Abel's paper &quot;A semantic analysis
of structural recursion&quot;, because it was a referred to by &lt;a href=&quot;http://www.cs.mdx.ac.uk/staffpages/dat/sblp1.pdf&quot;&gt;David
Turner's paper on total
functional programming&lt;/a&gt;. &lt;p&gt;

The Turner paper is a must-read.  It's about functional programming in
languages where every program is guaranteed to terminate.  This is
more useful than it sounds at first.&lt;p&gt;



Turner's initial point is that the presence of &amp;perp; values in languages
like Haskell spoils one's ability to reason from the program
specification.  His basic example is simple:

&lt;pre&gt;
        loop :: Integer -&gt; Integer
        loop x = 1 + loop x
&lt;/pre&gt;

Taking the function definition as an equation, we subtract (loop x)
from both sides and get

&lt;blockquote&gt;
        0 = 1
&lt;/blockquote&gt;

which is wrong.  The problem is that while subtracting &lt;tt&gt;(loop
x)&lt;/tt&gt; from both sides is valid reasoning over the integers, it's not
valid over the Haskell &lt;tt&gt;Integer&lt;/tt&gt; type, because &lt;tt&gt;Integer&lt;/tt&gt;
contains a &amp;perp; value for which that law doesn't hold: 1 &amp;ne; 0, but 1
+ &amp;perp; = 0 + &amp;perp;.&lt;p&gt;

Before you can use reasoning as simple and as familiar as subtracting
an expression from both sides, you first have to prove that the value
of the expression you're subtracting is not &amp;perp;.&lt;p&gt;

By banishing nonterminating functions, one also banishes &amp;perp; values,
and familiar mathematical reasoning is rescued.&lt;p&gt;

You also avoid a lot of confusing language design issues.  The whole
question of strictness vanishes, because strictness is solely a matter
of what a function does when its argument is &amp;perp;, and now there is no
&amp;perp;.  Lazy evaluation and strict evaluation come to the same thing.
You don't have to wonder whether the logical-or operator is strict in
its first argument, or its second argument, or both, or neither,
because it comes to the same thing regardless.&lt;p&gt;

The drawback, of course, is that if you do this, your language is no
longer Turing-complete.  But that turns out to be less of a problem in
practice than one would expect.  &lt;p&gt;

The paper was so interesting that I am following up several of its
precursor papers, including Abel's paper, about which the Turner paper
says &quot;The problem of writing a decision procedure to recognise
structural recursion in a typed lambda calculus with case-expressions
and recursive, sum and product types is solved in the thesis of
Andreas Abel.&quot;  And indeed it is.&lt;p&gt;



But none of that is what I was planning to discuss.  Rather, Abel
introduces a representation for ordinal numbers that I hadn't thought
much about before.&lt;p&gt;

I will work up to the ordinals via an intermediate example.  Abel
introduces a type &lt;b&gt;Nat&lt;/b&gt; of natural numbers:&lt;p&gt;



&lt;blockquote&gt;
        &lt;b&gt;Nat&lt;/b&gt; = 1 &amp;oplus; &lt;b&gt;Nat&lt;/b&gt;
&lt;/blockquote&gt;
     


The &quot;1&quot; here is not the number 1, but rather a base type that contains
only one element, like Haskell's &lt;tt&gt;()&lt;/tt&gt; type or ML's
&lt;tt&gt;unit&lt;/tt&gt; type.  
For concreteness, I'll write the single value of this type as '&amp;bull;'.&lt;p&gt;

The &amp;oplus; operator is the disjoint sum operator
for types.  The elements of the type &lt;i&gt;S&lt;/i&gt; &amp;oplus; &lt;i&gt;T&lt;/i&gt; have one of
two forms.  They are either  &lt;i&gt;left&lt;/i&gt;(&lt;i&gt;s&lt;/i&gt;) where &lt;i&gt;s&lt;/i&gt;&amp;isin;&lt;i&gt;S&lt;/i&gt; or
&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;t&lt;/i&gt;) where &lt;i&gt;t&lt;/i&gt;&amp;isin;&lt;i&gt;T&lt;/i&gt;.  So 1&amp;oplus;1  is
a type with exactly two values: &lt;i&gt;left&lt;/i&gt;(&amp;bull;) and &lt;i&gt;right&lt;/i&gt;(&amp;bull;).
&lt;p&gt;

The values of &lt;b&gt;Nat&lt;/b&gt; are therefore &lt;i&gt;left&lt;/i&gt;(&amp;bull;), and
&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;n&lt;/i&gt;) for any element &lt;i&gt;n&lt;/i&gt; of &lt;b&gt;Nat&lt;/b&gt;.  So
&lt;i&gt;left&lt;/i&gt;(&amp;bull;), &lt;i&gt;right&lt;/i&gt;(&lt;i&gt;left&lt;/i&gt;(&amp;bull;)),
&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;left&lt;/i&gt;(&amp;bull;))), and so on.   One can get a
more familiar notation by defining:&lt;p&gt;

&lt;table align=&quot;center&quot;&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;0&lt;/b&gt;              &lt;td&gt;= &lt;td&gt;&lt;i&gt;left&lt;/i&gt;(&amp;bull;)
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Succ&lt;/b&gt;(&lt;i&gt;n&lt;/i&gt;) &lt;td&gt;= &lt;td&gt;&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;n&lt;/i&gt;)
&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;

And then one just considers 3 to be an abbreviation for
&lt;b&gt;Succ&lt;/b&gt;(&lt;b&gt;Succ&lt;/b&gt;(&lt;b&gt;Succ&lt;/b&gt;(&lt;b&gt;0&lt;/b&gt;))) as usual.  (In this
explanation, I omitted some technical details about recursive types.)&lt;p&gt;

So much for the natural numbers.  Abel then defines a type of ordinal
numbers, as:




&lt;blockquote&gt;
        &lt;b&gt;Ord&lt;/b&gt; = (1 &amp;oplus; &lt;b&gt;Ord&lt;/b&gt;) &amp;oplus; (&lt;b&gt;Nat&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt;)
&lt;/blockquote&gt;

In this scheme, an ordinal is either &lt;i&gt;left&lt;/i&gt;(&lt;i&gt;left&lt;/i&gt;(&amp;bull;)),
which represents 0, or &lt;i&gt;left&lt;/i&gt;(&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;n&lt;/i&gt;)), which
represents the successor of the ordinal &lt;i&gt;n&lt;/i&gt;, or
&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;f&lt;/i&gt;), which represents the limit ordinal of the
range of the function &lt;i&gt;f&lt;/i&gt;, whose tyoe is &lt;b&gt;Nat&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt;.&lt;p&gt;

We can define abbreviations:&lt;p&gt;

&lt;table align=&quot;center&quot;&gt;
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Zero&lt;/b&gt;              &lt;td&gt;= &lt;td&gt;&lt;i&gt;left&lt;/i&gt;(&lt;i&gt;left&lt;/i&gt;(&amp;bull;))
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Succ&lt;/b&gt;(&lt;i&gt;n&lt;/i&gt;) &lt;td&gt;= &lt;td&gt;&lt;i&gt;left&lt;/i&gt;(&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;n&lt;/i&gt;))
&lt;tr&gt;&lt;td&gt;&lt;b&gt;Lim&lt;/b&gt;(&lt;i&gt;f&lt;/i&gt;)  &lt;td&gt;= &lt;td&gt;&lt;i&gt;right&lt;/i&gt;(&lt;i&gt;f&lt;/i&gt;)
&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/td&gt;&lt;/td&gt;&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;



So 0 = &lt;b&gt;Zero&lt;/b&gt;, 1 = &lt;b&gt;Succ&lt;/b&gt;(0), 
2 = &lt;b&gt;Succ&lt;/b&gt;(1), 
and so on.  If we define a function &lt;i&gt;id&lt;/i&gt; which maps &lt;b&gt;Nat&lt;/b&gt; into &lt;b&gt;Ord&lt;/b&gt; in
the obvious way:

&lt;pre&gt;
        id :: &lt;b&gt;Nat&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt;
        id 0       = &lt;b&gt;Zero&lt;/b&gt;
        id (&lt;i&gt;n&lt;/i&gt; + 1) = &lt;b&gt;Succ&lt;/b&gt;(id &lt;i&gt;n&lt;/i&gt;)
&lt;/pre&gt;

then &amp;omega; = &lt;b&gt;Lim&lt;/b&gt;(&lt;i&gt;id&lt;/i&gt;).  Then we easily get &amp;omega;+1 =
&lt;b&gt;Succ&lt;/b&gt;(&amp;omega;), etc., and the limit of this function is 2&amp;omega;:&lt;p&gt;

&lt;pre&gt;
        plusomega :: &lt;b&gt;Nat&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt;
        plusomega 0       = &lt;b&gt;Lim&lt;/b&gt;(id)
        plusomega (&lt;i&gt;n&lt;/i&gt; + 1) = &lt;b&gt;Succ&lt;/b&gt;(plusomega &lt;i&gt;n&lt;/i&gt;)
&lt;/pre&gt;

We can define an  addition function on ordinals:&lt;p&gt;



&lt;pre&gt;
        &lt;b&gt;+&lt;/b&gt; :: &lt;b&gt;Ord&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt;
        ord &lt;b&gt;+&lt;/b&gt; &lt;b&gt;Zero&lt;/b&gt;    = ord
        ord &lt;b&gt;+&lt;/b&gt; &lt;b&gt;Succ&lt;/b&gt;(&lt;i&gt;n&lt;/i&gt;) = &lt;b&gt;Succ&lt;/b&gt;(ord &lt;b&gt;+&lt;/b&gt; &lt;i&gt;n&lt;/i&gt;)
        ord &lt;b&gt;+&lt;/b&gt; &lt;b&gt;Lim&lt;/b&gt;(&lt;i&gt;f&lt;/i&gt;)  = &lt;b&gt;Lim&lt;/b&gt;(&amp;lambda;&lt;i&gt;x&lt;/i&gt;. ord &lt;b&gt;+&lt;/b&gt; &lt;i&gt;f&lt;/i&gt;(&lt;i&gt;x&lt;/i&gt;))
&lt;/pre&gt;

This gets us another way to make 2&amp;omega;:  2&amp;omega; =
&lt;b&gt;Lim&lt;/b&gt;(&amp;lambda;&lt;i&gt;x&lt;/i&gt;.&lt;tt&gt;id&lt;/tt&gt;(&lt;i&gt;x&lt;/i&gt;) &lt;b&gt;+&lt;/b&gt; &amp;omega;).&lt;p&gt;

        

Then this function multiplies a &lt;b&gt;Nat&lt;/b&gt; by &amp;omega;:&lt;p&gt;

&lt;pre&gt;
        timesomega :: &lt;b&gt;Nat&lt;/b&gt; &amp;rarr; &lt;b&gt;Ord&lt;/b&gt;
        timesomega 0       = &lt;b&gt;Zero&lt;/b&gt;
        timesomega (&lt;i&gt;n&lt;/i&gt; + 1) = &amp;omega; &lt;b&gt;+&lt;/b&gt; (timesomega &lt;i&gt;n&lt;/i&gt;)
&lt;/pre&gt;

and &lt;b&gt;Lim&lt;/b&gt;(&lt;tt&gt;timesomega&lt;/tt&gt;) is &amp;omega;&lt;sup&gt;2&lt;/sup&gt;.  We can go on like this.&lt;p&gt;

But here's what puzzled me.  The ordinals are really, really big.
Much too big to be a set in most set theories.  And even the countable
ordinals are really, really big.  We often think we have a handle on
uncountable sets, because our canonical example is the real numbers,
and real numubers are just decimal numbers, which seem simple enough.
But the set of countable ordinals is full of weird monsters, enough to
convince me that uncountable sets are much harder than most people
suppose.&lt;p&gt;

So when I saw that Abel wanted to define an arbitrary ordinals as a
limit of a &lt;i&gt;countable&lt;/i&gt; sequence of ordinals, I was puzzled.  Can
you really get every ordinal as the limit of a countable sequence of
ordinals?  What about &amp;Omega;, the first uncountable ordinal?&lt;p&gt;

Well, maybe.  I can't think of any reason why not.  But it still
doesn't seem right.  It is a very weird sequence, and one that you
cannot write down.  Because suppose you had a notation for all the
ordinals that you would need.  But because it is a notation, the set
of things it can denote is countable, and so a fortiori the limit of
all the ordinals that it can denote is a countable ordinal, not
&amp;Omega;.&lt;p&gt;

And it's all very well to say that the sequence starts out (0, &amp;omega;,
2&amp;omega;, &amp;omega;&lt;sup&gt;2&lt;/sup&gt;, &amp;omega;&lt;sup&gt;&amp;omega;&lt;/sup&gt;, 
&amp;epsilon;&lt;sub&gt;0&lt;/sub&gt;, &amp;epsilon;&lt;sub&gt;1&lt;/sub&gt;,
&amp;epsilon;&lt;sub&gt;&amp;epsilon;&lt;sub&gt;0&lt;/sub&gt;&lt;/sub&gt;, ...), or whatever, but the
beginning of the sequence is totally unimportant; what is important is
the end, and we have no way to write the end or to even comprehend
what it looks like.&lt;p&gt;

So my question to set theory experts: is &lt;i&gt;every&lt;/i&gt; limit ordinal the
least upper bound of some countable sequence of ordinals?&lt;p&gt;

I hate uncountable sets, and I have a fantasy that in the mathematics
of the 23rd Century, uncountable sets will be looked back upon as a
philosophical confusion of earlier times, like Zeno's paradox, or the
luminiferous aether.  &lt;p&gt;

[ Addendum 20081106: Not every limit ordinal is the least
upper bound of some countable sequence of (countable) ordinals, and my
guess that &amp;Omega; is not was correct, but the proof is so simple that
I was quite embarrassed to have missed it. 
&lt;a href=&quot;http://blog.plover.com/addenda/200810.html#ordinals&quot;&gt;More details here&lt;/a&gt;.&amp;nbsp;]&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">JonathanD Welcome</title>
		<link href="http://sogeekithurts.com/?q=node/1"/>
		<id>http://sogeekithurts.com/1 at http://sogeekithurts.com</id>
		<updated>2008-11-09T14:00:45+00:00</updated>
		<content type="html">&lt;p&gt;The purpose of this site is to further my pursuit of some of the things I enjoy...&lt;/p&gt;</content>
		<author>
			<name>JonathanD</name>
			<uri>http://sogeekithurts.com</uri>
		</author>
		<source>
			<title type="html">sogeekithurts.com</title>
			<link rel="self" href="http://sogeekithurts.com/?q=rss.xml"/>
			<id>http://sogeekithurts.com/?q=rss.xml</id>
			<updated>2008-11-20T15:30:10+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Election results</title>
		<link href="http://blog.plover.com/politics/countdown.html"/>
		<id>tag:blog.plover.com,2008:/politics/countdown</id>
		<updated>2008-11-06T18:51:00+00:00</updated>
		<content type="html" xml:lang="en">Regardless of how you felt about the individual candidates in the
recent American presidential election, and regardless of whether you
live in the United States of America, I hope you can
appreciate the deeply-felt sentiment that pervades this program:&lt;p&gt;

&lt;pre&gt;
        #!/usr/bin/perl

        my $remain = 1232470800 - time();
        $remain &gt; 0 or print(&quot;It's finally over.\n&quot;), exit;

        my @dur;
        for (60, 60, 24, 100000) {
          unshift @dur, $remain % $_;
          $remain -= $dur[0];
          $remain /= $_;  
        }

        my @time = qw(day days hour hours minute minutes second seconds);
        my @s;
        for (0 .. $#dur) {
          my $n = $dur[$_] or next;
          my $unit = $time[$_*2 + ($n != 1)];
          $s[$_] = &quot;$n $unit&quot;; 
        }
        @s = grep defined, @s;

        $s[-1] = &quot;and $s[-1]&quot; if @s &gt; 2;
        print join &quot;, &quot;, @s;
        print &quot;\n&quot;;
&lt;/pre&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">Elizabeth Bevilacqua Philadelphia Ubuntu Intrepid Ibex Release Party! And how we almost got arrested</title>
		<link href="http://princessleia.com/journal/?p=1345"/>
		<id>http://princessleia.com/journal/?p=1345</id>
		<updated>2008-11-04T02:58:27+00:00</updated>
		<content type="html">&lt;p&gt;On Saturday the 1st the Philadelphia team of the &lt;a href=&quot;http://ubuntupennsylvania.org/&quot;&gt;Ubuntu Pennsylvania LoCo&lt;/a&gt; held our release party. Just like last year, we decided to celebrate the release with a Halloween influenced costume party at &lt;a href=&quot;http://www.draketavern.com/&quot;&gt;Drake Tavern&lt;/a&gt; in Jenkintown.&lt;/p&gt;
&lt;p&gt;Drake Tavern is quite the hospitable place for our events, it&amp;#8217;s a pretty family-friendly environment (&lt;a href=&quot;http://meetzoe.blogspot.com/&quot;&gt;Zoe&lt;/a&gt; was our youngest participant &lt;a href=&quot;http://gallery.ubuntupennsylvania.org/main.php?g2_itemId=268&quot;&gt;last year&lt;/a&gt;) and they gave us plenty of space and were tolerant of us spending a few hours there. We had several new folks show up (including one who trekked out from Pittsburgh!) and a few of us dressed up&amp;#8230; I couldn&amp;#8217;t resist a Leia costume, &lt;a href=&quot;http://twitter.com/ssweeny&quot;&gt;ssweeny&lt;/a&gt; as Indiana Jones, &lt;a href=&quot;http://www.chinnodog.com/&quot;&gt;ChinnoDog&lt;/a&gt; as an executioner and &lt;a href=&quot;http://jedijf.blogspot.com/&quot;&gt;jedijf&lt;/a&gt;, the primary organizer of the party, as a satanic priest.&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/intrepid_release_party_1.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/intrepid_release_party_1_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;&lt;center&gt;&lt;a href=&quot;http://princessleia.com/images/journalpics/112008/intrepid_release_party_2.jpg&quot;&gt;&lt;img src=&quot;http://princessleia.com/images/journalpics/112008/intrepid_release_party_2_sm.jpg&quot; alt=&quot;&quot; border=&quot;0&quot; /&gt;&lt;/a&gt;&lt;/center&gt;&lt;/p&gt;
&lt;p&gt;More photos here: &lt;a href=&quot;http://gallery.ubuntupennsylvania.org/main.php?g2_itemId=502&quot;&gt;UbuntuPennsylvania.org Gallery: Ubuntu Intrepid Ibex Release Party&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;As a whole, the party was a blast, but a very unexpected event very early on almost made it end very quickly&amp;#8230;&lt;/p&gt;
&lt;p&gt;Paraphrased from jedijf in IRC, here is what happened:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;So a 14 year old kid who had frequented our IRC channel shows up with his friend and mom, Randy and I are the only ones there, standing outside on their deck above the Ubuntu banner so people know where to come. I am in costume as a priest with the pentagon chain, Ubuntu satanic edition! Randy is of course with his teddy bear. So the mom asks &amp;#8220;When is everyone supposed to get here?&amp;#8221; We tell her &amp;#8220;around 3&amp;#8243; but it&amp;#8217;s now 3:20 ish and no one else is there. Some 20-somethings leave the bar to smoke and she decides this is not the right place for her son, says so and leaves with her son and his friend. I say &amp;#8220;No problem,&amp;#8221; I don&amp;#8217;t want the kid to feel uncomfortable.&lt;/p&gt;
&lt;p&gt;10 minutes later 2 Jenkintown police cars show up. They ask me what am I doing and why am I dressed like that. I say &amp;#8220;It&amp;#8217;s Halloween and we&amp;#8217;re having a party&amp;#8221; and the police ask for some ID. I point out the banner, explain that we we have reservations, but end up going to get ID and some CDs. The police officer checks Randy&amp;#8217;s ID and tells him someone called in a complaint that we were trying to lure young boys. InHisName (another regular of the IRC channel) comes up with his son and the police take his son aside and talk to him. In the end I show the officer my ID and offer him CDs to take back to the station, he only accepted one.&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Wow! I absolutely respect this mother&amp;#8217;s decision to remove her son from a situation she was uncomfortable with, but taking the additional step of calling the police really says a lot about the culture of fear here in the United States. It was a bit upsetting. We&amp;#8217;d rather not restrict attendance of our events based on age (and I&amp;#8217;m positive the &lt;a href=&quot;https://wiki.ubuntu.com/UbuntuYouth&quot;&gt;Ubuntu Youth&lt;/a&gt; folks wouldn&amp;#8217;t be pleased with this either!), and probably won&amp;#8217;t. However we are now more aware of what kinds of things can happen and it has gotten me to think what we can do to prevent this kind of situation in the future.&lt;/p&gt;</content>
		<author>
			<name>pleia2</name>
			<uri>http://princessleia.com/journal</uri>
		</author>
		<source>
			<title type="html">pleia2's blog » plug</title>
			<link rel="self" href="http://princessleia.com/journal/?cat=7&amp;feed=atom"/>
			<id>http://princessleia.com/journal/?feed=atom</id>
			<updated>2008-11-17T03:45:10+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Atypical Typing</title>
		<link href="http://blog.plover.com/talk/atypical-typing.html"/>
		<id>tag:blog.plover.com,2008:/talk/atypical-typing</id>
		<updated>2008-11-03T14:46:00+00:00</updated>
		<content type="html" xml:lang="en">I just got back from Nashville, Tennessee, where I delivered a talk at
&lt;a href=&quot;http://www.oopsla.org/oopsla2008/&quot;&gt;OOPSLA 2008&lt;/a&gt;, my first
talk as an &quot;&lt;a href=&quot;http://www.oopsla.org/oopsla2008/program-overview/invited-speakers.html#ins0000005&quot;&gt;invited
speaker&lt;/a&gt;&quot;. This post is a bunch of highly miscellaneous notes
about the talk.&lt;p&gt;

If you want to skip the notes and just read the talk,
&lt;a href=&quot;http://perl.plover.com/yak/OOPSLA/samples/slide001.html&quot;&gt;here it is&lt;/a&gt;.&lt;p&gt;

&lt;h3&gt;Talk abstract&lt;/h3&gt;

&lt;blockquote&gt;
Many of the shortcomings of Java's type system were addressed by the
addition of generics to Java 5.0. Java's generic types are a direct
outgrowth of research into strong type systems in languages like SML
and Haskell. But the powerful, expressive type systems of research
languages like Haskell are capable of feats that exceed the dreams of
programmers familiar only with mainstream languages.&lt;p&gt;

In this talk I'll give a brief retrospective on the history of type
systems and an introduction to the type system of the Haskell
language, including a remarkable example where the Haskell type
checker diagnoses an infinite loop bug at compile time.&lt;p&gt;
&lt;/p&gt;&lt;/p&gt;&lt;/blockquote&gt;

I did not say in the abstract that the talk was a retread of &lt;a href=&quot;http://perl.plover.com/yak/typing/&quot;&gt;a talk I gave for the Perl
mongers in 1999 titled &quot;Strong Typing Doesn't Have to Suck&lt;/a&gt;.
Nobody wants to hear that.  Still, the talk underwent a major rewrite,
for all the obvious reasons.&lt;p&gt;

In 1999, the claim that strong typing does not have to suck was
surprising news, and particularly so to Perl Mongers.
In 2008, however, this argument has been settled by Java 5, whose type
system demonstrates pretty conclusively that strong typing doesn't
have to suck.  I am not saying that you must like it, and I am not
saying that there is no room for improvement.  Indeed, it's obvious
that the Java 5 type system has room for improvement: if you take the
SML type system of 15 years ago, and whack on it with a hammer until
it's chipped and dinged all over, you get the Java 5 type system; the
SML type system of the early 1990s is ipso facto an improvement.  But
that type system didn't suck, and neither does Java's.&lt;p&gt;

So I took out the arguments about how static typing didn't have to
suck, figuring that most of the OOPSLA audience was already sold on
this point, and took a rather different theme: &quot;Look, this ivory-tower
geekery turned out to be important and useful, and its current
incarnation may turn out to be important and useful in the same way
and for the same reasons.&quot;&lt;p&gt;

In 1999, I talked about Hindley-Milner type systems, and although it
was far from clear at the time that mainstream languages would follow
the path blazed by the HM languages, that was exactly what happened.
So the HM languages, and Haskell in particular, contained some
features of interest, and, had you known then how things would turn
out, would have been worth looking at.  But Haskell has continued to
evolve, and perhaps it &lt;i&gt;still&lt;/i&gt; is worth looking at.&lt;p&gt;


&lt;p&gt;

Or maybe another way to put it: If the adoption of functional
programming ideas into the mainstream took you by surprise, fair
enough, because sometimes these things work out and sometimes they
don't, and sometimes they get adopted and sometimes they don't.  But
if it happens &lt;i&gt;again&lt;/i&gt; and takes you by surprise &lt;i&gt;again&lt;/i&gt;,
you're going to look like a dumbass.  So start paying attention!&lt;p&gt;

&lt;h3&gt;Haskell types are hard to explain&lt;/h3&gt;

I spent most of the talk time running through some simple examples of
Haskell's type inference algorithm, and finished with a really
spectacular example that I first saw in a talk by
Andrew&amp;nbsp;R. Koenig at San Antonio USENIX where the type checker
detects an infinite-loop bug in a sorting function at compile time.
The goal of the 1999 talk was to explain enough of the ML type system
that the audience would appreciate this spectacular example.  The goal
of the 2008 talk was the same, except I wanted to do the examples in
Haskell, because Haskell is up-and-coming but ML is down-and-going.&lt;p&gt;

It is a lot easier to explain ML's type system than it is to explain
Haskell's.  Partly it's because ML is simpler to begin with, but also
it's because Haskell is so general and powerful that there are very
few simple examples!  For example, in SML one can demonstrate:&lt;p&gt;

&lt;pre&gt;
        (* SML *)
        val 3 : int;
        val 3.5 : real;
&lt;/pre&gt;

which everyone can understand.&lt;p&gt;




But in Haskell, &lt;tt&gt;3&lt;/tt&gt; has the type &lt;tt&gt;(Num &lt;i&gt;t&lt;/i&gt;) &amp;rArr;
&lt;i&gt;t&lt;/i&gt;&lt;/tt&gt;, and 
&lt;tt&gt;3.5&lt;/tt&gt; has the type &lt;tt&gt;(Fractional &lt;i&gt;t&lt;/i&gt;) &amp;rArr;
&lt;i&gt;t&lt;/i&gt;&lt;/tt&gt;.  So you can't explain the types of literal numeric
constants without first getting into type classes.&lt;p&gt;

The benefit of this, of course, is that you can write &lt;tt&gt;3 + 3.5&lt;/tt&gt;
in Haskell, and it does the right thing, whereas in ML you get a type
error.  But it sure does make it a devil to explain.&lt;p&gt;

Similarly, in SML you can demonstrate some simple monomorphic
functions:

&lt;pre&gt;
	  not : bool &amp;rarr; bool
	 real : int &amp;rarr; real
	 sqrt : real &amp;rarr; real
	floor : real &amp;rarr; int
&lt;/pre&gt;

Of these, only &lt;tt&gt;not&lt;/tt&gt; is simple in Haskell:&lt;p&gt;

&lt;pre&gt;
            not :: Bool &amp;rarr; Bool
    fromInteger :: (Num a) &amp;rArr; Integer &amp;rarr; a    -- analogous to 'real'
           sqrt :: (Floating a) &amp;rArr; a &amp;rarr; a
          floor :: (RealFrac a, Integral b) &amp;rArr; a &amp;rarr; b
&lt;/pre&gt;

There are very few monomorphic functions in the Haskell standard
prelude.&lt;p&gt;

&lt;h3&gt;Slides&lt;/h3&gt;

I'm still using the same slide-generation software I used in 1999,
which makes me happy.  It's a giant pile of horrible hacks, possibly
the worst piece of software I've ever written.  I'd like to hold it up
as an example of &quot;worse is better&quot;, but actually I think it only
qualifies for &quot;bad is good enough&quot;.  I should write a blog article
about this pile of hacks, just to document it for future
generations.&lt;p&gt;

&lt;h3&gt;Conference plenary sessions&lt;/h3&gt;

This was the first &quot;keynote session&quot; I had been to at a conference in
several years.  One of the keynote speakers at a conference I attended
was such a tedious, bloviating windbag that I walked out and swore I
would never attend another conference plenary session.  And I kept
that promise until last week, when I had to attend, because now
&lt;i&gt;I&lt;/i&gt; was not only the bloviating windbag behind the lectern, but
an oath-breaker to boot.  This is the &quot;shameful confession&quot; alluded to
on slide 3.&lt;p&gt;

&lt;h3&gt;On the other hand...&lt;/h3&gt;

&lt;a href=&quot;http://lispy.wordpress.com/2008/07/02/oopsla-2008-in-nashville-lets-go/&quot;&gt;One
of the highest compliments I've ever received&lt;/a&gt;.  It says &quot;John
McCarthy will be there.  Mark Jason Dominus, too.&quot;  Wow, I'm almost in
the same paragraph with John McCarthy.&lt;p&gt;

McCarthy didn't actually make it, unfortunately.  But I did get to
meet Richard Gabriel and Gregor Kiczales.  And Daniel Weinreb,
although I didn't know who he was before I met him.  But now I'm glad
I met Daniel Weinreb.  During my talk I digressed to say that anyone
who is appalled by Perl's regular expression syntax should take a look
at Common Lisp's &lt;a href=&quot;http://www.cs.cmu.edu/Groups/AI/html/cltl/clm/node200.html&quot;&gt;&lt;tt&gt;format&lt;/tt&gt;
feature&lt;/a&gt;, which is even more appalling, in much the same way.  And
Weinreb, who had been sitting in the front row and taking copious
notes, announced &quot;I wrote &lt;tt&gt;format&lt;/tt&gt;!&quot;.  &lt;p&gt;

&lt;h3&gt;More explaining of jokes&lt;/h3&gt;

As I get better at giving conference talks, the online slides
communicate less and less of the amusing part of the content.  You
might find it interesting to compare &lt;a href=&quot;http://perl.plover.com/yak/typing/&quot;&gt;the 1999 version of this
talk&lt;/a&gt; with &lt;a href=&quot;http://perl.plover.com/yak/OOPSLA/&quot;&gt;the 2008
version&lt;/a&gt;.&lt;p&gt;

One joke, however, is too amusing to leave out.  At the start of the
talk, I pretended to have forgotten my slides.  &quot;No problem,&quot; I said.
&quot;All my talks these days are generated automatically by the computer
anyway.  I'll just rebuild it from scratch.&quot;  I then displayed &lt;a href=&quot;http://pic.blog.plover.com/talk/atypical-typing/autogenerate.html&quot;&gt;this form&lt;/a&gt;, which initialliy
looked like this:&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/talk/atypical-typing/autogenerate-1.png&quot; /&gt;&lt;/p&gt;

I then filled out the form appropriately for OOPSLA: &lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/talk/atypical-typing/autogenerate-2.png&quot; /&gt;&lt;/p&gt;

I pushed the button, and poof!  Instant slides.&lt;p&gt;

&lt;h3&gt;Wadler's anecdote&lt;/h3&gt;

I had the chance to talk to Philip Wadler, one of the designers of
Haskell and of the Java generics system, before the talk.  I asked him
about the history of the generics feature, and he told me the
following story: At this point in the talk I repeated an anecdote that
Wadler told me. After he and Odersky had done the work on generics in
their &lt;tt&gt;gj&lt;/tt&gt; and &quot;Pizza&quot; projects, Odersky was hired by Sun to
write the new Java compiler. Odersky thought the generics were a good
idea, so he put them into the compiler. At first the Sun folks always
ran the compiler with the generics turned off.  But they couldn't rip
out the generics support completely, because they needed it in the
compiler in order to get it to compile its own source code, which
Odersky had written with generics. So Sun had to leave the feature
in, and eventually they started using it, and eventually they decided
they liked it.  I related this story in the talk, but it didn't make
it onto the slides, so I'm repeating it here.&lt;p&gt;

I had never been to OOPSLA, so I also asked Wadler what the OOPSLA
people would want to hear about.  He mentioned STM, but since I don't
know anything about STM I didn't say anything about it.&lt;p&gt;

&lt;h3&gt;View it online&lt;/h3&gt;

&lt;a href=&quot;http://perl.plover.com/yak/OOPSLA/samples/slide001.html&quot;&gt;The slides are
online&lt;/a&gt;.&lt;p&gt;

[ Addendum 20081031: Thanks to a Max Rabkin for pointing
out that Haskell's analogue of &lt;tt&gt;real&lt;/tt&gt; is &lt;tt&gt;fromInteger&lt;/tt&gt;.
I don't know why this didn't occur to me, since I mentioned it in the
talk.  Oh well.&amp;nbsp;]&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">mikegrb Quick &amp;amp; Easy Temperature Logging with the Arduino</title>
		<link href="http://michael.thegrebs.com/2008/11/02/arduino-temperature-logging/"/>
		<id>http://michael.thegrebs.com/?p=137</id>
		<updated>2008-11-03T03:29:50+00:00</updated>
		<content type="html">&lt;p&gt;&lt;strong&gt;Basic Voltage Divider with a Thermistor:&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;&lt;img src=&quot;http://thegrebs.com/~michael/therm-vd.png&quot; alt=&quot;Thermistor Voltage Divider Schematic&quot; class=&quot;alignleft&quot; /&gt;&lt;/p&gt;
&lt;p&gt;Typical voltage divider, matched would have made better sense but the thermistor was a random one salvaged from consumer electronics so I didn&amp;#8217;t know the value in advance.&lt;/p&gt;
&lt;p&gt;Would work just fine like this with TP1 connected to an Arduino analog input and Vcc and GND connected.  Energy savings for the win though, connected the top of the divider (Vcc) to a digital pin on the Arduino.  Set the pin HIGH when you want to take a reading, LOW the rest of the time.  Now the divider is not consuming power when a reading isn&amp;#8217;t being taken.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Arduino Code&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;textmate-source black_pearl&quot;&gt;&lt;span class=&quot;source source_c&quot;&gt;&lt;span class=&quot;storage storage_type storage_type_c&quot;&gt;int&lt;/span&gt; pinDivEn   = &lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;4&lt;/span&gt;;
&lt;span class=&quot;storage storage_type storage_type_c&quot;&gt;int&lt;/span&gt; pinDivRead = &lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;1&lt;/span&gt;;
&lt;span class=&quot;storage storage_type storage_type_c&quot;&gt;int&lt;/span&gt; pinLED     = &lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;13&lt;/span&gt;;

&lt;span class=&quot;storage storage_type storage_type_c&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;meta meta_function meta_function_c&quot;&gt; &lt;span class=&quot;entity entity_name entity_name_function entity_name_function_c&quot;&gt;setup&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_c&quot;&gt;()&lt;/span&gt;&lt;/span&gt; {
    Serial.begin(&lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;9600&lt;/span&gt;);
    pinMode(pinLED, OUTPUT);
    pinMode(pinDivEn, OUTPUT);
    Serial.println(&lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_c&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_c&quot;&gt;&amp;#8220;&lt;/span&gt;READY&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_c&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;);
}

&lt;span class=&quot;storage storage_type storage_type_c&quot;&gt;void&lt;/span&gt;&lt;span class=&quot;meta meta_function meta_function_c&quot;&gt; &lt;span class=&quot;entity entity_name entity_name_function entity_name_function_c&quot;&gt;loop&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_c&quot;&gt;()&lt;/span&gt;&lt;/span&gt; {
    &lt;span class=&quot;keyword keyword_control keyword_control_c&quot;&gt;if&lt;/span&gt;&lt;span class=&quot;meta meta_function meta_function_c&quot;&gt; &lt;span class=&quot;punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_c&quot;&gt;(&lt;/span&gt;Serial.available(&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_c&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &amp;gt; &lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;0&lt;/span&gt;) {
        digitalWrite(pinDivEn, HIGH);
        digitalWrite(pinLED, HIGH);
        delay(&lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;100&lt;/span&gt;);
        &lt;span class=&quot;keyword keyword_control keyword_control_c&quot;&gt;while&lt;/span&gt;&lt;span class=&quot;meta meta_function meta_function_c&quot;&gt; &lt;span class=&quot;punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_c&quot;&gt;(&lt;/span&gt;Serial.available(&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_parameters punctuation_definition_parameters_c&quot;&gt;)&lt;/span&gt;&lt;/span&gt; &amp;gt; &lt;span class=&quot;constant constant_numeric constant_numeric_c&quot;&gt;0&lt;/span&gt;)
            &lt;span class=&quot;storage storage_type storage_type_c&quot;&gt;int&lt;/span&gt; serByte = Serial.read();
        Serial.println(analogRead(pinDivRead));
        digitalWrite(pinDivEn, LOW);
        digitalWrite(pinLED, LOW);
    }
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;pinDivEn is the divider enable pin (Vcc), pinDivRead is the analog input connected to TP1 in the divider, pinLED is is a digital pin with an LED that is lit while a reading is taken.&lt;/p&gt;
&lt;p&gt;Once the Arduino boots it sends READY on the serial port at 9600 bps.  It then waits for any data to be available on the serial port, when bytes are available, the voltage divider is enabled, the LED is lit, the bytes on the serial port are consumed, the value of TP1 is read and then written to the serial port, the divider enable pin is brought back low and the led is extinguished.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Perl Code&lt;/strong&gt;&lt;/p&gt;
&lt;pre class=&quot;textmate-source black_pearl&quot;&gt;&lt;span class=&quot;source source_perl&quot;&gt;&lt;span class=&quot;meta meta_comment meta_comment_full-line meta_comment_full-line_perl&quot;&gt;&lt;span class=&quot;comment comment_line comment_line_number-sign comment_line_number-sign_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_perl&quot;&gt;#&lt;/span&gt;!/usr/bin/perl
&lt;/span&gt;&lt;/span&gt;
&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;use&lt;/span&gt; strict;
&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;use&lt;/span&gt; warnings;

&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;use&lt;/span&gt; IO::Handle;
&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;use&lt;/span&gt; Device::SerialPort;

&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;dev&lt;/span&gt; = &lt;span class=&quot;support support_function support_function_perl&quot;&gt;tie&lt;/span&gt; (*FH, &lt;span class=&quot;string string_quoted string_quoted_single string_quoted_single_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8216;&lt;/span&gt;Device::SerialPort&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8216;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;/dev/tty.usbserial-A4001JwW&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;)
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;|| &lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;die&lt;/span&gt; &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;Can&amp;#8217;t tie: &lt;span class=&quot;variable variable_other variable_other_predefined variable_other_predefined_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;!&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;;

&lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;dev&lt;/span&gt;&lt;span class=&quot;keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_perl&quot;&gt;-&amp;gt;&lt;/span&gt;baudrate(9600);
&lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;dev&lt;/span&gt;&lt;span class=&quot;keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_perl&quot;&gt;-&amp;gt;&lt;/span&gt;databits(8);
&lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;dev&lt;/span&gt;&lt;span class=&quot;keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_perl&quot;&gt;-&amp;gt;&lt;/span&gt;parity(&lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;none&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;);
&lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;dev&lt;/span&gt;&lt;span class=&quot;keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_perl&quot;&gt;-&amp;gt;&lt;/span&gt;stopbits(1);

&lt;span class=&quot;support support_function support_function_perl&quot;&gt;open&lt;/span&gt; (&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;log&lt;/span&gt;, &lt;span class=&quot;string string_quoted string_quoted_single string_quoted_single_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8216;&lt;/span&gt;&amp;gt;&amp;gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8216;&lt;/span&gt;&lt;/span&gt;, &lt;span class=&quot;string string_quoted string_quoted_single string_quoted_single_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8216;&lt;/span&gt;ohms.log&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8216;&lt;/span&gt;&lt;/span&gt;) || &lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;die&lt;/span&gt; &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;can&amp;#8217;t open: &lt;span class=&quot;variable variable_other variable_other_predefined variable_other_predefined_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;!&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;log&lt;/span&gt;&lt;span class=&quot;keyword keyword_operator keyword_operator_comparison keyword_operator_comparison_perl&quot;&gt;-&amp;gt;&lt;/span&gt;autoflush(1);

&lt;span class=&quot;meta meta_comment meta_comment_full-line meta_comment_full-line_perl&quot;&gt;&lt;span class=&quot;comment comment_line comment_line_number-sign comment_line_number-sign_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_perl&quot;&gt;#&lt;/span&gt; wait for arduino to boot
&lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;while&lt;/span&gt; (1) {
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;val&lt;/span&gt; = &amp;lt;FH&amp;gt;;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;last&lt;/span&gt; &lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;if&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;val&lt;/span&gt;;
}

&lt;span class=&quot;support support_function support_function_perl&quot;&gt;print&lt;/span&gt; FH &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;1&lt;span class=&quot;constant constant_character constant_character_escape constant_character_escape_perl&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;while&lt;/span&gt; (1) {
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;val&lt;/span&gt; = &amp;lt;FH&amp;gt;;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;next&lt;/span&gt; &lt;span class=&quot;keyword keyword_control keyword_control_perl&quot;&gt;unless&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;val&lt;/span&gt;;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;support support_function support_function_perl&quot;&gt;chomp&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;val&lt;/span&gt;;

&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;vR2&lt;/span&gt; = &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;val&lt;/span&gt; / 1023 * 5;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;vR1&lt;/span&gt; = 5 - &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;vR2&lt;/span&gt;;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;i&lt;/span&gt;   = &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;vR1&lt;/span&gt; / 1_000 * 1_000;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;storage storage_modifier storage_modifier_perl&quot;&gt;my&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;R2&lt;/span&gt;  = &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;vR2&lt;/span&gt; / &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;i&lt;/span&gt;;

&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;support support_function support_function_perl&quot;&gt;print&lt;/span&gt; &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;log&lt;/span&gt; &lt;span class=&quot;support support_function support_function_perl&quot;&gt;time&lt;/span&gt; . &lt;span class=&quot;string string_quoted string_quoted_single string_quoted_single_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8216;&lt;/span&gt; &lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8216;&lt;/span&gt;&lt;/span&gt; . &lt;span class=&quot;variable variable_other variable_other_readwrite variable_other_readwrite_global variable_other_readwrite_global_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_variable punctuation_definition_variable_perl&quot;&gt;$&lt;/span&gt;R2&lt;/span&gt; . &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;span class=&quot;constant constant_character constant_character_escape constant_character_escape_perl&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;comment comment_line comment_line_number-sign comment_line_number-sign_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_comment punctuation_definition_comment_perl&quot;&gt;#&lt;/span&gt; printf(&amp;#8221;V_R2=%.2fV, i=%.2fmA  R2=%.2fK&amp;amp;#8486;\n&amp;#8221;, $vR2, $i, $R2);
&lt;/span&gt;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;support support_function support_function_perl&quot;&gt;sleep&lt;/span&gt; 10;
&lt;span class=&quot;meta meta_leading-tabs&quot;&gt;&lt;span class=&quot;meta meta_odd-tab&quot;&gt;    &lt;/span&gt;&lt;/span&gt;&lt;span class=&quot;support support_function support_function_perl&quot;&gt;print&lt;/span&gt; FH &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_perl&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_perl&quot;&gt;&amp;#8220;&lt;/span&gt;1&lt;span class=&quot;constant constant_character constant_character_escape constant_character_escape_perl&quot;&gt;\n&lt;/span&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_perl&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;;
}&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;Opens the serial port, waits for something (the Arduino sending &amp;#8216;READY&amp;#8217; but it pays no attention to what) on the serial port then every 10 seconds sends a 1\n to the Arduino prompting it to send a value.  The result of analogRead is an integer from 0 - 1023 so this is converted to a voltage.  The current through the divider is found allowing the resistance of the thermistor to be solved for.  The resistance and time are written to a space separated log file.  If the thermistor wasn&amp;#8217;t unknown it would make more sense to solve for the actual temp using the Steinhart–Hart equation or similar and logging that rather than the resistance.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Sample log file entries&lt;/strong&gt;&lt;br /&gt;
&lt;code&gt;1224349429 10.1195652173913&lt;br /&gt;
1224349439 10.3666666666667&lt;br /&gt;
1224349449 10.3666666666667&lt;br /&gt;
1224349459 10.3666666666667&lt;br /&gt;
1224349469 10.4943820224719&lt;br /&gt;
1224349479 10.3666666666667&lt;br /&gt;
1224349489 10.2417582417582&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;A few lines in a text file gets us a graph from the log file by way of GnuPlot:&lt;/p&gt;
&lt;pre class=&quot;textmate-source black_pearl&quot;&gt;&lt;span class=&quot;source source_apache-config&quot;&gt;set term png transparent nocrop enhanced font &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;./arial.ttf&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt; 9 size 800, 600
set xdata time
set timefmt &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;%s&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;
set format x &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;%m/%d %H:%M&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;
set xtics  rotate by -45
set title &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;Thermistor Value&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;
set xlabel &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;Date/Time&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;
set ylabel &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;Resistance (kOhms)&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;
set grid
set output &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;ohms.png&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt;
plot \
    &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;ohms.log&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt; using 1:2 title &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;10 sec interval readings&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt; linecolor 2, \
    &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;ohms.log&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt; using 1:2 title &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;Bezier fit curve&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt; smooth bezier linecolor 4 lw 2, \
    10 title &lt;span class=&quot;string string_quoted string_quoted_double string_quoted_double_apache-config&quot;&gt;&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_begin punctuation_definition_string_begin_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;77 F&lt;span class=&quot;punctuation punctuation_definition punctuation_definition_string punctuation_definition_string_end punctuation_definition_string_end_apache-config&quot;&gt;&amp;#8220;&lt;/span&gt;&lt;/span&gt; lw 2 linecolor 1
&lt;/span&gt;&lt;/pre&gt;
&lt;p&gt;&lt;img src=&quot;http://thegrebs.com/~michael/ohms.png&quot; alt=&quot;GnuPlot Graph of Time vs Resistance&quot; class=&quot;alignnone&quot; /&gt;&lt;/p&gt;</content>
		<author>
			<name>mikegrb</name>
			<uri>http://michael.thegrebs.com</uri>
		</author>
		<source>
			<title type="html">hmmm.... » geek</title>
			<link rel="self" href="http://michael.thegrebs.com/tag/geek/feed"/>
			<id>http://michael.thegrebs.com/tag/geek/feed</id>
			<updated>2008-11-12T03:30:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron And, let&amp;#8217;s not forget the many failures of Apple</title>
		<link href="http://yonkeltron.com/2008/10/30/and-lets-not-forget-the-many-failures-of-apple/"/>
		<id>http://yonkeltron.com/?p=338</id>
		<updated>2008-10-30T23:47:38+00:00</updated>
		<content type="html">&lt;p&gt;For reasons I really don&amp;#8217;t understand, people really like Apple these days. I&amp;#8217;ve long felt that they offer an overpriced product which are generally inferior to similar products on the market. Still, simply because the iPod is popular, people assume it&amp;#8217;s good. So too, do people have a positive opinion of the iPhone. With a little luck and some common sense, devices running Android will offer up some serious competition and hopefully displace the iPhone, for the good of the consumer. In fact, I&amp;#8217;ve often been very angry at Apple for selling products which I consider to be technologically inferior, much in the same way that I&amp;#8217;ve become angry with Microsoft for the embarrasment that is the Windows family.&lt;/p&gt;
&lt;p&gt;In any case, there is an article in &lt;a href=&quot;http://www.forbes.com/personaltech/2008/10/29/apple-product-flops-tech-personal-cx_ag_1030apple_slide_2.html?thisSpeed=15000&quot;&gt;Forbes about ten of the biggest Apple failures&lt;/a&gt;. Enjoy it.&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron My Hacker Key</title>
		<link href="http://yonkeltron.com/2008/10/28/my-hacker-key/"/>
		<id>http://yonkeltron.com/?p=333</id>
		<updated>2008-10-29T03:35:57+00:00</updated>
		<content type="html">&lt;p&gt;It&amp;#8217;s been far-past time to replace the &lt;a href=&quot;http://en.wikipedia.org/wiki/Geek_Code&quot;&gt;Geek Code&lt;/a&gt;, so I&amp;#8217;m very glad that I discovered the &lt;a href=&quot;http://en.wikipedia.org/wiki/Hacker_Key&quot;&gt;Hacker Key&lt;/a&gt;. My key:&lt;/p&gt;
&lt;blockquote&gt;&lt;p&gt;v4sw6/7ALRU$hw4ln5+7pr5FOP$ck0ma0u8Lw2m1l7Di6e4t5NTVb8ADHKMOPRen5a2Xs0r5$p-2.38/-2.31g5G hackerkey.com&lt;/p&gt;&lt;/blockquote&gt;
&lt;p&gt;Make your own, at &lt;a href=&quot;http://www.hackerkey.com&quot;&gt;hackerkey.com&lt;/a&gt;!&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Saving myself lots of bandwidth with apt-proxy</title>
		<link href="http://yonkeltron.com/2008/10/19/saving-myself-lots-of-bandwidth-with-apt-proxy/"/>
		<id>http://yonkeltron.com/?p=320</id>
		<updated>2008-10-19T18:49:35+00:00</updated>
		<content type="html">&lt;p&gt;I have at least 3 machines running Debian on my network at any given time and I&amp;#8217;m using Debian testing (currently Lenny) because it&amp;#8217;s so close to being stable anyway. Still, there are plenty of updates on a regular basis and keeping my machines up to date is a rather big drain on my network connection considering that machines share basic packages anyway.&lt;/p&gt;
&lt;p&gt;I looked around and found a wonderful tool called &lt;a href=&quot;http://apt-proxy.sourceforge.net/&quot;&gt;apt-proxy&lt;/a&gt; which will act as both intelligent cache and partial mirror for machines on a network. You set up apt-proxy on one machine with the names of whatever package repositories you want to use along with a few other settings.  I got some pointers from a &lt;a href=&quot;http://www.debian-administration.org/articles/406&quot;&gt;wonderful article at Debian Administration&lt;/a&gt; by &lt;a href=&quot;http://www.steve.org.uk/&quot;&gt;Steve&lt;/a&gt; when I was messing with the default config provided with the package. Once that&amp;#8217;s all set up, you change all of the other machines&amp;#8217; sources.list point to the apt-proxy mirror you just set up. Then machines requests will get intelligently filtered through apt-proxy and duplicate packages will be cached for multiple machines. It&amp;#8217;s great because it makes subsequent updates faster and simplifies mirror management on different machines. I could see this being very handy for clusters and doing large installs.&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Finally broke down, joined Twitter</title>
		<link href="http://yonkeltron.com/2008/10/16/finally-broke-down-joined-twitter/"/>
		<id>http://yonkeltron.com/?p=317</id>
		<updated>2008-10-16T04:21:48+00:00</updated>
		<content type="html">&lt;p&gt;After months of being above it all, I have finally so broken down and got a Twitter account. I have a widget displaying my status on the sidebar of my site and you can follow me directly from my page, &lt;a href=&quot;http://twitter.com/yonkeltron&quot;&gt;http://twitter.com/yonkeltron&lt;/a&gt; whenever you like. I sort of wish that they would bring back the &lt;a href=&quot;http://status.twitter.com/post/53978711/im-not-coming-soon&quot;&gt;Twitter IM&lt;/a&gt; feature which they killed because &lt;a href=&quot;http://chris.quietlife.net/2008/04/10/twitter-and-xmpp/&quot;&gt;Jabber/XMPP integration&lt;/a&gt; would be delightfully wonderful&amp;#8230;&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Why must it be so hard to cluster?</title>
		<link href="http://yonkeltron.com/2008/10/08/why-must-it-be-so-hard-to-cluster/"/>
		<id>http://yonkeltron.com/?p=315</id>
		<updated>2008-10-08T02:30:06+00:00</updated>
		<content type="html">&lt;p&gt;In the past, I&amp;#8217;ve gotten pretty upset by how difficult it is to take advantage of multiple computers on a network for general tasks. In this age of advanced Linux software, I&amp;#8217;m still shocked at how hard it is to cluster machines.&lt;/p&gt;
&lt;p&gt;Let&amp;#8217;s say I have three or so machines on my local network. If the task is something commonplace like encoding audio or compiling, I can use either &lt;a href=&quot;http://packages.debian.org/search?keywords=distmp3&quot;&gt;distmp3&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/Distcc&quot;&gt;distcc&lt;/a&gt;, respectively.&lt;/p&gt;
&lt;p&gt;Alternatively, if I want to share disk space among nodes, I could use a clustered file system such as &lt;a href=&quot;http://en.wikipedia.org/wiki/Lustre_(file_system)&quot;&gt;Lustre&lt;/a&gt; or &lt;a href=&quot;http://en.wikipedia.org/wiki/Global_File_System&quot;&gt;GFS&lt;/a&gt;. After that, I&amp;#8217;d have to put together a &lt;a href=&quot;http://en.wikipedia.org/wiki/Beowulf_(computing)&quot;&gt;more formal&lt;/a&gt; cluster like &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenMosix&quot;&gt;OpenMosix&lt;/a&gt; (now abandoned), &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenSSI&quot;&gt;OpenSSI&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Kerrighed&quot;&gt;Kerreghed&lt;/a&gt; (comparison paper, &lt;a href=&quot;http://hal.inria.fr/inria-00070604/en/&quot;&gt;PDF&lt;/a&gt;) or some other option. The next step is to write my own applications to do something explicitly parallel using any number of options like &lt;a href=&quot;http://en.wikipedia.org/wiki/OpenMP&quot;&gt;OpenMP&lt;/a&gt;, &lt;a href=&quot;http://en.wikipedia.org/wiki/Parallel_Virtual_Machine&quot;&gt;PVM&lt;/a&gt; along with trendy stuff like &lt;a href=&quot;http://en.wikipedia.org/wiki/Hadoop&quot;&gt;hadoop&lt;/a&gt; and &lt;a href=&quot;http://en.wikipedia.org/wiki/MapReduce&quot;&gt;MapReduce&lt;/a&gt;. I can always opt for just doing it by hand using distributed objects for a given language. Apropos, Ruby has positively stellar support for &lt;a href=&quot;http://segment7.net/projects/ruby/drb/introduction.html&quot;&gt;distributed objects&lt;/a&gt; indcluding &lt;a href=&quot;http://www.ruby-doc.org/stdlib/libdoc/rinda/rdoc/index.html&quot;&gt;Rinda&lt;/a&gt;, an implementation of &lt;a href=&quot;http://en.wikipedia.org/wiki/Tuple_space&quot;&gt;tuple-spaces&lt;/a&gt; (ala &lt;a href=&quot;http://en.wikipedia.org/wiki/Linda_(coordination_language)&quot;&gt;Linda&lt;/a&gt;) which provides nifty things (auto-discovery, among &lt;a href=&quot;http://www.datanoise.com/articles/2006/8/24/what-is-rinda-anyway&quot;&gt;other features&lt;/a&gt;). Still, these options don&amp;#8217;t help me build a general usage cluster out of machines.&lt;/p&gt;
&lt;p&gt;Then there are the tools to control the actions of the machines remotely like &lt;a href=&quot;http://clusterssh.wiki.sourceforge.net/Main+Page&quot;&gt;clusterssh&lt;/a&gt;, &lt;a href=&quot;http://www.netfort.gr.jp/~dancer/software/dsh.html&quot;&gt;dsh&lt;/a&gt; and &lt;a href=&quot;http://guichaz.free.fr/gsh/&quot;&gt;gsh&lt;/a&gt;.&lt;/p&gt;
&lt;p&gt;So far, my options are:&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Settle for the limited capabilities except for select tasks.&lt;/li&gt;
&lt;li&gt;Write my own app to do something (or everything, which is a bad idea).&lt;/li&gt;
&lt;li&gt;Deal with it and control actions using a remote, group-admin tool.&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;I understand how the landscape could reach such a state, but I don&amp;#8217;t like the fact that this is the same set of options I&amp;#8217;ve had for the last five years or so. Are there options I&amp;#8217;m overlooking? Is there something I don&amp;#8217;t know about? The only thing I can see down the pipeline is &lt;a href=&quot;http://www.gnu.org/software/gnu-queue/&quot;&gt;GNU Queue&lt;/a&gt; (got a tipoff from &lt;a href=&quot;http://michael.toren.net/&quot;&gt;mct&lt;/a&gt;) which might very well be exactly what I&amp;#8217;ve been dreaming of. Unfortunately, no &lt;a href=&quot;http://savannah.gnu.org/projects/gnu-queue/&quot;&gt;releases have yet been made&lt;/a&gt;, so certainly no chance of using it now.&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Palm should go Android</title>
		<link href="http://yonkeltron.com/2008/10/07/palm-should-go-android/"/>
		<id>http://yonkeltron.com/?p=311</id>
		<updated>2008-10-06T03:21:04+00:00</updated>
		<content type="html">&lt;p&gt;Palm would &lt;a href=&quot;http://bigtech.blogs.fortune.cnn.com/2008/10/01/why-palm-needs-android/&quot;&gt;benefit from adopting Android for so many reasons&lt;/a&gt;!&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Stop funneling profits to Microsoft&lt;/li&gt;
&lt;li&gt;Get enthusiastic Android developers from the community&lt;/li&gt;
&lt;li&gt;Support free software and change the business model enough to ensure future solidity. How long before someone does a *really* good clone of HotSync? Why not just move to an open standard like &lt;a href=&quot;http://en.wikipedia.org/wiki/SyncML&quot;&gt;SyncML&lt;/a&gt; and monetize the transition?&lt;/li&gt;
&lt;li&gt;Focus on kickin hardware and stop worrying about the OS. Remember the fiasco with &lt;a href=&quot;http://en.wikipedia.org/wiki/PalmSource&quot;&gt;PalmSource&lt;/a&gt;?&lt;/li&gt;
&lt;li&gt;Contributing the upcoming Linux-based new Palm OS to the community would be a kickin way to give back, a great PR stunt and it would free up talent assets to work on the coolness that is Android&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Just one person&amp;#8217;s opinion but I remember my old Palm hardware and wouldn&amp;#8217;t think twice before dropping some cash on a Palm device that ran Android.&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Linux boots even faster!</title>
		<link href="http://yonkeltron.com/2008/10/05/linux-boots-even-faster/"/>
		<id>http://yonkeltron.com/?p=309</id>
		<updated>2008-10-04T23:42:14+00:00</updated>
		<content type="html">&lt;p&gt;I have always been a super-huge fan of Linux for it&amp;#8217;s quick and elegant startup. Ok, so various versions of &lt;a href=&quot;http://en.wikipedia.org/wiki/Init&quot;&gt;init&lt;/a&gt; aren&amp;#8217;t exactly the most elegant things but projects like &lt;a href=&quot;http://upstart.ubuntu.com/&quot;&gt;upstart&lt;/a&gt; enrich the landscape all the same. Anyway, I got wind of efforts to make Linux boot faster by way of a Slashdot post or two which pointed me to some major coolness. Basically, there are numerous individuals trying to &lt;a href=&quot;http://blog.crozat.net/2008/09/improving-boot-time-on-general-linux.html&quot;&gt;track the boot process&lt;/a&gt;, &lt;a href=&quot;http://broadcast.oreilly.com/2008/09/how-powertop-latencytop-and-fi.html&quot;&gt;reduce the resource consumption&lt;/a&gt; of the whole process and &lt;a href=&quot;http://lwn.net/Articles/299483/&quot;&gt;set stronger goals&lt;/a&gt; for the whole affair. All in all, they&amp;#8217;ve shaved boot time down to 5 seconds. Whoa&amp;#8230;.&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd The Lake Wobegon Distribution</title>
		<link href="http://blog.plover.com/math/right-skewed.html"/>
		<id>tag:blog.plover.com,2008:/math/right-skewed</id>
		<updated>2008-10-02T00:08:00+00:00</updated>
		<content type="html" xml:lang="en">&lt;a href=&quot;http://godplaysdice.blogspot.com/2008/07/three-beautiful-quicksorts.html&quot;&gt;Michael
Lugo mentioned a while back that most distributions are normal&lt;/a&gt;.  He
does not, of course, believe any such silly thing, so please do not
rush to correct him (or me).  But the remark reminded me of how many
people &lt;i&gt;do&lt;/i&gt; seem to believe that most distributions are normal.
More than once on internet mailing lists I have encountered people who
ridiculed others for asserting that &quot;nearly all &lt;i&gt;x&lt;/i&gt; are above [or
below] average&quot;.  This is a recurring joke on &lt;cite&gt;Prairie Home
Companion&lt;/cite&gt;, broadcast from the fictional town of Lake Wobegon,
where &quot;all the women are strong, all the men are good looking, and all
the children are above average.&quot;  And indeed, they can't all be above
average.  But they could &lt;i&gt;nearly&lt;/i&gt; all be above average.  And this
is actually an extremely common situation.&lt;p&gt;

To take my favorite example: nearly everyone has an above-average
number of legs. I wish I could remember who first brought this to my
attention.  James Kushner, perhaps?&lt;p&gt;

But the world abounds with less droll examples.  Consider a typical
corporation.  Probably most of the employees make a below-average
salary.  Or, more concretely, consider a small company with ten
employees.  Nine of them are paid $40,000 each, and one is the owner,
who is paid $400,000.  The average salary is $76,000, and 90% of the
employees' salaries are below average.&lt;p&gt;

The situation is familiar to people interested in baseball statistics
because, for example, most baseball players are below average.
Using &lt;a href=&quot;http://www.baseball1.com/statistics/&quot;&gt;Sean Lahman's
database&lt;/a&gt;, I find that 588 players received at least one at-bat in
the 2006 National League.  These 588 players collected a total of
23,501 hits in 88,844 at-bats, for a collective batting average of
.265.  Of these 588, only 182 had an individual batting average higher
than 265.  69% of the baseball players in the 2006 National League
were below-average hitters.  If you throw out the players with fewer
than 10 at-bats, you are left with 432 players of whom 279, or 65%,
hit worse than their collective average of 23430/88325 = .265.  Other
statistics, such as earned-run averages, are similarly skewed.  &lt;p&gt;

The reason for this is not hard to see.  Baseball-hitting talent in
the general population is normally distributed, like this:&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/math/right-skewed/normal.jpg&quot; /&gt;&lt;/p&gt;

Here the right side of the graph represents the unusually good hitters, of whom
there aren't very many.  
The left side of the graph represents the unusually bad hitters; there
aren't many of those either.  Most people are somewhere in the middle,
near the average, and there are about as many above-average hitters as
below-average hitters in the general population.&lt;p&gt;

&lt;!--
(Why this is is another blog post in itself, one I've planned for a
long time.  The short answer is that baseball-hitting is itself the
sum of many factors, such as size, strength, eye-hand coordination,
training, nutrition, and so on, each with its own probability
distribution.    Whenever you add together a bunch of probability
distributions, regardless of what you started with, what you get tends to
be more normally distributed than what you put in.  This statement is
of course very rough and inaccurate; for full details see the
Wikipedia article on the central limit theorem.)&lt;p&gt;
--&gt;

But major-league baseball players are not the general population.
They are carefully selected, among the best of the best.  They are all
chosen from the right-hand edge of the normal curve.  The people in
the middle of the normal curve, people like me, play baseball in Clark
Park, not in Quankee Stadium.&lt;p&gt;

Here's the right-hand corner of the curve above, highly magnified:&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/math/right-skewed/normal-tail.jpg&quot; /&gt;&lt;/p&gt;

As you can see here, the shape is not at all like the curve for the
general population, which had the vast majority of the population in
the middle, around the average.  Here, the vast majority of the
population is way over on the left side, just barely good enough to
play in the majors, hanging on to their jobs by the skin of their
teeth, subject at any moment to replacement by some kid up from the
triple-A minors.  The above-average players are the ones over on the
right end, the few of the few.&lt;p&gt;

Actually I didn't present the case strongly enough.  There are around
800 regular major-league ballplayers in the USA, drawn from a population of
around 300 million, a ratio of one per 375,000.  Well, no, the ratio is
smaller, since the U.S. leagues also draw the best players from Mexico,
Venezuela, Canada, the Dominican Republic, Japan, and elsewhere.  The
curve above is &lt;i&gt;much&lt;/i&gt; too inclusive.  The real curve for major-league
ballplayers looks more like this:&lt;p&gt;

&lt;p align=&quot;center&quot;&gt;&lt;img src=&quot;http://pic.blog.plover.com/math/right-skewed/normal-tail-tail.jpg&quot; /&gt;&lt;/p&gt;

(Note especially the numbers on the &lt;i&gt;y&lt;/i&gt;-axis.)&lt;p&gt;

This has important implications for the analysis of baseball.  A
player who is &quot;merely&quot; above average is a rare and precious
resource, to be cherished; far more  players are below average.  
Skilled analysts know that comparisons with the &quot;average&quot; player  are
misleading, because baseball is full of useful, effective players who
are below average.  Instead, analysts compare players to a
hypothetical &quot;replacement level&quot;, which is effectively the leftmost
edge of the curve, the level at which a player can be easily replaced
by one of those kids from triple-A ball.&lt;p&gt;

In the &lt;cite&gt;Historical Baseball Abstract&lt;/cite&gt;, Bill James describes
some great team, I think one of the Cincinnati Big Red Machine teams
of the mid-1970s, as &quot;possibly the only team in history that was above
average at every position&quot;.  That's an important thing to know about
the sport, and about team sports in general: you don't need great
players to completely clobber the opposition; it suffices to have
players that are merely above average.  But if you're the coach, you'd
better learn to make do with a bunch of players who are below average,
because that's what you have, and that's what the other team will beat
you with.&lt;p&gt;

The right-skewedness of the right side of a normal distribution has
implications that are important outside of baseball.  Stephen Jay
Gould wrote an essay about how he was 
diagnosed with cancer 
and given six months to live.
This sounds awful, and it is awful.
But six months was the &lt;i&gt;expected&lt;/i&gt; lifetime for patients with his
type of cancer&amp;mdash;the average remaining lifetime, in other
words&amp;mdash;and in fact, nearly everyone with that sort of cancer
lived &lt;i&gt;less&lt;/i&gt; than six months, usually much less.  The average was
only skewed up as high as six months because of a few people who took
&lt;i&gt;years&lt;/i&gt; to die.  Gould realized this, and then set about trying
to find out how the few long-lived outliers survived and what he could
do to turn himself into one of the long-lived freaks.  And he
succeeded, and lived for twenty years, dying eventually at age 60.&lt;p&gt;

My heavens, I just realized that what I've written is an article about
the &quot;long tail&quot;.  I had no idea I was being so trendy.  Sorry, everyone.&lt;p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;&lt;/p&gt;</content>
		<author>
			<name>Mark Dominus</name>
			<uri>http://blog.plover.com</uri>
		</author>
		<source>
			<title type="html">The Universe of Discourse</title>
			<subtitle type="html">The Universe of Discourse (Mark Dominus Blog)</subtitle>
			<link rel="self" href="http://blog.plover.com/index.atom"/>
			<id>tag:blog.plover.com,2005:/</id>
			<updated>2008-11-17T21:45:07+00:00</updated>
		</source>
	</entry>

	<entry xml:lang="en">
		<title type="html">yonkeltron Squeak without an OS: I don&amp;#8217;t get it</title>
		<link href="http://yonkeltron.com/2008/09/28/squeak-without-an-os-i-dont-get-it/"/>
		<id>http://yonkeltron.com/?p=307</id>
		<updated>2008-09-28T00:21:12+00:00</updated>
		<content type="html">&lt;p&gt;Caught wind of a neat sort of project from &lt;a href=&quot;http://osnews.com/story/20335/SqueakNOS_Look_Ma_No_OS_&quot;&gt;OSNews about a project&lt;/a&gt; called &lt;a href=&quot;http://wiki.squeak.org/squeak/1762&quot;&gt;SqueakNOS&lt;/a&gt; which seeks to implement the &lt;a href=&quot;http://en.wikipedia.org/wiki/Smalltalk&quot;&gt;Smalltalk&lt;/a&gt; programming language as close to the bare metal as possible, i.e., without an operating system. It&amp;#8217;s not that the real &lt;a href=&quot;http://en.wikipedia.org/wiki/Squeak&quot;&gt;Squeak&lt;/a&gt; isn&amp;#8217;t cool, but might this be somewhere along the same lines as &lt;a href=&quot;http://common-lisp.net/project/movitz/&quot;&gt;Movitz&lt;/a&gt; is with &lt;a href=&quot;http://en.wikipedia.org/wiki/Common_Lisp&quot;&gt;Common Lisp&lt;/a&gt;?&lt;/p&gt;
&lt;p&gt;It might just be me, but I&amp;#8217;m very happy with my current OS (which is &lt;a href=&quot;http://en.wikipedia.org/wiki/Linux&quot;&gt;GNU/Linux&lt;/a&gt;) and I&amp;#8217;d like to see better integration of virtual machines into the system before I do away with the system entirely!&lt;/p&gt;</content>
		<author>
			<name>Jonathan Magen</name>
			<uri>http://yonkeltron.com</uri>
		</author>
		<source>
			<title type="html">yonkeltron » Computing</title>
			<subtitle type="html">Temporary Exile</subtitle>
			<link rel="self" href="http://yonkeltron.com/tag/computing/feed/atom"/>
			<id>http://yonkeltron.com/feed/atom/</id>
			<updated>2008-11-20T12:00:36+00:00</updated>
		</source>
	</entry>

	<entry>
		<title type="html">mjd Sprague-Grundy theory</title>
		<link href="http://blog.plover.com/math/sprague-grundy.html"/>
		<id>tag:blog.plover.com,2008:/math/sprague-grundy</id>
		<updated>2008-09-26T16:07:00+00:00</updated>
		<content type="html" xml:lang="en">I'm on a small mailing list for math geeks, and there's this one guy
there, Richard Penn, who knows everything.  Whenever I come up with
some idle speculation, he has the answer.  For example, back in 2003 I
asked:&lt;p&gt;

&lt;blockquote&gt;
Let &lt;i&gt;N&lt;/i&gt; be any positive integer.  Does there necessarily exist a
positive integer &lt;i&gt;k&lt;/i&gt; such that the base-10 representation of &lt;i&gt;kN&lt;/i&gt; contains
only the digits 0 through 4?  
&lt;/blockquote&gt;

M.&amp;nbsp;Penn was right there with the answer.&lt;p&gt;

Yesterday, M.&amp;nbsp;Penn asked a question to which &lt;i&gt;I&lt;/i&gt; happened to
know the answer, and I was so pleased that I wrote up the whole theory
in appalling detail.  Since I haven't posted a math article in a
while, and since the mailing list only has about twelve people on it,
I thought I would squeeze a little more value out of it by posting it
here.&lt;p&gt;

Richard Penn asked:&lt;p&gt;

&lt;blockquote&gt;
&lt;i&gt;N&lt;/i&gt; dots are placed in a circle.  Players alternate moves, where a move
consists of crossing out any one of the remaining dots, and the dots
on each side of it (if they remain).  The winner is the player who
crosses out the last dot.  What is the optimal strategy with 19 dots?
with 20?  Can you generalize?
&lt;/blockquote&gt;

M.&amp;nbsp;Penn  observed that there is a simple strategy for the 20-dot
circle, but was not able to find one for the 19-dot circle.  But
solving such problems in general is made easy by the Sprague-Grundy
theory, which I will explain in detail.&lt;p&gt;

&lt;h3&gt;0. Short Spoilers&lt;/h3&gt;

Both positions are wins for the second player to move.&lt;p&gt;

The 20-dot case is trivial, since any first-player move leaves a row
of 17 dots, from which the second player can leave two disconnected
rows of 7 dots each.  Then any first-player move in one of these rows
can be effectively answered by the second player in the other row.&lt;p&gt;

The 19-dot case is harder.  The first player's move leaves a row of
16 dots.  The second player can win by removing 3 dots to leave
disconnected rows of 6 and 7 dots.  After this, the strategy is
complicated, but is easily found by the Sprague-Grundy theory.
&lt;a href=&quot;http://blog.plover.com#strategy19&quot;&gt;It's at the end of this article&lt;/a&gt; if you want
to skip ahead.&lt;p&gt;

Sprague-Grundy theory is a complete theory of all finite impartial
games, which are games like this one where the two players have
exactly the same moves from every position.&lt;p&gt;

The theory says:&lt;p&gt;

&lt;ol&gt;
&lt;li&gt; Every such game position has a &quot;value&quot;, which is a non-negative integer.
&lt;li&gt; A position is a second-player win if and only if its value is zero.
&lt;li&gt; The value of a position can be calculated from the values of the positions to which the players can move, in a simple way.
&lt;li&gt; The value of a collection of disjoint positions (such as two disconnected rows of dots)
   can be calculated from the values of its component positions in a
   simple way.
&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/li&gt;&lt;/ol&gt;

&lt;div class=&quot;bookbox&quot;&gt;&lt;table align=&quot;right&quot; width=&quot;14%&quot; border=&quot;1&quot;&gt;&lt;tr&gt;&lt;td align=&quot;center&quot;&gt;
&lt;font size=&quot;-1&quot;&gt;Order&lt;/font&gt;&lt;br /&gt;
&lt;cite&gt;&lt;font size=&quot;-1&quot;&gt;Winning Ways for Your Mathematical Plays, Vol. 1&lt;/font&gt;&lt;/cite&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/1568811307&quot;&gt;&lt;img src=&quot;http://www.powells.com/cgi-bin/imageDB.cgi?isbn=1568811307&quot; border=&quot;0&quot; align=&quot;center&quot; alt=&quot;Winning Ways for Your Mathematical Plays, Vol. 1&quot; /&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/partner/29575/biblio/1568811307&quot;&gt;&lt;font size=&quot;-1&quot;&gt;with kickback&lt;/font&gt;&lt;/a&gt;&lt;br /&gt;
&lt;a href=&quot;http://www.powells.com/biblio/1568811307&quot;&gt;&lt;font size=&quot;-1&quot;&gt;no kickback&lt;/font&gt;&lt;/a&gt;
&lt;/td&gt;&lt;/tr&gt;&lt;/table&gt;&lt;/div&gt;
Long details follow.  They are also found in &quot;Winning Ways&quot;, Vol I, by
Berlekamp, Conway, and Guy.&lt;p&gt;


&lt;h3&gt;1. Nim&lt;/h3&gt;

In the game of Nim, one has some piles of beans, and a legal move is
to remove some or all of the beans from any one pile.  The winner is
the player who takes the last bean.  Equivalently, the winner is the
last player who has a legal move.&lt;p&gt;

Nim is important because every position in every impartial game is
somehow equivalent to a position in Nim, as we will see.  In fact,
every position in every impartial game is equivalent to a Nim position
with at most one heap of beans!
Since single Nim-heaps are trivially analyzed, one can completely
analyze any impartial game position by calculating the Nim-heap to
which it is equivalent.&lt;p&gt;

&lt;h3&gt;2. Disjoint sums of games&lt;/h3&gt;

Definition: The &quot;disjoint sum&quot; &lt;i&gt;A&lt;/i&gt; # &lt;i&gt;B&lt;/i&gt; of two games
&lt;i&gt;A&lt;/i&gt; and &lt;i&gt;B&lt;/i&gt; is a new game whose rules are as follows: a
legal move in &lt;i&gt;A&lt;/i&gt; # &lt;i&gt;B&lt;/i&gt; is &lt;i&gt;either&lt;/i&gt; a move in &lt;i&gt;A&lt;/i&gt;
&lt;i&gt;or&lt;/i&gt; a move in &lt;i&gt;B&lt;/i&gt;; the winner is the last player with a
legal move.&lt;p&gt;

Three easy exercises:&lt;p&gt;

&lt;ol&gt;
&lt;li&gt; # is 