I originally posted this text on September 11, 2003. I reprint it here in its entirety. Because I still remember. And so we never forget.
I remember my pager going off during a meeting. “CALL HOME ASAP.” My wife never pages me. I left the meeting. It was a little past 9am.
I remember finding an empty office and calling home. I was in Manhattan only for the day, 52nd Street. My wife was upset. “Two planes just crashed into the World Trade Center. Are you there?” We live two hours away - she didn’t know anything about New York City, just that I was there. “I’m five miles away, hon. I’m fine.”
I remember getting off the phone after several minutes of assuring my wife I’d find out how to get home and call her back. The meeting was still in progress.
I remember wondering how I could go tell a room full of New Yorkers what had happened. I remember my relief when a moment later, the meeting room opened up and everyone poured out. Someone else had already told them.
I remember wandering down a few floors, looking for a television. I passed someone I didn’t know. “They blew up the Pentagon,” he said. My stomach turned to ice. How far would this go?
I remember talking to my wife again. I had to call someone back in my office, over a dedicated line, and get him to conference us. Long distance and cell phones were completely tied up. “I promise I’ll try to get home today,” I told her. She was trying not to be hysterical. So was I.
I remember leaving the building with four other people from my office, all visiting for the day. Someone had come up over the weekend, and had a car parked in Brooklyn. The 3:30 streets were empty. Subways, the ones that were running, were nearly empty. We walked a long time, away from the smoke. I looked over my shoulder at it so many times I lost count.
I remember riding out of Brooklyn over the Verazanno Narrows bridge several hours later. Looking back at the column of smoke, larger than belief. I will never forget that image as long as I live.
I remember arriving home. Hugging my children. Holding my wife. Calling friends and loved ones, assuring them I was home. Crying. Praying for the families of those who were lost.
On September 11, 2001, over three thousand people lost their lives. At the World Trade 2,972 people were lost. At the Pentagon, 184 people were lost. In a field in Pennsylvania, 40 people were lost. I was fortunate… I didn’t lose anyone. But I remember.
Also: Pwylla remembers. Joel replaced his site with a stirring memorial for the day.
Boy, what a lousy blogger am I. As part of my recent, er, sabatical from blogging, I completely missed my blog’s first Birthday. My first post was on Aug 14, 2003. Happy belated Birthday, Blog o’ mine.
The last couple of nearly-blogging-free months notwithstanding, I guess it’s been a good a first year. Nearly 175 posts in the first year. My current design may never win any awards, but it beats the original, and its successor. Along the way, I’ve added a few alternate stylesheets, upgraded my feed to RSS2.0, got everything (usually) to validate (html, css, rss). I switched from Textile to Markdown, added comments, added Markdown to my comments, and fought comment spammers. Most recently, I finally added a blogroll. I’ve made some new friends and linked to long time friends. Hopefully I’ve even managed to help people here and there - I’m (currently) still the top Google hit for “xemacs fink panther”, and my moreentries plugin for Blosxom has been used by a few people.
Here’s to another year. Thanks for reading.
So I finally completed a website update that’s been on my list for ages: I’ve added a blogroll (on the right, scroll down past the category tree). I decided a long time ago that I didn’t want to maintain a blogroll by hand. Of the various websites that help you create a blogroll, Bloglines seemed like the best fit- Bloglines is my aggregator, so it already knows what sites I read.
Bloglines offers several ways to share your blogroll. The most basic is your public url, which is a publicly viewable version of your subscriptions within the Bloglines interface. This is a great way to let others see what you read, but not to embed a blogroll within your site.
The next way to create a blogroll via Bloglines, and the option actually designed for the purpose, is the Bloglines Blogroll Wizard (accessible after you’ve logged into Bloglines). It provides an HTML version of your blogroll in two ways- via script or literal HTML. For example, to include my blogroll, I can add the following to my page:
<script language="javascript" type="text/javascript"
src="http://rpc.bloglines.com/blogroll?id=jclark"></script>
Of course, I really don’t like the idea of using script to build my page. You can get the same HTML that the script would insert via direct URL, but the HTML generated by Bloglines isn’t laid out the way I want. Here’s an excerpt of the HTML generated by Bloglines for my blogroll:
<div class="blogrollmain">
<p /><div class="blogrollfolder">Corporate</div>
<div class="blogrollitem">
<a href="http://weblogs.oreilly.com/">O'Reilly Weblogs</a></div>
<div class="blogrollitem">
<a href="http://www.macdevcenter.com/">MacDevCenter.com</a></div>
I don’t mind the <div> wrapped around the entire blogroll, but wrapping every website link in a <div> is a little over the top. And using an empty <p /> tag for page layout? How 1999 is that? The blogroll is just a list of folders, each containing a list of links (assuming you use folders). I wanted to set this up the same way my Categories list is laid out- as a <ul> containing nested <ul> blocks.
Fortunately, there’s another way to get your blogroll data from Bloglines. From the public view, you can choose to “export” your subscriptions. This gives you an OPML file containing all of your blogs and folders. Since OPML is XML (and so is XHTML), this seems like a prime use for XSLT.
I had set out to create a blogroll from Bloglines’ OPML via XSLT months ago, but I got hung up on the mechanics. I had intended to have my webserver retrieve the Bloglines OPML, and to transform it on the webserver. To this end, I asked my hosting company to install an XSLT library for Perl, but I asked for XML::XSLT instead of XML::LibXSLT, and found that XML::XSLT was not complete enough to be effective. I ended up shelving the idea for a while.
When I decided this weekend to finally get my blogroll online, it occurred to me that my blogroll doesn’t change very often. With updates so infrequent, I really don’t need to put the maintence of the blogroll on the server. Instead, I wrote a perl script which retrieves my Bloglines OPML file, converts it to XHTML using an XSLT Stylesheet, and uploads to results to my website, where I use Nelson Minar’s File Plugin for Blosxom to include the file in my page output. I just run this script from my Powerbook whenever I update my Bloglines subscriptions.
A few notes about the script and stylesheet: you might notice that I upload the blogroll into a state/file directory. I’ve modified my copy of the File plugin to look for files in $plugin_dir/state/file, in keeping with the informal standard for Blosxom plugins. Also of interest is the FTP upload code. I didn’t see any need to write my XHTML out to a file just so I could FTP it, but I couldn’t figure out how to upload the contents of a scalar via FTP using the common Perl FTP modules. I ended up using the command line utility curl to perform the FTP upload. Curl will accept a file from stdin, which works perfectly from perl by opening a pipe to the command. The stylesheet uses no id attributes, and only one class attribute for attaching my CSS. This class, set on the outermost <ul>, is ‘categories’, which is the same as my category tree. By sharing rules, I didn’t have to write any new CSS for the blogroll to fit into my layout. Also note that as written, the XSLT doesn’t properly handle top-level subscriptions (those not assigned to a folder in Bloglines). If/when I fix that, I’ll repost the XSLT and make a note here.
I recently began doing some web development at work. As a result, I ended up poking around the Firebird Extension page looking for useful tools. What I found was Chris Pederick’s Web Developer Extension. When combined with the DOM Inspector present in most Firebird builds, this may be the only developer tool I ever need.
WDE adds a toolbar to your Firebird (or Mozilla, via separate installer) window, below the bookmarks bar and above the tabs. Normally I dislike anything that adds a toolbar; I’m jealously protective of my screen real estate. In this case, I’m sold - this toolbar is worth the pixels. Here’s a rundown of what you get.
The tool bar contains 10 dropdown menus, filled with useful goodies, plus a view source button (the only feature I don’t use, since ctrl+U is faster and ingrained in my skull). On the right hand end of the bar are three small icons: Render Mode (Quirks or Standards Compliance, clicking opens page properties dialog), Javascript errors (clicking opens javascript console), and what I call the “Power Button”. Clicking the Power Button disables the entire toolbar, and clicking again re-enables it. As minor as this sounds, I’ve found it to be a huge help. When the toolbar is diabled, the icons and text are dimmed, and become much less intrusive. Since I use my Bookmarks bar constantly, leaving the Webdev toolbar off unless I’m using it really reduces visual noise when looking for a bookmark.
So what’s in the menus? Plenty. One menu lets you diable things, like cookies, image animations, images, Java, Javascript, color, referers, and stylesheets. The CSS menu integrates all of the functionality of the EditCSS extension which has served me so well for so long (in fairness, I’ve had some trouble with this integrated version, but I haven’t tried a clean profile yet). There’s a Forms menu, that lets you convert GETs to POSTs and vice-versa, display form details, make fields writeable, show passwords, and more. The Images menu lets you hide all images, find broken images, and replace images with ALT attributes. You can display image paths and/or image image dimensions, which appear as tooltip-sized labels directly in the page for easy viewing. You can also outline any of the following: images without an Alt attribute, images with a blank Alt attribute, and images with no Title attribute. Handy for the accessibility-minded developer.
The Information menu gives quick access to all sorts of information, including page headers, a speed report from WebSiteOptimization.com (in another tab), and even a report showing all cookies for the current page. From the Misc. menu, you can clear cache, clear HTTP auth, clear cookies (great when debugging your server-side session management code), zoom in and out, and more. It even contains a submenu with links to a number of W3C specs - conveniently opened in another tab, of course.
The Outline menu lets you outline various page elements, such as table cells, block elements, and links without title attribs; or you can specify custom elements to outline. The resize menu lets you see the size of your current browser, resize the window to 800×600 to make sure it’ll work on Grandma’s PC, or set an exact custom size. The Validation menu incorporates some of the functionality of Checky by providing one-click validation from a number of services, although not nearly as many as Checky. You can validate your CSS, HTML, Links, Section 508 Accessibility, and WAI Accessibility. For CSS and HTML there is also a “validate local” option, which automatically saves the current page to disk and uploads it to your validator. Perfect for checking dynamically built pages on a firewalled intranet. The Options menu lets you change a few things, including the URLs used for the validator menu.
I’ve been using this toolbar for about a week, and I’d hate do anymore development without it. It’s really that good. If you’d like to give it a try, you can install it directly from the Web Developer Extension homepage.
Update: Received a nice email from Chris. He pointed out an assumption I made that was incorrect, regarding the validate local feature. To quote Chris:
It doesn’t actually save the file to disk, but rather
creates a new request in the background to grab the source and send
it as text in a POST to the validator. I minor difference, but it
can affect the way it works for dynamic pages etc.
Thanks Chris! He also asked about the problem I head with CSS editing, but I’ll have to follow up on that next week. The problem was at work, and thankfully, I’m off until Tuesday. However, I tried using the CSS Editing on my powerbook, and it seems to work nicely. It has the additional feature that each stylesheet is loaded as a separate tab in the edit pane.