« September 2005 | Main | November 2005 »

October 31, 2005

Halloween Pictures

Saturday night my roommates and I had a Halloween and house cooling party. There were a bunch of camera around and as a result we have plenty of pictures:

I also added a few random pictures.

October 30, 2005

You're outta here

Three strikes and you are out. Simple rule and my current digital camera has just struck out. First it was a dead pixel showing up in every photo taken. Second it was the flash not firing when taking a night picture. Lastly, the battery has now lost it's ability to hold a charge for any decent amount of time. None of these conditions existed when I first got the camera. That has since changed. I even tried a different battery and it's still funked up. Blargh.

October 25, 2005

Sex ID test

Sex ID test

From the web site:

Find out more about 'brain sex' differences by taking the Sex ID test, a series of visual challenges and questions used by psychologists in the BBC One television series Secrets of the Sexes.

October 24, 2005

Digital Natives

Digital Natives

Commencement Speech – University of Michigan 2005 Delivered by John Seely Brown 4/30/05:

Good luck and remember the importance of listening with humility and seeing clearly.

An older piece by Marc Prensky, I suspect he may have coined the term.

October 21, 2005

WKRP in Cincinnati

Guess I'll stop waiting to watch those old episodes:

From a IANAL comment on music licensing.

Music licensing is a big part of why WKRP in Cincinnati isn't being released on video tape or DVD. Many other shows have much music replaced with different music than used in the broadcast version but WKRP just has too much music. Crazy world but that's the way it works.

October 20, 2005

Science on Screen

Science on Screen

UPCOMING: Tuesday, November 22, 7 p.m. @ Coolidge Corner Theatre

THE ELEPHANT MAN with guest speaker Jerome Groopman, M.D., whose research on degenerative diseases has lead to groundbreaking advances in the study of cancer and AIDS, as well as multiple sclerosis, Lou Gehrig's disease, and Alzheimer's.

Web Memory

Laziness has kept me from implementing / installing a feature related to the web that I've wanted for some time. I want to record and save every bit of traffic I send over HTTP. I don't care if the data was sent securely or not, everything should be saved. I assume that the storage mechanism will provide safe guards against unauthorized access. Unlike the cache that a browser uses which eventually gets filled, nothing in my store would be removed. I'd also want to save all of the meta-data associated with the data such as the raw HTTP headers etc. Everything, including those pesky ads should be saved.

Why would I want such a thing? Despite the use of such lovely features as bookmarks and history in Firefox combined with del.icio.us and other such sites, I don't always capture what I want to in a way that makes it easy to find it again. Case in point. I was recently involved in a discussion of higher education, the rising costs, and benefits. I know over the few month I read of series of articles in the Economist about that which I previously forwarded to someone (while I still had the physical magazine to easily look up the issue number) along with a couple of NY Times articles (which I only read online).

Trying to go back to either of those web sites and use their search engines usually leaves me frustrated. The primary reason is that using one of their search engines doesn't incorporate one of the most important filters. The content that I've read on their site. I'll call this a remembrance search. If I'm doing an exploratory search, I want the search to consider all of the content it has at its disposal (and hopefully just return the best matches). If instead I'm doing a remembrance search, I only want the search to consider content that I've looked at apply my remembrance key (aka search term) against that subset of content.

I consider the problem of trying to have every site I visit implement a remembrance search next to impossible. However, since my computer is receiving all of the content from these sites (the subset of information that I've looked at) I have an easy way to do that remembrance search. For example I could setup Google's Desktop or Apple's Spotlight to search the collection of content I've viewed.

Given the ubiquity of proxy servers, I think implementing such a system would be easy, but as I mentioned at the start of this post, my own laziness has prevented me from doing it.

October 19, 2005

Balance

I wonder if anyone has done research on the optimal amount of time that you should spend reading about a new concept? Given the ubiquity of Google and other search engines, the actions taken as a result of asking a question like that has changed. You don't think about the question and different forms or variations of it, instead you reach for a browser and type some words into a search engine. With the feedback loop shortened, once you find the answer does your brain have enough time to piece it all together? This gets me thinking about a book, I think it's called Mind Hacks. The real spawn of this idea is my current reading of On Intelligence which I'll be writing up shortly.

October 18, 2005

Hot, Hot, Hot

John has a summary of last night's supper. Very yummy and spicy food! I wasn't in as much pain as John or Clara which only means I need to get the Pasta from Hell next time.

October 15, 2005

Waste a few hours

emacs -batch -l dunnet

MIT Press Book Sale

MIT Press Book Sale

If you are around Boston this weekend, MIT Press is having a book sale.
DATE: October 15 & 16, 2005
TIME: 10 am - 7 pm (both days)

Maple Syrup

As I was pouring some maple syrup on my waffles this morning I couldn't help but wonder why the majority of maple syrup comes packaged in plastic containers. Why not glass? Since it was breakfast that was as far as my train of thought went.

October 14, 2005

Boston User Groups

Boston User Groups

A centralized calendar for upcoming meetings of various Boston User Groups.

October 11, 2005

HttpUnit and document.referrer

Another small patch to HttpUnit 1.6.1 to go along with my other one. The following JavaScript blows up in HttpUnit, but runs fine in a normal browser:

var temp = document.referrer;
if (temp.length <= 1) {
temp = "no referrer"
}

The resulting stack trace is below. The fix is to add the following method to the Document nested class in HttpUnit's JavaScript class.

public String jsGet_referrer() throws SAXException {
return "";
}

You could stub that method out with something more interesting, but that's good enough for me at this time.


org.mozilla.javascript.EcmaError: TypeError: Cannot read property "length" from undefined (httpunit#59)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3226)
at org.mozilla.javascript.ScriptRuntime.constructError(ScriptRuntime.java:3216)
at org.mozilla.javascript.ScriptRuntime.typeError(ScriptRuntime.java:3232)
at org.mozilla.javascript.ScriptRuntime.typeError2(ScriptRuntime.java:3251)
at org.mozilla.javascript.ScriptRuntime.undefReadError(ScriptRuntime.java:3264)
at org.mozilla.javascript.ScriptRuntime.getObjectProp(ScriptRuntime.java:1321)
at org.mozilla.javascript.gen.c1._c0(httpunit:59)
at org.mozilla.javascript.gen.c1.call(httpunit)
at org.mozilla.javascript.ContextFactory.doTopCall(ContextFactory.java:337)
at org.mozilla.javascript.ScriptRuntime.doTopCall(ScriptRuntime.java:2755)
at org.mozilla.javascript.gen.c1.call(httpunit)
at org.mozilla.javascript.gen.c1.exec(httpunit)
at org.mozilla.javascript.Context.evaluateString(Context.java:1132)
at com.meterware.httpunit.javascript.JavaScript$JavaScriptEngine.executeScript(JavaScript.java:150)
at com.meterware.httpunit.scripting.ScriptableDelegate.runScript(ScriptableDelegate.java:65)
at com.meterware.httpunit.ParsedHTML.interpretScriptElement(ParsedHTML.java:325)
at com.meterware.httpunit.ParsedHTML.access$700(ParsedHTML.java:37)
at com.meterware.httpunit.ParsedHTML$ScriptFactory.recordElement(ParsedHTML.java:489)
at com.meterware.httpunit.ParsedHTML$2.processElement(ParsedHTML.java:706)
at com.meterware.httpunit.NodeUtils$PreOrderTraversal.perform(NodeUtils.java:195)
at com.meterware.httpunit.ParsedHTML.loadElements(ParsedHTML.java:722)
at com.meterware.httpunit.ParsedHTML.getFrames(ParsedHTML.java:1034)
at com.meterware.httpunit.WebResponse.getFrames(WebResponse.java:1098)
at com.meterware.httpunit.WebResponse.getFrameRequests(WebResponse.java:875)
at com.meterware.httpunit.FrameHolder.updateFrames(FrameHolder.java:179)
at com.meterware.httpunit.WebWindow.updateFrameContents(WebWindow.java:252)
at com.meterware.httpunit.WebClient.updateFrameContents(WebClient.java:485)
at com.meterware.httpunit.WebWindow.updateWindow(WebWindow.java:146)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:130)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebClient.getResponse(WebClient.java:113)
at net.sourceforge.jwebunit.HttpUnitDialog.(HttpUnitDialog.java:48)
at net.sourceforge.jwebunit.WebTester.beginAt(WebTester.java:55)
at net.sourceforge.jwebunit.WebTestCase.beginAt(WebTestCase.java:46)
(... additional lines deleted ...)

October 10, 2005

HTTPS testing with jWebUnit

A common problem with testing HTTPS is having to deal with self-signed certificates. While Java has made it pretty easy to add certificates to your local keystore, for development purposes it always seemed like more trouble than it was worth. While some of the standard solutions worked well in the past, trying to use jWebUnit which builds upon HttpUnit resurfaced many of the same issues. It seems HttpUnit knows best and forces using the old school Sun SSL provider in com.meterware.httpunit.HttpsProtocolSupport. As a result the typical Trust All Certificates hack doesn't work. To complicate matters connecting to localhost, 127.0.0.1, and whatever other name your machine might have, can cause validation issues. This can be worked around with a custom HostnameVerifier. Alas, again HttpUnit makes it hard to get around that problem too.

A simple jWebUnit test making an HTTPS connection to your local machine produces an error like:

java.lang.RuntimeException: java.io.IOException
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:602)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:272)
at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.getResponseCode(DashoA12275)
at com.meterware.httpunit.HttpWebResponse.readResponseHeader(HttpWebResponse.java:162)
at com.meterware.httpunit.HttpWebResponse.readHeaders(HttpWebResponse.java:200)
at com.meterware.httpunit.HttpWebResponse.(HttpWebResponse.java:56)
at com.meterware.httpunit.HttpWebResponse.(HttpWebResponse.java:67)
at com.meterware.httpunit.WebConversation.newResponse(WebConversation.java:76)
at com.meterware.httpunit.WebWindow.getResource(WebWindow.java:164)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:128)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebWindow.updateWindow(WebWindow.java:144)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:130)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebClient.getResponse(WebClient.java:113)
at net.sourceforge.jwebunit.HttpUnitDialog.(HttpUnitDialog.java:48)
at net.sourceforge.jwebunit.WebTester.beginAt(WebTester.java:55)
at net.sourceforge.jwebunit.WebTestCase.beginAt(WebTestCase.java:46)
(... additional lines deleted ...)
Caused by: javax.net.ssl.SSLHandshakeException: sun.security.validator.ValidatorException: No trusted certificate found
at com.sun.net.ssl.internal.ssl.BaseSSLSocketImpl.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SunJSSE_az.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SunJSSE_ax.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.a(DashoA12275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.j(DashoA12275)
at com.sun.net.ssl.internal.ssl.SSLSocketImpl.startHandshake(DashoA12275)
at sun.net.www.protocol.https.HttpsClient.afterConnect(DashoA12275)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(DashoA12275)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:626)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderFieldKey(HttpURLConnection.java:1504)
at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.getHeaderFieldKey(DashoA12275)
at com.meterware.httpunit.HttpWebResponse.loadHeaders(HttpWebResponse.java:216)
at com.meterware.httpunit.HttpWebResponse.readHeaders(HttpWebResponse.java:198)
... 31 more
Caused by: sun.security.validator.ValidatorException: No trusted certificate found
at sun.security.validator.SimpleValidator.buildTrustedChain(SimpleValidator.java:304)
at sun.security.validator.SimpleValidator.engineValidate(SimpleValidator.java:107)
at sun.security.validator.Validator.validate(Validator.java:202)
at com.sun.net.ssl.internal.ssl.X509TrustManagerImpl.checkServerTrusted(DashoA12275)
at com.sun.net.ssl.internal.ssl.JsseX509TrustManager.checkServerTrusted(DashoA12275)
... 44 more
at net.sourceforge.jwebunit.HttpUnitDialog.(HttpUnitDialog.java:50)
at net.sourceforge.jwebunit.WebTester.beginAt(WebTester.java:55)
at net.sourceforge.jwebunit.WebTestCase.beginAt(WebTestCase.java:46)
(... additional lines deleted ...)

Plugging in the standard trust all solution from above does nothing. A co-worker pointed me at a different solution to the problem. That gets around the SSL certificate check issue. However, problems still arise if you try to connect to 127.0.0.1 when your certificate is signed as localhost:

java.lang.RuntimeException: java.io.IOException
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:602)
at java.net.HttpURLConnection.getResponseCode(HttpURLConnection.java:272)
at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.getResponseCode(DashoA12275)
at com.meterware.httpunit.HttpWebResponse.readResponseHeader(HttpWebResponse.java:162)
at com.meterware.httpunit.HttpWebResponse.readHeaders(HttpWebResponse.java:200)
at com.meterware.httpunit.HttpWebResponse.(HttpWebResponse.java:56)
at com.meterware.httpunit.HttpWebResponse.(HttpWebResponse.java:67)
at com.meterware.httpunit.WebConversation.newResponse(WebConversation.java:76)
at com.meterware.httpunit.WebWindow.getResource(WebWindow.java:164)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:128)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebWindow.updateWindow(WebWindow.java:144)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:130)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebClient.getResponse(WebClient.java:113)
at net.sourceforge.jwebunit.HttpUnitDialog.(HttpUnitDialog.java:48)
at net.sourceforge.jwebunit.WebTester.beginAt(WebTester.java:55)
at net.sourceforge.jwebunit.WebTestCase.beginAt(WebTestCase.java:46)
(... additional lines deleted ...)
Caused by: java.io.IOException: HTTPS hostname wrong: should be <127.0.0.1>
at sun.net.www.protocol.https.HttpsClient.b(DashoA12275)
at sun.net.www.protocol.https.HttpsClient.afterConnect(DashoA12275)
at sun.net.www.protocol.https.AbstractDelegateHttpsURLConnection.connect(DashoA12275)
at sun.net.www.protocol.http.HttpURLConnection.getInputStream(HttpURLConnection.java:626)
at sun.net.www.protocol.http.HttpURLConnection.getHeaderFieldKey(HttpURLConnection.java:1504)
at com.sun.net.ssl.internal.www.protocol.https.HttpsURLConnectionOldImpl.getHeaderFieldKey(DashoA12275)
at com.meterware.httpunit.HttpWebResponse.loadHeaders(HttpWebResponse.java:216)
at com.meterware.httpunit.HttpWebResponse.readHeaders(HttpWebResponse.java:198)
... 31 more
at net.sourceforge.jwebunit.HttpUnitDialog.(HttpUnitDialog.java:50)
at net.sourceforge.jwebunit.WebTester.beginAt(WebTester.java:55)
at net.sourceforge.jwebunit.WebTestCase.beginAt(WebTestCase.java:46)
at net.ruckus.test.jwebunit.AbstractWebTestCase.login(AbstractWebTestCase.java:154)
at net.ruckus.test.jwebunit.AbstractWebTestCase.login(AbstractWebTestCase.java:143)
at net.ruckus.ui.web.SiteWebTest.testGet(SiteWebTest.java:20)
at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
at java.lang.reflect.Method.invoke(Method.java:324)
at junit.framework.TestCase.runTest(TestCase.java:154)
at junit.framework.TestCase.runBare(TestCase.java:127)
at junit.framework.TestResult$1.protect(TestResult.java:106)
at junit.framework.TestResult.runProtected(TestResult.java:124)
at junit.framework.TestResult.run(TestResult.java:109)
at junit.framework.TestCase.run(TestCase.java:118)
at junit.framework.TestSuite.runTest(TestSuite.java:208)
at junit.framework.TestSuite.run(TestSuite.java:203)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.runTests(RemoteTestRunner.java:478)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.run(RemoteTestRunner.java:344)
at org.eclipse.jdt.internal.junit.runner.RemoteTestRunner.main(RemoteTestRunner.java:196)
(... additional lines deleted ...)

Because HttpUnit is forcing the old Sun protocols you need to use the Sun specific classes when creating a custom HostnameVerifier instead of the more generic javax.net.ssl classes. You'll have to live with the deprecated warnings:

public class DeprecatedNullHostnameVerifier implements com.sun.net.ssl.HostnameVerifier
{
private static boolean INITIALIZED = false;
public boolean verify(String arg0, String arg1)
{
return true;
}
public static void install()
{
if (!INITIALIZED)
{
com.sun.net.ssl.HttpsURLConnection.setDefaultHostnameVerifier(new DeprecatedNullHostnameVerifier());
INITIALIZED = true;
}
}
}

Combiing the XTrustProvider and the DeprecatedNullHostnameVerifier into a run-once JUnit setup method will let you easily test any HTTPS site.

BeanShell and finally

Trying to use BeanShell 2.0b4 to allow on-the-fly database driven Java interface implementations I was getting an odd error when trying to call a method on the interface. There weren't any errors instantiating the interface only when I called the method. The error was something like:

Caused by: Incorrect type returned from method: validate
Can't assign void value to com.neophi.ValidateResult:
Can't assign void value to com.neophi.ValidateResult:
at Line: -1 : in file: <Called from Java Code> : <Compiled Java Code>

The root cause was that the version of BeanShell being used doesn't fully support all Java constructs. In particular this sample code will cause the above error:

public ValidateResult validate(String email, String password)
{
try {
return new ValidateResult();
} finally {
// something that must always happen
}
}

In order to work in BeanShell the method must be rewritten as such:

public ValidateResult validate(String email, String password)
{
ValidateResult validationResult = null;
try {
validationResult = new ValidateResult();
} finally {
// something that must always happen
}
return validationResult;
}

Hopefully this will spare someone else from getting a headache.

HttpUnit and JavaScript

A little problem I worked through with HttpUnit and the Rhino JavaScript library while writing some automated tests.

Using the stock httpunit-1.6.1 with js-1.5R4.1.jar (the version of js.jar included in the httpunit-1.6.1 jars directory) I ran into an issue testing a site that included some fairly standard JavaScript code:

if (navigator.plugins && navigator.plugins.length) {
// do something that requires a plugin
}

The above code produces a nasty stack trace something along the lines of:

org.mozilla.javascript.EvaluatorException: Invalid JavaScript value of type [Ljava.lang.Object; (httpunit; line 41)
at org.mozilla.javascript.DefaultErrorReporter.runtimeError(DefaultErrorReporter.java:76)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:591)
at org.mozilla.javascript.Context.reportRuntimeError(Context.java:630)
at org.mozilla.javascript.Context.reportRuntimeError1(Context.java:606)
at org.mozilla.javascript.ScriptRuntime.errorWithClassName(ScriptRuntime.java:2058)
at org.mozilla.javascript.ScriptRuntime.toBoolean(ScriptRuntime.java:119)
at org.mozilla.javascript.gen.c18.call(httpunit:41)
at org.mozilla.javascript.gen.c18.exec(httpunit)
at org.mozilla.javascript.Context.evaluateReader(Context.java:820)
at org.mozilla.javascript.Context.evaluateString(Context.java:784)
at com.meterware.httpunit.javascript.JavaScript$JavaScriptEngine.executeScript(JavaScript.java:132)
at com.meterware.httpunit.scripting.ScriptableDelegate.runScript(ScriptableDelegate.java:65)
at com.meterware.httpunit.ParsedHTML.interpretScriptElement(ParsedHTML.java:325)
at com.meterware.httpunit.ParsedHTML.access$700(ParsedHTML.java:37)
at com.meterware.httpunit.ParsedHTML$ScriptFactory.recordElement(ParsedHTML.java:489)
at com.meterware.httpunit.ParsedHTML$2.processElement(ParsedHTML.java:706)
at com.meterware.httpunit.NodeUtils$PreOrderTraversal.perform(NodeUtils.java:195)
at com.meterware.httpunit.ParsedHTML.loadElements(ParsedHTML.java:722)
at com.meterware.httpunit.ParsedHTML.getFrames(ParsedHTML.java:1034)
at com.meterware.httpunit.WebResponse.getFrames(WebResponse.java:1098)
at com.meterware.httpunit.WebResponse.getFrameRequests(WebResponse.java:875)
at com.meterware.httpunit.FrameHolder.updateFrames(FrameHolder.java:179)
at com.meterware.httpunit.WebWindow.updateFrameContents(WebWindow.java:252)
at com.meterware.httpunit.WebClient.updateFrameContents(WebClient.java:485)
at com.meterware.httpunit.WebWindow.updateWindow(WebWindow.java:146)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:130)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebWindow.updateWindow(WebWindow.java:144)
at com.meterware.httpunit.WebWindow.getSubframeResponse(WebWindow.java:130)
at com.meterware.httpunit.WebWindow.getResponse(WebWindow.java:121)
at com.meterware.httpunit.WebClient.getResponse(WebClient.java:113)
(... additional lines deleted ...)

My first thought was to switch the version of js.jar (aka Rhino) that I was using. I dropped in the latest version which is js-1.6R2.jar. Better, but now it was spitting out a nasty warning to System.err:

RHINO USAGE WARNING: Missed Context.javaToJS() conversion:
Rhino runtime detected object [Ljava.lang.Object;@15db314 of class [Ljava.lang.Object; where it expected String, Number, Boolean or Scriptable instance. Please check your code for missig Context.javaToJS() call.

I decided it was time to do a little digging into the source. I grabbed the source for httpunit and js and popped them into Eclipse. Turns out that httpunit was returning an Object array for plugins, which was causing the above error. The offending method in com.meterware.httpunit.javascript.JavaScript was part of the Window static nested class:

public Object[] jsGet_plugins() {
return new Object[0];
}

I figured upgrading to the latest js.jar was a good thing so I modified JavaScript.java to compile against js-1.6R2.jar (required removing some checked exceptions) while also putting in a fix for the above plugins issue. It was basically:

private ElementArray _plugins = new ElementArray();
public Scriptable jsGet_plugins() {
return _plugins;
}

A quick recompile of the httpunit jar and my tests were happily running again.

Diff of JavaScript.java (I use Eclipse's code formatting which is why there are bunch of other changes)
New version of JavaScript.java

October 9, 2005

Three Part Story

While writing that last entry, I realized I could have easily made it into multiple posts and included more details on each part. I've still got a lot to learn about how to write, when to write, etc.

What I didn't do this weekend

Thursday after work I ran errands to prepare for my weekend biking trip up to Vermont with friends from my last job. I mainly ran to the grocery store to pickup some snacks and after ride refueling. Once back home I started to get all of the other supplies I needed. Helmet, check, backpack hydration, check, biking shoes, check, pedals, hmmm. You might wonder about pedals. Well the mountain bike I'm borrowing doesn't have any on it so I had to bring my own.

A trip down to the closet looking through my old and mostly forgotten spare parts bike box made me realize, I don't know where my pedal wrench is. Pedal wrenches are cool and do the job really well. Not having one makes for a PITA. The reason is that the threads on pedals are done so that as you pedal you actually tighten the bolt. If you haven't taken the pedals off your bike, which most people don't do ever, it's hard to get them off. A pedal wrench is big and designed to make that task much easier. Alas, I was without mine.

Digging through my toolbox didn't enlighten my mood. The best I was able to scrounge up was a pair of vice grips. The other nice thing about a pedal wrench is that it is very thin to make sure that you can get the pedal bolt and just that. The problem with a pair of vice grips is that they are not thin. In fact a pair of vice grips are too large to get around the bolt on my pedals. Time check 8:45pm. Doh! All the bike stores I could think of at the time had already closed or would be by the time I drove there.

Back in the car. Home Depot to the rescue. Doh! What size was the bolt? 8/16th 9/16th was it even American sized. Doh! Maybe 10mm? Let me think. My tires are measured in mm, most bike frames are done in cm. Time to look for metric wrenches. Gah, back to the size issue. $8 a wrench! Not the time to guess wrong. Oh, those are the really nice ones. $4 that's better, but what size. Blah screw it, variety pack it is.

The problem with a regular wrench set goes back to that torque issue. As I already mentioned a pedal wrench is big. About 2 feet long. This wrench, which took the biggest one in the set to fit, is only about 8 inches. Time to get on the bike, apply pressure on one side and yank, yes yank is the right verb as these bolts get tight. Right tighty, lefty loosey, 1, 2, 3, and go. I should note that my bike is in my trak stand at this point so I don't actually need to steady the bike while all of this is going on. Maybe someday I'll buy a bike work stand.

Pedals off, time to finish packing. Check the weather. Warm, cold, rainy, dry, windy, calm, it would be great if there was any similarity between forecasts. A clear case of over packing ensued. I'm pretty sure I took fewer clothes during my week long gaunt around Bangkok then I did for a day and a half of biking. Camping gear was next tent, sleeping bag, and mat. Don't need a stove. Man, I've been using this tent forever! I used to use this tent when my family took driving vacations around the country while I was still in middle school. I think this was the tent my dad used on his biking trips. Wow, what a trooper. In the car with everything else.

5pm time to jet. Traffic suicide is more like it. What was I thinking leaving Boston at 5pm on a Friday heading north. Of course the highways are going to be crowded. Mmmmm, Lamb, at least I've got good music to listen to. Out of Mass, into NH. When will this traffic ever end. Concord. Finally the traffic is easing up. Man I'm hungry, oh yeah, I should probably have dinner. Panera. Good food. Ahhh fake fire place with comfy chairs. That's a great way to spend a little time eating supper. Too bad I didn't notice that until I was on my way out.

I'm now in the middle of no where on 93 in NH and traffic is coming to stand still. WTF! A quick look to my right at the navigation system shows an auxiliary road that runs parallel to 93. 132 you are my only hope. Given the amount of traffic on the road, it must be right. What a fun 10 miles. It would be so much better to do that stretch in the daytime. Twisty, turny, up and down. A road made for driving a car like the Z on. Back on 93 and not a car in site, crazy backup avoided.

Finally made it to 91 in Vermont, not much further now. Turn on the wipers. Finally roll in a little before 10pm. Dark and rainy, always a bad combination to try and setup a tent in. The heel on my L.L. Bean boots is solid. Very handy for digging a little trench in the dirt to help divert the water running off of the tent's fly. Time to call it a night. Man, that rain is really coming down. Turn over. Wow, that rain is really coming down hard. Turn over. Ewwww! Turn over. Double ewww.

Plastic sheet, tent floor, sleeping mat, and sleeping back have all managed to fail in keeping the rain out. My sleeping conditions have now been compromised. 4am is not the time you want to be finding this out. Break out the flash light. Doh! The entire tent floor is wet. The sleeping mat has been wicking up the water and now my weight on the sleeping bag has completed the picture. My butt is wet. Retire to the car. Doh! Trying to sleep in the 350Z is like being on an airplane. Not that much leg room and the seats don't go back far enough to be really comfortable.

I'll also admit that I attempted to crawl into the trunk space and sprawl out there. That didn't work so well. Part of the reason was that I still had all of my other gear in the trunk and the tension bar cover kind of cramps how you can position your body. While those that know we well won't be surprised to know that I did fit in the space, it wasn't comfortable enough to sleep in. The driver's seat can recline further than the passenger's seat provided you remove the head rest and move the seat forward. The problem is that the steering wheel and pedals make it very uncomfortable. I ended up in the passenger's seat sideways, pretty much in the fetal position covered in my winter jacket.

Time passes and finally it's time to get up. Well more like I'm tired of trying to sleep uncomfortably and just read instead. Finally signs of life from other people. The rain also hasn't abated at all. In fact since last night it seems to have gotten worse. Raise the pop-up tent and eat some breakfast. The park has closed all the single track mountain bike trials for the day. Only two hours to Montreal.

Bus hitting car. Oh wait that was after the other car already hit that car. What the hell just happened. Car brakes and swerves, can't stop in time, hit by the other half of our group driving in the other truck. What the hell happened, hit car's driver turns around gets hit by bus. What the hell happened. Pull over. Wait. Wait. Hit car never shows up. Guess we are off the hook. Time passes. Don't know if it was an additive but my gin and tonic looked really cool under the black lights.

Wake up Sunday morning, still wet as a bath tub outside. Temperature much colder than I want it to be. Doh! Pretty leaves driving back. Time spent riding: 0.

October 2, 2005

What plan?

Today was one of those days when you've got it all worked out and pretty much nothing goes quite like you want it to. Blah, I don't even feel like writing this right now. Time to sleep.

Brain Hurts

I had a nasty sudden onset headache this evening while I was working on the next problem set for PPL. I kind of wonder if it was related to all of the sneezing I did walking back from the Border Cafe. Maybe I do have allergies and I ended up with some sinus like headache. The worst part about getting the headache was that it killed my drive to get on my bike to train some more. I'm going to have to be extra sure to hop on tomorrow. Anyway, it's last, I've only got one problem left on the problem set, and tomorrow is looking to be pretty busy.