Site statistics through December 31, 2009

Here are the rolling three month site stats from Google Analytics, plus 12 month previous stats. Percentages are calculated with respect to total numbers of hits. Statistics are computed from the first to the last days of the months listed. The up and down arrows compare the latest month listed with the percentages 12 months earlier, not the previous month.

Net Analysis:

Winners: Apple, Linux, Macintosh, Firefox, Chrome
Losers: Microsoft, Internet Explorer, Windows, Opera

December, 2008 October, 2009 November, 2009 December, 2009
Firefox 47.24% 56.45% 57.25% ↑ 55.85%
Internet Explorer 36.31% 21.91% 22.89% ↓ 23.35%
Safari 7.72% 7.86% 7.78% ↑ 7.99%
Chrome 3.31% 6.87% 6.85% ↑ 7.74%
Mozilla 1.20% 2.33% 1.49% ↑ 2.69%
Opera 3.31% 3.74% 2.84% ↓ 1.28%
Operating System
Windows 74.57% 61.83% 61.82% ↓ 64.68%
Linux 10.81% 21.17% 21.95% ↑ 17.59%
Macintosh 13.83% 16.14% 15.44% ↑ 16.74%
iPhone 0.25% 0.48% 0.34% ↑ 0.51%
Android 0.01% 0.04% 0.07% ↑ 0.11%
Browser / OS
Firefox / Windows 31.26% 30.76% 30.83% ↑ 33.98%
Internet Explorer / Windows 36.31% 21.88% 22.89% ↓ 23.34%
Firefox / Linux 9.25% 17.03% 18.19% ↑ 13.00%
Firefox / Macintosh 6.51% 8.60% 8.18% ↑ 8.83%
Safari / Macintosh 6.88% 7.02% 6.92% ↑ 7.02%
Chrome / Windows 3.31% 5.64% 5.61% ↑ 5.55%
Mozilla / Linux 0.95% 2.18% 1.35% ↑ 2.49%
Chrome / Linux 0.00% 1.07% 1.07% ↑ 1.62%
Opera / Windows 2.57% 2.93% 1.85% ↓ 0.97%
Chrome / Macintosh 0.00% 0.15% 0.16% ↑ 0.57%
Opera / Linux 0.51% 0.56% 0.92% ↓ 0.22%
Safari / iPhone 0.24% 0.39% 0.24% ↑0.35%

Getting ready for Spring gardening in upstate NY

Ok, it’s after New Year’s so I can officially start thinking about gardening again in about three months. I live in the northwest corner of New York State in the USA, so that very much affects what plants I can and can’t use. I’m in gardening zone 5B, which means that the lowest temperatures we can usually expect during winter are from -15 F to -10 F, or -26.1 C to -23.4 C.

Here are some gardening resources that I’ll be looking at in planning what I’ll be planting this year:

  • High Mowing Organic Seeds is an independently-owned, farm-based seed company dedicated to supporting sustainable agriculture and providing farmers and gardeners with the highest quality certified organic seed.” High Mowing is based in Hardwick, VT, and was featured in a one hour Emeril Green special.
  • logoBurpee’s Seeds: More seeds than you can imagine, but may not be local to your area. Where I live, these are often available at a great discount toward the end of winter at Wegmans supermarkets.
  • White Flower Farms: Great selection of plants, especially perennials and bulbs. I’ve bought their naturalizing collection of narcissus several times through the years.
  • logoPark Seed Co.: Another company with a huge selection of both seeds and seed starting apparatus. Same caveat as above about seeds perhaps not being local to your area.
  • Musser Forests: Great source of seedling and transplants for trees and shrubs. Located in Pennsylvania. I’m thinking of using them to start a small stand of future Christmas trees for our family.
  • Garden’s Alive!: As they say, “Environmentally Responsible Gardening Products that Work”. Good for supplies for organic gardening.
  • logoMiller Nurseries: A big selection of fruit trees, as well as raspberries and asparagus plants.

If you have favorite sources of plants and gardening supplies, please append a comment with the details.

The great website reorganization of 2010

WordPress logo

Well, I did it. Over the end of December, 2009, holiday break I took about 15 hours to do what I considered a much needed website reorganization.

Here are the highlights:

  • Modified my WordPress theme to have printing CSS support and a two column full page PHP template.
  • Split the website into two WordPress installations, one for the older, archived blog material and one for the current blog.
  • Moved all pages that were in Drupal into the new WordPress installation and set up .htaccess redirects for all the old Drupal pages. While Drupal is still present, all access attempts to pages should go to the new WordPress pages. In a few months I’ll delete the Drupal installation as I have no further plans for it.
  • Started moving auxiliary files like images and Mint into more standardized locations higher up in the site hierarchy. The rest of the work on this is lower priority and will be done as time permits over the next few months.
  • Started cleaning up the archived blog and adding some links to the current blog. The widgets used in the new and archived blog are similar, but the latter is simpler and encourages people to go to the new blog. I’ve greatly extended the time that entries in the archived blog are cached.

    Aside: I find it really annoying to find errors in old blog entries. I wish someone had mentioned them if they had seen them.

I’ve talked elsewhere about some of my frustrations with using both WordPress and Drupal on this site. It was a worthy experiment to learn both technologies but, in the end, I was able to make WordPress do everything I wanted, with a few caveats (see below).

Why did I do this? I found …

  • … it untenable to have two content management systems with two similar but different themes. Now I can use WordPress and the same theme for both installations, any employ WordPress plugins. I may use different plugins, but at least they have the same technology base.
  • … that I was spending more time fiddling with my CMSs (content management systems) and not enough time creating new content, blog or otherwise.
  • … the size of the older WordPress installation (over 3000 entries and 3000) comments was making it excruciatingly slow to work with, even with caching.

What else does WordPress need to be useful for page-based content management?

  • Built-in support for wide pages for non-blog content in themes.
  • Built-in CSS support for printing (and eventually mobile styles) in themes.
  • Page hierarchy navigation at least as good as but preferably much better than what Drupal has.
  • Anything else that I’ve complained about before. (grin)

Finally some words of advice to the Drupal community: You really need to provide exemplary import of WordPress blogs if you want to move more people to your platform, no matter how many others are adopting it (e.g., the White House). You shouldn’t say it’s non-core, you shouldn’t say “somebody in the community will do it if they want to,” you need to make it easy, complete, and elegant. I know there are some import modules out there, but unless you can handle things like intra-blog links, automatic category and tag taxonomy creation, and generated redirects from the WordPress structure to the new Drupal structure, you won’t get people to move sizable blogs over.

That said, if I were starting from scratch I would certainly consider using Drupal, but WordPress is not only an excellent blogging platform, it is becoming a very capable CMS. It works for me.

Daily Links for Friday, January 1, 2010

Open Source

Seeking Profit in Open-Source Search Software
The New York Times / Ashlee Vance

In the case of Lucid, the company hopes to profit from an open-source software package called Lucene.

When paired with some other software (another open-source package called Solr), Lucene turns into the basis of a pretty powerful and fast corporate search system — the kind of thing companies use to trawl through and organize their internal data.

Microsoft looks to fight OpenOffice / Nick Eaton

We know Microsoft is worried about Google Docs and is fighting against its expansion. Google Docs threatens one of Microsoft’s biggest cash cows– Office — and is, unlike Office, free for consumers.


2009’s Five Most Popular & Important Linux Stories
ComputerWorld / Steven J. Vaughan-Nichols

Before jumping into this, let me say that’s what popular isn’t the same thing as what’s important. So, I’m giving you a twofer list. The first is the most popular of my stories, and then there are the stories, which I think are the most important for Linux’s future.


image for bookmark

Chicago Sun Times / Roger Ebert

Watching “Avatar,” I felt sort of the same as when I saw “Star Wars” in 1977. That was another movie I walked into with uncertain expectations. James Cameron’s film has been the subject of relentlessly dubious advance buzz, just as his “Titanic” was. Once again, he has silenced the doubters by simply delivering an extraordinary film. There is still at least one man in Hollywood who knows how to spend $250 million, or was it $300 million, wisely.

New locations for Bob Sutor’s blog

I’ve been extensively reorganizing my website and effective January 1, 2010, my blog will be split into current and archived versions.

Current blog

Please update your bookmarks and feed subscriptions as follows:

The address of the current blog is

The link to the blog feed is

The blog comments feed is

Archived blog

The address of the archived blog is

Embedded programming languages

A long time ago when I first started at IBM I used an editor named XEDIT that ran under the VM/CMS operating system on mainframes. It was a fullscreen, line-oriented editor that looks primitive now but was quite sophisticated in its time. One of the best things about it was that it was scriptable: you could write very sophisticated programs that could manipulate files and their contents. XEDIT really became powerful when used with the REXX programming language and many of my thoughts and philosophy about embedded languages were formed during my use of REXX.

I love embedded programming languages. Today these not only allow you to manipulate text editors, word processors, and spreadsheets, but also 3D environments like World of Warcraft (Lua) and Second Life (LSL).

These days you don’t need to figure out how to write an embedded language for an application, you can pick up an engine “off the shelf” and link it to your program. This is important, because for non-trivial languages you can spend a tremendous amount of time worrying about basic issues like scanning, parsing, symbol tables, scoping, garbage collection, and other topics. While you must understand the semantics of what it means for the embedded language to operate within your application, it’s still easier to borrow the work of others that start from scratch, unless this is what you want to do.

Note that if you are using an open source embedded programming language you must understand the license used and what you can and cannot do. For example, if the engine is GPL, do not plan to statically link it to your commercially distributed proprietary software.

Here are some of your options for languages to embed open source programming engines in your applications:

Suggestions for other languages and links are welcome.

Also see:

Finishing up 2009

There’s not been much action here in my personal blogosphere in the last few weeks since December has been exceptionally busy. I had two domestic business trips plus a week in Tunisia in North Africa, then followed by the holidays. Basically, it’s been run, run, run, but now I’m trying to sit, sit, sit, at least until the beginning of January.

Once I went on break from work, I turned my attention to renovating our kids’ bathroom. This wasn’t a major renovation, but it was more than redecoration. This bathroom has a skylight, and through the years some of the plaster or joint compound near the corners of the shaft to the roof needed repair. I’m not sure if it was water damage from the shower or a leaky roof that caused the problem, but since we had the roof replaced last summer, I decided that it was time to fix the ceiling.

With that done, I painted the ceiling with a white semi-gloss paint and then did the door and beadboard woodwork in a high gloss white. I don’t think flat paint works well in bathrooms because of the moisture. Some sort of gloss is always appropriate for woodwork and I think the semi-gloss on the ceiling gives extra protection.

shade of blue

The walls had been wallpapered, but I think this is also a problem in small bathrooms with a shower. I decided that paint would be best but our family quandary was the choice of color. There are pink accent tiles in the walls and floor, and they were not going anywhere. Since this bathroom is used primarily by my son, I wanted to reduce the pinkness, and I declined his suggestion that I rip out the pink tiles. We briefly considered some shade of green, but then moved to blue. I ended up getting a deep, slightly gray blue called Celestial Blue by Olympic Paints. I used a satin finish, though semi-gloss would have worked here as well.

After the paint, it was time to improve the fixtures. The bathroom had one 24″ towel rod on the wall, so I replaced that with a double rod and added one to the door as well (two kids = a lot of towels). The medicine cabinet is quite old (as in over a hundred years) and I wanted to keep that, so I painted it with the high gloss white and put a new chrome knob on it to match the other fixtures.

Plumbing-wise, I replaced the separate hot and cold faucets with a single bridge model. This fits into the 12″ faucet spacing but has a horizontal pipe that mixes hot and cold, with a centered spigot. It looks traditional but has modern conveniences.

I have a few other odds and ends to finish up before New Year’s Day, both in this project and otherwise. Here’s hoping that everything gets done and that we can all start 2010 with new projects, fresh ideas, and enough energy to get them all accomplished!

Chronicles of a trip home

This last week I had the pleasure to travel to Tunis, Tunisia, in North Africa, to speak at the Conference on Open Source Software. In another post I’ll put up some photos of my two hour tourist time in Carthage on Thursday, but here let me tell you about my trip home.

My return flight was scheduled to leave Tunis on Friday at 4 am. This is a not a great time to travel in general, but since I had a full work day on Thursday, I had some decisions to make. Should I bother trying to sleep before the flight? What time should I get to the airport?

Despite some trouble related to weather and travel the previous week, I wasn’t anticipating any problems. My idea was to put one foot in front of the other and repeat through the various flights and airports until I got home.

I returned from the IBM offices to my hotel about 8:15 PM on Thursday night. I had thought about skipping dinner, but I was pretty hungry so I ordered a light meal from room service (the hotel was far from any restaurants). I did most of my packing and some email, and around 10 pm decided to take a nap.

Though I wasn’t sure I could sleep, evidently I did because when the alarm went off at midnight, I woke up, and woke up hard from a very deep sleep. Though I was groggy, I finished getting ready and caught my ride to the airport at 1 am. It probably helped that I kept telling myself that it was only 7 pm Thursday night at home.

The first leg of my trip from from Tunis to Frankfurt on Lufthansa. There were plenty of free seats when I checked in online on Thursday afternoon, which made sense because, I thought, how many people would choose to fly at such a bizarre time? I took me some time to find the check-in counter for Lufthansa (at the far end of the hall on the right) and then where I was to go for passport control and security (back of hall to the left, under the departures sign).

Unfortunately, though I was all set by 1:30, the doors didn’t open until 2 am. While I was waiting, I met a man who had been in the airport for twelve hours. Bad weather (bad weather?) had caused the airline to cancel his earlier flight to Paris and he had hours to go before his rebooked flight.

I was the first one through the processing and found my gate. At first, a few people trickled in and then more and more as we got closer to the boarding time. Unlike in the US and with some airlines, overseas flights sometimes board by saying “ok, everyone get on.” Oddly enough, this works pretty well.

The flight was packed and included a lot of families with children, presumably traveling home for the holidays.

I always bring ear plugs when I fly. It helps with noisy passengers and, oh yes, noisy planes.

Though I had very little legroom, I at least did have an aisle and slept on and off during the two and one-half hour flight. The first passport control was right on the plane – officers stood at the front and back doors of the plane and checked our credentials. After that, we boarded buses and waited twenty minutes.

Eventually we took off and I got through passport control #2 and then over to Hall C for my American Airlines flight to Chicago. Luckily, AA was opening up for earlier flights as I had an eight hour layover. I got my boarding pass and went to the Admiral’s Club. I’m not a member, but if you have AA Platinum status, you can use the club lounge if you are traveling abroad, even if you are in economy, as I was.

I settled in for a long wait. The television behind me was running a continuing story of snowy weather hitting London. I had originally planned to fly through London, but the need to switch planes between Heathrow and Gatwick put the kabosh on that. And so I sat as people came and went. Most of the people in the lounge were taking the 10 am flight to Dallas.

Around 9 an announcement came on that the Dallas flight would be delayed, with more details later. Then: “flight delayed due to mechanical problems.” Later: “there is a hydraulic system leak.” Finally: “a part is needed, it’s coming from Paris, we hope it will be here at 7 pm.”

I, however, was going to Chicago, not Dallas, and my flight left on time. I hope all those people eventually got home to Dallas and beyond.

When I chose my seat I got an exit row aisle, but I made a small mistake. When there are two consecutive exit rows, the seats in front don’t recline as much as the back ones. The bulkhead wall was a bit to close for comfort but I again slept on and off for the nine and one-half hour flight. My left knee kept cramping, but I got through it. Incidentally, I finished reading To Say Nothing of the Dog by Connie Willis.

There were no problems with AA, passport control, and customs in Chicago and I headed over to Terminal 1 for my United flight for the last leg of the trip. I was supposed to have a four hour layover, but I was early enough for an earlier flight. Though I had to pay for the honor of switching (United makes you pay for everything), I did the change to get home a couple of hours early. Moreover, my originally scheduled flight was delayed, so it seemed like a good bet to take the earlier plane.

I got to the gate and it was crammed with people who, of course, were trying to get to Dallas. And their plane was delayed due to mechanical problems. They did better than the folks in Frankfurt, and left without too much delay. My flight was delayed a bit as well, maybe an hour, but as long as the last leg of a trip actually flies, I’m cool.

I finally got home around 11:15 pm Friday night, about 29 hours after I had awakened from my short nap in Tunis. On Saturday a big storm hit the east coast of the US, but we got none of it here in northwestern NY. So it’s been a long weekend with delays and winter weather all around me, but I did pretty well.

I know the travel gods will make me pay for it eventually.

Open source software: modify, extend, or leave it alone?

Let me begin with a story.

When I first started using WordPress for blogging, it didn’t have support for standards-level Atom feeds. Being open source, though, a colleague had looked at how RSS feeds were processed and had written some code for Atom. I took this code and plugged it into my installation, right along side all the code that came as an official part of WordPress.

This worked great until I installed the next release of WordPress. First, I forgot to stick the Atom code into the code directory. Later I realized that something had changed and things were not working correctly. I was able to tweak it and everything was fine … until it happened again. This might still be a problem except that WordPress eventually provided proper support for Atom and I could delete and forget the custom code.

To be fair, WordPress has a very good extension architecture and hundreds of plugins have been written that support this. There is virtually no reason for the average WordPress user to look at the source code of the main application.

And this is good, because if you start tweaking the main application you can run into the same sort of problem that I had above. If you start making modifications to the primary source, you have created a recurring commitment to keeping the patch current until it is no longer needed. There might be great advantages to you for having the patch, but keeping it up to date through changes of the main application can be quite a bit of work.

One way of ending the need for you to maintain the patch is to get the application committers to accept your “fixes” and put them in subsequent versions. Depending on the project and the quality of your work, this can be easy or next to impossible. In the closed source world, the analog would be for you to get the software vendor to implement a change request immediately as a fix or long term as a feature addition.

As I mentioned above, if there is a good extension architecture, there may be no need to modify the core application. WordPress, Drupal, and FireFox are all hugely popular open source projects that allow extensions by virtue of software hooks or programming interfaces (APIs). I think most people know about APIs, but an example of a hook is something like “apply a set of user actions right before sending the content to the browser.” An example might be “every time the content is to be sent to a browser, first search for all occurrences of words in a given list, and then replace them with links to relevant websites.”

This allows the architects and developers of the main application to focus on the core functionality and the extension mechanisms. They themselves can provide higher level, non-core features via hooks or APIs, and it is not uncommon to see software shipped with standard extensions.

Extensions are not immune to bugs or problem when the main application changes. Anyone who uses Firefox and extensions knows that it takes a fair amount of time after a major new release is available for extensions to get updated, if they ever do. I used several extensions years ago that never supported later versions of Firefox. It is frustrating when this happens, but I either move on to new extensions or learn to live without the old ones.

Drupal seems to require massive changes in extension modules between its major version changes. WordPress sometimes requires plugin updates, but since WordPress is updated more frequently, this has become standard operating procedure and is generally pretty smooth.

To be clear, extensions and plugins are wonderful things and maintaining compatibility with new software releases is an old problem not restricted by any means to open source. Proprietary software also can have version-to-version compatibility problems with extensions, APIs, and data formats.

If you don’t want to deal with any of these problems, consider avoiding patching code and using extensions. I think for most people the first is a reasonable option, but the second will probably cause you to miss some really nice features that come in extensions, often by developers outside the core development community.

There can be innovation in the core application, but that same application can become a platform for innovation if it has a good extension mechanism. Choose good applications that can be improved or configured outside the core software, and you’ll save a lot of trouble and gain some real advantages. This is true for open or closed source software.