Playing with magnets #

The Supermag 244 kit comes with 72 long magnets and 108 short magnets. In total, that's about 11 feet of magnets.

Magnets are interesting to play with. I can take a S==N and a N==S magnet and move them together and they'll repel. If I put a metal sphere in between, they'll still repel until they both touch the sphere, and then they'll attract. Why is that? I don't quite understand it yet. The polarity of the magnets matters when building certain structures. S==N (*) N==S and S==N (*) S==N look and feel the same but when you're attaching more magnets to them, they'll behave differently. This page gives some tips on how to build with geomag/supermags. Unfortunately I haven't found any other web sites with magnet building tips. I did find an explanation of magnetic fields that was useful to remind me of magnetic and electric fields, and an entire site about magnets.

Something that I want to explore is combining Lego and Supermag. The spheres are larger than a Lego "dot" and the rods are narrower than a dot. Thus, you can hang the supermags off of a lego structure by creating a 1x1 hole in a structure, putting a supermag rod inside, and then putting a sphere on top to hold it there. Another way to use them is sideways―the length of a half-size supermag rod is about the same as the length of a 2-dot brick. One of these two orientations should be usable to build a maglev train. With 108 short rods, I can either build a monorail (3 dots wide) maglev that's 2x108 = 216 dots long (that's about 6 feet) or a dual-rail (5 dots wide) maglev that's 108 dots long.

The only thing I need now is magnetic viewing film.

Supermags arrived #

I opened up my Supermags on Christmas day. First thought: Yay! The box is unusual in that you have to tear it (it seems) to open it, unlike my Lego sets, which come in boxes you can close again. Inside the box is cheap styrofoam with six compartments, four for the spheres (16 in each compartment), one for the 108 short rods (2 layers, each with 6 rows, each with 9 rods), and one for the 72 long rods (2 layers, each with 6 rows, each with 6 rods). It would've been nice to have a manual with some building suggestions and technical specs. Instead, it's a tiny pamphlet with one suggestion on what to build, a marketing paragraph, and a list of their other Supermag products. Ick.

Something that's really neat about playing with magnets is that they are easy to clean up. You just sweep a magnet along the floor and it picks up all the other magnets and spheres. They even line themselves up to some extent.

One of the dangers of playing with magnets is that they can wipe your credit cards, library cards, hard disks, etc.

Each of the rods is hexagonal, has "Plastwood" (the manufacturer's name) written on one side, and "supermag" written on the opposite side. On the side with "supermag", there is a letter and a number. I start reading them from the short rods ... P8 R3 O1 P4 Q8 Q1 P2 Q3 Q1 Q6 O5 P8 O8 R6 P4 Q4 O1 P7 O4 R5 O7 Q7 R5 O8 Q8 R3 P7. I thought at first that each rod in the set might have a different letter/number pair, maybe corresponding to how they were laid out in the box. However, there are no 9's, and there are 9 short rods in each row. There are 6 rows in each layer but there are only 4 letters (O P Q R). Investigating more, I decided to pull out all the 8's. There are 3 O8s, 4 P8s, 5 Q8s, and 1 R8. No obvious pattern here. Do the letters and numbers correspond to polarity? No, there's no obvious connection. So I'm really not sure what the letters and numbers mean. The long rods have letters S T U V and the numbers go up to only 4.

Labels:

Laws are meant to be broken #

I've never been a fan of the Second Law of Thermodynamics. It always felt to me like someone decided something was likely to happen, therefore it must always happen. Sort of like Murphy's Law. Finally, someone has found evidence against the Second Law.

A sick mind #

Wednesday night I got the flu. Ugh. While in bed, I had a laptop, so while I wasn't sleeping (which was most of the time), I was either watching TV or surfing the web. I also got caught up on a lot of my work email. Here's a sample of places I visited:

As you can see, I'm pretty strange when I'm sick. I also tried to upgrade my home system from RedHat 9 to Fedora Core 1. The installer failed miserably and I spent a few hours repairing my system. Stupid Linux. And I tried to buy myself a Christmas gift (see next blog entry).

Shopping for myself this Christmas #

This Christmas I decided to buy myself a gift. After looking for computer games, I decided that none of the games I found (Railroad Tycoon 3, SimCity 4, Age of Mythology:Titans were my top choices) were something I wanted. Perhaps I'll look harder after Christmas. Instead of buying a computer game, I decided to buy a Geomag set. The Geomags are high-quality magnetic building toys that come with metal spheres and 1-inch magnetic rods. You can build all sorts of cool things with them. (There are also some other brands that are cheaper and easier to find but have weaker magnets, but I wanted the strongest magnets I could find.) A friend of mine has several sets and I've found that I spend time in his office playing with them.

I started my search on Google. After poking around, I got the impression that Geomags are being phased out, and Supermags are the replacement. I haven't yet found any good information about the strength of Geomag vs. Supermag, but as they come from the same company, I assume they're similar in strength. The main differences are:

  1. Geomag comes with spheres and 1-inch rods. Supermag comes with spheres, 1/2-inch rods, and 1-inch rods. This allows them to give you the same amount of material with a higher count on the box. The set I was interested in, the Geomag 184, comes with 64 spheres and 120 long rods. The similarly priced Supermag 244 comes with 64 spheres, 108 short rods, and 72 long rods. If you consider each short rod as 1/2 of a long rod, then that's 108/2 + 72 = 54 + 72 = 126 long rods' worth. So it's the same amount but the box says "244" instead of "184", which probably helps them sell more. In practice, it seems that having the short rods won't hurt―you can build more interesting shapes with them, and you can just hook up two of them to form a long rod if you need to.
  2. Geomag's rods are flat-ended, whereas Supermag's rods are tapered. They claim you can attach more Supermags to a sphere this way (24 per sphere). ToyMagnets has a picture showing lots of rods attached to a sphere. Ben's Spot has an even better picture. I guess tapered ends sound good, but I wonder if it affects the magnet's strength.

Once I decided to buy these, I wanted to do some research. Google's ads gave me a list of stores that had the Supermags available. The ads were:

  • hi-dow.com had a 10% off coupon for Magnastix. Not what I wanted (they don't offer Supermag, but a competing brand). But I think it's a good idea for companies to offer coupons in their ads, just as they do in newspapers and mailers.
  • svgames.com took me to a page listing their Geomag and Supermag products. Good. They have a $7 off coupon. Also good. They have a gallery showing off various things you can build. Excellent! Their price was $110 for the Supermag 244 set. You can select your color with a drop-down box.
  • toyscamp.com took me to a page showing their very limited selection of Geomag/Supermag products. They have free shipping (yay), but they're out of stock. They do not however carry the Supermag 244. (Interestingly, when I Google search for supermag 244, their ad doesn't show up, but when I search for supermag, their ad does show up. This is good.)
  • walmart.com carries the product but it's out of stock. And it's $120.
  • officeplayground.com takes me to a page about desk toys. They don't carry Geomag or Supermag! Like hi-dow.com, they are selling competing products.
  • An Amazon.com affiliate has an ad that takes me to the home page of Amazon.com. This is useless!! Why should this affiliate get a cut of the sale when they won't even point the ad at the right page!? I hit the back button right away.
  • toysrus.com has an ad that takes me to toysrus.com's search results for what I had searched for on Google. That's a little annoying. The page however showed me that not only do they not carry the Supermag 244, they're out of stock of all the Supermag sets they do carry.
  • geomags.net takes me to a page listing their Geomag and Supermag sets. They have a good selection, including the product I want. The page is really bright and ugly, with plenty of animation. Ick. But they do seem to have a good knowledge of the products, and they include a picture gallery. Plus, they have a $5 off coupon, and until recently they offered free shipping. The price is $90 - $5 = $85.

Next I looked at Google's "shopping" results that are shown a the top of the search results page.

  • Amazon.com has the Supermag 244 for $100. However, they're out of stock.
  • The Exploratorium store lists the Supermag 244 for $125. I didn't bother going to their site, since I had seen Ben's Spot for $85.

I also looked on EBay and found several that were going for $70 + $12 shipping = $82. However they didn't seem to offer a choice of colors, and I definitely wanted red.

In Google's regular search results I found ToyMagnets.com. The search results took me to the right page―not the page listing all the sets, but the page with the specific set I wanted. I then explored more of their site and found that they had a nice picture gallery (no thumbnails though). They also showed their inventory for each set and each color. I could see that they're nearly out of blue but they have plenty of red. (This is a really cool feature!) ToyMagnets.com is a nice looking site, has a good description of the products, and (as you can guess from the name) specializes in magnets. They offer the red Supermag 244 for $95, free shipping. Interestingly, they offer the yellow and white sets for $85 (because they have more yellow and white in stock, so they probably want to steer people who don't really care about color to buy those).

I also took a look at Froogle, but didn't really find that much that was useful given the information I had already found. Epinions and Bizrate were useless for such a specialized product.

Something I'd like to see from all the stores is an easy way to find out shipping costs. I shouldn't have to put in my name and address and phone number to get shipping costs. Zip/postal code and country should be enough.

I ended up buying from ToyMagnets.com. I could have gotten it cheaper at Ben's Spot, but I would have had to wait until after Christmas to get free shipping. Also, the real-time inventory on ToyMagnets.com impressed me. Plus, after spending some time exploring ToyMagnets.com, I was impressed with their expertise and professional look.

I also visited Plastwood.com, home of the makers of Geomag and Supermag. Unfortunately their site is totally useless. It starts out with a flash "intro" movie that can't be skipped and has no useful information. The site lists their products but doesn't tell you anything about them! I was hoping to get a comparison between Geomag and Supermag, the strength of the magnets, etc., but the site is useless. I don't even know why they bothered putting it up.

My order's estimated arrival date is December 23. Whee!

Vector resizing algorithm #

I had heard that the vector class in C++ STL doesn't double every time it needs to resize (as we were taught to do in data structures class), but instead it multiplies the size by 1.5. In a recent article on comp.lang.c++.moderated, Andrew Koenig explains why. It's related to the golden ratio and the Fibonacci sequence:

From: "Andrew Koenig" <ark@acm.org>
Subject: Re: vector growth factor of 1.5
Newsgroups: comp.lang.c++.moderated
Date: 5 Nov 2003 17:26:10 -0500
Organization: AT&T Worldnet
                                                                                
There is a technical reason to prefer 1.5 to 2 -- more specifically, to
prefer values less than 1+sqrt(5)/2.
                                                                                
Suppose you are using a first-fit memory allocator, and you're progressively
appending to a vector.  Then each time you reallocate, you allocate new
memory, copy the elements, then free the old memory.  That leaves a gap, and
it would be nice to be able to use that memory eventually.  If the vector
grows too rapidly, it will always be too big for the available memory.
                                                                                
It turns out that if the growth factor is >= 1+sqrt(5)/2, the new memory
will always be too big for the hole that has been left sofar; if it is
<1+sqrt(5)/2, the new memory will eventually fit.  So 1.5 is small enough to
allow the memory to be recycled.

Anti-aliased XEmacs #

I've been wanting an anti-aliased XEmacs for years. There had been a patch a few years ago but it wasn't maintained. There's a new patch out now! The announcement was on the xemacs-beta list.

The authors have been having some trouble getting the patches accepted into the CVS version. I guess I'll just keep applying their patches.

Labels: ,

Name the African Nation #

Which Congo is Zaire?

Boost Libraries for C++ #

I've been wanting to use the Boost libraries for quite a while now. Unfortunately I always got stuck when trying to install them. Now there's a solution (for me, anyway) -- RedHat's Rawhide distribution includes boost, boost-devel, boost-python, boost-python-devel, and boost-doc. I found these RPMs on rpmfind.net.

Labels:

Yapps 2.1 #

I've been working on a major upgrade to Yapps. I had a lot of ideas in mind but I decided to first concentrate on usability. In particular, error messages from parsers tend to be bad. I'm not sure what I actually want to see as an error message though. In the past I tested Yapps by using good grammars and inputs and making sure the output was correct. I'm now starting to build up a set of bad grammars and inputs. I'm not yet sure how to evaluate the error messages in an automated way, so for now I'm manually checking them.

Writing good error messages is hard. You have to get into the right frame of mind -- that of your user -- and figure out what would be most helpful to the person trying to figure out how to fix the error.

Commercializing the Internet #

There’s got to be content on the Internet that people pay for, or else it’s not viable. The Internet needs to be a vehicle for mass-market advertising and for compelling content. We have to figure out the advertising part, because multiple streams of revenue are vital.

-- Merrill Brown, senior vice president of Real Networks

I just want to say to Mr. Brown: GO AWAY! Leave our Internet alone!

Yapps 3.0 #

[Update: I abandoned this project for several reasons, the main one being that I didn't have an immediate use for a parser system at the time.]

I've been working on a major upgrade to Yapps (Yet Another Python Parser System). Yapps was designed with two things in mind: it should be easy to use and it should be easy to understand output. I think I got those two pretty well. However, as I try to push the system to do more, I'm finding that easy to use and easy to understand output are coming into conflict:

  • LL(1) recursive descent parsers are easy to understand. But they make it harder to write grammars, because you have to manually left-factor.
  • Better error messages would make Yapps easier to use. But tracking the information needed for better error messages clutters up the parser, making it harder to understand.

So far, I've been leaning towards more ease of use and less readable parsers. Some more things I want to implement towards that goal:

  • Abstract rules: a way to reuse common patterns used in writing rules.

    If you want to parse a comma-separated list of numbers in Yapps 2, you'd write a rule like this:

    rule number_list:
          {{ numbers = [] }}
          (
             number {{ numbers.append(number) }}
             ( ',' number {{ numbers.append(number) }}
             )*
          )?
          {{ return numbers }}
    

    If you then want to parse a colon-separated list of strings, you have to write a very similar rule with a different delimiter and pattern. When you need to parse a semicolon-separated list of statements, you may be wondering how you can avoid writing this pattern repeatedly.

    Abstract rules are rules that have named placeholders. For the above rule, you'd write

    rule delimiter_separated_list[delimiter][element]:
          {{ results = [] }}
          (
             element {{ results.append(element) }}
             ( delimiter element {{ results.append(element) }}
             )*
          )?
          {{ return results }}
    

    You'd then be able to invoke that rule with delimiter_separated_list[','][number], delimiter_separated_list[':'][string], and delimiter_separated_list[';'][statement]. I'm running out of delimiters, though. I've already used [ A B C ] for optional matches. I'll probably switch to the standard EBNF form for optional matches, (A B C)?, to free up brackets for something else.

  • Inheritance of Parsers: the ability to reuse an existing parser's rules when defining a new parser.

    In Yapps 2, I find that I often copy and paste tokens and rules from one parser to another. The most common ones are strings, numbers, identifiers, and delimiter-separated lists. I'd like to be able to define these in one place and then inherit them in the parsers I'm writing.

    To implement this, Yapps needs to be able to decipher an existing parser's First and Follow sets. I can either do this via reflection at the Python class level or I can implement inheritance directly at the grammar level. Either way, parsers would be more useful if you could reuse them in larger parsers.

I've also been thinking about some more radical changes to Yapps:

  • Backtracking: abandoning the LL(1) restriction.

    The Toy Parser Generator (don't be fooled by the name -- it's quite powerful!) supports full backtracking. You don't have to worry about whether your grammar is LL(1) or not; you can write it in a more natural style. However, I'm not sure how backtracking interacts with imperative actions. I've thought about using something like Haskell monads, but without decent support for blocks, it's hard to do this properly in Python. I might be able to delay all the actions by constructing a string at parse time and then using exec when the parser is complete. However, that has the disadvantage that the actions can't influence the parser. (On the other hand, without backtracking, the actions can't meaningfully influence the parser anyway.)

  • Run Time Parser Generation: abandoning the model of generating a Python source file.

    One annoying feature of most parser generators is that they generate source code, which then has to be compiled/run in a separate process. It'd be much nicer to build a parser within a running program. With Python, this doesn't seem hard to do. Even in the most static of languages -- C++ -- you can generate parsers without creating a separate source file, using the Spirit parser library.

I'm not yet sure whether I'll implement the more radical changes.

Labels:

Cancel your Discover Card #

Since cancelling my Discover Card, I've been receiving nasty phone calls from people at Discover trying to get me to come back. This latest caller was rude/condescending to my wife, then said he must talk to me. He then tried to convince me to keep my account open but not get a credit card. And he'd give me a 0% interest rate. He says I should keep the Discover Card in case of emergency. I keep telling him no, but he keeps pushing. Grr.

Discover, if you're listening, here's a tip: being rude and nasty to potential customers is a bad business strategy.

I'm not the only one who has had bad experiences with Discover Card's customer service folk. Read this letter and this letter and this letter (at PlanetFeedback.com).

Update [2004-08-01]: See this list of bad experiences with cancelling a Discover card.

Labels:

Pick your battles #

Clay Shirky reminds us that whether we're for or against some new techonology, it doesn't really matter. It's a better use of your time to figure out how to deal with the new technology.

Learning languages #

Lojban is an interesting looking language. Also take a look at their phonetic rules.

Imperative features in functional languages #

Eric Tiedemann convinced me to take a closer look at Haskell Monads, a way to inject imperative programming features into a purely functional language. I've always been skeptical about monads. They seem like sleight-of-hand. A pure functional language has no imperative features. Monads give you imperative features. So how do you preserve pure functionality with imperative features?

It's a trick. The imperative features are delayed until you reach the top level, which is allowed to perform imperative features. To guarantee that none of the imperative actions are performed before then, the type system is constructed in a way that you can produce an action, you can compose actions, but you cannot execute an action.

The trouble with this is that any imperative feature taints interfaces. If someone way down in the call chain needs to write some data somewhere, then that function needs to change its type to mark it as imperative. Then everything that calls that function needs to change -- they need to be rewritten to handle that imperative action and they also need to propagate it upwards. And on and on upwards to lots of functions. That's really awful -- you can't encapsulate imperative features.

To address this problem, Haskell had to add a way to execute an action without propagating it upwards. Its use is discouraged, but it's there.

My sense is that monads have to be there not because it's a purely functional language but because it's a lazy-evaluation language. With lazy evaluation, constructing the value a = [1.5/0.0, print 5] doesn't evaluate any of the elements of the list. Instead, we don't divide by zero until you need to access a[0] and we don't print a value until you need to access a[1]. It's really hard to reason about programs when you don't know when things are going to happen. So Haskell needs a way to channel the imperative features and exceptions into some mechanism that behaves like a conventional ("strict evaluation") language.

But if instead we had a strict pure functional language, the order of evaluation could be specified precisely. Thus, you don't need to have a top-level imperative strict evaluation language on top of your purely functional language. It may still be of some use to separate the imperative and functional parts of the language, but it's less of a win.

Something to ponder: since imperative functions taint all their callers, you might end up with lots and lots of imperative functions. Instead of annotating lots functions as imperative, how about annotating some functions as being purely functional ("pure")? Unlike Haskell monads, in which you have to explicitly convert between the two types of functions, we can use subtyping to express the relationship. A pure function type is a subtype of its corresponding imperative function type. This gives us the proper constraints:

  1. Context requires an imperative function. We have an imperative function. Fine.
  2. Context requires an imperative function. We have a pure function. Fine.
  3. Context requires a pure function. We have a pure function. Fine.
  4. Context requires a pure function. We have an imperative function. Type error.

(The golden rule of subtyping: the type of the value you have needs to be a subtype of the type required by the context.)

I certainly find functional programming appealing. But the programs I write tend to be imperative. It's not that I'm writing in the wrong style -- it's that I really want to perform imperative actions, like writing to a database. So I need a language that addresses the needs I have when programming, not a language that is really elegant.

Scheme is a language that lets me do what I want to do. If I have a need for an imperative program, it lets me express that directly. If I have a need for a functional program, it lets me express that too. Related reading: Oleg's site (incredibly cool site, btw) explains how to implement monads in Scheme.

Cancel your Discover Card #

I tried to cancel my Discover Card. It took 15 minutes of the guy trying to convince me that there's no harm in keeping it, "just in case", that I should use it for everything, that their cash back thing is worth it, that it's accepted virtually everywhere, that it'd ruin my credit history if I cancelled this card, etc. Sheesh. Based on this experience, I'm not going to ever get a Discover Card again.

Labels:

Freedom #

For the Americans out there celebrating July 4, here's a reminder of why we are celebrating.

Blogging patterns #

I've found that I post to my internal blog at work, but I don't post as much to my externally visible blog. Why is that? I suspect that internally, I know my audience―my coworkers―and we have a lot to talk about. But externally, I don't know the people reading my blog, and I don't know what we might have in common. So it's hard to think of things to say. I happen to be this way in offline life too. I say a lot to people I know but I find it hard to talk to people I don't know.

The Segway is not as intuitive as it seems #

There's some talk of President Bush falling off the Segway being a way to discourage people from using non-oil-based transporation. The article discusses how Segways are hard to fall off of, they're really easy to use, that no one gets injured from them.

It's all a lie. The Segway comes with lots of warnings about even though you really really want to step on, you need to watch the video. The video goes into all sorts of warnings about ways you can fall off -- and they're not the "don't put your cat in the microwave" sort of thing. These are reasonable things you'd expect to do on the Segway, but it doesn't support it.

I first tried the Segway on March 25. I watched the video first. And still, when I got on, it started oscillating back and forth. You need to practice just stepping on. I rolled along a few feet and hit something on the floor. And the Segway went crazy; I jumped off.

More recently, I tried the "e-series" Segway on June 6. (We have a "fleet" of them at work, mainly for their coolness; it turns out that in practice it's not faster than walking.) Even though I had practiced getting on the Segway, when I got on this one it started going crazy. It turns out that lots of people get hit in the shin when they try to get on. Imagine the Segway in front of you. You reach out, hold onto a handlebar, and step up. A natural thing to do when you're stepping up is to use the handlebar to help you up; you pull back on the handlebar. The Segway senses you're leaning back. It starts driving backwards. It hits your leg. Ick.

The way you turn on the Segway feels wrong to me. You twist something on the handlebar, like changing gears on a bike. Why not turn the handlebars? Or lean? Twisting a little circle on the handlebar caused trouble for me when getting on the e-series. The Segway started to move, I pushed back on the handlebar, but that made it turn too.

Once you're going on the Segway, it's pretty good. It's just getting on or off that's the problem.

Anyway, the Segway is really cool, but I can't say it's entirely intuitive. Maybe Bush did fall off on purpose. But it's more likely that he too experienced the unintuitive process of getting on or off the Segway.

Labels:

Two great games can't be combined into another great game #

Is Sims Online doing so badly that they are giving it away? It's a 1.2 gigabyte demo. Sheesh.

Fun with magnets #

This magnetic sheet looks really cool! And it's only $3 ! Unfortunately they're out of stock.

The way we think #

An entity either has an explicit point of origin, a specific time and place of creation, or else it evolves and has no definable moment of entry into the world.

Labels:

Playing games #

I've been playing Morrowind lately. It's a beautiful game.

Google buys Blogger... why? #

We finally learn what Google is doing with Blogger. Google Daily Menus.

How should I use XSLT? #

I was hoping that XSLT could help me generate my my web pages. Unfortunately XSLT doesn't seem to help with any of the things I wanted to do:

  1. "Last modified" timestamp based on the timestamp of the original .xml file.
  2. Automatically genenerated navigation bar that links to related documents (parent, children, etc.).
  3. A list of recently added links (based on either explicit timestamps or by using version control).

It seems that for any of these features, I need to write my own XML processing code. So I'm holding off on learning XSLT. It only does simple things. Maybe I'll revisit it later after I implement the more important features for my site.

Strange matter #

Bose-Einstein Condensate is some pretty weird stuff.

Labels:

Early computer networking #

In October 1969 Charley Kline was asked to arrange the first computer-to-computer message through an ordinary telephone line. Working as a programmer in the UCLA lab of Leonard Kleinrock, he was part of a project attempting to connect to the only other existing Internet node located at Stanford University. After establishing the connection, Kline started by typing "login." He typed l and got the echo from Stanford conforming that the letter had been received. He proceeded with o and again received the appropriate echo. Then he ventured to g. However, that was too much for the young system to absorb, and the computer crashed, killing the connection as well.

-- from Linked: The New Science of Networks.

Balanced diet #

Tacos are the perfect food. Protein (beef), vegetables, carbs (shell), dairy (cheese). It's all there.

Sunlight may be good for you #

I don't know what to think about sunlight anymore...

Labels:

Do windows block ultraviolet? #

Hm, apparently automobile windshields protect against ultraviolet but side and rear windows do not.

Scenic drive to California's Central Coast #

Fun scenic drive this weekend -- we [*] went down the California coast on highway 1, from Monterey to San Luis Obispo. We encountered some difficulty getting through the Big Sur Marathon. (I didn't know it was going to be taking place along 26 miles of highway 1.) They batched up hundreds of cars and had us wait ~20 minutes until the northbound traffic went through, and then we all went south. During the wait I ate some snacks (Cheetos); it kept me from starving before lunch.

We ate in Big Sur. Both of us weren't too hungry because of the snacks, so we split a turkey sandwich. The restaurant had a garden patio setting, with hummingbirds, an orange tree, and a lemon tree. Relaxing. It reminded me that I need to find some good hummingbird plants for our backyard.

Along the way south we saw over a thousand elephant seals. I've seen cows, goats, sheep, ducks, geese, emus, ostriches, coyotes, horses, mules, and lots of types of birds on these scenic drives. But this time I saw zebras. They were grazing with cows in a field overlooking the Pacific ocean. Apparently they're descendants of zebras owned by William Randolph Hearst.

We stayed in Pismo Beach in the Sea Gypsy. It has a great location -- it's on the beach, and our balcony faces the beach (no obstructions in the view). We watched around 50 surfers on Sunday night. Then we listened to the ocean all night. I need to get an ocean sound generator now.

I read a tide schedule. I noticed for the first time that the peak occurs a few days after the full moon. I should have expected the full and new moons to increase the height of the tide, but it never really clicked until now. What I don't understand is why the tide gets higher and higher each day until a few days after the full moon, then it drops quite a bit! Maybe this is something to do with the geography of Pismo Beach. I'll have to investigate.

We walked along the beach and then the pier. Waves are weird. We watched the waves going back out to sea interact with the new waves coming in, forming rather interesting ripple patterns.

We were trying to find a replacement camera battery. We walked to a local store and asked, but they said they didn't have that kind of battery. They tried to sell us two AA batteries instead. Even though the contacts are in a completely different place, the voltage was wrong, and they were a different size. They insisted that the AA batteries would work just fine!

For dinner we ate from Del's Pizzeria. We ordered a pizza ($13.55) and a salad ($3.75) and we had a coupon for a free drink ($2.00). Delivery was supposed to be free. Somehow the total ended up being $22.58. I didn't question it that night but the next morning I realized it was a bit too high. We tried calling them to find out what happened but they were closed. Bah.

The next morning we sat on the balcony, watched the waves, and read. I read half of Linked by Albert-László Barabási. It was great! The author provided many "interesting mathematician" anecdotes that I hadn't read before. Stanley Milgram was a strange guy. So is Paul "My Brain is Open" Erdös. I stopped at the point where the author started describing how the web, Google, Bose-Einstein condensate, and Microsoft were related. Woah. I'll finish the book next weekend.

We then drove around a bit, went to the "As Seen On TV" Store. It's amusing. But I didn't find anything really interesting.

For lunch, we went to Tortilla Flats in San Luis Obispo. The thing that drew me in was all you can eat tacos, fajitas, tostadas for $7 ! Needless to say, I ate a lot (three big tacos, a mini chimichanga, a fajita, chips/salsa, rice, and some fruit). It served as breakfast, lunch, and dinner.

Driving up 101 isn't as interesting as 1. I took a detour -- highway 25 by the Pinnacles. (I didn't actually visit the Pinnacles; I was just taking the scenic way.) The highway ends up in Hollister, which has grown quite a few suburbs. Huge houses, huge strip malls, huge parking lots. But no huge highways; it's still a tiny two-laner. I guess there's lots of land around here, and it's closer to the Bay Area than Sacramento.

It was a fun trip. Things I need to read more about:

  1. Why do ripples form when ocean waves collide on the beach?
  2. How are tide schedules calculated?
  3. Stanley Milgram
  4. Paul Erdös
  5. Bose-Einstein condensate
  6. Can you get a tan through a window?
  7. Does sunlight really help you heal faster? (During this trip I read in Scientific American that bright light can help your eyes heal.)

[*] "We" means my wife and I.

Playing games vs. programming games #

I haven't been working on my game lately because I got distracted by:

  1. Upgrading to Redhat 9. Looks nice. Feels nice. But they messed up GLUT somehow and Simblob won't link. Bah.
  2. Reading books: Nexus, Emergence, Sync, Linked.
  3. Playing Baldur's Gate II.
  4. Playing Age of Mythology.
  5. Playing Tropico.
  6. Getting my finances in order (now in a spreadsheet).
  7. Updating my web pages.
  8. Learning more XEmacs Lisp (advice and derived modes).