Inside
blog archive
about your host
resume
contact
this old sparc
design projects
artwork
mp3 music
software
photo albums
training log
Outside:Code
/.
joel on software
softpanorama
the anti-open source site
eric s. raymond's homepage
the free software foundation
opensource.org
Outside:Misc
blogger.com
pr watch
joel on software
backup brain
explodingdog
net.weblogs.com
zeldman
coolStop
jezebel
geekish.com
zug.com
the onion
bbspot.com
Community


Actively Reading
Introducing Ethics | David Robinson, et al
Socrates Cafe : A Fresh Taste of Philosophy | Christopher Phillips
On-deck
Agile Software Development | Alistair Cockburn
The Hacker Ethic | Pekka Himanen, et al
Counter Hack | Ed Skoudis
Practical Unix and Internet Security | Spafford, Garfinkel
Read (since 9.16.99)
The Career Programmer | Christopher Duncan
A Beautiful Mind | Sylvia Nasar
Me Talk Pretty One Day | David Sedaris
Euclid's Window | Leonard Mlodinow
Ava's Man | Rick Bragg
Affluenza | John DeGraaf, et al
sed & awk | Dougherty, Robbins
The Unix-hater's Handbook | Simson Garfinkel, et al
XML/RPC | Simon St. Laurent, et al
Core J2EE Patterns | John Krupi, et al
eXtreme Programming Explored | Wake
Software Craftsmanship | McBreen
XML-RPC | St. Laurent, et al
Mastering Regular Expressions | Friedl
Programming Ruby | Thomas, Hunt
Slack | DeMarco
Advanced JavaServer Pages | David Geary
Effective Java | Jeremy Bloch
Learning the vi Editor | Lamb, Robbins
The Secret House | David Bodanis
Unix Tricks and Tips | Kirk Waingrow
Learning the Korn Shell | Bill Rosenblatt
Geeks | John Katz
Hitchhiker's Guide to the Galaxy | Douglas Adams
The Cathedral and the Bazaar | Eric S. Raymond
Stranger in a Strange Land | Robert Heinlein
Several Books on Solaris and Unix Admin
It's Not About the Bike | Lance Armstrong
The Humane Interface | Jef Raskin
The Pragmatic Programmer | Andrew Hunt
The Water-method Man | John Irving
The Nudist on the Late Shift | Po Bronson
Does the Center Hold?: An Introduction to Western Philosophy | Donald Palmer
Principles of Transaction Processing | Philip Bernstein
In the Beginning Was the Command Line | Neal Stephenson
The Tomb | HP Lovecraft
The Lurking Fear | HP Lovecraft
Secrets, Lies, and Democracy | Chomsky/Barsamian
Hannibal | Thomas Harris
eXtreme Programming eXplained | Kent Beck
Philosophy for Dummies | Tom Morris
Sophie's World | Jostein Gaarder
Clear Thinking | Hy Ruchlis
Chomsky for Beginners | David Cogswell
Philosophy, the Basics | Nigel Warburton
Surely You're Joking, Mr. Feynman! | Richard Feynman
The Lord of the Rings | J.R.R. Tolkien
Listening
Remain in Light | Talking Heads
Good Dog, Happy Man | Bill Frisell
Revival | Gillian Welch

 

 
Saturday, January 20, 2001

Cycling performance tips for us worry warts who always want to be faster, even if we don't race.

muttered around 9:41 AM

Friday, January 19, 2001

I just laid out and ordered business cards at businesscards.com. Pretty darn good site, but the layout stuff is addicting for an anal-retentive person like me. I was there for about an hour and a half. But, by the time I was done I had a decent-looking card done, and 250 of them cost me $40 with shipping. I'll post an entry here about the quality, once I receive them.

muttered around 12:21 AM

Thursday, January 18, 2001

Wireless Update
Last week I returned the RIM 850 wireless 2-way pager I'd written about earlier on this site. While the novelty held out it was great. I could send and receive Yahoo! mail and carry out Yahoo! chats with my friends. However, there were a number of drawbacks:

  • Bad coverage. I took the pager to Coronado, and couldn't get service there. Ironic, since there are signs for the device/service all over San Diego. Also, poor penetration into buildings, even within coverage areas.
  • Poor battery life. I had to change batteries almost once per day. This was with alkalines (I never charged the rechargeable battery). I would expect the rechargeables to drain even faster.
  • Too heavy, and a bit too big.It didn't seem too bad at first, but I started noticing that over the course of the day the unit would start drooping off my pants as they slowly gave way to the unit's weight.
  • Missed Opportunities by Yahoo!. I covered this in a previous entry. Basically, Yahoo! and Motient missed a big opportunity to make this device fully wireless. Example: I would have to synch the device with a PC contact management application in order to get addresses into it (if I didn't want to enter them by hand). Why couldn't I synch with Yahoo! Address Book wirelessly? Dumb.
  • Bad Software. While it worked (albeit slowly) at first, the built-in web browser eventually started resetting the device whenever I tried to use it. The solution? Download a new version. No thanks, I just bought the thing. Call me when the embedded software works well already.
  • No Numeric Paging. While it's cool to receive email, it's not always convenient for someone who needs to get hold of me to have to send an email. You gotta have numeric paging, so people can contact you from a phone.
So, I returned the RIM 850 and replaced it with a Motorola T900 2-way pager. It's much more compact -- I forget it's there. It's been on continuously since last Saturday, and I've only put one fresh battery in it (the one supplied with it was mostly discharged). Yesterday I checked the battery, and it was at 80%. Coverage, so far, is excellent. I'm using Yahoo's mail forwarding feature to forward selected mail from my Yahoo! mail to the T900, and it works great (except for message length limits). Numeric paging and voice mail is included with my service. If a voice mail is left for me, I'm paged to let me know. The unit cost half what the RIM 850 cost, and the service is 2/3 the cost. Pretty cool, I'd say.
muttered around 11:16 PM

An Empirical Max Heartrate Measurement About a week ago I invested in a heartrate monitor to assist in my spinning workouts (I expect to use it during training road rides, too). It has proven to be a great investment, since you get great feedback about your actual training intensity. However, a problem with using a monitor is that determining your correct training zone (a range between certain percentages of max) means you need to know your max heartrate. Most people use a calculation based on your age:

Max = (220 - Age)

I always felt that this calculation inaccurate in my case. It works out to 182 bpm for me. However, informal heartrate checks during class indicated that my rate could go very high relative to a percentage chart posted on the wall -- I was often off the chart, but never felt bad.

My spinning class on Wednesday morning was what the instructor called a "personal best" day. This means that it's an extremely high intensity workout, and you can't predict exactly what's going to happen. Of course, I got there a little early, and got to watch the tail-end of the previous session's workout, so I got a little preview of at least the end of the workout. Basically, the idea was to use glucose stores by high-intensity periods followed by lower, but still relatively high intensity periods. This isn't exactly intervals, since the "rest" intervals weren't exactly restful.

Anyway, the grand finale of the class was 4-5 minutes of seated cycling, with continuously increasing intensity. At about T-2 minutes, I was having visions. At T-1, I decided to go for a max heart rate measurement, which meant going for broke. At T-30 seconds, I sprinted - hard. When she called "time" I was ready to faint, so I think I've got a fairly accurate max heartrate number now:

194 bpm

muttered around 11:01 PM

I know the pictures I posted earlier aren't centered correctly. It has something to do with my CSS and I don't have the energy to fix it. Sigh.

muttered around 10:32 PM

Sunday, January 14, 2001

OK, here are some photos from our vacation in Coronado, California. We visited between Christmas and New Year's holidays. Coronado is an island off of San Diego. We stayed at the somewhat famous Hotel Del Coronado, which was pricey but nice, and right on the beach. The weather was basically perfect, and we had a great time!

Day One: Flight into, and hanging out in, San Diego We caught a very early morning flight into San Diego. The views of the Rockies from the plane were awesome! Once we arrived, we basically hung out and got the lay of the land for the rest of the day. We took a long walk on the beach, hung out on the balcony of our room, and went to downtown San Diego for dinner at a great Indian restaurant.


Snowy Rockies from Plane


Out the French Doors to the Balcony

Day Two: Hike in the Anza Borrego Desert Early in the day, MB went for a walk on the beach, and I hit the weight room (yes, I actually worked out during this vacation). Later, we made a long drive out to the Anza Borrego Desert and did a hike MB had done years earlier when visiting a friend. That time, she'd taken my camera with her with my assurance that it was loaded with film. When she got back, we couldn't get the camera to rewind the film. When we took it to the shop for service, they helpfully pointed out that the camera didn't have any film in it -- that's why it wouldn't rewind. Well, we made up for the lack of pictures this time, and with a digital camera there's no need for film :-).

After the hike we hit a great Mexican restaurant in the small tourist town of Jasper(?).


MB Dwarfed by Anza Palms


The Oasis that Feeds the Palms


Lone Palm at Anza Borrego

Day Three: Nothing Not much to tell about our third day. We hung out at the hotel all day, basically. We went to the pool, went for a long walk, on the beach, etc.

Day Four: La Jolla We decided to take a short road trip up to La Jolla on our fourth and last day in California. It was a great day for a leisurely drive in our rented Mustang convertible. La Jolla's coastline is so very beautiful, it was hard to believe. We ate at a great diner-style place for breakfast (note my fascination with our meals), and shopped around a bit.


Surreal La Jolla Park


Yours Truly, Oceanfront


La Jolla Aviary Denizen


La Jolla Natural Beauty(ies)


Some View!


More Birds - there were a lot!


Sunset from Our Room


More Sunset


muttered around 1:28 PM

Saturday, January 06, 2001

Work is getting better. I got comfortable enough with Ant to decide what could and couldn't be done easily with it. That combined with significant pressure from an overworked peer to "just get the damn build working, and don't worry about elegance" caused me to nail it in a few hours after spending the first week or so fiddling with it. I ended up admitting to myself that, at least for now, I'd need to combine Ant with a bit of shell scripting to make it work just right. Maybe later, I'll know enough about Ant to make the build "pure". But for now, it works, it's automatic, and that's great.

I also finally got an assignment I can sink my teeth into a bit -- building a Junit test case that exercises the main EJB in the system. Of course, I got a little carried away in the design of the test (this is my life). The reason for my side trip was a simple one -- test cases need test data. I've created tests before where the test data is hard-coded into static variables in the test class, and in other cases, moved the static variables out into a "test data" class. However, these approches were never the best, so this time I resolved to create a test data framework, and of course, to build a Junit test for the test data framework, too. This basically took the whole day, and I did little about actually testing the EJB. However, we now have a decent framework for building test cases based on data that was created for other tests. This lets future test developers just reuse test data rather than hard-coding it every time they need some data to stick in a given class.

The design is based on a simple name/value pair approach to supplying test data - give me the name of a piece of test data, and I'll give you the value in return. The client must be able to instantiate test data instances for differing situations, most likely when a class needs to be filled in with test values.

My implementation for this is basically an API/Provider approach. There's an ITestData interface that provides the test data API -- accessors that take a name and return a value as one of major Java object types (String, Integer, Double, etc.). This is the interface that client test code sees and accesses. An abstract base class implements the ITestData interface and provides implementations for the accessors (the accessors perform conversions from String to the appropriate returned type).

Requests for test data items are delegated to an ITestDataProvider class that also has a base implementation (coding guideline: design with interfaces, but provide base classes). I further subclassed this class into a HashtableProvider that provides the name/value pairs in the simplest of ways -- a Hashtable. Other providers (property-file, XML, etc.) can be plugged in, either by subclassing TestDataProvider, or by simply supporting the ITestDataProvider interface. The client gets a reference to an ITestData instance by calling a method on a Factory class and supplying the classname of the desired provider. The provider is instantiated via reflection and associated with the TestData class by the factory.

This is a first cut. I can already imagine that I'll be refactoring soon to further decouple things, and to provide for collections of test data (for example if you need to instantiate n objects and fill them with different test data. But for now this gets me going on my actual task with a basic design that's extendible and useful to the rest of the project.

Anyway, here's a cheesy diagram of the current model:

 Client -----> ITestData
                   ^
                   |
             (implements)
                   |
               TestData --------> ITestDataProvider
                                           ^
                                           |
                                     (implements)
                                           |
                                   TestDataProvider
                                           ^
                                           |
                                       (extends)
                                           |
                                   HashtableProvider

muttered around 7:50 PM

Yeah, I know, I know -- It's been forever since an update. Seems as though I've been very busy lately, and with stuff to post here piling up on me, it's actually been easier to procrastinate on my updates.

Anyway, some time ago, I mentioned here that I'd had a fitness appraisal. I also mentioned that I wasn't sure about whether it was worth the $60 I paid for it. After reflection, I'm quite sure it wasn't. Here's why -- lack of standards. For example, when it came time to do the lower-body strength testing via a leg-press, the tester accompanied me to the leg press machine. Before getting on I asked him "is this a max test?". He responded that it was a max test, to which I replied, "dude, I do 15 reps on this machine with the stack and two riders (about 400 pounds)". He responded by moving me to the squat machine because it has more weight, since we couldn't possibly get a max on the leg press machine. Well, I know that I do much less weight on a squat machine than on a leg press machine, and it showed (check the results below). Same story with the bench press measurement. I can do more weight on one machine than another. The point isn't that I had to do the measurements on machines on which I'm weaker, but that all machines are different, and thus these measurements are basically useless. This stuff should be done with free weights. That aside, here's an overview of the assessment:

  • Aerobic
    • Body Fat: 27% (at least it's less than my scale measures)
  • Body Composition
    • Projected V02 max: 46.9ml/kg/min ("good", bordering on "excellent")
    • Target Heart Rate: 140-160
  • Flexibility
    • Sit and Reach: 17 ("average", surprised me -- I expected "fair")
  • Coronary Risk
    • Good (meaning I'm not likely to have a heart attack anytime soon)
    • BP: 125/70
  • Strength
    • Bench Press (max): 190 ("fair")
    • Leg Press (max): 360 ("poor" - was actually a squat, so this is bullshit)
  • Endurance
    • Situps: 31 in one minute ("average", and very painful :-) )

muttered around 7:28 PM

Powered by Blogger