Something’s been bugging me…

For a few months, now, Katie and I have been repeatedly finding a certain bug in our house. Our building has a history of cockroach
infestation, but we hardly get them way up on the 8th (top) floor
of our building.

The Western Conifer Seed Bug

These are not cockroaches, at least I was pretty sure they weren’t. I don’t know alot about bugs, so I wasn’t sure if these things were momma cockroaches or something else entirely.

Katie emits a blood curdling scream whenever she sees a bug (like this house centipede that we found in our bathtub one day. Totally creepy, this thing has a 3 inch body (~7cm) and legs everywhere, which made it seem much bigger. Fortunately for us, the tub was too slick for it to escape and feed on our succulent brains.

Anyhow, we found one of our new friends, dead, on the floor, today. Usually, I end up killing these guys with plenty of paper towels so I don’t get icky bug juice on me. Besides, I’m no outdoorsman. Since we had a dead specimen that hadn’t been turned into a streaky mess in a paper towel, I decided to investigate him. I’m generally too creeped-out to take a look at a live one, especially when I don’t know what the hell it is. It might be a Peruvian Eye-Gasher for all I know.

I decided that I had to find out what these things were, because they were appearing every couple of days. If they were roaches, I was going to deploy bait traps every 18 inches until they stopped showing up.

I searched around teh intarweb for a while, and found a great site: whatsthatbug.com. This site is all about identifying creepy things that one finds in and around one’s house. It takes the form of submissions of the type “I photographed this thing on my wall/floor/cabinet/dog/toilet, and I want to know what it is”. They archive what looks like to be every submission they’ve ever gotton, along with an explanation of what the thing is. You can search and/or browse, so I did a little of both.

Meanwhile, Katie was trying other sources of information — they appeared to be more academic in nature — with not too much luck. She found a few things that might have been related, but I wasn’t confinved. They looked too dissimilar to the corpse before me on my desk.

It didn’t take me long to find an entry about the Western Conifer Seed Bug, which is our bug. Some of the pictures of the WCSB on What’s That Bug‘s True Bugs page are not very good (except the one that was taken from below, where it looks like the bug is either on a window or is skydiving at the photographer). So, I decided to take my own (see above).

For some reason, my camera wouldn’t focus properly on the bug when at close range, or even far range with a high zoom. I simply couldn’t get the camera to focus properly. So, I used my extensive knowledge of optics to engineer a solution: I put a large magnifying glass between the camera and the bug, and the results were very good.

So, the Western Conifer Seed Bug is nothing to fear, apparently. They’re still creepy, and I’m likely to kill those found in my home, especially if I find my wife standing on a chair screaming.

Hyperthreading CPUs and User Experience

Brian has an article on his blog about Hyperthreaded CPUs and their effects on “the user experience”, by which I’m sure he means the typical response on a graphical desktop to a user’s actions — something like moving the mouse, dragging a window, opening-up a menu, etc.

I disagree with a few of his assertions… namely that HT itself is responsible for improving the user experience. For example, if you have a single (and non-HT) processor and you run some CPU-intensive process (such as a compiler, a complex graphical manipulation that doesn’t take advantage of your graphics processor, or a poorly written program that runs away with your CPU in a tight loop), that process is going to eat cycles that would otherwise be used to redraw your mouse pointer (hardware-drawn cursors went away with Microsoft Windows 3.1), draw the menus in your spreadsheet program, or drag your windows around the screen. This makes the responsiveness of your graphical desktop seem sluggish.

The reason this happens is that CPUs can only do one thing at a time. Fortunately, they typically do things reeeeeally fast, so you don’t notice that it’s only doing that one thing at a time because it switches tasks and does a little bit of work here and a little bit of work there, and it magically looks like everything is getting done “all at the same time”.

With HT, the CPU itself can actually do more than one thing at a time. Sure, the CPU still does that frienzied-switcheroo dance, except that it can — ostensibly, anyway — do work on two whole tasks at once. Brian mentions that HT isn’t as nice as actually having two equally-fast processors, but let’s ignore that fact for the moment.

I assert that the responsiveness of the graphical desktop has more to do with the way that the desktop functions than the way the CPU works. Evidence? Compare any version of Microsoft Windows with a similar machine running Linux and any one of the graphical desktops that run atop it. When you launch a program under Microsoft Windows, you get an hourglass mouse pointer, the computer churns for a while, and the program window eventually opens. The next time you do that, move the mouse around… try to open another application…. try to drag another window around. For the most part, your desktop will respond quite favorably. The mouse cursor will smoothly follow your hand motions, the windows will redraw, and the second application will also eventually open.

My experience with Linux is not the same. If I open an application, the mouse cursor immediately starts jerking around and loses its smoothness. With the mouse jerking around, the windows jerk around as well. Other apps will start, of course, but it’s really still like dropping menus down and moving the mouse that people really notice.

Note to Linux zealots: I totally love Linux. I run it on everything except the computer that I use as my primary desktop, mostly because of games that I want to play. Yeah, Wine just doesn’t work for me. Get over it.

Anyway, these observations lead me to believe that Microsoft Windows, no doubt through some kind of unholy voodoo, has gone through great pains to schedule the user interface at the highest possible priority. Linux, in typical pragmatic style, has chosen not to hijack the CPU for such trivial details as turning your mouse pointer into the Energizer Bunny.

As for Brian’s compiler running in a virtual machine, it’s a shame that VMWare doesn’t properly expose both processors available to Microsoft Windows to the OS running in the virtual machine. I would expect that a decent virtualization environment would allow you to set the number of CPUs to expose to the guest OS. I would have expected his gentoo compile to be able to peg both of his virtual CPUs.

But back to CPU utilization versus user experience. I would bet that if he were using a threaded compiler (which almost doesn’t make any sense) directly in his Microsoft Windows environment, and compiling the same code (or at least performing a compile that was equally CPU-intensive), then both HT CPUs would be pegged, and he’d still be able to move the mouse around, click on things (with a slight delay), etc.

I think it comes down to scheduling. Your OS can always interrupt your compiler for any reason. Your compiler (well, really your VM) is probably scheduled at in “normal” mode, whatever that means for your OS. I’m willing to bet dollars-to-doughnuts (mmmm… doughnuts) that Microsoft Windows’s graphical shell itself (explorer?) is scheduled at a higher-than-normal priority, or that all the UI calls that it makes are either running at the kernel level (which wouldn’t suprise me one bit for MS Windows, honestly) or at a higher-than-normal priority. It’s not the CPU, it’s the scheduler.

There are a lot of folks out there that say that HT is actually hurting performance. I haven’t read any of them, ’cause I’m honestly not that interested in looking at those numbers. After reading the ARS article linked above a few years ago, I thought that some really smart dudes got really high one day and had themselves a fantastic idea. I figured that it wasn’t as cool as the hype would suggest, but hey… why not squeeze as much out of the CPU as you possibly can? My gut reaction is that you can find data to either support or deride HT technology. I do know one thing: lots of Java developers were complaining in the past that HT CPUs would crash all the time with very strange errors, and turning off HT would solve their problems. >shrug<. You gotta do what you gotta do. Too bad those folks paid extra for their super-sexy HT processors.

I had a friend at Rose-Hulman that used to play Unreal Tournament with a couple of friends and me. He had just gotton a dual-CPU machine and decided to play with it a little: he created a dedicated server and set the processor affinity to his second processor (i.e. not the primary one). Then, he started UT in client mode so he could play it, and set the processor affinity for that process to the primary CPU. I’m not sure if it really made any difference than just running them separately with no tweaks, but it was an interesting idea.

When I heard that he had done that, I decided that since the OS itself actually needs very little CPU time to do it’s stuff, that an OS that could monopolize a considerably lower-powered processor and then schedule all user tasks on a much higher-powered processor would be great. Super-fast memory allocation (not that it’s particularly slow in the first place), buffer management, DMA, etc. For most OSs, this also means that the various hardware drivers would run on a CPU that wasn’t being used for applications. That would speed-up graphics processing since even a computer with the latest monster GPU still needs the graphics driver to actually send the data to the GPU to do the work.

Who knows. Maybe someone will steal my idea and make a jillion dollars. That would really suck for me.

Character Assassination

At the dawn of (computer) time, someone decided that computers being able to deal with letters as well as numbers would be a great idea. And it turned out to be a big ‘ole mess.

The problem is that you have to decide how to encode these letters (or characters) into numbers, which is the only thing that computers can handle. EBCDIC and ASCII were two of the first, and while DBCDIC has effectively died, ASCII has turned into a few (relatively compatible) standards such as US-ASCII and ISO-8859-1 (also called “Latin-1”). These jumbles of letters are called character sets, and the describe how to take the concept of a letter and turn it into one or more 8-bit bytes for processing within the computer.

One of the most flexible characters sets is called UTF-8, and represents an efficient packing of bytes by only using the minimum necessary. For example, there are jillions of characters out there in human language if you take into account written languages like Chinese, Sanskrit, etc. We would need many bytes to represent all character possibilities (maybe 4 or 5), but UTF-8 has a trick up its sleeve that helps reduce the number of bytes taken up by common (read: Latin-1) characters. It’s also completely backward-compatible with ASCII, which makes it super-handy to use in places where ASCII was already being used, and it’s time to add support for international characters.

Now that the history lesson is over, it’s time to complain.

I’m writing an application in the Java programming language, which is generally highly touted as having excellent internationalization (or i18n) support: it has encoding and decoding capability for a number of different character sets (ASCII, UTF-8, Big5, Shift_JIS, any number of ISO-xyz-pdq encodings, etc.), natively uses Unicode (actually, UTF-16, which is a specific type of Unicode), and has some really sexy ways to localize (that’s the process of managing translations of your stuff into non-native languages — such as Spanish being non-native to me, an English speaker) content.

I was tyring to do something very simple: get my application to accept a “funny” (or “international” or non-Latin-1… I’ll just say “funny”, since I don’t use those characters very often) character. I love the Spanish use of open-exclaimation and open-question characters. They’re upside-down versions of ! and ? and preceed questions and exclaimations. It makes sense when you think about it. Anyhow, I was trying to successfully take the string “¡Bienvenidos!”, put it into my database, and get it back out successfully, using a web browser as the client and my own software to move the data back and forth.

It wasn’t working. Repeated submissions/views/re-submissions were resulting in additional characters being inserted before the “¡”. Funny stuff that I had clearly not entered.

I’ve done this before, but the mechanics are miserable and I pretty much block out the painful memories each time if happens.

The problem is that many pieces of code get their grubby little hands on the data from the time you type it on your keyboard and the time it gets into my database. Here is a short list of code that handles those characters, and where opportunities for cock-ups occur.

  • Keyboard controller. Your keyboard has to be able to “type” these characters correctly so that the operating system can read them. I can’t type a “¡”on my keyboard, so I need to take other steps.
  • Your operating system. MS-DOS in its default configuration in the US isn’t going to handle Kanji characters very well.
  • Your web browser. The browser has to take your characters and submit them in a request to the web server. Guess what? There’s a character encoding that is used in the request itself, which can complicate matters.
  • The web server, which may or may not perform any interpretation of the bytes being sent from the web browser.
  • The application server, which provides the code necessary to convert incoming request data into Java strings.
  • My database driver, which shuttles data back and forth between Java and the database server.
  • The database itself, which has to store strings and retrieve them.

I can pretty much absolve the keyboard and operating system at this point. If I can see the “¡” on the screen, I’m pretty happy. I can also be reasonably sure that the web browser knows what character I’m taking about, since it’s being displayed in the text area where I’m entering this stuff. My web server is actually ignoring request content and just piping it through to my app server. The database and driver should be okay, as I have specified that I want UTF-8 to be used both as the storage format of characters in the database, and for communication between the Java database driver and the database server.

That leaves 2 possibilities: the request itself (made by the web browser) or the application server (converts bytes into Java strings).

The first step in determining the problem is research: what happens when the web browser submits the form, and how is it accepted and converted into a Java string?

  1. The web browser creates a request by converting all the data in a form into bytes. It does this by using the content-type “application/x-www-form-urlencoded” and some character encoding. You can ignore the content-type for now.
  2. The request is sent to the server.
  3. The application uses the ServletRequest.getParameter method to get a String value for a request parameter.
  4. The application server reads the parameter out of the request using some character encoding, and converts it into a String.

So, it looks like the possibilties for confusion are where the character sets are chosen. The W3C says that <form> elements can specify their preferred character set by using the accept-charset attribute. The default value for that attribute is “UNKNOWN”, which means that the browser is free to choose an arbitrary character set. A semi-tacit recommendation is that the browser use the character encoding that was used to provide the form (i.e. the charset of the current page) as the charset to use to make the request.

That seems relatively straightforward. My responses are currently using UTF-8 as their only charset, so the forms ought to be submitted as UTF-8. Perfect! “¡” ought to successfully be transmitted in UTF-8 format, and go straight-through to my database without ever being mangled. Since this wasn’t happening, there was obviously a problem. What character set *was* the browser using? A quick debug log message ought to help:

DEBUG - request charset=null 

Uh, oh. A null charset means that the app server has to do some of it’s own thinking, and that usually spells trouble.

Time to take a look at the ‘ole API specification. First stop, ServletRequest.getParameter(), which is the first place my code gets a crack at reading data. There’s no mention of charsets, but it does mention that if you’re using POST (which I am), that calling getInputStream or getReader before calling getParameter might cause problems. That’s a tip-off that one of those methods gets called in order to read the parameter values themselves. Since InputStreams don’t care about character sets (they deal directly with bytes), I can ignore that one. ServletRequest.getReader() claims to throw UnsupportedEncodingException if the encoding is (duh) unsupported, so it must be applying the encoding itself. There is no indication of how the API determines the charset to use.

The HTTP specification has a header field which can be used to communicate the charset to be used to decode the request. The header is “content-type”, and has the form: “Content-Type: major/minor; charset=[charset]”. I already mentioned that the content-type of a form submission was “application/x-www-form-urlencoded”, so I should expect something like “Content-Type: application/x-www-form-urlencoded; charset=UTF-8” to be included in the headers from the browser. Let’s have a look:

DEBUG - Header['host']=[deleted]
DEBUG - Header['user-agent']=Mozilla/5.0 [etc...]
DEBUG - Header['accept']=text/xml, [etc...]
DEBUG - Header['accept-language']=en-us,en;q=0.5
DEBUG - Header['accept-encoding']=gzip,deflate
DEBUG - Header['accept-charset']=ISO-8859-1,utf-8;q=0.7,*;q=0.7
DEBUG - Header['keep-alive']=300
DEBUG - Header['connection']=keep-alive
DEBUG - Header['referer']=[deleted]
DEBUG - Header['cookie']=JSESSIONID=[deleted]
DEBUG - Header['content-type']=application/x-www-form-urlencoded
DEBUG RequestDumper- Header['content-length']=121

Huh? The Content-Type line doesn’t contain a charset. That means that the application server is free to choose one arbitrarily. Again, the unspecified charset comes back to haunt me.

So, the implication is that the web browser is submitting the form using UTF-8, but that the app server is choosing its own character set. Since things aren’t working, I’m assuming that it’s choosing incorrectly. Since the Servlet spec doesn’t say what to do in the absence of a charset in the request, okly reading the code can help you figure out what’s going on. Unfortunately, Tomcat’s code is so byzantine, you don’t get very far into the request wrapping and facade classes before you go crazy.

So, you try other things. Maybe the app server is using the default file encoding for the environment (it happens to be “ANSI_X3.4-1968”) for me. Setting the “file.encoding” system property changes the file encoding used in the system, so I tried that. No change. The last-ditch effort was to simply smack the request into submission by explicitly setting the character encoding in the request if none was provided by the client (in this case, the browser).

The best way to do this is with a servlet filter, which gets ahold of the request before it is processed by any servlet. I simply check for a null charset and set it to UTF-8 if it’s missing.

public class EncodingFilter
    implements Filter
{
    public static final String DEFAULT_ENCODING = "UTF-8";

    private String _encoding;

    /**
     * Called by the servlet container to indicate to a filter that it is
     * being put into service.
     *
     * @param config The Filter configuration.
     */
    public void init(FilterConfig config)
    {
	_encoding = config.getInitParameter("encoding");
	if(null == _encoding)
	    _encoding = DEFAULT_ENCODING;
    }

    protected String getDefaultEncoding()
    {
	return _encoding;
    }

    /**
     * Performs the filtering operation provided by this filter.
     *
     * This filter performs the following:
     *
     * Sets the character encoding on the request to that specified in the
     * init parameters, but only if the request does not already have
     * a specified encoding.
     *
     * @param request The request being made to the server.
     * @param response The response object prepared for the client.
     * @param chain The chain of filters providing request services.
     */
    public void doFilter(ServletRequest request,
			 ServletResponse response,
			 FilterChain chain)
	throws IOException, ServletException
    {
	request.setCharacterEncoding(getCharacterEncoding(request));

	chain.doFilter(request, response);
    }

    protected String getCharacterEncoding(ServletRequest request)
    {
	String charset=request.getCharacterEncoding();

	if(null == charset)
	    return this.getDefaultEncoding();
	else
	    return charset;
    }

    /**
     * Called by the servlet container to indicate that a filter is being
     * taken out of service.
     */
    public void destroy()
    {
    }
}

This filter has been written before: at least here and here.

It turns out that adding this filter solves the problem. It’s very odd that browsers are not notifying the server about the charset they used to encode their requests. Remember the “accept-charset” attribute from the HTML <form> element? If you specify that to be “ISO-8859-1”, Mozilla Firefox will happily submit using ISO-8859-1 and not tell the server which encoding was used. Same thing with Microsoft Internet Explorer.

I can understand why the browser might choose not to include the charset in the content type header because the server ought to “know” what to expect, since the browser is likely to re-use the charset from the page containing the form. But what if the form comes from one server and submits to another? Neither of these two browsers provide the charset if the form submits to a different page, so it’s not just an “optimization”… it’s an oversight.

There’s actually a bug in Mozilla related to this. Unfortunately, the fix for it was removed because of incompatibilities that the addition of the charset to the content type was causing. Since Mozilla doesn’t want to get the reputation that their browser doesn’t work very well, they decided to drop the charset. 😦

The bottom line is that, due to some bad implementations out there that ruin things for everyone, I’m forced to use this awful forced-encoding hack. Fortunately, it “degrades” nicely if and when browsers start enforcing the HTTP specification a little better. My interpretation is that “old” implementations always expect ISO-8859-1 and can’t handle the “charset” portion of the header. Fine. But, if a browser is going to submit data in any format other than ISO-8859-1, then they should include the charset in the header. It’s the only thing that makes sense.

Ridin’ Along in my Automobile

Over the Labor Day weekend, a few friends and I rented a cabin on the Shenandoah riverfront and whiled away the weekend grilling, playing cards, and laughing at Bill whistling on all-fours, and Kasey smaaashing bugs.

Fortunately for Bill and Kasey, there was something even funnier, and more unbelievable that we witnessed that weekend. That thing was this dude driving his pickup down the middle of the Shenandoah river.

Image of some dude driving his truck down a river.
No particular place to go

There’s a video that I got during the whole thing, but I still have to get it from the camera’s owner (only got the pictures so far). Follow the picture-link to see more pictures.

And yes, he was just driving down the river… as if it were a regular road, albeit with continuous speed bumps.

Update: Here’s a google maps link to the place where we were staying: Cabin Map. If you zoom out one level and choose the map/satellite hybrid, you can see the area of the river where this dude was. We were on the southwest side of the river, and the island in the map was directly across the river from us.

How old are you, really?

When a man sits with a pretty girl for an hour, it seems like a minute. But let him sit on a hot stove for a minute–and it’s longer than any hour. That’s relativity.

-Albert Einstein

Reckoning time has always been a problem for humans, it seems. We have argued over which calendar to use for quote a long time. Even worse is trying to figure out how long ago something happened.

The answers to many “how long ago” questions can be answered with a certain degree of slop. For example, “how long ago was Jesus of Nazareth born?” could be answered, “about 2000 years ago”. “When was peace declared at the end of World War II?”, “60 years ago”. But what a question to which the answer should be more specific, such as “how long ago was I born?”. I want to know the years, months, and days for that figure, and here’s why.

As part of my continuing work with The Center for Promotion of Child Development Through Primary Care, I have to be able to display ages for patients that our doctors will be treating. More often than not, these patients are young, so we’re talking about newborns through adolescencts. For the newborns, the number of months and days is very important, while the ages of adolescent patients are okay to round-off to years and months, and maybe just years.

It turns out that it’s somewhat difficult to answer the question “how old are you?”. It doesn’t really seem all that hard, until you actually try to do it. The problem is that people disagree about a lot of things. For example, you won’t get much argument that there are 10 days separating 2000-01-01 and 2000-01-11, or that there is 1 month separating 2000-01-01 and 2000-02-01. But what about the date difference between 2000-01-31 and 2000-02-30? Is that 30 days or is it 1 month?

Julian Bucknall is a guy who studies algorithms, at least as a hobby. He has a discussion of time reckoning in software including a sample implementation in C#. Although I appreciate his discussion (and created a few new unit tests based upon some of the problematic date ranges he presents), I don’t entirely agree with how he did his implementation. I happen to be using Java for my purposes, but I did my own implementation because I needed to, not because I’m just a Java wonk.

Before I start, those without a programming background have to realize that most programming languages have very poor tools for handling dates. Mostly they center around counting milliseconds since a certain date (usually 1970-01-01). This is great for quick calculations of numbers of days between events, since a day has a fixed number of milliseconds (1000 ms/sec * 60 sec/min * 60 min/hr * 24 hr/day = 86400000 ms/day).

For those of you who are too smart for your own good, I’m going to be ignoring leap seconds and things like that for the time being, since computers generally don’t handle those, anyway. If you want your computer’s time to be correct to the nearest leap-second mandated by the IEOS, you should just manually adjust your clock whenever it’s convenient… no date library is going to worry about keeping a list of all leap-seconds ever added to civil time.

So, back to dates in software. Since the number of milliseconds in a day is fixed, and computers often represent dates as a number of milliseconds from a fixed date (generally known as the epoch), it’s very easy to calculate the difference between two dates as a number of days. For example, I was born on 1977-10-27. That means that I am 10146 days old (wow, that doesn’t seem like a lot…). But how many years, months, and days old am I?

Fortunately, for discussion purposes, I’m writing this entry on 2005-08-07, which has both the day-of-month, as well as the month itself, less than the same numbers in my birth date (that is, 8 is less than 10, and 7 is less than 27). That’s good because it makes the math harder. If I had been born on 1977-08-01, then you could count on your fingers that I am 28 years, 0 months, and 6 days old. Since I was born later in the month and later in the year, there are all kinds of fun things that have to happen.

If you were to perform these calculations on your fingers, you’d probably start with the birth date and keep adding years until you couldn’t add them anymore without going over. You’d easily get to 27 and stop (if you had that many fingers). But then, you have to figure out what the differences are between the months and days. Exactly 27 years after my birth would be 2004-10-27. In order to get yourself to 2005-08-07, you need to add a bunch of months. If you add 10 months, you’ll get 2005-08-27, which is too much. So, you have to add 9 months instead, and then figure the days. Exactly 27 years and 9 months after my birth would be 2005-07-27. In order to get to today, you have to add days. If you add 11 days, you’ll get to 2005-08-07. Ta-da!

Now, that didn’t seem too bad, did it? Actually, an implementation which basically follows this on-your-fingers calculation is the one proposed by Julian Bucknall as well as many others on the web. I don’t like this implementation because is it computational overkill (you have to do lots of looping, and most Date object implementations that exist out there will re-calculate a bunch of stuff whenever you update a single field, such as the year or month). I actually wrote mine before I read his article, and I don’t have a C# compiler handy to run his algorithm through my test cases, so I can’t be sure that they yield the same results. At any rate, I have an implementation that should be a little more efficient and meets my needs.

Oh, one last note: we had been using a Java library called BigDate to do our date calculations. I knew it was going to be a pain in the neck to write our own, so we found a library that would do it for us. Unfortunately, it fails with Java Date objects representing dates before 1970-01-01. The author claims that his library handles dates prior to 1970 in contrast to Java’s Date, but it appears that he is wrong on two counts: Java’s Date class does, in fact, handle dates before 1970, and his library trips over them. I was able to use his library by passing-in the year, month, and date separately, but that required me to use deprecated methods in the Date API, and I was already starting to look down my nose at it, slightly. Just for the heck of it, I tried to use BigDate to calculate the date delta between a BCE date and today, and BigDate ignored the era, so I got the wrong answers there, too.

So, I wrote my own implementation (in Java) that quickly calculates deltas for all three fields (I’m not concerned with time, just the date), possibly ajdusts them for BCE dates, and then runs a fairly simple algorithm to move the date, then month and year to their correct values. We use a class called DiffDate which just stores a year, month, and date as a return value. I have one method that accepts a pair of Date objects, and one that accepts a pair of Calendars. Use of the Calendar avoids deprecation warnings during compilation, and offers two methods for client code, making it easier to use in situations that call for either Dates or Calendars.

    //
    // Copyright and licence notice: I intend for this code to be freely copied, edited, improved, etc.
    // Please give me (Chris Schultz, http://www.christopherschultz.net/) credit as the source of
    // this code, and let me know if you find ways to improve it.
    //
    public static DiffDate diffDates(Date earlier, Date later)
    {
      Calendar c_e = Calendar.getInstance();
      c_e.setTime(earlier);
      Calendar c_l = Calendar.getInstance();
      c_l.setTime(later);
      return diff(c_e, c_l);
    }

    public static DiffDate diff(Calendar earlier, Calendar later)
    {
      int y1 = earlier.get(Calendar.YEAR);
      int m1 = earlier.get(Calendar.MONTH);
      int d1 = earlier.get(Calendar.DATE);
      int y2 = later.get(Calendar.YEAR);
      int m2 = later.get(Calendar.MONTH);
      int d2 = later.get(Calendar.DATE);

      // Adjust years across eras (BC dates should be negative, here).
      if(java.util.GregorianCalendar.BC == earlier.get(Calendar.ERA))
        y1 = -y1;
      if(java.util.GregorianCalendar.BC == later.get(Calendar.ERA))
        y2 = -y2;

      int d_y = y2 - y1;
      int d_m = m2 - m1;
      int d_d;

      // Now that we've got deltas, start with the days and work backward
      // changing any negatives into positives, and rippling up to larger
      // fields.
      if(d2 >= d1)
      {
        d_d = d2 - d1; // Easy
      }
      else
      {
        // To determine how big the months are.
        Calendar work = (Calendar)later.clone();
        while(d1 > d2)
        {
          // Move backward through the months, adding a whole month 
          // until we have enough days to cover the deficit.
          --m2;
          // To track our progress through the month
          --d_m;
          // Now, there's one less month between dates
          if(0 > m2)
          {
            --d_y;
            work.set(Calendar.YEAR, work.get(Calendar.YEAR) - 1);
            m2 = Calendar.DECEMBER;
          }

          work.set(Calendar.MONTH, m2);
          d2 += work.getActualMaximum(Calendar.DAY_OF_MONTH);
        }

        d_d = d2 - d1;
      }

      // Adjust the months and years
      while(0 > d_m)
      {
        d_m += 12;
        d_y -= 1;
      }

      return new DiffDate(d_y, d_m, d_d);
    }

The whole thing is very straightforward, with the notable exception of the big “else” block in the middle of the code. It is here where we handle cases when the earlier date has a day-of-month that is later in the month than the later date. In that case, we need to count backwards, enlisting the help of a Calendar object to give me the lengths of various months. That ‘work’ calendar actually exists only to help me with leap-year determination. I suppose I would have used the old “years evenly divisible by 4, except every 100, except every 400”, but that would have complicated my code even further, and, I think, been inaccurate for old dates because of changes to the calendar. Then again, I think that GregorianCalendar (the default calendar in my locale) had those same rules, so I’d get the same results in both cases. If you want to calculate dates in October of 1582, you’re on your own.

You may have noticed, but this implementation does not handle time zones in any way. The reason is that this is intended to be for age calculation. If you were born in Sydney on 2000-01-01, then it might still have been 1999-12-31 in New York. However, you’re certainly not going to maintain your birthday to be 1999-12-31 when you’re in the US and 2000-01-01 when you’re in Sydney. Or, at least, we won’t 😉

It occurs to be that I’d like to write an entirely new Date implementation for Java, to handle things like bizarre missing dates (like October 1582) and a few other things that bother me about the Date class, but it’s just not going to happen. There are too many APIs that already use Date (or Calendar) and they’re not likely to change. Also, one of the things that I haven’t liked about the APIs is that they were able to neither calculate nor store delta dates. I have solved both with a delta date implementation and a simple delta date class.

So, how old are you, exactly? My code says that I’m 27 years, 9 months, and 11 days old. But I feel much younger than that.

Can I Get A Witness?

On the 13th of July, Slashdot had a post about a guy who had, using some Javascript and interaction with the HTML DOM, replaced standard checkboxes and radio buttons on web forms with nicer looking versions; basically, he has a way to use nicer looking widgets on a web form. They’re quite attractive. His research can be found on this page.

He mentions in “The Code” section that this is — as far as he knows — an original idea. There’s no date on the page itself, so it’s difficult to tell when he had the idea.

What I can tell you is this: I had this working somewhere between 2005-02-14 and 2005-02-16 according to my CVS logs. I’m working on an online questionnaire delivery and decision-processing system for CHADIS, and I developed this technique over a period of time, and finally checked the code into my CVS repo over a period of 2 days, including updates and fixes. Of course, I have root access on the servers which host our CVS repositories, so I could be falsifying that information, however I don’t really have any motivation to do so.


Radio buttons replaced with stylized buttons. The orange-lit button is the currently-selected button, while the light-blue-lit one is under the cursor. Update: 2005-07-18 15:09: Oops. When I did a screenshot, the “light-blue” button that I describe disappeared, probably because the cursor disappears when you take a screenshot. I promose that it works 😉

My code is all in Javasript, keps in a separate file with a smattering of onclick-style hooks into the library that I’ve written. All of the form elements are standard HTML form elements, and the whole thing degrades gracefully on non-CSS/Javascript browsers (yes, I test my software on Lynx, thank you very much).


The same page with styles disabled.

I’m sure that someone else has identified this problem (of not being able to adequately style HTML radio buttons and checkboxes) and developed a similar solution as well. It’s nice to know that someone has found a solution very similar to my own. It gives me a sense of validation that someone else came to the same conclusions that I did: that this is a problem that is best solved with Javascript and DOM manipulation, and that degrading usefully on browsers that don’t support all the whiz-bang features is not only possible, but a worthwhile goal.


The same page when viewed with Lynx v2.8.5rel.1.

Spyware Sucks

Although I have never managed to fall victim to spyware or other variants, I am the de-facto Help Desk for my family, as I’m sure many tech-savvy family members are.

My brother-in-law lives in Atlanta and whenever I visit, I check their computers, apply any required updates and patches, and install anything I think they need. This time, I had known for a few months that his computer was totally hosed, since he described the problems over the phone to me. I instructed him to disconnect his network cable so that the problems wouldn’t get any worse. About all he wanted to do was play video games as a single player, so losing network access wasn’t a big deal.

Oh, and this is a post about cleaning up Spyware, so of course, he’s running Windows (2000).

When I got here, I expected the clean-up effort to be pretty easy: a little virus scan here, two or three runs of Spybot: Search & Destroy, and that would be that.

Boy, was I wrong.

It turned out that, not only had he fallen victim to some spyware and adware, but that he had been successfully attacked by several Trojan Horses. These programs were running on startup and basically re-installing all the stuff that I kept uninstalling every time.

My first mistake was not running the virus scanner as my first order of business. I ran Spybot a few times between reboots, and some of the things couldn’t be removed for one reason or another, so I ended up performing some boot-time scans as well. Apparently, this kind of pissed-off whatever was installed and everything seemed to get worse: there was a new program running called SpySherrif, which is a thinly-veiled effort to get you to buy something that you don’t need (i.e. a spyware cleaner that installs more spyware).

After wising up and installing my favorite anti-virus package, Avast!, it detected virii running in memory and recommended a boot-time scan. Of course, I accepted the offer and rebooted.

Along with a host of other files that were infected with things like win32:Trojano, win32:Trojan-XYZ (where XYZ is a random number between 1 and 1000), win32:Beavis-A, and a host of festering, adware-style trash, I was dismayed to learn that explorer.exe was infected with something. I tried to “repair” the file, but there was nothing to be done: it had to be deleted. I did that with a heavy heart, since I didn’t know how Windows would act with it’s primary shell gone. I figured that I would have to reinstall the OS if it was that badly damaged, anyway, so I’d better just delete the damned thing.

After all that, Windows started up, but with no desktop (as I would have expected). Fortunately, CTRL-ALT-DEL still worked, and I was able to run the command prompt and get some real work done. Conveniently, Windows still comes with expand.exe and I had conveniently copied all of the original files from the installation CD to his hard drive. Using those, I was able to restore explorer.exe and make some more progress.

It took several grueling rounds of reboot, virus scan, kill evil-looking resident programs, spyware scan, and then cleanup of Internet Explorer’s “Temporary Internet Files” folder because it ended up containing adware on every reboot. But, I was able to finally exorcize the machine of all the crap that was on it. Below is a list of extremely
useful programs that I keep in my bag of tricks to clean computers:

  • Avast! AntiVirus. Nice, ’cause it’s free for home use and very reliable.
  • Spybot: Search & Destroy. There’s no better spyware cleaner if you ask me.
  • Process Explorer from sys-internals. This puppy shows you everything, and will even let you scan for which program is using a particular file and snoop what resources a program is using.
  • Autoruns, also from sys-internals. This one was new to me, but I had to root-out lots of stuff that was re-installing itself on boot, and Windows has like 12 different places where run-on-boot programs can be specified.

Now, it was time to fix everything that was broken. For example, SpySheriff (or another program, it’s pretty much impossible to tell) changed the Desktop to be a web page telling me that my computer had been “stopped” due to spyware and virus activity. Now that I had cleaned it out (no thanks to SpySheriff), I was going to restore the desktop to its previous state. Unfortunately, the options to change any desktop settings were mysteriously greyed-out. This was obviously the work of nefarious software. I set about finding out what happened and how to fix it. Along the way, I discovered that the following items had been hosed by all the software that had taken over my brother-in-law’s computer.

  • ActiveDesktop permanently* enabled
  • Desktop wallpaper permanently disabled
  • Windows AutoUpdate permanently disabled

* By permanently disabled, I mean that re-enabling these features was not possible through the usual user interfaces.

After much searching, I found out how to fix each of these problems. Below, I describe them so that others might have an easier time finding this information.

ActiveDesktop is Disabled

I feel bad that I can’t remember precicely where I found this information or what it was, but I believe that checking this registry value will help you out a lot:

HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorerForceActiveDesktopOn (you’ll want this to be set to “0” — zero).

Desktop Wallpaper is Disabled

Using the information found at this site (http://www.bleepingcomputer.com/forums/How_to_remove_the_Smitfraud_or_Wpexe_bswexe_WindowsFY-t17258.html), I found a registry script that you can run to clean up after a handful of evil programs. I was leery of blindly running that script on my own registry, so I picked out those changes that seemed to make sense for me. Here they are for convenience:

Delete the following keys and their values:

In HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesSystem:
NoDispAppearancePage, Wallpaper, WallpaperStyle, and NoDispBackgroundImage

In HKEY_CURRENT_USERSoftwareMicrosoftWindowsCurrentVersionPoliciesExplorer:
NoActiveDesktopChanges

In HKEY_CURRENT_USERControl PanelDesktop:
Wallpaper, WallpaperStyle

AutoUpdate is Disabled
I first found this site (http://www.amset.info/windows/auto-updates.asp, which told me which registry keys were significant, here (search for “greyed out”). Unfortunately, there was more to it than their suggested fix, so I went looking for more information about those registery values. I found this site (http://www.susserver.com/FAQs/FAQ-InterpretingAUStateValues.asp) which described all the possible values and their meaning. That didn’t help too
much, so I kept looking and found this site (http://snakefoot.fateback.com/tweak/winnt/service/abc.html#AUTOMATIC_UPDATES) which pretty much lays it all out there for you. Using that information, I was able to correct all of the registry values that had been hosed.

Since I was both working and enjoying my family — including my nephew who was celebrating his 1st birthday — it took me 4 days to do all this. *Sigh*

Needless to say, he’s now running with all the latest OS patches, Avast!, Spybot, and, of course, Mozilla Firefox as a replacement for Internet Explorer.

A repeated adventure, with a twist

When Katie and I honeymooned in Italy, we took a tip from a good friend, Aaron Tristler, about heading to an area along the Mediterranean coast in Liguria called Cinque Terre, or Five Lands. If you’ve ever seen pictures or video of Italy’s coast where there’s a rough, rocky coastline with houses clinging to their sides (such as are featured in Under the Tuscan Sun, for example), just asking to fall into the ocean, then you’ve probably seen Positano, which is on the Amalfi Coast, just south of Pompeii. Cinque Terre is has very much the same look about it, but it turns out to be not one, but five distinct little hill-towns connected by hiking trails and rail lines.

Nearly two years ago, we boarded a train from Florence and went to Pisa, our first stop on our journey. We had heard that there was nothing to see in Pisa except for The Tower (this fact was confirmed by a rental car agent just the other day when a pair of English-speaking tourists were renting a car to go to Pisa and other places; I was more curious why they would rent a car to go to Pisa in the first place: it’s just 1 hour away by train!), so we decided to “do” Pisa on the way to Cinque Terre, since we had to change trains there, anyway.

Cinque Terre was amazing, and we vowed to return to the picturesque little communities when, not if, we came back to Italy. We came back to Italy, and so we had to return to Cinque Terre.

My sister (Jessica), brother-in-law (Wayne), and my 10-month-old nephew (Joshua) were visiting for the week, and we decided to repeat our initial excursion from Florence. “You can’t go to Italy without seeing the Leaning Tower of Pisa”, so we decided to do that, again, too. Just a quick day-trip. Easy out, easy in. Take the train the whole way… it couldn’t be easier.

Pisa

Joshua yearns for Tuscan grassland

With Joshua in-tow, we borded the train to Pisa and had a nice ride playing with him, talking, and watching the Tuscan countryside rush past. We had all sorts of romantic visions of what each building might be, and then joked about how a small town-looking area with city walls might actually be a penitentiary.

Pisa is largely an uninteresting town for tourists. There’s only one spot where anyone wants to be, and that’s the Campo dei Miracoli, or Field of Miracles, which contains Pisa’a immense Baptistry, Duomo, and, of course, The Tower. The tower really is leaning quite a bit. Apparently, it was an engineering cock-up from the very beginning. I’m a Software Engineer, and even I know that building a 60m tower, you can’t hold it up with a 3m foundation floating in sand. Apparently, in 1173, this was not considered common knowledge.

The Leaning Tower of Pisa

On neither visit have I elected to climb the tower. One guide says that it’s €15 per person, but I haven’t even looked. I perfer to be dwarfed by the tower and surrounding buildings. The field itself is very beautiful: something that I miss about Florence is greenery. There is virtually no grass and no trees in the city. Sure, you can go out to the Piazzala Michaelangelo (which has quite a view of the city) and see trees, but it’s hard to find a tree that you can sit under and feel the grass between your fingers. The lawn in the Campo dei Miracoli, on the other hand, is kept as well as a golf-course, and has a strict “keep of the grass” directive, which many tourists ignore and walk across the field, anyway.

Unfortunately, it takes about 20 minutes to walk from the train station to the Camop dei Miracoli, and there’s about 20 minutes of excitement there (gotta get a picture of you holding up the tower, for instance), so it’s a one-hour trip for a few photo-ops. Walking through the streets of Pisa, which are filled mostly with tourists walking from the station to The Tower, I noticed a few people who were most likely local Pisa residents. They seemed to be completely ignoring the presence of the masses of people wandering through their streets. I wonder if they dislike all those people doing nothing but walking from the train station to the Campo and back again. I suppose if they don’t own a consession stand or souvenir store, then you have no reason to enjoy the constant stream of foreigners stumbling through your streets.

Cinque Terre

After another train change in La Spezia, we were on the last 10-minute leg of our journey to Cinque Terre. Shortly after leaving La Spezia, the train ducks into a tunnel that ploughs directly through the mountains on the coast. Occationally, the rails pass very close to the surface of the mountains, and the track peeks out and gives passengers a great view of the sea. Unfortunately, I was only quick enough to snap a picture of the tunnel wall with a bit of water on the left as we re-entered the dark tunnel.

The first town on an east-to-west traversal of the Cinque Terre is Riomaggiore. Even the view of the sea from the train platform is gorgeous. Both this trip and that of two-years-past included very little of Riomaggiore, which is too bad. I’ll have to go back, because there is much more to see than the area around the train station and the beginning of the inter-town hiking trail. I suppose a day in each town would be a nice way to spend a vacation, but we didn’t have the time. Instead, we sat down at a restaurant overlooking the sea and relaxed for a bit.

Every meal should be in a place like this

We started looking at the menu when my phone rang. I had to attend a conference call for work, so I sat on this fantastically beautiful terrace on the phone. The group ordered, among other things, octopus carpaccio, which I was forced to finish when nobody else wanted to eat more than a single piece. It was at this point that I started getting sick. I could feel that morning… the slightly stiff and sore neck; the tickle in the back of your throat; the occational sneeze. I was hoping that it would get better, but my sickness turned out to be the backdrop upon which the rest of the day’s events would unfold.

We elected to walk from Riomaggiore to Manarola because Katie and I knew that the walk was beautiful, short, and easy to navigate in spite of Joshua’s presence. In fact, we had Joshua in a relatively easy-to-carry backback, so the hiking would only have been limited by our ability to navigate the trails with an extra 50 pounds of equipment and baby on our backs. This trail, however, had a boardwalk and everything: you can take a stroller along this trail without a problem.

This is the last good picture that my camera took. Take a good look, because it might be the last useful thing that it ever did.
Just after this picture, I asked a gentleman on the boardwalk to take our picture. I handed the camera to him and said “just press” and indicated the button on the camera that you press to take a picture. No sooner than he lifted the camera up to his face to look at the LCD display did he drop it. From about mouth-level. I watched in horror as the camera bounced off of the ground, regurgitating the battery it had swallowed before we left the house, spliting open along the factory-sealed seam, and careening toward the edge of the boardwalk, where I was sure that it would fall into the ocean that had, moments prior to its demise, been the focus of it’s attention.

I grabbed the camera before it could go any further and surveyed the damage. The attempted murderer was apologizing profusely for the assault on the camera even before it hit the ground. I was too polite in saying that it was okay, and, after snapping the case back together and feeding the battery back into the camera, I was able to turn it off and back on again; the lens moved in and out and the LCD worked, so I was pretty happy. He took camera back, took the picture of us, and we verified that it had been taken. The camera looked like it was okay, despite having been broken nearly in half. It turns out that the camera has lost its ability to focus properly at all zoom levels except when zoomed all the way out. Therefore, the remainder of the pictures from this trip, as well as others with my sister and brother-in-law, are coming from their camera. I appreciate the fact that they were willing to let me go through the trouble of copying every single one of their digital images from their camera to my computer before they put them on theirs.

Make-out point

Broken camera in hand, we resumed our stroll from Riomaggiore to Manarola, which includes a trip through the Via dell’Amore. Although I think it’s a pretty area, there’s not a bit of amorous graffitti in the tunnel. I actually find that the little garden distracts from the dramatic beauty of the cliffs themselves. Then again, I suppose the Via dell’Amore is not the place to have images of tossing one’s amore over the railing.

As we rounded a corner where a conveniently-placed Bar sits along the boardwalk, Manarola comes quickly into view, looking a lot like one of our sand castles that has been half-consumed by the waves. The houses of the town peek out from behind the rocks as if they are hiding from something. We didn’t stop in Manarola, because the trail had been closed between it and Corniglia due to rock slides — yikes!. In fact, we decided to skip Corniglia altogether and visit the next town west – Vernazza. Katie and I had never been there, and we had read and seen pictures of a castle defiantly standing on a promontory at the head of the town harbor. The train stops at each town, and you arrive at the train station for Manarola before the actual town when hiking in the direction we were. We hopped the train and were off to Vernazza.

Houses in Manarola along the high cliffs

Vernazza is, in a word, verra-nice’uh. As we emerged into the town square, I motioned to the area in general and asked my sister, “couldn’t you just spend the rest of your life on these eight blocks?”, to which she replied, “I think it would get a little boring.” Stupid Americans. What do they know?

Vernazza offers, to me, what each and every town in the Cinque Terre offers: a small town where it’s possible to know and be friends with everybody, a very slow pace of life where you can enjoy each and every day in relaxed contentment, and, of course, spectacular views of the hills, cliffs, and sea. The Cinque Terre are a scant two hour train ride from several major cities (Florence, for one) and, from my cursory study of a map on the train, maybe 3 or 4 hours from Monaco. I have a small fetish for tiny countries. I’ve already been to one of the two countries wholly contained by Italy, and I hope I have time before I leave Italy this time to visit San Marino.

What more could you want?

We whiled away the afternoon playing with Joshua around the castle and taking in the beauty that surrounds and permeates the whole area. When we arrived in La Spezia that morninig, we had consulted the train schedule and decided that an 18:46 train would be an ideal departure time. I’m not sure what time it was at this point — I turned off my phone at the end of the conference call and I had no other timepieces — but we were content to spend as much time as we wanted in this paradise on the cliffs.

As the sun went down, we returned to the train and took it to our last stop in the Cinque TerreMonterosso. One the five towns, I think this one has the longest stretch of beach-front property, which is all completely open. There’s a “new town” near the train station and an “old town” which is maybe 1km way to the east. We headed for the old town to see some sights and eat dinner. Food shortly trumped sightseeing so we sat down at a restaurant just behind the beach for what turned out to be a marathon meal. The food was excellent in spite of my being so sick that I was almost ready to lie down on the beach and die.

Our waitress picked up Joshua and played with him for a while, and then ran off with him to show the rest of the staff. When she didn’t come back for a few minutes, we figured that, between Joshua and the meal, we could just stand up and call it even. Fortunately, she returned with Joshua, who seemed oblivious to the entire episode.

We returned to the train station well after dark and began out next adventure: trying to get home. Apparently, the 18:46 train would have been a brilliant idea had we followed through. Unfortunately, we didn’t, and so, at around 22:25, we found ourselves on the platform at Monterosso, trying to figure everything out. This included buying a ticket, as the biglietteria was closed for the evening. There appeared to be a machine opposite the closed ticket office that dispensed tickets if you knew enough about the process to get one. In spite of my lack of Italian language prowess, I do know a lot about computers and this one, though primitive with only a double-line LCD display, had definately crashed.

Train Tunnel at Vernazza

Katie suggested that we simply get on the train and figure it out later. I, having been brainwashed by my mother about how I’ll be sent to a gulag if I ever hop a train with no ticket, decided to check out the area around the station to see if anyone had any information about how to get tickets when the office was closed and the macine biglietti was hosed. My search yielded niente, as everything was closed this time of night. There was a woman on the platform, waiting for a train to Genoa, who I asked for help. She sheparded me to the machine inside, and then frowned. I guess she also understood that the machine was muerte.

So, we hopped the train.

For maybe my second time ever on an Italian train — particularly a regional (i.e. local) train like the one we were on, a ticket-taker walked through the door at the back of the car. He asked us for our tickets, and, while Katie was contemplating giving him her Cinque Terre-only ticket (which she had apparently never validated), I told him that the ticket machine at Monterosso was not working. He frowned and said, “no ticket?”. “Si, no ticket” 😦 He asked where were going, and we indicated that we were going to Pisa, via La Spezia, and on to Florence. He shrugged and continued walking through the car.

I thought we were home free. I figured he was thinking “they’re just stupid tourists, and it’s really not worth my time to go through the process of selling them a ticket. It’s only five more minutes on the train, anyway.” I was wrong. He returned with a ticket book, and started flipping through it, apparently looking for the instructions, since he looked like he had no idea what he was doing. He sold us tickets all the way to Pisa, which was nice, because we were likely to have the same problem in La Spezia. He asked again where we were going. “A Firenze”. He wrinkled his brow and grimaced. Then, he checked his watch and frowned. “I dunno,” he said, which wasn’t encouraging. Just then, his buddy walked through the door, wearing the same conductor’s outfit and one quickly informed the other of our situation. The newcomer glanced at his watch and also frowned. With the double-frown, I was starting to get worried.

Joshua in Vernazza from Above

Joshua in Vernazza from Below

It became evident that it was going to be a close-call at Pisa. It would be a stretch to catch the last train of the night. At La Spezia, we waited anxiously for our connecting train, and then relaxed once aboard. It takes about an hour to get from La Spezia to Pisa, and it appears that about fifteen minutes of that time is spent pulling around a curve that is within spitting distance of the train station in Pisa. The entire car stood up and piled into the space between the compartments, waiting for the doors to open. And waiting. And waiting. We must have waited for a good ten minutes just standing there.

When we got off the train, I assumed that our chances of catching the last train to Florence for the evening would be nil. So, I asked the two nice looking old ladies in front of me as we disembarked where the bus station was. They considered the question for a moment, and then decided that they should simply show me. I started off after them when Katie shrieked at the top of her lungs to come back. I bid grazie and arrivederci to the ladies and went back up the stairs to the platform. Katie was hunched over the schedule with Wayne and Jessica huddled around her. “We’ve got a train, and we don’t even have to switch platforms! It should be here right now!” In the world of trains, if it’s not here right now, it’s already gone. The clocks on the walls were two minutes faster than my cell phone’s clock, but I think Trenitalia runs by their own clocks instead of my cell phone.

I trotted down the platform and asked someone who was wandering around on the tracks wearing a highly reflective service uniform if he knew where the train for binario tre was. He muttered something in Italian that I didn’t understand, and came over to us to look at the schedule. “Aah… solo festa,” he said, and I nearly fell over: Sundays only. Well, I suppose it’s technically “festival days and Sundays”, but trust me, today was no festival day. If we made it home that night, I would have promised to hold the biggest festa Florence had ever seen.

All of us in Monterosso, con sunset

We were stranded in Pisa.

We decided to ask the taxis how much it would cost to take a cab to Florence. It sounds completely foolish, but we figured that, if a double room costs €60 and the train costs €15 for all four of us, that our breaking point would be around €135. Each cab said the same thing (which was, in itself, encouraging) that the ride would be somewhere in the €140 range, but that they wouldn’t do a flat rate — only metered. We figured that they were probably underbidding the price a little, so we abandoned the idea of taking a cab. A women in line for taxis was adament about us going to the hostel where she and her two travel mates were headed. She even wrote down the name and telephone number for us, in case we wanted to try. Honestly, we were more interested in a place to stay as close to the train station as possible.

After some debate, we decided that the best thing for il bambino was to get a room in Pisa and just call it a night. Katie and I were determined to get back to Florence, especially when we found out that there was only one room at the pensione we found near the train station that had availability (we had called from the train and they had two rooms available). After taking care of Wayne and Jessica, we proceeded to determine the location of the bus station. Guidebook maps seem to indicate that the bus station is, in fact, directly in front of the train station. When we looked at the signs on our way out, it looked like all the busses were local busses — those that did short, intracity routes and returned to the same spot.

Since we were there, we asked the guy at the desk in the pensione. He seemed to know less about the bus situation than we did, and directed us around the corner, which was away from the train station. I was skeptical, but I knew from the (in service!) ticket machine at Pisa that there was a bus to Florence leaving at 00:46… we just needed to find out where to wait.

As we came within a block of the place indicated by the hotel attendant, I heard the unmistakable sound of bus brakes and a large diesel engine. I jogged up ahead and around two corners to find the source of the noise. Sure enough, right where he had indicated, there was a Lazzi bus parked on the side of the road. I was elated! It was even there about 25 minutes early, which would be nice, ’cause we could get onto the bus and just relax… no sitting on a concrete bench in the middle of the night waiting for the damned bus!

Unfortunately, this was not the bus to Florence. So, I asked the driver “dové la autobus a Firenze?” He waved his arms and said a lot, and the only work I understood from all of that was stazione: the train station. I told him that I was confused, and he simplified it for me: “bus at train station” (in English), and then motioned towards the station. I replied that I knew where the station was, but I didn’t know where to catch the bus to Florence. He motioned for me to get on his bus. Katie appeared out of nowhere, as if the potential for success was so great that it had whisked her off her feet and deposited her next to me as a witness to my triumph: this bus driver was going to take me either to the place where I will catch the bus to Florence, or he will be so enraged by my stupidity that he will actually drive me all the way to Florence just to make me shut up.

He drove the three blocks to the train station and opened the door where we had started: right next to a sign that said “Linea Verde”, the green line through Pisa. I rolled my eyes and got off the bus. I turned to the driver and said, “Qui?”, and indicated the place on the cement where I was standing. “Qui!”, said the driver. Just to make absolutely sure that we were seeing eye-to-eye, I asked, “La bus a Firenze — qui?”. He replied a conclusive, “Si”. Contented, we decided to find a place to sit. We still had twenty minutes or so left until the bus came, so we had to amuse ourselves in that time. I decided to re-read all the signs that we had looked at before, just in case I was missing something glaringly obvious like “Intercity Bus Stop” somewhere.

Just then, a well-dressed man approached Katie and asked her if she needed to get to Florence. She replied that she did, and he offered her a ride in his car. I overheard some of this, and came back to where the two of them were talking. He said that he would take us for €50, which actually sounded like a pretty good deal. I let Katie make the call. “We don’t have that much money,” she said. I had almost double that amount in my pocket, so she must have decided against hitching a ride at some point. He looked at the two of us, and quickly became very apologetic, half bowing as he backed away, saying “I’m sorry, no problem, si? I’m sorry.”.

I turned to Katie and said “were you just propositioned?”. “I think so,”, she laughed incredulously.

Since I was sick, I had been drinking a lot and needed to locate some facilities, pronto. A lengthy survey of the train station yielded neither restrooms nor an alley dark enough for a substitute. We returned to the alleged bus stop, and noticed that there was a pizzaria that was apparently open. And it was hopping! I guess when you’re the only place in town that’s open past midnight, everybody drops by.

We bought a bottle of water, mostly to be polite, and took care of business. I asked one of the cooks if he spoke English. I was determined to get to the bottom of this whole bus situation, and at this point, I was settling for nothing other than an English conversation that I could actually understand. He frowned and shook his head. I pointed to another cook and asked “Lui parla inglese?”: does he speak English? He shook his head and I proceeded to point to another person behind the bar and ask again. He called to his co-worker to come over and talk to me. He spoke a little English, but it was good enough for me. I said very simply that I was going to Florence, there was a 00:46 bus and I wanted to be on it. I only needed to know where it stopped. Fortunately, he completely understood (or feigned complete comprehension) and said that the bus comes “just outside”, indicating the area directly outside the pizzaria.

Once again contented with an explanation, we went outside to take a look. Standing in the middle of the street, with one bus parked away in a corner of the circle (don’t ask me how that works, I just know this this bus was definately parked in a corner of the circle) where the busses stop, and a nearly empty piazza all around us, we decided to stand in the middle of the circle along the grass — ready for action. My cell phone said it was 00:43, so Trenitalia must think it’s about time to be leaving for Florence by now.

Just then, a bus came flying through the streets of Pisa, tearing across the intersection just in front of the train station, and into the circular drive where we were standing. It came to an abrupt halt, and we could already hear the driver animatedly ushering his friend off the bus out onto the sidewalk. The two of them lit up cigarettes, exchanged a few words, and then the driver stalked off through a door in the side of the train station. We walked up and asked the two people standing outside the door to the bus, “a Firenze?” We were greeted with a very friendly, “Si! Si! Thees-a bus going-a to Florence!”.

Fantastico. Now all we had to do was figure out how to buy a ticket. The machine inside the station only sells train tickets, though it has the complete bus schedule available, and you can even buy a train ticket that includes complex transfers, including busses. An oversight in customer use-case planning resulted in the unfortunate inability to purchase only a bus ticket. And, if there had been anything resembling a ticket office anywhere near the train station in Pisa, I would have already found it and violently assulted any ticket machine that refused to give me a ticket for whatever reason.

To avoid a lengthy destruction of public property trial, I asked the friendly gentlemen in front of the bus where I could buy a ticket for this particular bus. They exchanged a look, looked at the train station entrance, consulted their watches, and then nodded at each other: “In la bus”, and indicated that we should buy our ticket from the driver once we were on the bus.

The driver emerged from the train station and exchanged a few animated words with his buddies outside the bus. He looked around at the small collection of people waiting on the curb and said “okay-ee! ever-body to Firenze!” and climbed in. We all piled in and sat down on the bus, which appeared more cavernous than it should due to the dearth of passengers at this late hour.

The driver was very friendly and spoke a tiny bit of English, which he enjoyed using. He verified that we were, in fact, going to Florence, and specifically to Santa Maria Novella – the main train station in Florence. The tickets were the same price as the train ticket would have been: €5 each. After processing each passenger in such a way and expelling a gentleman who appeared to have no verifiable address, he checked his Trenitalia-synchronized watch, closed the door, and we were on our way.

After a gentle turn around the circle at the bus stop, he accelerated quite a bit onto the abandoned street which runs approximately east from the station. He turned on the radio which was playing quite outdated American pop songs and cranked up the volume. As soon as we were headed straight on that road, he really put the hammer down. I didn’t know these intercity busses could accelerate this fast, or even sustain the speeds that we reached in the streets of Pisa. I checked: no seat belts. There was an “oh, shit bar” on the seat in front of me. I grabbed it tight with my left hand and thought to myself oh, shit!. I grabbed Katie’s leg and held on tight with my right hand. She seemed comforted by my gesture, until I admitted that it was mostly to prevent me from flying through the window when, not if, we hit a parked car.

Southeasterly view from Monterosso’s beach

Not knowing where we were going was part of the problem. The other part was that were travelling at — by my estimation — a significant fraction of the speed of sound. I expected our sonic boom to be setting off car alarms behind us for blocks and blocks. The center line of the road shimmied back and forth as we went around blind corners, taking the most efficient path for the enormous yacht we were all in. We came so close to cars parked on the side of the road that I felt like we were going to take off their side-view mirrors, bumpers, or even more along with us to Florence.

I was hoping to sleep on the bus — a nice, relaxing ride with a few bumps. I used to take a 45-minute bus ride to school and back every day for 6 years on a yellow school bus with crappy rubber seats. I figured that catching an hour of sleep on this ride was going to be cake. I was wrong. There was no way that any sane person could sleep on this trip — especially anyone that had decided that the best place to sit was in the first normal seat on the bus — the rumble seat was taken by the driver’s buddy, who appeared poised to leap directly out through the windshield at the first sign of danger. Then, the driver began to sing at the top of his lungs.

It was in semi-English, because he only knew the words to the chorus of the song he was singing — the verses were too complicated so he would just hum along with them and yell out the occasional unmistakable word. His voice was hoarse from all the cigarettes, singing, and verbal antics exchanged with his amico in the front seat.

Finally, we left Pisa and emerged onto a roundabout for getting onto the “Fi-Pi-Li” — the Firenze-Pisa-Livorno highway connector. We careened around the roundabout and were slingshot onto the highway where the driver performed a harrowing merge and went into the left lane without missing a beat. After passing a car, we went back over to the right lane for a while. Whenever we would approach a car from behind, the driver would pull within no more than 10cm of their back bumper, hover there for 1km or so, and then lurch into the left lane to go around them. And it goes without saying that, after passing, he would cut off the driver in the other lane mercilessly, as if to punish him for not driving faster. At least we’ll get there quickly, I thought.

Soon, we took an exit for a town I had never heard of. At one in the morning, this town was completely dead. It was the Italian equivalent of Terre Haute, Indiana, and we were again racing through narrow streets. We approached a traffic light — probably the only one in the entire town — which was red. He made a soft right-hand turn through it without slowing down a bit, taking up the entire width of the road with the bus. “Eets okay-ee!” he yelled, anticipating our protestations, which were of course frozen in the backs of our throats.

We pulled into what had to be the bus station, but looked like a parking lot for a drugstore, and the bus screeched to a halt. “Okay-ee! Eets Firenza!” the driver bellowed and laughed uproariously as he and his comrade stepped off the bus to smoke. As the bus sat there, heaving oddly up and down, we slowly felt our blood pressure and heart rates returning to normal. We watched the driver and his friend discuss some inconsequential topic, the driver waving his hands like a maniac and talking so loud that we could hear him very clearly through the glass windows. His friend was much more subdued but played along and chuckled at nearly everything he said. We decided that the driver was motivated by his desire to stand at the bus stations and smoke cigarettes with his friend. We concluded that he was driving so fast so he could enjoy as long of a break as possible, which made sense in our minds. That, and the fact that he was probably mainlining espresso whenever he got the chance.

We left the ‘Haute and resumed our journey towards Florence. Having relaxed quite a bit, Katie and I attempted to discuss objectively the situation we were in. I suggested taking a short video of us driving through a town to show just how crazy the trip was. She said, “nah, nobody’d believe that we hadn’t doctored the video. You know, sped it up. Besides, we don’t get any sound, and his singing is half the fun!”. She was right and I knew it: this was going to be another one of those experiences that I will never believe that I actually had, and there is no record of it ever happening, save for my and Katie’s memories.

In another town, we slowed down in an unlikely place and made what appeared to be an unscheduled stop. The driver’s friend stood up and got off the bus. We were stopped near a corner and there was a tabacci on it. Oh, he’s getting cigarettes, I thought. Instead, the driver closed the door and drove off. Puzzled, we looked behind us, and saw our now ex-passenger was going into a door next to the tabacci, which we assumed was his home. Wow, curb-side service! I decided that we should try to get the same treatment. After all, Santa Croce isn’t that far from the train station by bus.

At our penultimate stop, the driver re-verified everyone’s destinations. “Firenze — Santa Maria Novella, si?”. “Si,” I responded, “but Santa Croce é un po piú bene”, which apparently sounded like Greek to him. He wrinkled his brow, came back to our seat, and said “I’m sorry, I want to understand,” and looked hopefully at the guy behind us. He was the one who had told us that this was the right bus and that we could buy tickets on the bus, too. He appeared to be in a position to help us again. They exchanged a few words, and I only understood the driver asking him, “dové”, and his response: “In centro” — in the city center. Things were looking promising for our ride directly to our front door.

Having never driven in Florence, I’m always amazed whenever I come into the city by auto at how the city center jumps out at you from nowhere. Much of non-historic Florence is, to me, virtually indistinguishable from any other non-historic part. I try to identify where I am to orient myself, but just when I think I’ve got it all figured out, an unmistakable landmark jumps out at me from a place where it shouldn’t be. This hadn’t happened yet when our friend behind us got out at another unscheduled stop in what ended up being the north side of Florence. Uh, oh, I thought. There goes our navigator.

We pulled into Santa Maria Novella station right on time: 02:45. The bus stopped and the driver got up and stretched, facing the back of the bus. There were only three of us left: Katie and me, and another guy who had spent the entire ride on his cell phone at the back of the bus. The driver bid us all a buona notte and we all got out. Male, I thought. No door-to-door service.

We went to the taxi stand where most cabbies were literally asleep at their wheels. We had to give the first one in line a rather loud and uncourtious buona sera to wake him up. “Quanto costa a Sante Croce?” — how much to Santa Croce. Our Italian is so poor, but I like to think that our attempt is appreciated, and hey, we get the point across. He grunted, frowned, and said in a heavy Italian accent, “meeneemum charg-ay ees eight ay-uro”. Eight euro to go ten blocks? Forget that. We’re walking.

Katie didn’t protest. It was cold, and we were walking corpses, but we’d be damned before we were going to pay more for the cab ride home from the bus station than we paid for the whole trip from Pisa!

It seemed to get colder as we walked. We approached our front door at about 03:00. Home sweet home. “At least it’ll feel nice and toasty inside compared to our walk home,” I said. “Not if you left the windows open all day and night,” Katie replied. Which, of course, I had.

Pasqua a la Fiorentina

Florence’s Duomo dominates the city

It seemed a little daunting, going to Cattadrale di Santa Maria del Fiore, for Easter Mass. It happens to be the 4th largest church in the world (depending on whom you ask and what your criteria are, the others may be St. Peter’s in Rome, St. John the Divine in New York City, and Saint Paul’s in London), and I was sure that the mass was going to be entirely in Italian, a language in which I have attained little mastery. Fortunately, amen sounds the same in Italian as it does in English.

We woke up in the morning to pouring rain — not a good sign when your travel plans consist primarily of walking. Florence’s Duomo is only a leisurely 10-minute walk from our front door, but rain always dampens one’s spirit as well as the cuffs of one’s pants. Fortunately, about five minutes after we had intended to leave, birds began singing outside, and we were convinced that the rain had stopped for the time being. We set out, umbrellas in tow, toward the Basilica under a low canopy of light grey clouds. The rain had subsided, and lots of people were making their way through the city to various churches.

For the first several blocks, I was convinced that we were headed in the wrong direction, despite my clear recollection of how to get to the Duomo — we walk by it almost every day. Today, most of the foot traffic seemed to be in the direction opposite to the way we were going. I guessed that these particular inhabitants preferred other churches to the Duomo — particularly today when the mass is likely to be overrun with tourists who may be less than faithful.

Another reason why there was no clear destination for the hundreds of people we saw that morning was that Florence is home to at least 8 gigantic basilicas and churches (Santa Maria Novella, San Lorenzo, Santo Spirito, Santa Maria del Carmine, Santa Croce, Orsanmichele, Il Duomo, and Santa Trinita), as well as dozens of smaller churches around the city. It is easy to see why, ninety minutes before the most important mass in the Catholic church, there would be mass confusion in the streets with each person going to the church of their choice for Easter.

Colorful procession of the ox-cart

When we arrived at the Duomo, the square was filled with hundreds of tourists, there to see the procession of medieval costumes and trumpet fanfare. A traditional ox-cart loaded with enough fireworks to bring down the roof of the cathedral was parked out front, waiting for the beginning of the mass to detonate and burn for a good 15 minutes. We watched for a few minutes, and then decided that we had better get inside and find seats before we found ourselves standing through an entire mass which was likely to be longer than usual.

It turns out that few people were gathered to the right of the alter — most had gathered in the nave, where all of the temporary seating had been set up, and the best place to get a view of the ox-cart outside, poised for subsequent conflagration. We sat down and took a few pictures before the mass started. We also began to notice that, inside the cathedral, it was freezing. Since the church has few windows to let in a great deal of light, and no noticeable heating system, it is still cold from the winter. Even when the sun is bright and lightly baking those in the square, the church remains dark and cold.

Katie and me in the Duomo

There seemed to be quite a lot going on outside that we could not see. Trumpets would occasionaly sound, the crowd would cheer, and everyone in the church was looking around, trying to get a better look at either the action outside or the tremendous architecture inside. I was trying to guess the country of origin for all of the people surrounding us. I listened to their speech and decided that there were a number of Italians and Americans — which came as no surprise to me – as well as German, Polish, and a few Asian languages. My capacity to identify languages pretty much stops at the eastern edge of Europe… I haven’t had enough friends who speak Asian languages often enough to have learned to recognize certain sounds that tip me off as to the language of the speaker. I might be able to discern Japanese from a Chinese dialect if I heard them at the same time, but I have to admit that I am very ignorant with respect to these languages at this point in my life.

Judgement Day on the interior of Brunelleschi’s Dome

The architecture in the Duomo is impressive. During the rennaisance, Europeans finally re-learned everything that the ancient world had already figured out, and then somehow lost along the way. Art and architecture were re-born, and people started building big. Brunelleschi was both an artist and an architect, and he apparently managed to get an exclusive commission to build the huge dome of Florence’s Duomo by both making Ghiberti (of Doors to Paradise fame) look like an incompetent, and being a hell of an engineer. It appears as though the dome itself has stood the test of time, while the cathedral itself has required bracing along the way, due to the crushing weight of the massive roof. Arches line both the interior and exterior isles of the nave, but appear to be buckling somewhat under the stress. Various means have been used to forestall further weakening of the arches and columns, such as adding iron rods driven through the columns to the roof — apparently to hold the two supports of the arch together.

Florentines in costume

Upon review of the pictures I took inside the cathedral, I have to say that the duomo looks smaller in the pictures. It is simply massive. The ceiling is so high that looking directly up at the inside of the dome invokes a strong sense of vertigo, so it was fortunate that I was already sitting down. The pictures taken, in general, have a very warm illumination to them. That is due to the faux candles that are mostly used around the church. They emit the usual, vaguely yellowish light given off by incandescent light bulbs. A few of the candles were real, and added to the yellow glow which lights the inside of the basilica.

The ox-cart explosion lasts at least fifteen minutes

The service finally began with what I can only assume was a long introduction and welcoming of all the guests, tourists, and faithful to Florence’s Duomo. This was one of the only Catholic masses where it wasn’t entirely obvious when to stand up or sit down. Since so many of the visitors were non-Catholic (like the German family who accidentally took part in the Eucharist and wasn’t exactly sure what to do with the wafer) or non-Italian-speakers (such as our family), many of the attendants were unable to follow the printed mass program (such as I, who, for reasons still unclear to me, was apparently the owner of a 3-year-old Easter program… it is very difficult to follow a mass in another language when you’re expecting a totally different set of phonics to be uttered by the priest).

In spite of my program buffoonery, I knew exactly what was going on when the organist apparently laid down full-out on the keyboard, producing an absolute cacophony of air-powered sound from the gigantic pipes. For Easter, a synthetic dove had been rigged, hanging from a wire extending from near the alter, down the length of the cathedral, out the door and into the street outside. The dove burst into life (and flame) and shot right out the door, and into the ox-cart waiting outside. The next fifteen minutes or so were occupied watching the ox-cart spew smoke, flames, and sparks while the crowd outside cheered repeatedly to the belching of this Florentine Easter tradition.

Once the commotion died down, the mass continued just as it had left off — very strange that such a secular (or at least not particularly Catholic) event should postpone the most important even in the liturgical calendar. I guess that’s what happens when religions, over time, adopt the policy of embrace and extend when events of cultural importance exist in the places into which the faith is spreading.

Omelettes with fresh, smoked, buffalo mozzarella

I had intended to make breakfast before church, but let’s face it: nobody was going to get up that early, so we had brunch after mass instead. I made omelettes with smoked buffalo mozzerella, which was an entirely new taste thrill for me. The mozzarella was super smoky. While being an interesting thing to try, and might be good to have occasionally, not much can beat a big salty sphere of mozzarellific goodness. Mmmm… insalata caprese

I have also started getting accustomed to our limited means with respect to the kitchen in our rented flat. We have a single serrated knife, a single, thin, aluminum pan, and two pots of different sizes. Oh, and something that looks kind of like a mini watering-can, complete with spout, but matches the pattern of the two pots. I’m not sure what its intended use is, but I used it to beat the eggs and milk together and pour it into the pan. We have one of those infuriating plastic “pasta spoons”, which I believe was invented explicitly to make sure that one didn’t eat too much pasta, and a large, shallow plastic spoon with holes in it — kind of like the wire spoons used to retrieve things from large vats of boiling oil when frying things. I have nearly perfected the art of pouring the omelette from the pan into the spoon and then, with a flick of the wrist, returning the eggs, folded in half, back into the pan. Luckily I am capable of flipping the omlette with nothing more than a flick of the wrist on the handle of the pan.

The previous day, at the Mercato St. Ambrogia, I acquired the necessary ingredients for my Easter meal. I had originally intended to get lamb — probably chops, since we have only microwave and toaster ovenw — but settled instead on a beef fillet bathed in sage and other herbs, inserted into a loaf of bread and finally wrapped in prosciutto and lashed together with string. I wasn’t sure how well the toaster oven was going to work, but hey — why not?

I decided to just kick the toaster oven up as high as it would go to sear the meat, and then re-evaluate the situation. Since the oven doesn’t really stay warm when its heating cycle turns off the elements, I ended up leaving the toaster at this high setting for the duration. The problem turned out to be not the heat, but the electricity.

I believe that Katie and I are the first guests to rent this particular apartment from the owner. As such, it is missing some important things, such as a garlic press or a 30-amp circuit. With the toaster oven at 250 degrees (Celcius), the breaker tripped approximately every 6 minutes. The worst part was that it wasn’t just tripping the breaker for the kitchen — it was tripping the main breaker. That means that the apartment itself can’t provide enough power for the toaster oven, which is pretty sad. Needless to say, this wasn’t exactly convenient for cooking.

We decided that, to minimize the changes of the circuit breaker being tripped (or, at least to maximize the time between mandatory trippings), we had better turn everything off. We unplugged anything that could possibly draw current, including nightlights and even things that were already completely turned off like the CD-player. We sat in total darkness and watched the toaster oven’s orange light to see if it was still on. The breaker tripping didn’t make that much noise, and sometimes we couldn’t hear it, so we had to watch. I wanted to light a candle, but we decided that trying to coax a decent flame out of a napkin thrust into the heating element of the toaster oven was going to be a bad idea, generate a lot of smoke, and prolong the cooking time of the fillet.

Darkest caprese salad ever

I found the concept of sitting in total darkness pretty stupid, so I decided to venture forth into the sleeping city to get matches. Of course, everything was closed except for pharmacies and a few other places, and nobody had matches. I finally went into a club and tried to describe what I needed. I didn’t have a cigarette, and therefore didn’t look like I needed matches — much less a whole pack to take away with me. After a few confusing minutes, I was offered a plastic cigaretter lighter. After issuing many gratzies, and making sure that nobody got mad as I approached the door, I returned home.

Progress was being made. Katie and my father were trying to rig a ladies’ compact mirror on a shelf so that we could see the eye of the toaster oven from the living room, instead of having to stand in the kitchenette, staring. They got it going, and I lit a candle so we could at least have some light.

We sat at the candlelit table and enjoyed our caprese salad made with picorino cheese that my parents got in Siena. Occationally, one of us would get up to re-set the breaker. Thank god we don’t have fuses like our apartment at home. We would have frozen to death with all the stores closed for Easter.

Slicing the Easter Fillet

After one hour and fifteen minutes, we decided to take a look. I turned off the oven and then, with the lights back on, checked the fillet. It was perfect. I’m not sure how I could have cooked it any better. So, we laid it asside and made all the other stuff for dinner — asparagus and fresh pasta with butter, garlic, and grated cheese. By the time these had been prepared, the meat had cooked over a bit, but was still very good.

Using the knife on the cutting board, I carved the meat for Easter dinner. It turned out to be wonderful, in spite of the fact that it was no longer pink inside. Everything tasted great, and we had wine and aqua frizzante, and a big laugh about the fact that this would certainly be a memorable Easter, bizarre as measured by just about any standard.

With the lights turned back on, I thought about how I would actually prefer that the lights be turned back off. There was a calm quiet during that time, and the illumination from the halogen bulbs in our apartment were harsh after the softness of the candlelight. Maybe we’ll turn off the lights again when we have a meal at home on a quiet day.

Happy Easter

È Gratis?

Here’s another post from Katie. Sheesh.. she needs her own blog.

It’s Katie again. I feel compelled to share about my and Christopher’s recent gratis (free) experiences. The first came when I was returning home from the grocery store, about 2 weeks into the trip. When I walk alone I tend to keep my eyes ahead of me so I won’t get any unwanted “Ciao Bella!”, but this days I was feeling friendly, looking at the shops I passed. As I passed by a cobbler’s shop, I glance up and said Buona Sera (good evening) to the shop keeper standing in the store. He responded in kind, as expected, but then continued to chat, saying “how are you?” in Italian. I was then forced to use all of my linguistic skills, which really aren’t much, to try and keep up my end of the conversation and understand what he is saying. After some initial confusion, I tell him that I am an American and he asks me “which part?”. I say Washington DC, and he gets excited and motions me into his shop. He has a collection of post cards, including some from DC. He motions to one specific DC post card and says that it is from his friend, and then quickly indicates another post card featuring a woman with enormous breasts and declares that this woman is unfortunately not the friend in question. We both chuckle. Then he reaches for his shelf and hands me a small box containing shoe polish. Upon seeing the confused look on my face, he motions to my feet indicating the proper direction of use. I had that part figured out — just not the part about why it was in my hand. Was I supposed to pay him for it? Was it a gift? He then asks if I am a student (No) and I try to explain I am here with my husband- not knowing the word, so we settle on ragazzo (boy) and he seems to understand enough. At this point I am ready to leave, and so I say Grazie repeatedly and head out, with my free shoe polish in hand.

Chris, on the other hand, has been working on his relationship with the owner of La Ch@t — a man in his upper 30’s, maybe — who is always very well-dressed and always talking to the young college girls who come in to use the computers. So he doesn’t really chat with either one of us, I guess I spend too much time hanging on Chris. Anyway, each day, Chris has tried to extract more conservation out of signor La Ch@t. We even went to the 4th anniversary party for La Ch@t at a local bar/club where he recognized us and even said hello. Then, yesterday, while Chris was working on his laptop, as usual, the owner comes over Chris and hands him a neck tie. Of course Chris was confused and the owner mumbled something about people giving each other gifts at easter, or that he has changed his tie and was no longer in need of the services of this one — it is not entirely clear. Of course Chris says Grazie, and we leave.

Ok, I know this is a lame blog entry, but why we we getting free stuff from strangers? Is this just the way of business, like a free sample, just bigger? Are we supposed to give something in return? Are these gentlemen expecting anything more than a thanks? I am so confused… but on the other hand I do love free stuff…