Best Version of Windows Ever

Sorry to be negative on a Monday, but when the lede on reviews of Windows 7 is “best version ever”, that is very bad news. That is the buzz for a service pack, not for a major release. Is it news that it didn’t get worse?

“Best version ever” is not even as strong as “sucks less”. It might mean there is some groovy new feature you will never use. For example, explain to me how “aero shake” is better than Option-Command-H. Shaking titlebars with the mouse multiple times a day? I can feel my wrist hurt already.

Continue reading

At the Orthodontist

I spent an hour plus sitting at the orthodontist one morning last week while my son got started on his second round of braces. I was wearing my Netflix sweatshirt, so I chatted with the assistant about movies, search, Don, and streaming. I pointed out the Netflix support in the new LG Blu-ray player, and the kid in the neighboring chair said, “and the Roku box, we watch a lot of stuff on that”.

I love being in Silicon Valley. Even the middle-schoolers are on top of the tech trends.

wunder@best.com is Dead, Long Live wunderwood.org

Verio killed off my wunder@best.com address without warning, so I’ve spent a few days getting mail working on wunderwood.org with the friendly but not always effective tech support at Verio. There is no forwarding, sigh, but you can send mail to the same username @wunderwood.org and you’ll get me. The rest of the family now has their own mailboxes there, no more party line e-mail.

I’m sad to lose the wunder@best.com address. It was my internet identity for a really long time, maybe fifteen years. It certainly goes back to pre-web, dialup internet. I had a shell account, and if you know what that is, you know your DCE’s from your DTE’s, I bet.

“wunder” is a lot older than wunder@best.com. My OS/370 batch processing account at Rice in Fall 1975 was WUNDERW and I switched it to WUNDER the next year. At The Rice Thresher, photo credits were first initial plus last name in all lower case. The period and space slowly disappeared (through the magic of kerning) over several issues to become “wunderwood” (thanks Mark). Both wunder and wunderwood live on at wunderwood.org.

wunder@best.com will bounce. Sorry about that, I can’t fix it. I own the new domain, so that will continue to work for a long time.

Best Internet Communication was a great provider, Mac-savvy, local, and even profitable. Check out the history at the link above for a taste of early ISPs.

After a couple of acquisitions, my old account is now with NTT/Verio. I need to have a chat with an account rep there, because their price list shows my account at $15/month and I’m paying $24.95. The joys of a grandfathered account.

Click on the Blue Stuff

Here is the documentation for using the web:

Click on anything blue and underlined.

When you change the color of the links or change the underline, you invalidate the entire user manual. When you do Flash and fancy 2.0 stuff, you invalidate the entire user manual. Even “click on images, too” is a big risk.

Sometimes it is worth confusing the user, but it always consider doing it the simple way.

Jakob Nielson agrees as the first part of his cautionary article about Web 2.0. Follow that (very dark blue) link, by the way. It is an excellent article.

If you are inclined to blow off Jakob, remember that it’s the law. A “click on the blue stuff” site is about 99% ADA-compliant already.

Troff Flashback

I was editing a doc on our internal wiki, and I kept getting the wiki-speak header directive wrong. After a while, I figured out why I was typing .h3 instead of h3. into the editing window. I’m almost surprised I didn’t type .h 3 since that’s the proper directive in mm (the Memorandum Macros). On the other hand, it has been a few years since I even edited a man page, let alone a full document in troff.

I don’t really miss PWB/UNIX, but it was very fine for its time. Source control with SCCS, yacc/lex, troff, wow.

Microserfs

While cleaning out the “closed stacks” in the garage (boxes of books), I found my unread copy of Microserfs by Douglas Coupland and put it back on the in-house “to read” pile. Three weeks later, I’ve read it.

Short version: I haven’t learned anything from this book. I used “learn” in a pretty broad sense that includes any new experience, not just facts.

Long version

This book is about the West Coast coding culture, something that I was part of a decade before it was published (1995) and continue to be a decade after that date. Any journalistic content is not new information for me, so the book’s value to me is all in that creative remainder. Perchance I resemble an upper-class Regency woman reading Jane Austen. All that period fru fru is the reality I swim in (sigh, reduced to using Google to spell-check “fru fru”, so sad to vote on spelling).

I like journalistic work and really enjoyed both The Soul of a New Machine and Blue Sky Dream, so I’m ready to learn more about things that I already know.

Surprisingly, considering the title, that culture is only Microsoft for the first bit, after which a Deus ex Silicon Valley causes the crew to decamp to a startup and house in Palo Alto a few blocks off of my former commute to HP.

I fully understand that fiction is made up (objectively false, subjectively true), but when a realistic setting is a key part of the work, getting it wrong just isn’t an option. Coupland includes carefully crafted typos in the e-mails, so I know he was paying attention. I can just imagine the mail back and forth with the copy editors trying to get those typos published properly. Yet he didn’t do his homework on the simple things.

  • Why isn’t the startup in a garage? Was that already too clichĂ©? Google did it after this was published.
  • Bug testers (his term, we call them “QA”) don’t immediately switch to being major hackers at a startup. Testing and coding are different skills and most people just like doing one better than the other. Even if you want to switch, you need to build your skills and your cred.
  • Can Daniel please stop using “random” as if it means “unexpected” instead of “unpredictable”?
  • It isn’t the “open-hills fire”, it is the “Oakland Hills fire”. Jeez.
  • “Cal-Tec”? That sounds like a gasoline additive. It’s “Caltech”.

I’ll give him a bit of slack for those East Coast editors who can’t be bothered to care about computers or any place West of the Mississippi, but his name is on the book so it is a teeny-weeny bit of slack. [Re “East Coast editors”, ask me about a couple of howlers in Infinite Jest.]

I remember a comment from the introduction to Best Short Stories of the Year Whenever that quoted some famous short story writer saying that she stops reading if she finds a factual error. She felt that the writer has a responsibility to the reader to avoid those jarring moments, and if they couldn’t be bothered to do that, she couldn’t be bothered to continue reading.

Then there is the plot, which is mostly imposed, unmotivated events that increase in frequency toward the end of the book until we end with with a big fairy tale group hug. It reminded me of that baby programmer mistake where you stick to the initial spec even though you’ve run out of time and you start gluing on poorly-integrated barely-working features as the deadline approaches. That is the time to find the essence of your product and leave out anything that is peripheral. It is when the iron goes through the fire. It is Occam’s Chainsaw.

Oh yeah, another problem. Not much sense of impending deadline — the plot skips straight from beta to already having a distribution deal. Huh? The first half of the book keeps making a Big Deal of the Microsoft “Ship It” award, then he doesn’t bother to follow his characters as they ship their 1.0? That goes beyond ignorant to stupid. Every engineer in the valley can tell you exactly what they have shipped. Shipping is the essential act in engineering. It makes your work real.

In some sense, the novel is just an expanded version of a fine short story, published in Wired and used as the first chapter of this book. A common move and a very risky one. Short stories and novels are very different beasts, in my experience. When it doesn’t work, it is glaringly obvious. Two different examples: Flowers for Algernon is devastating read in thirty minutes but numbing when expanded to novel length, and you can stop reading Starship Troopers after that stunning first chapter with the powered combat suits since the rest alternates between “my life in the military” and libertarian ranting.

The original short story really is pretty good. Obviously, it was good enough to get a book deal, but it remains good reading. You can feel the rain and the green in Redmond and the tension between being a cog in the Microsoft machine and doing something you care about. Just stop reading before it switches to Silicon Valley.

I guess I have learned one thing from Microserfs. I’m not going to read any more Douglas Coupland.

E-Mail Volume

After my two week vacation, I had 2000 unread e-mails. Sounds like a lot, but twenty years ago after a three week honeymoon, I had 3000 unread e-mails. I guess I’ve been dealing with a lot of e-mail for a long time.

What was hard to get through was the 600 unread items in newsfeeds. It took a week of spare time reading to get those under control.

Mac Software That I Run

Since Marc Andreeson posted his Killer Mac OS X apps for 2007 and someone just asked me, I’ll post some of my favorites.

NetNewsWire: go ahead and pay the $30 for the non-Lite version. This is a great newsreader. Do this and you’ll understand why websites carrying any sort of news (and ads) are effectively dead.

MenuMeters: for some reason, I just can’t live without a CPU graph in the menu bar. I’ve been that way every since I fired up xload in X10R3. MenuMeters also can show a handy Tx/Rx network traffic meter. That lets me know when my DSL has down-shifted. Again.

MarcoPolo: is an automatic location switcher, a better-thean-before replacement for the OS 9 Location Manager. After only six years. It is supposed to switch my default printer, but that isn’t working for me. There are some other tools like this, and the MarcoPolo home page lists them with a chart showing their features.

SQLGrinder: I use this for running Oracle queries. Not a lot of features, but it works fine. Like other tools, it is pretty clueless about CSV format, so I use keyboard macros in the next tool to quote text strings that contain commas.

Emacs: either you need this or you don’t know you need it. I’ve tried AquaMacs, but it was too Aqua and not enough Emacs. I’m running Carbon Emacs.

Fire: this is my multi-protocol IM tool. Everyone else seems to like Adium, but I found it too pixel-greedy, too cute, and too quacky. They are both free, so make your own choice. Hmm, according to Wikipedia (it must be true!), there will be no more versions of Fire. It still works for me, so I’ll wait until I must switch.

Fetch: an FTP client. Fetch goes back to the early days of Mac shareware. When I got a Windows machine at work, I figured that Windows shareware was as good as the Mac stuff. I never found a Windows FTP client nearly as good as Fetch, either free or commercial. There are plenty of good Mac FTP clients, but Fetch hasn’t failed me in over a dozen years, so there is no point in changing now. Yes, it is all rewritten to be OS X native.

MarsEdit: if you post to a blog, consider getting a client. It is way faster than dealing with the web posting interface. MarsEdit is a good one, it is on Andreeson’s list, too. Ecto also has fans and seems to have a better UI for uploading images.

GraphicConverter: kinda old school, but iPhoto drives me up a wall and GraphicConverter does what I need. Plus, I’m set if I ever need to read images in Amiga HAM or LuraWave or Meteosat 5 or X-Face (see list of supported formats).

MouseposĂ©: perhaps the most focused app I’ve ever used, this puts a spotlight around your cursor for doing demos on a projector. That’s all it does and it works great. They’ve gone payware and added some other features. Next time I do a demo, I’ll spend the $14.95.

SubEthaEdit: a multi-user text editor. I don’t use it that much, but it is so ideal for distributed note-taking that I bought it.

Apple and High Standards

At work, we had an e-mail discussion about this New Yorker article on feature proliferation, and one of the strands was about a mis-understanding in the article, specifically that Apple Design equals Simple Design, especially with the iPod. Among the various good observations — “simple is hard”, “sexy supports simple” — I chipped in with the following.

There is a weird follow-on effect that makes the best Mac software vastly better (or at least better-looking) than supposedly equivalent stuff on Windows or Linux. For example, Microsoft’s Mac e-mail tool (Entourage) is much nicer than Outlook.

Even more odd is the case of NetNewsWire, an RSS reader. It has been around for nearly five years, but no one has even managed to copy it on Windows, let alone surpass it. WTF? How hard can it be? Do Windows developers just not pay attention?

In some sort of cosmic synchrony, Tim Bray posted a one-paragraph shout-out to NNW today. Tim is Sun’s Director of Web Technology, the driving force behind Atom, and a really nice person. Heck, it ain’t that long, I’ll quote the whole thing:

The problem is, these days, that my input queues are jammed up. I’m reading Caesar: Life of a Colossus by Adrian Goldsworthy and it’s very good, but it’s awfully big and thick and dense. And my time for reading is tight because, after all, I’m married with two children and also I’m trying to read the Internet, or at least that huge little piece of it where people care about the things I do. And on that subject, once again I just have to plug NetNewsWire. I’ve tried a ton of newsreaders on a ton of platforms. Google’s blog reader is pretty good, and so are a couple of the other clients, but NetNewsWire just shows you more stuff in less time with fewer keystrokes. Years ago I predicted that feed-reading would have been sucked into the browser by now, but I was wrong. So between that and Caesar, and day-to-day job work, and a grungy unexciting complicated fill-a-hole-in-the-ecosystem programming project, well, I have Wikinomics and Everything is Miscellaneous and RESTful Web Services and the Programming Erlang PDF staring accusingly at me from the shadows. Blame Julius Caesar and Brent Simmons.

NetNewsWire rules. It is vastly better than anything else I’ve tried, including Google Reader.

One of the reasons I use a Mac is to keep my standards high. If my work is “as good as Windows”, it isn’t good enough.

Templates and Website Design

John Gruber posts about templates and design on his excellent blog, Daring Fireball. He talks about specific blogservers, but the point is true for any serious website.

I started the visual design with a blank sheet of paper, and then moved on to an empty Photoshop file. I designed the markup starting with an empty XHTML 1.0 skeleton in BBEdit. I designed the URLs on pen and paper, trying to maximize clarity and structure while minimizing cruft and length.

On the other hand, anyone who’s designed a software library is well aware that 90% of their customer’s shipping code has some chunk that was written by loading up the sample program in an editor. When I was working on ORBlite, it was pretty easy to tell who had used my sample code and not replaced the default log message (“Oops, an error occurred.”).

So, I disagree with John a bit. He makes the right qualifications for his recommendations (“… for anyone attempting to establish their own unique brand”), but that is a tiny fraction of websites, though a larger fraction of traffic.

There are plenty of websites that should be usable, attractive, and functional (utilitas, venustas, firmitas) without a ground up design. Said differently, the default templates need to be excellent, with a set of base styles broad enough to serve as useful starting points for various tastes. Even those tastes that design MySpace pages.

As John says at the close of the article, “If you start with nothing, you’re forced to think about everything.” For a designer, that’s great. For the rest of us, not so good. For good or ill, most templates aren’t that far from “nothing”.

To be specific, I’d like one, just one, template for Movable Type 3.x that has a fluid width.

Five Habits of Seven Successful Websites

Aaron Swartz calls his post Seven Habits of Highly Successful Websites, covering five approaches common across MySpace, Wikipedia, Facebook, Flickr, Digg, del.icoi.us (I can never type that correctly), and Google Maps. I guess that the sixth and seventh habits are “get the details wrong” and “always use magic numbers”.

The five are:

  1. Be Ugly
  2. Don’t Have Features
  3. Let Users Do Your Job
  4. Ignore Standards
  5. Build to Flip

Welcome to the real Web 2.0.

Design for Easier HTTP Load Testing

I’ve told two people about this trick in the last few days, so it is worth writing it up.

It is hard to get a good distribution of requests in your HTTP load tester, it usually requires a knowledge of valid keys or users and a model of the distribution of the accesses. This can all be built in the load tester, but that seems to be a big barrier, since I’ve rarely seen that happen. I’ve certainly never done it and I’ve needed it several times.

The easy way to do this is to add a “random choice” parameter to the app. The app already knows the legal set of keys or users and can quickly make a choice. You already know the language and the code in the app, and the changes are localized to the URL parameter parsing. Let’s say you have a back-end server that returns records.

http://example.com/getRecords?key=12345&key=67890
http://example.com/getRecords?key=random&key=random

An HTTP load tester can access the single randomizing URL over and over again, and fetch different records each time. This is a trivial load test script. In Jakarta JMeter, it is one of the samples.

This is really very easy to write inside of the server. Getting a random key looks something like this, assuming that we already have an instance of java.util.Random initialized and ready to go.

key = cache.keySet().get(random.nextInt(cache.keySet().size()))

In Python, you can use the default, shared instance of the random source and the choice() convenience method:

key = random.choice(cache.keys())

This can all be done in the code that parses the URL parameters. Once you have a random key, the remainder of the app executes with no changes.

If the app should be tested with a non-uniform distribution of accesses, that is also easy to do. Python’s random.paretovariate() looks especially good for Zipf (80/20 or “long tail”) distributions. Or you could duplicate that code in your favorite language:

def paretovariate(self, alpha):
"""Pareto distribution.  alpha is the shape parameter."""
# Jain, pg. 495
u = 1.0 - self.random()
return 1.0 / pow(u, 1.0/alpha)

For user logins, add an option to masquerade as a random user, or even a random user from certain classes (big profile, frequent login, new user …).

For testing search, I once made an especially fancy tester that would access a log of queries in order, but start at a different place for each client. This preserves the time locality of queries while giving each client a different set. I used a cookie to hold the per-client state, so that each client would access the queries in order from their starting place. It went roughly like this:

  1. If the client did not send a cookie, choose a random index in the log.
  2. Otherwise, read the cookie to get an index.
  3. Set the cookie to the next index.
  4. Wrap the index, modulo the log size.
  5. Run the search with the query at that index.

Now go test your software. I might need to use it someday.

CALL BRTHDY(50)

FORTRAN turns 50 years old in four days. October 15, 1956 was the release date for Programmer’s Reference Manual, The FORTRAN Automatic Coding System for the IBM 704 EPDM (6.1 Meg scanned PDF). FORTRAN was an amazing achievement, inventing the idea of a compiler while generating code as fast as hand-coded assembler.

There are a couple of early papers that give a feeling for how hard all this was. The FORTRAN Automatic Coding System (1957) describes the design of the compiler. History of FORTRAN I, II, and III (1978) goes into the economics of computing at the time, influences, design decisions, and follow-ons. They didn’t have it really working until April 1957, which seems rather similar to modern software projects.

Some possible ways to commemorate this occasion:

  • RESTRICT YOUR TYPING TO 6-BIT BCD (SEE APPENDIX A OF MANUAL).
  • Use no words longer than six chars.
  • Propose the arithmetic IF as a Java extension.
  • Use GO TO. A lot.
  • Number your statements.
  • Refer to the LEDs on your computer as “sense lights”.
  • Solve a problem that uses only 32K 6-bit words of memory. Data and program has to fit.
  • No indentation.
  • Switch to vacuum tube heat this winter.
  • Write a program on a coding form, type it in, and run it. If there are any errors, even syntax errors, start over.

Prepare for the festivities by (re)reading the Programmer’s Reference Manual. It is only 51 pages, and refreshingly clear. The whole language fits in your head — no running back to the manual to figure out why const is propagating through your templates like a virus or whether you should use notify or notifyAll.

Movable Type’s Impenetrable CSS

I really like MT, but the 3.x layout is really, really hard to work with. With MT 2.6, I spent about 45 minutes and had a simple fluid layout. Done. With 3.0, I wasted a couple of hours and got nowhere. I’ve seen a couple posts where people spent six or eight hours to get it working. That’s crazy.

I really, really hate fixed-width designs and Six Apart doesn’t offer a single fluid design in their styles, so I’m forced to do it all from scratch. A fixed-width design is like a guest walking into your home and immediately rearranging all the furniture to suit them. It is total design arrogance and I won’t do it.

The current layout is my old 2.6 templates pasted onto 3.x.

So, if parts of this blog are ugly, like the comments popup, well, it is my responsibility, but I just don’t have a full day to sacrifice to the CSS god and the ridiculous design from Six Apart. Sorry about that. It is on my list of things to fix.