<?xml version="1.0" encoding="UTF-8"?>
<?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/atom10full.xsl" type="text/xsl" media="screen"?><?xml-stylesheet href="http://feeds.feedburner.com/~d/styles/itemcontent.css" type="text/css" media="screen"?><feed xmlns="http://www.w3.org/2005/Atom" xmlns:openSearch="http://a9.com/-/spec/opensearchrss/1.0/" xmlns:geo="http://www.w3.org/2003/01/geo/wgs84_pos#" xmlns:feedburner="http://rssnamespace.org/feedburner/ext/1.0"><id>tag:blogger.com,1999:blog-5051684</id><updated>2008-11-05T03:37:47.128-08:00</updated><title type="text">Xenomachina</title><subtitle type="html">Laurence Gonsalves's home page</subtitle><link rel="alternate" type="text/html" href="http://xenomachina.com/" /><link rel="next" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default?start-index=26&amp;max-results=25" /><link rel="http://schemas.google.com/g/2005#feed" type="application/atom+xml" href="http://xenomachina.com/atom.xml" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><generator version="7.00" uri="http://www.blogger.com">Blogger</generator><openSearch:totalResults>50</openSearch:totalResults><openSearch:startIndex>1</openSearch:startIndex><openSearch:itemsPerPage>25</openSearch:itemsPerPage><geo:lat>37.40679</geo:lat><geo:long>-122.074613</geo:long><logo>http://xenomachina.com/xm-feed-logo.png</logo><link rel="self" href="http://feeds.feedburner.com/xenomachina" type="application/atom+xml" /><feedburner:browserFriendly>This is an XML content feed. It is intended to be viewed in a newsreader or syndicated to another site, subject to copyright and fair use.</feedburner:browserFriendly><entry><id>tag:blogger.com,1999:blog-5051684.post-7641007477672735222</id><published>2008-07-23T09:30:00.000-07:00</published><updated>2008-07-23T09:52:18.178-07:00</updated><title type="text">GXP Now Open Source</title><content type="html">&lt;a href="http://gxp.googlecode.com/"&gt;Google XML Pages (GXP)&lt;/a&gt; is now open source! See  &lt;a href="http://google-opensource.blogspot.com/2008/07/google-xml-pages-functional-markup.html"&gt;the announcement on the Google Open Source Blog&lt;/a&gt; for more info.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/343730012" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/7641007477672735222/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=7641007477672735222" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/7641007477672735222" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/7641007477672735222" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/343730012/gxp-now-open-source.html" title="GXP Now Open Source" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://xenomachina.com/2008/07/gxp-now-open-source.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-4171143272431987652</id><published>2008-07-18T12:11:00.000-07:00</published><updated>2008-07-20T22:37:28.846-07:00</updated><title type="text">Speaking at OSCON 2008</title><content type="html">&lt;a href="http://conferences.oreilly.com/oscon"&gt;
&lt;img align=right src="http://assets.en.oreilly.com/1/event/12/oscon2008_banner_125x125.gif" width="125" height="125"  border="0"  alt="OSCON 2008" title="OSCON 2008"  /&gt;
&lt;/a&gt;
I'll be speaking at O'Reilly's Open Source Convention (OSCON) next week about &lt;a href="http://en.oreilly.com/oscon2008/public/schedule/detail/3501"&gt;Google XML Pages&lt;/a&gt;. GXP is an XML-based templating system that I originally built almost 7 years ago, and have been working on (mostly 20%-time) since then. It's hard to believe, but it's finally being open-sourced.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/339560748" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/4171143272431987652/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=4171143272431987652" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/4171143272431987652" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/4171143272431987652" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/339560748/speaking-at-oscon-2008.html" title="Speaking at OSCON 2008" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://xenomachina.com/2008/07/speaking-at-oscon-2008.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-5723513548299330241</id><published>2008-02-28T08:36:00.000-08:00</published><updated>2008-02-28T09:02:20.046-08:00</updated><title type="text">UI Design in Sunshine</title><content type="html">&lt;p&gt;I just saw &lt;a href="http://www.imdb.com/title/tt0448134/"&gt;Sunshine&lt;/a&gt;, and while going through the extras I was pleasantly surprised by this short video about the design of the user interfaces on board the ship in the movie. The whole video is pretty interesting, but the part that made me literally laugh out loud starts just after 1:47.

&lt;p align="center"&gt;&lt;object width="425" height="355"&gt;&lt;param name="movie" value="http://www.youtube.com/v/0bqINrwoMbI"&gt;&lt;/param&gt;&lt;param name="wmode" value="transparent"&gt;&lt;/param&gt;&lt;embed src="http://www.youtube.com/v/0bqINrwoMbI" type="application/x-shockwave-flash" wmode="transparent" width="425" height="355"&gt;&lt;/embed&gt;&lt;/object&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/242826783" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/5723513548299330241/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=5723513548299330241" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/5723513548299330241" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/5723513548299330241" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/242826783/ui-design-in-sunshine.html" title="UI Design in Sunshine" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://xenomachina.com/2008/02/ui-design-in-sunshine.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-6664660747110845073</id><published>2008-01-21T21:16:00.000-08:00</published><updated>2008-01-21T22:48:46.828-08:00</updated><title type="text">Flickr Photo Page Bookmarklet</title><content type="html">&lt;p&gt;Occasionally I come across images that are hosted by &lt;a href="http://www.flickr.com/"&gt;Flickr&lt;/a&gt;, but which don't have a link back to the photo page on Flickr. This seems to be especially common on message boards and image bookmarking sites like &lt;a href="http://ffffound.com/"&gt;FFFFound&lt;/a&gt;. Being able to get to the Flickr photo page is nice for a number of reasons: you can see other photos by the same author, see the metadata, notes, comments, others sizes, etc.

&lt;p&gt;A Flickr photo URL looks something like this:

&lt;pre class=code&gt;  http://farm2.static.flickr.com/1407/1085850486_23589455e2.jpg&lt;/pre&gt;

&lt;p&gt;Flickr &lt;a href="http://www.flickr.com/services/api/misc.urls.html"&gt;has some nice documentation for their URLs&lt;/a&gt;. The URL above is of the form &lt;code&gt;http://farm&lt;var&gt;farm-id&lt;/var&gt;.static.flickr.com/&lt;var&gt;server-id&lt;/var&gt;/&lt;var&gt;id&lt;/var&gt;_&lt;var&gt;secret&lt;/var&gt;.jpg&lt;/code&gt;, so the photo ID is 1085850486 and the "secret" is 23589455e2. It's possible to find the photo page by using &lt;a href="http://www.flickr.com/services/api/explore/?method=flickr.photos.getInfo"&gt;Flicker's API call  "flickr.photos.getInfo"&lt;/a&gt;, which returns XML containing the photo ID. That's tedious, and won't work in a bookmarklet.

&lt;p&gt;Some more searching turned up the &lt;code&gt;http://flickr.com/photo.gne?id=&lt;var&gt;id&lt;/var&gt;&lt;/code&gt; URL. I can't find any official documentation for this, only &lt;a href="http://www.flickr.com/help/forum/41252/"&gt;some posts in the Flick help forums&lt;/a&gt;. It appears to work though, and it wasn't too hard to turn it into a bookmarklet.

&lt;p&gt;To install the bookmarklet, just drag the following link to your bookmarks or toolbar.

&lt;p&gt;&lt;a href="javascript:document.location='http://flickr.com/photo.gne?id='+document.location.pathname.replace(/_.*/,'').replace(/.*\//,'')"&gt;[Flickr photo page]&lt;/a&gt;

&lt;p&gt;To use the bookmarklet, first make sure that the photo is the only thing open in the browser tab/window. In other words, the URL in the address bar should be for the .jpg hosted on flickr.com. If the photo is embedded in a page you'll generally need to select "View Image" (or equivalent) from the context menu. (FFFFound is an exception: it caches the images, so you'll instead need to click on the image to be taken to the original) One you're on the image, just click the bookmarklet to be sent to the Flickr photo page.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/220808690" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/6664660747110845073/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=6664660747110845073" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/6664660747110845073" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/6664660747110845073" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/220808690/flickr-photo-page-bookmarklet.html" title="Flickr Photo Page Bookmarklet" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://xenomachina.com/2008/01/flickr-photo-page-bookmarklet.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-116828956267846360</id><published>2007-07-11T23:09:00.000-07:00</published><updated>2007-07-11T23:16:36.843-07:00</updated><title type="text">Rant: Bad Internationalization</title><content type="html">&lt;p&gt;A lot of websites don't seem to "get" the fact that the Internet is &lt;em&gt;international&lt;/em&gt;. I'm not talking about things like being translated into multiple languages or outputting content in UTF-8 (in this post). What really annoys me are sites that seem to actually go out of their way to make life difficult for international users and/or customers.

&lt;p&gt;Credit cards have the nice property that they work internationally. If someone accepts Visa or Mastercard they'll normally accept those cards no matter what country the cards originate in or what currency the account is in. Currency conversion is handled automatically by the credit card issuing bank. A number of websites seem to be incapable of dealing with this properly, however.

&lt;h2&gt;Air Canada&lt;/h2&gt;
&lt;p&gt;An example I recently encountered is Air Canada's website. I was going to purchase some plane tickets for some family in Canada. After going through the ordeal of finding flights that met the various constraints I got to the payment page. I then entered my credit card number and most of my billing address only to find that "United States" wasn't in the country selector. "Is it listed as America? USA?" I thought to myself. Nope. It just wasn't there.

&lt;p&gt;After a few minutes of trying to figure out what was up I noticed a paragraph in the sidebar that helpfully pointed out that the United States, as well as a handful of other countries, had been &lt;em&gt;intentionally left out of the available options&lt;/em&gt; based on the country selection I had (apparently) made when I first visited the site. The only rationale I can think of for this is that it's a way to charge customers in different countries different prices. Blech.

&lt;h2&gt;Dell&lt;/h2&gt;
&lt;p&gt;Another incident happened back around Christmas. I was going to order a present for my father, who lives in Canada, from Dell. I first tried using &lt;code&gt;dell.com&lt;/code&gt;, but it wouldn't let me ship to Canada. I then tried &lt;code&gt;dell.ca&lt;/code&gt;, but the billing page had the country field hard-coded to Canada. My US-based credit card wasn't going to work.

&lt;p&gt;After failing with both websites, I decided to try and get in touch with a human. "I'll just call the number on &lt;code&gt;dell.ca&lt;/code&gt;", I thought. The number is 1-800-WWW-DELL (phone over HTTP?), and it's the same number on &lt;code&gt;dell.com&lt;/code&gt;. Calling the number from the US connected me to Dell US, not Dell Canada, and they wouldn't ship to Canada. I asked if they could connect me to Dell Canada, and the sales person suggested that I just have the present delivered to myself, in California, and then I could ship it to Canada myself.

&lt;p&gt;This idea is all kinds of terrible because it would mean more work on my part, be more expensive, take longer for the gift to arrive, and it'll also mean that the recipient would have have to pay GST -- not a very nice Christmas present. (GST is a tax applied to items as they cross into Canada.) By ordering from Dell Canada I could pay the GST, rather than the recipient having to pay it, the shipping would be direct (and presumably from a warehouse in Canada), and would be included in the price.

&lt;p&gt;Eventually I was able to convince the Dell US salesperson to give me a real phone number for Dell Canada sales, and I was able to order the gift. Still, this would've been far less painless if &lt;code&gt;dell.ca&lt;/code&gt; just let me choose the billing country for my credit card. Better yet, &lt;code&gt;dell.com&lt;/code&gt; should allow shipping to Canada by forwarding my order to Dell Canada for me.

&lt;p&gt;With the Dell example I think the reason for this screwup was less malice, more oversight/ignorance/stupidity. However, in some ways it's even more sad that even Dell, a company known for being relatively 'net savvy, can't seem to get this right.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/132887689" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/116828956267846360/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=116828956267846360" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116828956267846360" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116828956267846360" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/132887689/bad-internationalization.html" title="Rant: Bad Internationalization" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://xenomachina.com/2007/01/bad-internationalization.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-2307216833384245665</id><published>2007-06-03T12:05:00.000-07:00</published><updated>2007-07-11T22:12:37.268-07:00</updated><title type="text">Voodoo Electronics</title><content type="html">&lt;p&gt;I'm interested in robotics, but building robots requires three things: mechanics, electronics and software. (I'm intentionally ignoring BEAM here -- I'm not interested in building software-free robots.) I know software, and I feel like I have an okay grasp of mechanical systems. I don't know enough about electronics, though.

&lt;p&gt;My understanding of electronics is that there are basically three
types of electronics:

&lt;ul&gt;
  &lt;li&gt;AC electronics. Not especially relevant to building robots.
  &lt;li&gt;DC digital electronics. This part I feel like I pretty much understand. It's based on boolean logic, and so a lot of my software knowledge is applicable. The only extra bits are pretty simple:
    &lt;ul&gt;
      &lt;li&gt;you're dealing with high versus low rather than true/false, so you need to come up with a mapping convention for each circuit and stick with it.
      &lt;li&gt;many components (like ICs) also need power. Just get a power source that's the right voltage and enough current, and this should be okay.
      &lt;li&gt;there are a few different "families" of digital components. Stick with one for any one circuit.
    &lt;/ul&gt;
  &lt;li&gt;DC analog electronics. This has two main parts. The first part is the "simple bits": things like Ohm's law which &lt;em&gt;every single electronics tutorial&lt;/em&gt; feels the need to tell you about. The second part is what I've come to call "voodoo electronics" -- the parts that every electronics tutorial I've ever seen simply hand-waves away.
&lt;/ul&gt;

&lt;p&gt;A recent example of "voodoo electronics" that I encountered was in &lt;a href="http://makezine.com/10/"&gt;the most recent issue of Make&lt;/a&gt;. This issue had a number of electronics tutorials. Some of these were very helpful, like &lt;a href="http://makezine.com/10/workbench/"&gt;Your Electronics Workbench&lt;/a&gt;. The article on the 555 timer chip, however, &lt;a href="http://makezine.com/10/littlechip/"&gt;The Biggest Little Chip&lt;/a&gt;, suffered from the voodoo electronic problem. The article contained the following schematic:

&lt;p align=center&gt;&lt;img src="/images/555-voodoo-schematic.png" title="R3 = magic, C2 = more magic" alt='Figure 2 from "The Biggest Little Chip"' /&gt;&lt;/p&gt;

&lt;p&gt;It then went on to explain the purpose of each of the various components one by one. The explanations were a bit terse, but reasonable. Eventually, the entire circuit had been explained except for R3 and C2. Here's how the article explained their purpose:

&lt;blockquote&gt;
R3 protects the LED from excessive current, while C2 protects the 555 timer from random noise.
&lt;/blockquote&gt;

&lt;p&gt;"Excessive current"? "Random electronic noise"? How am I supposed to design my own circuits without understanding how to both predict when these problems will exist and how to devise a defense against them? So far I have yet to see a single electronics tutorial that explains these things.

&lt;p&gt;I ran into the same thing when I found some schematics for a stepper motor controller on the web. All of the schematics made sense to me, except a mysterious zener diode which was there (according to the documentation) "to absorb reverse EMF". No more explanation was given.

&lt;p&gt;Are there any electronics tutorials out there that actually explain how to predict when part of a circuit will be susceptible to "random electronic noise", "excessive current", or "reverse EMF" and how to build protection against them, or is my only hope to take a full-fledged course in electrical engineering?

&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;After posting this I realized that I could just post a comment on &lt;i&gt;Make&lt;/i&gt;'s website. The author of the 555 article posted a &lt;a href="http://makezine.com/10/littlechip/#msg2214"&gt;very helpful response&lt;/a&gt;. Now I just need to figure out what that zener diode in that stepper motor controller was for.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823950" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/2307216833384245665/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=2307216833384245665" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/2307216833384245665" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/2307216833384245665" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823950/im-interested-in-robotics-but-building.html" title="Voodoo Electronics" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://xenomachina.com/2007/06/im-interested-in-robotics-but-building.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-2237780704867869742</id><published>2007-05-01T11:10:00.000-07:00</published><updated>2007-05-01T11:17:27.806-07:00</updated><title type="text">Copyright Law and the King</title><content type="html">&lt;p&gt;From the U.S. Copyright Office's &lt;a href="http://www.copyright.gov/help/faq/faq-protect.html"&gt;What Does Copyright Protect?&lt;/a&gt; page:
&lt;blockquote&gt;&lt;b&gt;How do I protect my sighting of Elvis?&lt;/b&gt;&lt;br&gt;
Copyright law does not protect sightings. However, copyright law will protect your photo (or other depiction) of your sighting of Elvis. Just send it to us with a Form VA application and the filing fee. No one can lawfully use your photo of your sighting, although someone else may file his own photo of his sighting. Copyright law protects the original photograph, not the subject of the photograph.&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823952" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/2237780704867869742/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=2237780704867869742" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/2237780704867869742" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/2237780704867869742" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823952/copyright-law-and-king.html" title="Copyright Law and the King" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://xenomachina.com/2007/05/copyright-law-and-king.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-1796802406259578145</id><published>2007-03-10T16:21:00.000-08:00</published><updated>2007-05-06T19:52:25.279-07:00</updated><title type="text">Easier Links with Google AJAX Search API</title><content type="html">&lt;p&gt;Ever get annoyed by the complexity of adding links in blog or message board posts? Sure, it isn't rocket science, but between getting the angle brackets, quotes and start and end tags balanced correctly &lt;em&gt;and&lt;/em&gt; getting the URL right, adding links is a pain.

&lt;p&gt;This weekend I did some playing around with the &lt;a href="http://code.google.com/apis/ajaxsearch/"&gt;Google AJAX Search API&lt;/a&gt; and made a nifty bookmarklet for creating links in textareas. I've only tested it with Firefox (various combinations of 1.5 and 2.0 on Linux, Windows and Mac), and it only works with plain old multi-line textareas (not 1-line text fields or rich/"wysiwyg" text controls). Aside from those caveats, it seems to work pretty well.

&lt;p&gt;Installation is easy: just drag this link to your bookmark toolbar: &lt;a href="javascript:if%28window._XM_SEARCHPOP%29%7B_XM_SEARCHPOP.open%28%29%7Delse%7Bvar%20b%3Ddocument.body%3Bvoid%28z%3Ddocument.createElement%28%27script%27%29%29%3Bvoid%28z.src%3D%27http%3A//xenomachina.com/bookmarklets/searchpop.js%27%29%3Bvoid%28b.appendChild%28z%29%29%3B%7D"&gt;[linkify]&lt;/a&gt; Note that if you're reading this in a feed reader you'll probably need to visit my site for this step, as feed readers usually strip out JavaScript. (Readlings: no smirking.)

&lt;p&gt;Here's how to use it:

&lt;ol&gt;
&lt;li&gt;Go to some page that has a textarea. The comments area on most blogs should work. The Blogger posting form in "Edit Html" mode also works.
&lt;li&gt;Type some text in the textarea.
&lt;li&gt;Select the part you'd like to turn into a link.
&lt;li&gt;Activate the bookmarklet. This will bring up a search pane on the right side of your browser window.
&lt;p&gt;&lt;img alt="screen shot" src="http://xenomachina.com/images/searchpop-screenshot.png"&gt;
&lt;p&gt;The search query defaults to the text you'd highlighted. You can edit the query if necessary.
&lt;li&gt;Click on "create link" next to the search result. The popup will disappear, and the text you selected earlier (in the textarea) will be replaced with a link. The link's text will be the original selected text, and its href will be the URL of the search result you picked.
&lt;/ol&gt;

&lt;p&gt;Thanks to &lt;a href="http://www.massless.org/"&gt;Chris Wetherell&lt;/a&gt; for telling me about &lt;a href="http://tagneto.blogspot.com/2006/06/cross-domain-frame-communication-with.html"&gt;inter-frame communication with URL fragments&lt;/a&gt;, which turned out to be handy.

&lt;h3&gt;Update&lt;/h3&gt;
&lt;p&gt;I've been told that the bookmarklet works in Opera, but not in Safari. I'll look into the Safari issue.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823953" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/1796802406259578145/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=1796802406259578145" title="18 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/1796802406259578145" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/1796802406259578145" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823953/easier-links-with-google-ajax-search.html" title="Easier Links with Google AJAX Search API" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">18</thr:total><feedburner:origLink>http://xenomachina.com/2007/03/easier-links-with-google-ajax-search.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-1511261393404092259</id><published>2007-01-10T13:59:00.001-08:00</published><updated>2007-01-10T22:19:10.200-08:00</updated><title type="text">Intellectual Tug-O-War</title><content type="html">&lt;p&gt;Why is it that almost all of the online debate about intellectual
property is between extremists? On the one hand we have Richard
Stallman, Cory Doctorow and piracy apologists. On the
other hand we have the RIAA, MPAA and Microsoft/Apple
astroturfers. I tend to disagree with both of these groups because both
of them go too far -- just in opposite directions.

&lt;p&gt;The most recent example of this is the &lt;a href
="http://badvista.fsf.org/blog/analysis-of-microsofts-suicide-note-part-1"&gt;Analysis
of Microsoft's Suicide Note&lt;/a&gt; page. It's on fsf.org, so of course it's no
surprise that most of the comments are from free-software groupies. The only
exceptions are a few posts from "sreiser". I actually agree with some of
his points, but I strongly disagree with:7

&lt;blockquote&gt;by affording basic intellectual property protection within
the operating system, they [Microsoft] are doing great service towards
cultivating a more responsible public&lt;/blockquote&gt;

&lt;p&gt;The responses are, of course, equally extreme, but diametrically
opposite. For example:

&lt;blockquote&gt;...private piracy, on the other hand, does not cause a real
harm to the manufacturer, due to its nature. By private piracy I refer
to those people who download a certain product from Internet or
otherwise make unauthorized copies of it only for self use. This is, of
course, still illegal (although there are legal holes in many countries
than enable it), but even so it requires a closer look: most of 'private
pirates' (most probably more that 99%) copy the product just because
they cannot afford buying it. So, if you disable such user from doing
that, this won't make him/her to buy that product, since cannot afford
it. Instead that user won't use the product at all.&lt;/blockquote&gt;

&lt;p&gt;I don't agree with either of these quoted bits. On the one hand, if
I'm buying an operating system, that operating system should serve
&lt;em&gt;me&lt;/em&gt;, not the content providers. If there was somehow some sort
of DRM that didn't cause any harm, then I'd be okay with it, but not
causing any harm means:
&lt;ul&gt;
&lt;li&gt;It shouldn't make my machine slower.
&lt;li&gt;It shouldn't make my machine run hotter.
&lt;li&gt;It shouldn't increase the cost of the operating system or computer.
&lt;li&gt;It shouldn't increase the liklihood of bugs.
&lt;li&gt;It shouldn't make any legitimate tasks that I might want to
perform more difficult. This includes fair-use tasks like backing up my
media, moving it between my machines, burning it to a CD so I can listen
to it in my car, etc.
&lt;/ul&gt;Since no such DRM exists (or can exist, given the fuzziness of what is fair use) it's better to do without.

&lt;p&gt;On the other hand, the "private piracy doen't hurt anyone" argument
simply doesn't hold water.  There generally isn't a black and white
distinction between what one can afford and what one cannot. Can the
typical teenager afford to buy thousands of CDs? Probably not. Can they afford
to buy tens or even hundreds of CDs? For most American teenagers the
answer is probably yes. So is it okay for someone to buy as many CDs as
they can afford, and then to pirate the rest of their music?

&lt;p&gt;Even if you did consider such an absurd situation to be morally
justified, I argue that it would rarely happen. Once someone accepts
piracy as a legitimate option they'll pirate whenever the percieved
benefit minus cost outweighs that of purchasing. Given that many people's
wants expand to exceed their means, and that physical goods are
notoriously hard to pirate, people who have taken this path will not
purchase media even if they can afford it. Worse, this sort of behavior
can spread to those well outside of the "can't afford it" group because
it lowers the social stigma of pirating, while at the same time
decreasing the percieved value of the purchased product.

&lt;p&gt;One of the craziest things I've experienced when trying to talk with these extremeists is that they generally see me as being on the opposite side of the spectrum from them. The anti-copyright crowd, upon hearing that I think content creators should be able to use copyright in order to get compensation for their work will invariably accuse me of being against open source/"free" software. I actually like open source (I'm typing this on my Ubuntu box) and I've even contributed to some projects. I think of "open source" as a feature though, not a moral imperative. While I prefer my software to be open source, I don't consider the developers of non-open-source software to be infidels.

&lt;p&gt;Likewise, members of the the pro-DRM camp, upon hearing that I dislike DRM, will generally accuse me of being a software pirate. I just don't want fair use to be harmed. The "don't even talk about circumvention" bits in the DMCA are also frighteningly similar to &lt;a href="http://en.wikipedia.org/wiki/Thoughtcrime"&gt;thoughtcrime&lt;/a&gt;.

&lt;p&gt;Am I really the only one here in the middle? In the end, I'm inclined to side with the "information wants to be free" crowd, but mostly because they seem to be on the losing side of the tug-of-war.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823954" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/1511261393404092259/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=1511261393404092259" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/1511261393404092259" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/1511261393404092259" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823954/intellectual-property-extremists.html" title="Intellectual Tug-O-War" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://xenomachina.com/2007/01/intellectual-property-extremists.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-116564231950112007</id><published>2006-12-08T21:31:00.000-08:00</published><updated>2006-12-08T22:03:38.566-08:00</updated><title type="text">Book: On The Edge</title><content type="html">&lt;a href="http://www.commodorebook.com/"&gt;&lt;img border=0 align=left alt=""
src="/images/on-the-edge-cover.jpg"&gt;&lt;/a&gt;&lt;p&gt;I recently finished reading
&lt;a href="http://www.commodorebook.com/"&gt;&lt;cite&gt;On the Edge: The
Spectacular Rise and Fall of Commodore&lt;/cite&gt;&lt;/a&gt;. I had a string of
Commodore computers from the time I was 8 up until I was in university,
so it was great to find out more about the history behind these
machines.

&lt;p&gt;One thing that comes to mind when I think about the Commodore
machines I had is how there was so little hardware abstraction. In
modern PCs you rarely talk directly to the hardware. Instead there are
high level languages and APIs piled on top of APIs. I'm not saying that
having little hardware abstraction was unique to the Commodore machines.
It was probably actually very common in other machines of that era as
well, since the machines were so underpowered (by today's standards)
that you couldn't really afford the extra overhead imposed by layers of
abstraction. However, as far as I can tell, the Commodore machines tended to 
have even less hardware
abstraction than their contemporaries.

&lt;p&gt;I think a large part of
this had to do with Commodore's habit of using custom chips in almost
every machine since the &lt;a
href="http://en.wikipedia.org/wiki/VIC-20"&gt;VIC-20&lt;/a&gt;, which was
actually named after the &lt;a
href="http://en.wikipedia.org/wiki/MOS_Technology_VIC"&gt;VIC&lt;/a&gt; chip the
machine was based around. In the &lt;a
href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore 64&lt;/a&gt; there
were the &lt;a href="http://en.wikipedia.org/wiki/VIC-II"&gt;VIC-II&lt;/a&gt; and &lt;a
href="http://en.wikipedia.org/wiki/6581"&gt;SID&lt;/a&gt; chips.  On the &lt;a
href="http://en.wikipedia.org/wiki/Amiga"&gt;Amiga&lt;/a&gt;, there was of course
the &lt;a href="http://en.wikipedia.org/wiki/Original_Amiga_chipset"&gt;famous
Amiga custom chipset&lt;/a&gt;.

&lt;p&gt;This hardware-centric philosophy permeated the system software as
well. I remember programming on the Commodore 64 in &lt;a
href="http://en.wikipedia.org/wiki/BASIC_2.0"&gt;BASIC 2.0&lt;/a&gt;, which
provided &lt;em&gt;absolutely no high-level support for sound or graphics
whatsoever&lt;/em&gt;. This was on the machine that arguably had some of the
best sound and graphics capabilities for its time. On the C64 everything
had to be done in &lt;a
href="http://en.wikipedia.org/wiki/PEEK_and_POKE"&gt;&lt;code&gt;PEEK&lt;/code&gt;s and
&lt;code&gt;POKE&lt;/code&gt;s&lt;/a&gt;. Even on the Amiga, which had a "real" operating
system, many hardware details would still peek (or is that poke?)
through, and applications frequently took advantage of hardware features
that were unique to the Amiga.

&lt;p&gt;From reading &lt;cite&gt;On the Edge&lt;/cite&gt; I think I have a better
understanding of why the Commodore machines were like this. A big factor
in this seems to be that the Commodore 64 and the Amiga development
teams included chip designers. The C64 pretty much started with the
VIC-II and SID chips, and the rest of the computer was built around
them.  This sort of makes sense, since Commodore was one of the only
computer makers of that era to have its &lt;a
href="http://en.wikipedia.org/wiki/MOS_Technology"&gt;own chip fab&lt;/a&gt;.
(According to the book, this was because &lt;a
href="http://en.wikipedia.org/wiki/Jack_Tramiel"&gt;Jack Tramiel&lt;/a&gt;,
Commodore's founder, was  obsessed with "vertical integration".)
Likewise, the Amiga's design centered around its own custom chips
largely because it was originally going to be a game machine. It
even sounds like one of the reasons Amiga was willing to be bought by
Commodore had to do with Commodore owning a chip fab.

&lt;p&gt;The book talks about both the engineering and the marketing behind
the Commodore machines. As a software engineer I'm obviously really
interested in the engineering stories, but some of the marketing stories
are also fascinating, especially given Commodore's notoriously bad
marketing in its later years.

&lt;p&gt;Here's a bit about Commodore's marketing tactics in 1983:

&lt;blockquote&gt;
Commodore instigated a strange offer that literally removed the
competition from homes. ... "Send in any sort of computing device and
you can get $100 off your Commodore 64." ...

&lt;p&gt;Commodore employees speculated that the offer actually increased
sales of &lt;a
href="http://en.wikipedia.org/wiki/Timex_Sinclair"&gt;Timex-Sinclair&lt;/a&gt;
computers. Customers sometimes purchased $50 Timex-Sinclair computers
just to take advantage of the $100 rebate offer. The excess Sinclair
computers became a running joke within the halls of Commodore. "We had
all these Sinclairs," says &lt;a
href="http://en.wikipedia.org/wiki/Bil_Herd"&gt;Bil Herd&lt;/a&gt;. "I started
using them as doorstops." &lt;/blockquote&gt;

What's especially interesting is how these stories can sometimes
intersect in surprising ways. During the development of the &lt;a
href="http://en.wikipedia.org/wiki/Commodore_128"&gt;Commodore 128&lt;/a&gt;
there was difficulty getting the C64's &lt;a
href="http://en.wikipedia.org/wiki/CP/M"&gt;CP/M&lt;/a&gt; and Magic Voice
cartridges to work on the C128 prototype:

&lt;blockquote&gt;
To fix the problem, Herd required the C128 to start at memory address
zero, but the 8502 started elsewhere. "One night, everybody left and it
was broken," says Herd. "During the night, I said, 'I have no way to fix
this, unless we startup by not starting at that address.' I said, 'Hey,
Von. The Z80 chip starts from zero, doesn't it?' He said, 'Yup.' I said,
'Cool. I need somebody wire wrapping tonight.'"

&lt;p&gt;The hour was too late to purchase a Z80 chip, so Herd looked
elsewhere. "Everybody had doorstops that were actually Sinclairs," he
recalls. "I went and tore open my doorstop because we didn't own a Z80
chip in the place."
&lt;/blockquote&gt;

&lt;p&gt;The Z80 in the C128 literally originated in a doorstop!

&lt;p&gt;If, like me, you grew up with Commodore computers, or if you're just
interested in the history of personal computers in general, then I
highly recommend reading
&lt;a href="http://www.commodorebook.com/"&gt;&lt;cite&gt;On the Edge&lt;/cite&gt;&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823955" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/116564231950112007/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=116564231950112007" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116564231950112007" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116564231950112007" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823955/book-on-edge.html" title="Book: On The Edge" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://xenomachina.com/2006/12/book-on-edge.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-116355845344133949</id><published>2006-11-14T18:38:00.000-08:00</published><updated>2006-11-14T18:41:29.546-08:00</updated><title type="text">Fubars for sale</title><content type="html">&lt;p&gt;I looks like &lt;a href="http://www.amazon.com/gp/product/B000FCGS0Y/ref=cm_gift_gg_B000FCGS0Y/002-2284732-5596012"&gt;fubars &lt;/a&gt; really exist. This review cracked me up:

&lt;blockquote&gt;... if all you want to do is knock down some walls or kill some enemies, this is the way to go.&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823957" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/116355845344133949/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=116355845344133949" title="3 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116355845344133949" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116355845344133949" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823957/fubars-for-sale.html" title="Fubars for sale" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">3</thr:total><feedburner:origLink>http://xenomachina.com/2006/11/fubars-for-sale.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-116297260408090845</id><published>2006-11-07T23:56:00.000-08:00</published><updated>2006-11-15T17:14:10.896-08:00</updated><title type="text">Scala Programming Language</title><content type="html">&lt;p&gt;Today I went to &lt;a href="http://video.google.com/videoplay?docid=553859542692229789"&gt;a talk on the Scala
Programming Language&lt;/a&gt;. According to its creators, &lt;a href="http://scala.epfl.ch/"&gt;Scala&lt;/a&gt;
"smoothly integrates features of object-oriented and functional
languages". It's also got static type checking, and from the little bit
I've seen so far the type system seems fairly powerful. These are all
things I've wanted in a language for quite some time.

&lt;p&gt;The languages that I use at work, mostly Java and Python, are
normally classified as "object-oriented". Python does have a bit of a
functional flavor to it as well, but it seems that most people think of
functional and object-oriented styles of programming as almost
completely disjoint. I've been finding that I've been gradually moving
to an ever more "functional style" of object-oriented programming, even
when programming in Java, so I was happy to see a language designed to
integrate the two styles.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823958" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/116297260408090845/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=116297260408090845" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116297260408090845" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/116297260408090845" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823958/scala-programming-language.html" title="Scala Programming Language" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://xenomachina.com/2006/11/scala-programming-language.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-115695608006624271</id><published>2006-08-30T10:03:00.000-07:00</published><updated>2006-08-30T10:11:10.826-07:00</updated><title type="text">Nerds versus geeks</title><content type="html">&lt;p&gt;Ask Yahoo recently had a post titled "&lt;a href="http://ask.yahoo.com/20060818.html"&gt;What's the difference between a nerd, a geek, and a dork?&lt;/a&gt;. Their definitions of nerd and geek are pretty consistent with the ones I've become used to since living in the SF Bay Area, but they aren't consistent with the way these terms were used when I was growing up.

&lt;p&gt;In my high school a geek was someone who was unpopular while a nerd was someone who was unpopular but smart. I remember when I first started reading &lt;a href="http://slashdot.org/"&gt;Slashdot&lt;/a&gt;, shortly after I moved to the Bay Area, I was really surprised at their use of the word "geek". "Geeks don't know how to use computers", I thought, "they're too busy &lt;a href="http://www.kli.org/"&gt;learning to speak Klingon&lt;/a&gt; or &lt;a href="http://www.cerado.com/web20quiz.htm"&gt;memorizing the names of Star Wars characters&lt;/a&gt;". Sure, there are  certain things that both geeks and nerds tend to be interested in, like science fiction, comic books and role playing games, but nerds are the ones who know how to do "useful" things. I became even more surprised when I learned that many slashdotters seemed to use an inverted set of definitions for geek and nerd.

&lt;p&gt;&lt;a href="http://en.wikipedia.org/wiki/Nerd#Differences_from_geek"&gt;Wikipedia has a bit of an explanation&lt;/a&gt;:

&lt;blockquote&gt;Pundits and observers dispute the relationship of the terms "nerd" and "geek" to one another. Some view the geek as a less technically skilled nerd. Others view the exact opposite.&lt;/blockquote&gt;

&lt;p&gt;They also reference &lt;a href="http://www.catandgirl.com/view.php?loc=94"&gt;an excellent &lt;cite&gt;Cat and Girl&lt;/cite&gt;&lt;/a&gt; comic which, incidentally, defines nerd and geek in a way that's consistent with the definitions I grew up with.

&lt;p&gt;It sounds like the definitions of these two terms are regional. The Wikipedia page suggests that this may be an east-coast versus west-coast thing: on the east coast people think nerds are smart, while on the west coast people think geeks are smart.  That's certainly consistent with my experience, as I grew up in Ontario. It would be interesting if someone made a map-poll like the &lt;a href="http://www.popvssoda.com/"&gt;Pop vs. Soda Page&lt;/a&gt;. &lt;a href="http://www.lazyweb.org/"&gt;LazyWeb&lt;/a&gt;, don't fail me now!&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823959" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/115695608006624271/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=115695608006624271" title="5 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/115695608006624271" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/115695608006624271" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823959/nerds-versus-geeks.html" title="Nerds versus geeks" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">5</thr:total><feedburner:origLink>http://xenomachina.com/2006/08/nerds-versus-geeks.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-114843950255067405</id><published>2006-08-17T18:30:00.000-07:00</published><updated>2006-08-17T18:40:38.393-07:00</updated><title type="text">Top 10 Java Classes I Love to Hate</title><content type="html">&lt;p&gt;I haven't posted here in months. What better way is there to end a blogging dry spell than a good rant?
&lt;p&gt;Here are ten Java classes in the standard API that annoy me whenever I have to deal with them, in no particular order:
&lt;dl&gt;
&lt;dt&gt;&lt;code&gt;java.io.File&lt;/code&gt;
&lt;dd&gt;An abstract file representation... or is it? It exposes system specific things like the &lt;code&gt;File.separator&lt;/code&gt; and &lt;code&gt;File.pathSeparator&lt;/code&gt;, yet it doesn't understand what "." and ".." do unless you canonicalize the &lt;code&gt;File&lt;/code&gt; object. It's also tied to the system's filesystem. This means you generally need to build an abstraction layer on top of &lt;code&gt;File&lt;/code&gt;. Finally, &lt;code&gt;File.lastModified()&lt;/code&gt; returns a &lt;code&gt;long&lt;/code&gt;. Why not a &lt;code&gt;Date&lt;/code&gt;? (&lt;code&gt;lastModified()&lt;/code&gt; used to be measured in arbitrary units from some arbitrary time. Not very useful if you want to be able to communicate the last modified time to the user or even another program. This was later fixed to be measured in milliseconds since the epoch.)
&lt;dt&gt;&lt;code&gt;java.io.Serializable&lt;/code&gt;
&lt;dd&gt;First, it's a marker interface. Marker interfaces are generally a bad smell. They're a good sign that someone was being lazy, or not thinking very carefully about the problem they were trying to solve. In the case of &lt;code&gt;Serialization&lt;/code&gt; it's especially bad because there are methods that probably should be in the interface: &lt;code&gt;writeObject()&lt;/code&gt;, &lt;code&gt;readObject()&lt;/code&gt; and &lt;code&gt;getSerialVersionUID&lt;/code&gt;. Instead, reflection is used to find methods that have "magic names". A definite no-no in my book.
&lt;p&gt;Of course, even that wouldn't fix the bigger issue which is that Java's serialization (like Python's pickling) is a very fragile mechanism for persisting objects which relies on the internal state of objects rather than on their public interfaces.
&lt;dt&gt;&lt;code&gt;java.lang.Cloneable&lt;/code&gt;
&lt;dd&gt;Like &lt;code&gt;Serializable&lt;/code&gt;, &lt;code&gt;Cloneable&lt;/code&gt; is a marker interface. It's even easier to see what's wrong with &lt;code&gt;Clonable&lt;/code&gt;, though. Where's the &lt;code&gt;clone()&lt;/code&gt; method? The docs mention its absence. That doesn't stop it from being a bug.

&lt;dt&gt;&lt;code&gt;java.text.MessageFormat&lt;/code&gt;
&lt;dd&gt;Overcomplicated. It defines a whole programming language for messages. This is great in theory, but it's not something you could actually give to translators. Hint: most translators are not computer programmers. Even if you manage to find a translator that can deal with the craziness of &lt;code&gt;MessageFormat&lt;/code&gt; chances are they don't know &lt;em&gt;every&lt;/em&gt; language you want to translate into.

&lt;dt&gt;&lt;code&gt;java.text.SimpleDateFormat&lt;/code&gt;
&lt;dd&gt;Almost every time I see this class used I see the same bug in the code that uses it. &lt;code&gt;SimpleDateFormat.format()&lt;/code&gt; is not reentrant and is not thread safe. Beyond that, &lt;code&gt;DateFormat&lt;/code&gt; has one of the most bizarre APIs ever. It has a &lt;code&gt;setCalendar&lt;/code&gt; method, but what does setting the "calendar" do? Why, it lets you get it back with &lt;code&gt;getCalendar&lt;/code&gt;! It also lets you stomp on some of format's internal state if you call it concurrently, but presumably it isn't meant for that.

&lt;dt&gt;&lt;code&gt;java.util.Calendar&lt;/code&gt;
&lt;dd&gt;What &lt;em&gt;isn't&lt;/em&gt; wrong with this class? Well, I guess it isn't a marker interface, at least.

&lt;p&gt;An instance of the &lt;code&gt;Calendar&lt;/code&gt; class represents what? The answer should be "a calendar", but in fact an instance of this class represents a &lt;em&gt;date&lt;/em&gt;. A mutable date whose mutators follow the rules of a particular calendar. Truly bizarre.

&lt;dt&gt;&lt;code&gt;java.util.Date&lt;/code&gt;
&lt;dd&gt;Date isn't so bad. It has two main sins: First, Date objects are mutable. Second, somehow it made someone feel the urge to write Calendar.

&lt;dt&gt;&lt;code&gt;java.util.Locale&lt;/code&gt;
&lt;dd&gt;Here's a &lt;a href="http://www.answers.com/locale"&gt;dictionary definition for "locale"&lt;/a&gt;:
&lt;blockquote&gt;
&lt;b&gt;lo·cale&lt;/b&gt; (lō-kăl')
&lt;br /&gt; &lt;i&gt;n.&lt;/i&gt;&lt;ol&gt;&lt;li&gt; A place, especially with reference to a particular event: &lt;i&gt;the locale of a crime.&lt;/i&gt;&lt;/li&gt;&lt;li&gt; The scene or setting, as of a novel.&lt;/li&gt;&lt;/ol&gt;
&lt;/blockquote&gt;

&lt;p&gt;Some of the constants in &lt;code&gt;Locale&lt;/code&gt; fit this definition, and clearly represent "places":

&lt;pre class=code&gt;
static public final Locale CHINA = new Locale("zh","CN","");
static public final Locale FRANCE = new Locale("fr","FR","");
static public final Locale GERMANY = new Locale("de","DE","");
&lt;/pre&gt;

&lt;p&gt;Others, not so much:

&lt;pre class=code&gt;
static public final Locale CHINESE = new Locale("zh","","");
static public final Locale FRENCH = new Locale("fr","","");
static public final Locale GERMAN = new Locale("de","","");
&lt;/pre&gt;

&lt;p&gt;This is a pretty clear example of a common problem I've noticed with internationalization: a lot of people seem to confuse &lt;strong&gt;location&lt;/strong&gt; with &lt;strong&gt;language&lt;/strong&gt;. Is it &lt;em&gt;because of&lt;/em&gt; the Locale class, or is the &lt;code&gt;Locale&lt;/code&gt; class merely another victim of some sort of mass-hysteria? I don't know. In any case, the class probably should've been called &lt;em&gt;language&lt;/em&gt; since it's obviously based on &lt;a href="http://rfc.net/rfc1766.html"&gt;RFC1766: Tags for the Identification of &lt;strong&gt;Languages&lt;/strong&gt;&lt;/a&gt;.

&lt;dt&gt;&lt;code&gt;java.util.Stack&lt;/code&gt;
&lt;dd&gt;&lt;code&gt;Stack&lt;/code&gt; is mostly annoying because it used up a good name. I occasionally want a stack, but I never want a stack that extends &lt;code&gt;Vector&lt;/code&gt;. At least &lt;code&gt;Vector&lt;/code&gt; and &lt;code&gt;Hashtable&lt;/code&gt; had the decency to not use the only good names for what they do, but what else do you call a &lt;code&gt;Stack&lt;/code&gt;? A LIFO? Java 1.6 will actually add &lt;code&gt;Deque&lt;/code&gt; which can be used as a stack, but the interface is a lot "fatter" than than I'd like for the cases where I really just want a stack.

&lt;dt&gt;&lt;code&gt;java.util.WeakHashMap&lt;/code&gt;
&lt;dd&gt;Good idea, poor execution. First, the name is ambiguous. Weak what? Weak keys? Weak values? It turns out that it's weak keys, but it would be nice if the name said as much. It would also be nice if there was a weak value version so that people were more aware that they had to make a decision, as the two types of "weakness" are not interchangeable. You typically want weak keys when you're trying to "annotate" existing objects, but don't want the annotations to outlive the objects. You typically want weak values when you're trying to implement a weak cache keyed by something that's "recreatable" (typically "value objects", like Strings or numbers).

&lt;p&gt;Since it is a weak key hashmap it should actually be a weak key identity hashmap. It isn't, though. &lt;code&gt;WeakHashMap&lt;/code&gt; uses &lt;code&gt;Object.equals()&lt;/code&gt; despite the fact that weak references operate on identity.
&lt;/dl&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823960" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/114843950255067405/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=114843950255067405" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114843950255067405" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114843950255067405" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823960/top-10-java-classes-i-love-to-hate.html" title="Top 10 Java Classes I Love to Hate" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://xenomachina.com/2006/08/top-10-java-classes-i-love-to-hate.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-114909443561097552</id><published>2006-05-31T09:15:00.000-07:00</published><updated>2006-06-10T16:41:15.020-07:00</updated><title type="text">Amazing Spaghetti</title><content type="html">&lt;a href="http://www.atariarchives.org/basicgames/"&gt;&lt;img border=0 align=right src="http://xenomachina.com/images/basic-computer-games-cover.gif" alt=""&gt;&lt;/a&gt;&lt;p&gt;On &lt;a href="http://www.gadgetopia.com/post/2386"&gt;Gadgetopia&lt;/a&gt; I read that "Someone scanned in all the pages from the classic book &lt;cite&gt;BASIC Computer Games&lt;/cite&gt;". I remember back in elementary school and high school I used to get magazines and books from the library with program listings.

&lt;p&gt;I rarely ever actually typed in the listings, though -- I was too lazy for that. Instead, I'd often try to figure out how the code worked. My favorites were the listings that also had an explanation of how the program worked. Then I'd typically ignore the listing entirely and just try to write a program based on the description. I remember writing a fractal landscape generator in BASIC 7.0 for the &lt;a href="http://en.wikipedia.org/wiki/Commodore_128"&gt;Commodore 128&lt;/a&gt; based on an article in &lt;a href="http://en.wikipedia.org/wiki/Compute_magazine"&gt;Compute!&lt;/a&gt; which had a listing for an IBM PC &lt;a href="http://en.wikipedia.org/wiki/Fractal_landscape"&gt;fractal landscape&lt;/a&gt; generator.&lt;a href="http://www.atarimagazines.com/compute/index/#issue85"&gt;&lt;img border=0 align=left src="http://xenomachina.com/images/compute-june1987-cover-small.jpg"&gt;&lt;/a&gt;

&lt;p&gt;Anyway, back to &lt;cite&gt;BASIC Computer Games&lt;/cite&gt;: Looking at the scanned cover, I felt like I remembered this book. I remember borrowing it from the public library back in high school and being surprised by the seemingly ancient version of BASIC that it was using. I don't know if it was actually an "ancient version of BASIC", that's just what it seemed like to me at the time. The book &lt;em&gt;was&lt;/em&gt; published in 1978, well before the &lt;a href="http://en.wikipedia.org/wiki/Commodore_64"&gt;Commodore 64&lt;/a&gt;, my first computer, even existed.

&lt;p&gt;There was one program in the book that really intriguied me: a random maze generator called "Amazing". By the time I got my hands on the book my programming language of choice was &lt;a href="http://en.wikipedia.org/wiki/Turbo_Pascal"&gt;Turbo Pascal&lt;/a&gt;, so I decided to try and port "Amazing". I never actually succeeded because Turbo Pascal is &lt;a href="http://en.wikipedia.org/wiki/Structured_programming"&gt;structured&lt;/a&gt;, while "Amazing" made copious use of spaghetti like &lt;code&gt;&lt;a href="http://en.wikipedia.org/wiki/GOTO"&gt;GOTO&lt;/a&gt;&lt;/code&gt;s.

&lt;p&gt;The first thing I did when I found out about the scan of the book today was to check if this really was the maze generator I remembered. I remembered that the program had lots of "&lt;code&gt;GOTO 1000&lt;/code&gt;" statements, and that line 1000 was itself a &lt;code&gt;GOTO&lt;/code&gt; statement (making the program worthy of &lt;a href="http://thedailywtf.com/"&gt;TheDailyWTF&lt;/a&gt;, IMHO). Sure enough, if you check &lt;a href="http://www.atariarchives.org/basicgames/showpage.php?page=3"&gt;the listing of Amazing&lt;/a&gt; you can see that spaghetti I was up against.

&lt;p&gt;The funny part is that the program listing is only about 150 lines long, which is actually pretty short. I think I'll take another crack at translating the program, though this time I'll probably use &lt;a href="http://python.org/"&gt;Python&lt;/a&gt; rather than Turbo Pascal.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823961" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/114909443561097552/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=114909443561097552" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114909443561097552" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114909443561097552" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823961/amazing-spaghetti.html" title="Amazing Spaghetti" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://xenomachina.com/2006/05/amazing-spaghetti.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-114607171994818070</id><published>2006-04-26T08:17:00.000-07:00</published><updated>2006-09-07T16:14:16.673-07:00</updated><title type="text">Maker Faire</title><content type="html">&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274555/" title="Welcome to Maker Faire 2006"&gt;&lt;img align=left src="http://static.flickr.com/45/133274555_6428f58a56_m.jpg" width="240" height="180" alt="Welcome to Maker Faire 2006" /&gt;&lt;/a&gt;
This past weekend I went to Maker Faire. There was lots of neat stuff
on display, including a firetruck that belched flames at random
intervals, a life-size robotic giraffe (life size for a giraffe, that
is), and games of Segway Polo.

&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274540/" title="Firetruck"&gt;&lt;img align=right src="http://static.flickr.com/56/133274540_29b76191a3_m.jpg" width="180" height="240" alt="Firetruck" /&gt;&lt;/a&gt;
There were also a number of workshops and presentations. For many of
the workshops you were supposed to sign up in advance, but in many cases
it was possible to get in without doing this. In the worst case you
could still observe workshops even when it wasn't possible to get into
them.

&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274527/" title="Robotic Giraffe"&gt;&lt;img align=left src="http://static.flickr.com/45/133274527_b0c22bbf33_m.jpg" width="240" height="180" alt="Robotic Giraffe" /&gt;&lt;/a&gt;
The first presentation I went to on Saturday was 
&lt;cite&gt;Control Lights and Appliances using Express Tools&lt;/cite&gt;. This was
a thinly veiled ad for Microsoft's Visual Studio Express Tools. The
presenters were trying to show how one could control lights via X10
using C#, but their x10 modules kept flaking out. The presenters were
university students (one from Stanford and one from Berkeley), and a
sales guy from Microsoft who seemed like he would've been more at home
coaching a football team. Overall, the presentation was at the wrong
level for the audience. As far as I could tell, most, if not all, of the
people in the audience were proficient programmers, yet the Microsoft
guy kept prompting the two students to explain basic programming
concepts like "what is a comment".

&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274511/" title="Segway Polo"&gt;&lt;img align=right src="http://static.flickr.com/52/133274511_5058a5bb60_m.jpg" width="240" height="180" alt="Segway Polo" /&gt;&lt;/a&gt;
Things went uphill from there. The next thing I checked out was a
workshop by Perry Kaye from Think Solve Do!, Inc. I think this was $200
Machine Shop. I wasn't actually in the workshop (I got there too late,
and I hadn't signed up), but watching it was pretty interesting. Perry
demonstrated a number of interesting techniques for building "prototypes"
of inventions very quickly and at low cost. For example, he suggested
drawing 2D designs on a computer, printing them out at 1:1 scale, gluing
the printout to a sheet of wood, and then using a scrollsaw. He also
talked about epoxy putty, and a technique for making molds and casting
parts in &lt;a href="http://www.alumilite.com/"&gt;Alumilite&lt;/a&gt; resin.

&lt;p&gt;
After this I went to a talk on Hacking USB Keyboards. The basic idea
was simple: get a (cheap) USB keyboard, open it up and label the key
contacts, follow the traces back from the contacts for the keys you care
about, and finally connect your own switches or sensors to the lines.
Using this technique one could connect a large number of binary (ie:
on/off) sensors to a PC.

&lt;p&gt;
&lt;a href="http://flickr.com/photos/laurence/133274175/" title="Eggbot"&gt;&lt;img align=left src="http://static.flickr.com/53/133274175_7818a6d4ed_m.jpg" /&gt;&lt;/a&gt;
I then went to a talk by Bruce Shapiro called &lt;a
href="http://www.taomc.com/home.htm"&gt;The Art of Motion Control&lt;/a&gt;.
Bruce had a number of neat things on display including "ribbondancer", a
tower that gracefully swings a pole with a ribbon at the end
continuously, &lt;em&gt;all day long&lt;/em&gt;; "Eggbot", a shoebox sized device
that can draw intricate designs on eggs or lightbulbs; and a computer
controlled Etch-A-Sketch. Many of Bruce's devices would be called
"robots" to many people, but he prefers the term "motion control". I
think this may be to avoid getting people's hopes up. His devices look
nothing like humanoids: they're very special purpose machines for
creating (or being) art.

&lt;p&gt;
&lt;a href="http://flickr.com/photos/laurence/133274159/" title="Egg^H^H^HBulbbot"&gt;&lt;img align=right src="http://static.flickr.com/44/133274159_ff0099b1a7_m.jpg" /&gt;&lt;/a&gt;
In his talk Bruce explained how he gave up his career as a medical
doctor to become an artist and educator, and described a number of other
projects that he's worked on.

&lt;p&gt;
&lt;a href="http://flickr.com/photos/laurence/133274134/" title="Lee Krasnow's Incredibly Precise Wooden Puzzles"&gt;&lt;img align=left src="http://static.flickr.com/51/133274134_e392a62da3_m.jpg" /&gt;&lt;/a&gt;
The last presentation I went to on Saturday was &lt;cite&gt;Precision
Woodworking / Puzzles&lt;/cite&gt; by &lt;a
href="http://www.pacificpuzzleworks.com/"&gt;Lee Krasnow&lt;/a&gt;. Lee explained
his process for creating &lt;em&gt;extremely&lt;/em&gt; precise 3D wooden puzzles. A
lot of these are platonic solids or starred platonic solids which
disassemble/reassemble only if you know the right sequence of moves.

&lt;p&gt;
&lt;a href="http://flickr.com/photos/laurence/133274088/" title="Some of Lee Krasnow's Woodworking Jigs"&gt;&lt;img align=right src="http://static.flickr.com/49/133274088_d9f85b2e67_m.jpg" /&gt;&lt;/a&gt;
Despite the fact that he's working with one of the oldest materials
known to man (wood), Lee uses some &lt;em&gt;very&lt;/em&gt; modern techniques to
get the precision that he demands. He uses a computer controlled saw and
a series of jigs that he built himself for cutting everything. He
doesn't sand anything (sanding is imprecise, after all). Instead, he
cuts &lt;em&gt;very&lt;/em&gt; slowly, and he has the saw programmed to slow down
even more at the end of the cut. He also always cuts with the grain
rather than against it. Pieces where the cut was against the grain he
refinishes by running them through the saw a second time facing in the
opposite direction.

&lt;p&gt;
For fastening the pieces together he uses pins, not glue. Because
many of the pieces are strange shapes that are hard to work with he has
a bunch of jigs that he designed in 3D CAD and then had 3D printed.

&lt;p&gt;
By the end of the day I thought I'd seem just about all of the
booths. I was surprised that I hadn't really seen much Lego, since I'd
heard that Lego was a sponsor. I looked at my map and realized that I'd
missed one area.

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274441/" title="Lego City"&gt;&lt;img src="http://static.flickr.com/47/133274441_e4fd8a87cb_m.jpg" width="240" height="180" alt="Lego City" /&gt;&lt;/a&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274406/" title="Giant Lego Crane"&gt;&lt;img src="http://static.flickr.com/44/133274406_4dca9e07f7_m.jpg" width="240" height="180" alt="Giant Lego Crane" /&gt;&lt;/a&gt;
&lt;/center&gt;

&lt;p&gt;
"Maker Hall B" had huge displays of Lego including an enormous
(probably about 400 square feet) Lego City with numerous working trains,
a massive Lego crane (more than 15 feet tall, I'd guess) and many other
Lego creations like a "Lucky Cat".

&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274470/" title="Lego Lucky Cat"&gt;&lt;img align=right src="http://static.flickr.com/49/133274470_83c3c66397_m.jpg" width="240" height="240" alt="Lego Lucky Cat" /&gt;&lt;/a&gt;
The new NXT Mindstorms sets were also
on display. I was surprised at how small some of the new pieces (like
the sonar sensor). I'd only ever seen them in photos, and so I didn't
have a proper sense of scale.

&lt;p&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274387/" title="Lego NXT"&gt;&lt;img align=left src="http://static.flickr.com/56/133274387_5372d67713_m.jpg" width="240" height="180" alt="Lego NXT" /&gt;&lt;/a&gt;
The next day I went to a talk on &lt;a
href="http://instructables.com"&gt;Instructables&lt;/a&gt; by Eric Wilhelm.
Instructables is sort of like Flickr for tutorials. One thing I found
really interesting was the way that they'd thought about the issues of
refactoring and re-use. Just as you factor common operations in a
computer program out into reusable functions/classes/whatever, in
Instructables it's useful to be able to factor out part of one tutorial
(eg: the part on "how to use a hammer") for use in another tutorial.

&lt;p&gt;
Next, I went to a talk on &lt;a
href="http://processing.org/"&gt;Processing&lt;/a&gt;. Processing is a somewhat
goofy little scripting language, but it's quite good at one thing:
making it really easy to create artwork and animation from code. The
tutorial reminded me of when I used to write programs on my Commodore
128 in BASIC 7.0 for drawing fractals and geometric art. It made me want
to dig up those old programs and recode them in processing.

&lt;p&gt;
I then went to the only workshop I'd actually signed up for in
advance, &lt;a href="http://www.makezine.com/pub/ev/235"&gt;Build Your Own
RFID Reader&lt;/a&gt; presented by &lt;a
href="http://www.parallax.com"&gt;Parallax&lt;/a&gt;. For $15 we were given about
$100 worth of Parallax products including an RFID reader, a Basic Stamp
2 "HomeWork" board, two RFID tags and a bunch of software and documentation in a
addition to being told how to use it. We have two cats, and the bigger
one is always eating the smaller one's food. My plan is to put an RFID
tag on him, and then rig up something around the other cat's bowl that
will scare him away if he tries to steal food.

&lt;p&gt;
I also went to a presentation called &lt;a
href="http://www.makezine.com/pub/ev/352"&gt;DIY Touchpanels&lt;/a&gt; given by
Sasha Harris-Cronin. She talked about a bunch of different techniques
for building touchpanels including computer vision, RF, capacitance, and
a bunch of others. It was pretty interesting as she showed a bunch of
examples and explained the pros and cons of each implementation.

&lt;center&gt;
&lt;a href="http://flickr.com/photos/laurence/133274285/" title="A 3D Lamp by Bathsheba Grossman"&gt;&lt;img src="http://static.flickr.com/55/133274285_88844d41f2_m.jpg" /&gt;&lt;/a&gt;
&lt;a href="http://flickr.com/photos/laurence/133274249/" title="3D &amp;quot;Art Parts&amp;quot; by Bathsheba Grossman"&gt;&lt;img src="http://static.flickr.com/54/133274249_bcd2ec687c_m.jpg" /&gt;&lt;/a&gt;
&lt;/center&gt;
&lt;p&gt;
One of my favorite exhibits at the Faire was the 3D artwork by &lt;a
href="http://www.bathsheba.com/"&gt;Bathsheba Grossman&lt;/a&gt;. Some of it she
designs using 3D modeling software, and some she creates with software
she writes herself. She then uses 3D printing to produce the most
amazingly intricate paperweights I've ever seen.

&lt;center&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274349/" title="Meccano Difference Engine"&gt;&lt;img src="http://static.flickr.com/49/133274349_dd046be283_m.jpg" width="240" height="180" alt="Meccano Difference Engine" /&gt;&lt;/a&gt;
&lt;a href="http://www.flickr.com/photos/laurence/133274318/" title="Meccano Difference Engine Closeup"&gt;&lt;img src="http://static.flickr.com/54/133274318_946f8459c5_m.jpg" width="240" height="180" alt="Meccano Difference Engine Closeup" /&gt;&lt;/a&gt;
&lt;/center&gt;
Another really neat exhibit was the amazing working model of a
difference engine constructed out of Meccano by &lt;a
href="http://www.meccano.us/difference_engines/rde_1/"&gt;Tim Robinson&lt;/a&gt;.
The model was several feet long and a couple of feet tall &lt;em&gt;and it
actually works!&lt;/em&gt; Tim showed how he was able to compute sines using
the device just by turning the crank.

&lt;p&gt;
Here's a little video I made of Tim and his difference engine:

&lt;center&gt;
&lt;embed style="width:400px; height:326px;" id="VideoPlayback" align="middle" type="application/x-shockwave-flash" src="http://video.google.com/googleplayer.swf?videoUrl=http%3A%2F%2Fvp.video.google.com%2Fvideodownload%3Fversion%3D0%26secureurl%3DoAAAAB-OFzQGeyi9TmmDUVeN99Nv1sshohl50q92nR_btav7IoXtb1qK5ocKq_ftMN2soOQPmISQNtkiMMRaOBLRL-CBDywTA5CiAlBWd6yiDGaBqQ7PIanZ6LYlAFId_MFMAc3L0woS3J7gqLXSnVPXXzItM1GvaarYXf6rdHSOThNzS-rJPi4BvA2v7HOoxTqmva2JPGduvzS81MZ7pIYrMRH4ddE-hO7RYwfzlM2r9u1i%26sigh%3DTvfsYw8bm6Q3Sq6h-zWD88fu1hU%26begin%3D0%26len%3D63499%26docid%3D8639494575376908189&amp;thumbnailUrl=http%3A%2F%2Fvideo.google.com%2FThumbnailServer%3Fapp%3Dvss%26contentid%3Db903358f62571507%26second%3D5%26itag%3Dw320%26urlcreated%3D1146022400%26sigh%3D4WPqoXXIqSWo-liJjjxA4pXg7cM&amp;playerId=8639494575376908189" allowScriptAccess="sameDomain" quality="best" bgcolor="#ffffff" scale="noScale" wmode="window" salign="TL"  FlashVars="playerMode=embedded"&gt; &lt;/embed&gt;
&lt;/center&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823962" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/114607171994818070/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=114607171994818070" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114607171994818070" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114607171994818070" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823962/maker-faire.html" title="Maker Faire" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://xenomachina.com/2006/04/maker-faire.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-114321975707662680</id><published>2006-03-24T08:49:00.000-08:00</published><updated>2006-03-24T09:07:50.036-08:00</updated><title type="text">Sorry, Everyone</title><content type="html">&lt;p&gt;I'd like to apologize in advance for all of the pain and suffering that are bound to be a result of the term "&lt;a href="http://www.massless.org/?archive=2006/03/me-roll-contains-no-jelly"&gt;me roll&lt;/a&gt;", which I uniwittingly unleashed upon the world. I meant it as a parody of "blog roll" (a word I can't stand) but faster than &lt;a href="http://en.wikipedia.org/wiki/Boston_Molasses_Disaster"&gt;a steaming vat of molasses&lt;/a&gt;, my parody transmogrified into a word that &lt;a href="http://www.massless.org/?area=About"&gt;some people&lt;/a&gt; actually use.

&lt;p&gt;I feel like the guy who invented the atom bomb. Okay, probably not that bad. I guess I feel more like the guy who invented the &amp;lt;blink&amp;gt; tag.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823963" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/114321975707662680/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=114321975707662680" title="0 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114321975707662680" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114321975707662680" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823963/sorry-everyone.html" title="Sorry, Everyone" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">0</thr:total><feedburner:origLink>http://xenomachina.com/2006/03/sorry-everyone.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-114079879524976668</id><published>2006-03-14T22:07:00.000-08:00</published><updated>2006-03-15T23:33:48.290-08:00</updated><title type="text">Somebody Else's Panda</title><content type="html">One of my best friends from &lt;a href="http://www.uwaterloo.ca/"&gt;school&lt;/a&gt; is &lt;a href="http://www.kataba.com/weblog/Weblog.asp?blog=Chris"&gt;Chris Thiessen&lt;/a&gt;. Back when we were in school Chris liked to collect some pretty odd things. For example, he once bought a bowling ball because he thought it was "really cool to have a solid ball of acrylic".

&lt;p&gt;One time I was over at Chris's apartment and he showed me a spool of string he'd recently purchased. The string was very strong, almost like fishing line, but I remember it being a dark reddish brown color. The spool had two handles, perhaps so that it could be used as kite string. Neither of us knew what the string was really meant for, but Chris had bought it because it was "really cool to have a spool of really strong string".

&lt;p&gt;Chris lived on the ninth floor of his apartment building, and he had a balcony that overlooked the parking lot. We decided that it would be neat to hurl something over the balcony, attached to the string, and then wind it back up. We selected a toy panda as the subject of our experiment. We attached a small red cape and then tied the end of the string around the panda firmly, and threw the panda off the balcony.

&lt;p&gt;The panda landed probably 50 or 60 feet out from the base of the building. We then started to wind the panda back in. Once we took up the slack, the panda "stood up" on its hind legs, and "waddled" almost as if it was walking towards the building. This cracked us up, so we continued winding it in slowly so that it could "walk" all the way back to the base of the building.

&lt;p&gt;At this point, a car drove into the parking lot and parked very close to the panda. Two people got out and walked towards the building. All the while the panda was walking right beside them. Somehow they managed to make it all the way back to the building without noticing the 1 1/2 foot tall panda walking less than ten feet away.

&lt;blockquote&gt;"An SEP," he said, "is something that we can't see, or don't see, or our brain doesn't let us see, because we think that it's somebody else's problem. That's what SEP means. Somebody Else's Problem. The brain just edits it out, it's like a blind spot. If you look at it directly you won't see it unless you know precisely what it is. Your only hope is to catch it by surprise out of the corner of your eye."&lt;cite&gt;Life, the Universe, and Everything&lt;/cite&gt;&lt;/blockquote&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823964" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/114079879524976668/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=114079879524976668" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114079879524976668" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/114079879524976668" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823964/somebody-elses-panda.html" title="Somebody Else's Panda" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://xenomachina.com/2006/03/somebody-elses-panda.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-113865207178040757</id><published>2006-02-24T17:13:00.000-08:00</published><updated>2006-02-24T17:12:01.536-08:00</updated><title type="text">Apple Predictions</title><content type="html">For years I've been correctly predicting what Apple would do. That's a bit weird, since I don't really follow the Mac press (or rumor sites), and I didn't even have a Mac when I made most of these predictions.&lt;p&gt;Here are the predictions I'd made about Apple in the past:&lt;ul&gt;&lt;li&gt;the iMac will be available in multiple colors&lt;li&gt;the iMac will switch to flat panel display&lt;li&gt;the iPod will be available in multiple colors (really only completely came true for the mini)&lt;li&gt;the iMac will change to a configuration where the whole computer is &lt;em&gt;in&lt;/em&gt; the flat panel&lt;/ul&gt;Unfortunately, I didn't really tell anyone any of these predictions before they came true, so you pretty much have to take my word for it.&lt;p&gt;This time, I'm going to post my current prediction here so that I have proof. My current prediction is that Apple is going to release a "smartphone" some time in the next couple of years. This will be sort of along the lines of the Treo, but will run an Apple OS (probably &lt;em&gt;not&lt;/em&gt; Mac OS, just like the iPod doesn't run Mac OS) and will, like the ROKR, have iTunes integration. Unlike the ROKR, it'll be a "smartphone", meaning that you'll be able to run PDA-like applications on it. I'm also guessing that the storage capacity will be more in line with iPods (unlike the ROKR's bizarre 100 song limitation).&lt;p&gt;Why am I predicting this? Partly, because it's something I want. I currently have a Treo 600, which I like. When it comes time to replace it I'm not planning on going with a Windows smartphone. Seeing as how &lt;a href="http://www.engadget.com/2005/09/22/the-palm-treo-700w-aka-treo-670-exclusive-first-look/"&gt;that's the direction that Treo is going&lt;/a&gt;, however, I'm left with few options.&lt;p&gt;Another reason I'm predicting this is that there are two signs that Apple is interested in this space. First, there's the obvious example of the ROKR. It isn't a smartphone, and is clearly just a Motorola phone with some iTunes intergration. It does indicate that Apple is interested in the mobile phone space, however. The other sign is that the iPod feature set has been expanding to encompass more of the features that you could conceivably want in a portable device. Now that audio and video are covered, a smartphone seems like the next obvious step.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823965" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/113865207178040757/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=113865207178040757" title="1 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/113865207178040757" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/113865207178040757" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823965/apple-predictions.html" title="Apple Predictions" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">1</thr:total><feedburner:origLink>http://xenomachina.com/2006/02/apple-predictions.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-113651262480249923</id><published>2006-01-24T23:48:00.000-08:00</published><updated>2006-01-25T17:06:47.286-08:00</updated><title type="text">Firefox Annoyances</title><content type="html">I was a &lt;a href="http://galeon.sourceforge.net/"&gt;Galeon&lt;/a&gt; user up until a few weeks ago, when I heard that Galeon development was coming to an end. The developers are moving to Epiphany, and I'm not really interested in following them.

&lt;p&gt;Galeon is a Mozilla based browser, just like Firefox. Galeon predates Firefox, and actually had many of the features that Firefox is known and loved for before Firefox even existed, notably "tabbed browsing" and being a stand-along web browser based on the Mozilla rendering engine, rather than a bloated "Internet suite".

&lt;p&gt;Galeon never had the popularity that Firefox has, however, and there are a number of features that Firefox had that I knew I wasn't going to get in Galeon. Notably, cross-platform portability, and support for extensions.

&lt;p&gt;I'd actually tried to switch to Firefox on several occasions in the past, but kept getting annoyed by various problems with it. This time I finally found a set of extensions which make it &lt;em&gt;bearable&lt;/em&gt;, but there are still some significant annoyances. Many of these annoyances are, not surprisingly, areas where Galeon was superior.

First, the annoyances that I was able to correct via extensions:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Single shared close button to close tabs.&lt;/b&gt; This makes as much sense as having a single shared close button to close windows. I use the &lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?application=firefox&amp;id=1122"&gt;Tab Mix Plus&lt;/a&gt; extension to correct this. Despite its goofy name, it's probably my favorite Firefox extension.
&lt;li&gt;&lt;b&gt;No single window browsing option&lt;/b&gt; I don't want websites to be able to open new windows, only new tabs. Tab Mix Plus also helps here.
&lt;li&gt;&lt;b&gt;Tabs open in the wrong order.&lt;/b&gt; Older versions of Galeon actually had an option to choose where new tabs would appear. Then, a few versions ago, they got rid of the option because they figured out the "right" place to open new tabs. Once again, Tab Mix Plus comes to the rescue. (in Events select "Open new tabs next to current one" and "Change openeing order")
&lt;li&gt;&lt;b&gt;No "clone tab" ability.&lt;/b&gt; Tab Mix Plus fixes this too.
&lt;li&gt;&lt;b&gt;Doesn't save session on exit.&lt;/b&gt; Surprisingly, Tab Mix Plus fixes this too. I guess that's what they mean by "Plus". I'd also tried an extension called Session Saver, but it seemed to make Firefox unstable.
&lt;li&gt;&lt;b&gt;No option to use a separate application for "view source".&lt;/b&gt; I like to "view source" in &lt;a href="http://www.vim.org/"&gt;gvim&lt;/a&gt;. The &lt;a href="https://addons.mozilla.org/extensions/moreinfo.php?application=firefox&amp;id=394"&gt;ViewSourceWith&lt;/a&gt; extension fixes this.
&lt;/ul&gt;

There are still a number of annoyances for which I haven't found a cure:
&lt;ul&gt;
&lt;li&gt;&lt;b&gt;Back-button history isn't preserved across tabs.&lt;/b&gt; For example, if I middle click on a link, the new tab's back button is disabled.
&lt;li&gt;&lt;b&gt;Middle clicking on submit buttons doesn't work.&lt;/b&gt; It should submit in a new tab.
&lt;li&gt;&lt;b&gt;No "detach tab" feature.&lt;/b&gt; Tab Mix Plus get close top this by having a "Duplicate in New Window" feature. It isn't quite the same though. I don't want a &lt;em&gt;copy&lt;/em&gt;, and I don't want a reload (especialy important for "AJAX" apps). I want &lt;em&gt;exactly this tab&lt;/em&gt; moved to a separate window.
&lt;li&gt;&lt;b&gt;No separate "Smart URL" in bookmarks.&lt;/b&gt; Firefox does allow bookmark "keywords", but it doesn't let you have separate URLs for "with arguments" and "without". For example, I want to be able to type "gg" in the address bar to go to "http://google.com/" but "gg foo" to go to "http://google.com/search?q=foo".
&lt;li&gt;&lt;b&gt;No custom toolbar search boxes.&lt;/b&gt; In Galeon, any bookmark on your toolbar that had a "smart URL" (a URL with a %s in it) would get a text field next to it. This was really nice because you could make custom search boxes. I had one for Google, one for my contacts list, one for the bug database, one for Wikipedia, and several others.
&lt;li&gt;&lt;b&gt;Only one, atomic, bookmarks toolbar.&lt;/b&gt; I'd like to be able to drag individual bookmarks/folders around on the toolbars when in customize mode.
&lt;li&gt;&lt;b&gt;No iconic bookmarks.&lt;/b&gt; In Galeon it was possible to choose an icon for a bookmark. This was handy for bookmarks that you wanted easy access to, but which you didn't want to take up a huge amount of space.
&lt;li&gt;&lt;b&gt;No bookmarks on the context menu.&lt;/b&gt; Again, this was a feature Galeon had. It was great for bookmarklets (like "post to del.icio.us").
&lt;li&gt;&lt;b&gt;Session saving is still a bit hokey.&lt;/b&gt; I want my session to save if I quit. I don't want it to save if I happen to close the last open window. This is probably actually an issue with Tab Mix Plus, rather than Firefox itself.
&lt;li&gt;&lt;b&gt;Closing the last tab should always close the window.&lt;/b&gt; This works with ctrl-W, but it doesn't work with the close button. Instead, a new, empty tab is fabricated for me. It astounds me that Tab Mix Plus doesn't have an option for this.
&lt;li&gt;&lt;b&gt;Keyboard focus occasionally flakey.&lt;/b&gt; I frequently run into issues where the cursor is blinking somewhere, but typing does nothing. I've noticed this on Linux and the Mac. (it's likely that I just don't use Windows enough to have run into it there yet) The problem can usually be solved by clicking on another window, and then back, but it's still annoying to periodically find that half a sentence was typed into the ether.
&lt;li&gt;&lt;b&gt;More standard shift-insert behaviour.&lt;/b&gt; On Linux, pressing shift-insert (in text fields, etc.) should paste the contents of the primary X selection, rather than the contents of the clipboard. ctrl-V already pastes the clipboard.
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823966" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/113651262480249923/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=113651262480249923" title="13 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/113651262480249923" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/113651262480249923" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823966/firefox-annoyances.html" title="Firefox Annoyances" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">13</thr:total><feedburner:origLink>http://xenomachina.com/2006/01/firefox-annoyances.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-112898917808239744</id><published>2005-10-11T21:20:00.000-07:00</published><updated>2005-10-12T08:42:26.080-07:00</updated><title type="text">HOWTO: Lego Minifig costume</title><content type="html">&lt;p&gt;Two years ago, I decided to make a Lego minifig (ie: "Lego man") costume for Halloween. The hardest part was building the head. Here's how I did it:&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852311/"&gt;&lt;img src="http://static.flickr.com/33/50852311_174a460a45.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;To start, I took some mug shots of an actual minifig. The only minifig I could find was this weird spaceman with facial hair and what appeared to by cyborg implants.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852402/"&gt;&lt;img src="http://static.flickr.com/28/50852402_6f4b9ee9ec.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;I then cleaned up photo in &lt;a href="http://www.gimp.org/"&gt;the GIMP&lt;/a&gt; by removing the extraneous features (facial hair, etc.). I just wanted to make a "classic" minifig costume. I then added a bunch of guidelines so I could more easily take measurements.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852460/"&gt;&lt;img src="http://static.flickr.com/31/50852460_f46eaaef99.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;


&lt;p&gt;I also measured my head. The distance from the top of my head to the bottom of my chin is about 10 inches. My plan was to make the head out of a stack of styrofoam insulation sheets. Each sheet is 2 inches thick, so five sheets could span the height of my head. Another sheet for the top, and one more for the bottom brings the total number up to seven.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852575/"&gt;&lt;img src="http://static.flickr.com/33/50852575_09be2038ab.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;I also printed out the minifig face to the right scale. I actually made two printouts. The first one was just full-page, and then the second one (shown here) was scaled to the right size. (I figured out how much to scale it down based on the size of the first printout) If I had good illustration software which would print at a reasonable scale I probably could've done without the first printout.&lt;/p&gt;

&lt;p&gt;This printout will be my template for painting the face later.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852653/"&gt;&lt;img src="http://static.flickr.com/30/50852653_12b59c68e9.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Then I started cutting disks of the right diameter out of the styrofoam sheets. The sheets are 4' x 6', and sell at home depot for about $2.50 each. The sheets I bought were convered in a plasticized-foil layer on one side.&lt;/p&gt;

&lt;p&gt;The first disk was traced out by putting a nail in the center, and using a pencil on a string as a home-brew compass. For all of the other disks, I used the first disk as a template.&lt;/p&gt;

&lt;p&gt;An ordinary steak knife works well for cutting the foam.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852736/"&gt;&lt;img src="http://static.flickr.com/32/50852736_fc8f65ea8f.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;I've cut a few disks so far, and you can see that it's starting to look like it's snowing. Cutting styrofoam makes a huge mess. It's easy to clean with a vacuum, though.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852878/"&gt;&lt;img src="http://static.flickr.com/24/50852878_ec07030d93.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Finally, my 7 styrofoam disks.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50852970/"&gt;&lt;img src="http://static.flickr.com/25/50852970_7afa5707cc.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;To paraphase Michelangelo, "I am merely releasing the minifig from the foam".&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853016/"&gt;&lt;img src="http://static.flickr.com/29/50853016_28e8f1d0cd.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;I then numbered all of the disks. Number 1 will be the bottom disk, and number 7 will be the top. During construction, it's easiest to have the stack upside down most of the time.&lt;/p&gt;

&lt;p&gt;You can also see that I put a couple of lines going down the length of the stack. This was so that I could maintain a consistent alignment between the pieces.&lt;/p&gt;

&lt;p&gt;I then cut a circular hole in disk #1 big enough for my head to pass through. When completed, this ring essentially goes around my neck.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853054/"&gt;&lt;img src="http://static.flickr.com/31/50853054_dd7cc3fd03.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;I then "shaved" the stack. This was just to remove any large inconsistencies. Later, I'll sand the stack to make it smoother. When "shaving" I made sure not to obliterate my alignment lines.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853123/"&gt;&lt;img src="http://static.flickr.com/28/50853123_9a670b9eec.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;I then traced the top of my head onto a sheet of paper, and then cut that shape into disk #6. (Remember: disk #7 is the one that will rest on top of my head, so it remains a solid disk.)&lt;/p&gt;

&lt;p&gt;When cutting this, I angled the knife inward a bit when I first cut out the shape. I then made gradual adjustmets until the disk would fit snugly on the top of my head. I wanted a reasonably snug fit so that the mask would rotate when I turned my head.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853164/"&gt;&lt;img src="http://static.flickr.com/28/50853164_321a482da3.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Here it is after cutting the holes in all of the layers, and gluing them together. I ended up using hot-glue, which works okay, but is tricky because it hardens so fast that there almost isn't enough time to put the pieces together.&lt;/p&gt;

&lt;p&gt;You have to be careful about  what sort of glue you use with styrofoam. Anything with a solvent will just disolve the foam. That means contact cement and model airplane glue are out. White glue (aka "Elmer's glue") would probably work okay, but I haven't tried it.&lt;/p&gt;

&lt;p&gt;After this step, I forgot to keep taking pictures. The next things that I did were:&lt;/p&gt;
&lt;ul&gt;

&lt;li&gt;Sanded the outside so that it was smooth. Styrofoam sands very well. I also sanded the top and bottom edges of the resulting cylinder to make them rounded like a minifig. A coarse sanding block made this really easy.

&lt;li&gt;Made a "stud" and glued it on top. More on the stud in a moment.

&lt;li&gt;Spray-painted the whole thing yellow, and used the face template to spray paint on the face.
&lt;/ul&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853344/"&gt;&lt;img src="http://static.flickr.com/24/50853344_87afc9131e.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Here it is after all of these steps.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853297/"&gt;&lt;img src="http://static.flickr.com/25/50853297_39bca7b219.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Here's the stud that I put on top. This is just a smaller disk, cut to the correct scale, glued on the top. On a real minifig, this would be a ring (ie: I'd cut a circle of of the middle of it). To make the costume more recognizable to non-Lego fanatics, I instead carved the letters "L E G O" out of styrofoam, and glued those onto the stud. This makes it more like a brick stud than a minifig stud, but when people asked "what are you" I could just show them the top of my head.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853384/"&gt;&lt;img src="http://static.flickr.com/32/50853384_b34e2759e2.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;I also made eye holes by poking a ball-point pen into the eye spots. I put black acrylic paint into the holes from the outside, so that they wouldn't be very noticable.&lt;/p&gt;

&lt;p&gt;If I were going to do this again, I'd want to find a better way to make the eye-holes. Perhaps cutting out the eyes entirely (making 2" diameter holes), and then covering them with black bug screen would work better. With these miniscule eye holes, visibility was terrible.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853259/"&gt;&lt;img src="http://static.flickr.com/25/50853259_2e9dae1a00.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Using spray paint also turned out to be a mistake. Remember what I said about solvents and styrofoam? Spray paint contains solvents. It still worked, but I needed to be very gentle with the paint. Even then, you can still see some damage, especially around the left eye. It also left the entire thing with a sort of stippled texture, rather than the glossy surface I was originally hoping for.&lt;/p&gt;

&lt;p&gt;If I was going to do it again, I'd either use a water based paint, or I'd put some sort of protective coating (maybe a thin layer of plaster of paris, or &lt;a href="http://www.ndrr.com/rmr_faq/Models/Future-Floor-Wax.htm"&gt;Future floor wax&lt;/a&gt;) on the foam before spray painting it.&lt;/p&gt;

&lt;center&gt;&lt;a href="http://flickr.com/photos/laurence/50853213/"&gt;&lt;img src="http://static.flickr.com/28/50853213_6c9afd399c.jpg?v=0"&gt;&lt;/a&gt;&lt;/center&gt;

&lt;p&gt;Here's the finished product!&lt;/p&gt;

&lt;p&gt;For the rest of my costume I wore a long-sleve baseball T-shirt (to get the effect of different colored arms from legs that many minifig have), wore yellow kitchen gloves, and put some rectangles of carboard in the bottom of my pant legs to make my legs seem "boxy".&lt;/p&gt;

&lt;p&gt;The whole costume took me about 4 hours to build. I actually built it all the night before I wore it to the Halloween party at work.&lt;/p&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823967" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/112898917808239744/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=112898917808239744" title="23 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/112898917808239744" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/112898917808239744" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823967/howto-lego-minifig-costume.html" title="HOWTO: Lego Minifig costume" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">23</thr:total><feedburner:origLink>http://xenomachina.com/2005/10/howto-lego-minifig-costume.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-112890062435729120</id><published>2005-10-09T15:32:00.000-07:00</published><updated>2005-10-10T22:31:26.720-07:00</updated><title type="text">Google Reader</title><content type="html">&lt;p&gt;It's nice to finally be able to tell people what I've been working on for the past few months: &lt;a href="http://www.google.com/reader/"&gt;Google Reader&lt;/a&gt;.

&lt;p&gt;The feedback I've seen about Reader has been pretty interesting. A lot of people really like it, which is always great to hear.

&lt;p&gt;Of course, some people aren't so happy. A lot of these people seem to be a bit confused by how different Reader is from the feed readers they're used to. It would've been a lot easier for us to create a clone of some other feed reader, but we wanted to do something better. Unfortunately, there's a danger with any innovation: doing something that's different, even if it's better, means is that people have to unlearn old habits.

&lt;p&gt;That isn't to say that we think Google Reader is perfect as it is. It's very much a work in progress. (that's why it's on &lt;a href="http://labs.google.com/"&gt;Google Labs&lt;/a&gt;, by the way) As &lt;a href="http://persistent.info/archives/2005/10/09/google-reader"&gt;Mihai mentions&lt;/a&gt;, "the ideal feed reader user interface still hasn't been discovered".

&lt;p&gt;In any case, we plan on making many improvements in the days ahead, and we hope you'll &lt;a href="mailto:labs+reader@google.com"&gt;keep sending us suggestions&lt;/a&gt;.&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823968" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/112890062435729120/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=112890062435729120" title="4 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/112890062435729120" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/112890062435729120" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823968/google-reader.html" title="Google Reader" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">4</thr:total><feedburner:origLink>http://xenomachina.com/2005/10/google-reader.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-112638237495502674</id><published>2005-09-10T12:41:00.000-07:00</published><updated>2006-09-09T17:07:04.886-07:00</updated><title type="text">Printing through SAMBA in Color</title><content type="html">&lt;p&gt;This is a public service announcement. I wasn't able to find a solution to this problem on the web (or Usenet), so here's the solution I worked out.

&lt;p&gt;I was having this problem where our Windows XP box wasn't printing in color. In our setup, our Linux box is connected to our printer. The Linux box prints via CUPS, and the printer is made visible to our Windows box via SAMBA. Printing from the Linux box directly works great, but printing from the Windows box resulted in everything being converted to grayscale.

&lt;p&gt;The weirdest part about this problem was that we had the problem back when I was running Fedora, and it persisted even after I switched to Debian (including a completely new reinstall of CUPS and SAMBA).

&lt;p&gt;The first thing I tried was changing the printer driver on the Windows box. I was using the &lt;a href="http://www.adobe.com/support/downloads/product.jsp?product=44&amp;platform=Windows"&gt;Adobe PostScript drivers&lt;/a&gt;, so I tried switching to something that was explicitly color. I chose the Apple Color LaserWriter 12/600, since it's definitely color, and Apple LaserWriter tends to use standard PostScript (as opposed to HP PostScript printers, for example). To make a long story short: that didn't help. At least, it wasn't enough to do the trick on its own.

&lt;p&gt;I think that pretty much eliminated the Windows driver as a suspect, and both CUPS and the printer were eliminated by the fact that I could print from the Linux box in color. So that left SAMBA. I went through the advanced options one by one until I came across "use client driver", which was set to "no". I had no idea what this setting was for, and the documentation wasn't much help:&lt;blockquote&gt;This parameter applies only to Windows NT/2000 clients.  It has no effect on Windows 95/98/ME clients.  When serving a printer to Windows NT/2000 clients without first installing a valid printer driver on the Samba host, the client will be required to install a local printer driver.  From this point on, the client will treat the print as a local printer and not a network printer connection.  This is much the same behavior that will occur when &lt;b class="command"&gt;disable spoolss = yes&lt;/b&gt;.  &lt;/p&gt;&lt;p&gt;The differentiating  factor is that under normal circumstances, the NT/2000 client will  attempt to open the network printer using MS-RPC.  The problem is that because the client considers the printer to be local, it will attempt to issue the OpenPrinterEx() call requesting access rights associated  with the logged on user. If the user possesses local administator rights but not root privilegde on the Samba host (often the case), the OpenPrinterEx() call will fail.  The result is that the client will now display an "Access Denied; Unable to connect" message in the printer queue window (even though jobs may successfully be printed).  &lt;/p&gt;&lt;p&gt;If this parameter is enabled for a printer, then any attempt to open the printer with the PRINTER_ACCESS_ADMINISTER right is mapped to PRINTER_ACCESS_USE instead.  Thus allowing the OpenPrinterEx() call to succeed.  &lt;em&gt;This parameter MUST not be able enabled on a print share which has valid print driver installed on the Samba server.&lt;/em&gt;&lt;/p&gt;&lt;p&gt;Default: &lt;em&gt;&lt;tt&gt;use client driver&lt;/tt&gt; = no&lt;/em&gt;&lt;/blockquote&gt;
&lt;p&gt;I learned far more about Windows system calls than I really wanted to by reading that. In any case, despite the fact that this didn't mention anything about printouts being converted to black-and-white, it did mention the message "Access Denied; Unable to connect". Checking our Windows box, this message &lt;em&gt;was&lt;/em&gt; showing up in the printer settings window. So I enabled the "use client driver" setting and it worked! Not only did the "Access Denied" message disappear, but our Windows box now miraculously prints in color.

&lt;p&gt;I can hear the Mac users chuckling already...&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823969" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/112638237495502674/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=112638237495502674" title="2 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/112638237495502674" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/112638237495502674" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823969/printing-through-samba-in-color.html" title="Printing through SAMBA in Color" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">2</thr:total><feedburner:origLink>http://xenomachina.com/2005/09/printing-through-samba-in-color.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-111974829585156859</id><published>2005-06-25T17:41:00.000-07:00</published><updated>2005-06-25T18:13:18.436-07:00</updated><title type="text">Digital rights: where to draw the line?</title><content type="html">&lt;p&gt;Assuming I'm paying for cable TV, and all of the series in question are aired on the networks I'm paying for, which of the following &lt;strong&gt;are&lt;/strong&gt; legal? Should any be illegal? Are any immoral?

&lt;ul&gt;
  &lt;li&gt;I watch every episode of &lt;i&gt;Series X&lt;/i&gt; as they are broadcast.
  &lt;li&gt;I watch most episodes of &lt;i&gt;Series X&lt;/i&gt; as they are broadcast, but occasionally I'll record an episode if I can't make the normal broadcast time, and watch it later.
  &lt;li&gt;I have a Tivo, and record every episode of &lt;i&gt;Series X&lt;/i&gt;. I watch all of the episodes some time after they are broadcast.
  &lt;li&gt;I have a Tivo, and record every episode of &lt;i&gt;Series X&lt;/i&gt;. I watch all of the episodes some time after they are broadcast. Sometimes I'll watch episodes of &lt;i&gt;Series Y&lt;/i&gt; while my Tivo is recording episodes of &lt;i&gt;Series X&lt;/i&gt;
  &lt;li&gt;I have two Tivos (or one multi-tuner Tivo), and I record every episode of &lt;i&gt;Series X&lt;/i&gt; and &lt;i&gt;Series Y&lt;/i&gt;. The two series are only broadcast at the same time, so there's no practical way I could've watch both series without "time-shifting".

  &lt;li&gt;I accidentally deleted an episode before watching it:
    &lt;ul&gt;
      &lt;li&gt;I borrow a tape of the episode a friend recorded from TV so I can watch the episode.
      &lt;li&gt;I borrow a DVD a friend burned from his Tivo so I can watch the episode.
      &lt;li&gt;A friend emails the episode to me.
      &lt;li&gt;A friend gives me the password to his personal website where he's put up a copy of the episode for me to download.
      &lt;li&gt;A friend tells me about a public website where he's put up a copy of the episode for me to download.
      &lt;li&gt;A friend tells me about a public website where someone has put up a copy of the episode I can download.
      &lt;li&gt;Google tells me about a public website where someone has put up a copy of the episode I can download.
      &lt;li&gt;Google tells me about a .torrent for the episode so I can download it.
    &lt;/ul&gt;

  &lt;li&gt;I forget to tell my Tivo to record an episode:
    &lt;ul&gt;
      &lt;li&gt;I borrow a tape of the episode a friend recorded from TV so I can watch the episode.
      &lt;li&gt;I borrow a DVD a friend burned from his Tivo so I can watch the episode.
      &lt;li&gt;A friend emails the episode to me.
      &lt;li&gt;A friend gives me the password to his personal website where he's put up a copy of the episode for me to download.
      &lt;li&gt;A friend tells me about a public website where he's put up a copy of the episode for me to download.
      &lt;li&gt;A friend tells me about a public website where someone has put up a copy of the episode I can download.
      &lt;li&gt;Google tells me about a public website where someone has put up a copy of the episode I can download.
      &lt;li&gt;Google tells me about a .torrent for the episode so I can download it.
    &lt;/ul&gt;

  &lt;li&gt;I find out about a new series half-way through the season. The old episodes aren't being aired anymore, so:
    &lt;ul&gt;
      &lt;li&gt;I borrow a tape of the episodes a friend recorded from TV so I can watch the episode.
      &lt;li&gt;I borrow a DVD a friend burned from his Tivo so I can watch the episodes.
      &lt;li&gt;A friend emails the episodes to me.
      &lt;li&gt;A friend gives me the password to his personal website where he's put up copies of the episodes for me to download.
      &lt;li&gt;A friend tells me about a public website where he's put up a copies of the episode for me to download.
      &lt;li&gt;A friend tells me about a public website where someone has put up copies of the episodes I can download.
      &lt;li&gt;Google tells me about a public website where someone has put up a copies of the episodes I can download.
      &lt;li&gt;Google tells me about .torrents for the episodes so I can download them.
    &lt;/ul&gt;

  &lt;li&gt;I find out about a series that started before I even had cable. The old episodes aren't being aired anymore, so:
    &lt;ul&gt;
      &lt;li&gt;I borrow a tape of the episodes a friend recorded from TV so I can watch the episode.
      &lt;li&gt;I borrow a DVD a friend burned from his Tivo so I can watch the episodes.
      &lt;li&gt;A friend emails the episodes to me.
      &lt;li&gt;A friend gives me the password to his personal website where he's put up copies of the episodes for me to download.
      &lt;li&gt;A friend tells me about a public website where he's put up a copies of the episode for me to download.
      &lt;li&gt;A friend tells me about a public website where someone has put up copies of the episodes I can download.
      &lt;li&gt;Google tells me about a public website where someone has put up a copies of the episodes I can download.
      &lt;li&gt;Google tells me about .torrents for the episodes so I can download them.
    &lt;/ul&gt;
&lt;/ul&gt;&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823970" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/111974829585156859/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=111974829585156859" title="8 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/111974829585156859" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/111974829585156859" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823970/digital-rights-where-to-draw-line.html" title="Digital rights: where to draw the line?" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">8</thr:total><feedburner:origLink>http://xenomachina.com/2005/06/digital-rights-where-to-draw-line.html</feedburner:origLink></entry><entry><id>tag:blogger.com,1999:blog-5051684.post-111243262889148455</id><published>2005-04-02T00:19:00.000-08:00</published><updated>2005-04-02T01:10:04.943-08:00</updated><title type="text">Debian Woes</title><content type="html">&lt;p&gt;After my &lt;a href="http://xenomachina.com/2004/07/fedora-woes.html"&gt;troubles with Fedora&lt;/a&gt; a number of friends suggested that I try out Debian. After hearing lots of great things about it, I finally decided to take the plunge. All is not well, however.

&lt;p&gt;First of all, it seems that what was considered bleeding edge for RedHat 9 a year and a half ago is still considered bleeding edge for the current release of Debian stable, aka "woody". When I tried to install it on my machine it didn't recognize the network interface. I my network interface is the 3com 3c940 integrated into my Asus P4P800 motherboard. Luckily I was smart this time, and used a separate hard drive for the Debian install, so that I could fall back to my existing Fedora install if anything went wrong.

&lt;p&gt;After several attempts to install woody failed, I gave up and tried "sarge". It had a problem too, unfortunately. It wasn't able to recognize my CD-ROM drive. This was especially weird, because I was installing it from a CD. In other words, the installer could not find the disk it had just loaded from! After a bit of searching, I finally found &lt;a href="http://lists.debian.org/debian-boot/2005/02/msg00023.html"&gt;a page which had a workaround&lt;/a&gt;. Just before the CD detection begins, switch to the other virtual console and execute:
&lt;pre class=code&gt;modprobe piix
modprobe ide-generic
modprobe ide-cd&lt;/pre&gt;
Then switch back to the installer, and it'll detect the CD. This seems to work. Yay!&lt;img src="http://feeds.feedburner.com/~r/xenomachina/~4/130823971" height="1" width="1"/&gt;</content><link rel="replies" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/111243262889148455/comments/default" title="Post Comments" /><link rel="replies" type="text/html" href="https://www.blogger.com/comment.g?blogID=5051684&amp;postID=111243262889148455" title="7 Comments" /><link rel="edit" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/111243262889148455" /><link rel="self" type="application/atom+xml" href="http://www.blogger.com/feeds/5051684/posts/default/111243262889148455" /><link rel="alternate" type="text/html" href="http://feeds.feedburner.com/~r/xenomachina/~3/130823971/debian-woes.html" title="Debian Woes" /><author><name>Laurence</name><uri>http://www.blogger.com/profile/12946206226063265718</uri><email>noreply@blogger.com</email></author><thr:total xmlns:thr="http://purl.org/syndication/thread/1.0">7</thr:total><feedburner:origLink>http://xenomachina.com/2005/04/debian-woes.html</feedburner:origLink></entry></feed>
