The Boston Diaries

The ongoing saga of a programmer who doesn't live in Boston, nor does he even like Boston, but yet named his weblog/journal “The Boston Diaries.”

Go figure.

Tuesday, May 01, 2007

09 F9 11 02 9D 74 E3 5B D8 41 56 C5 63 56 88 C0

It took the computer industry over a decade and millions of dollars to realize that copy protection just doesn't work. There are too many bored, intelligent and (more importantly) broke high school and college age kids who view copy protection as a game, an intellectual diversion, and will work hours, nay, days to crack a sceme.

It's just sad that the entertainment industry has to learn the same expensive lession over a similar time period.

Which version was I using again?

Sorry if you've signed up for email notification and gotten some wierd notifications over the past twelve hours. That's because there was a show-stopping bug in the code that only now was triggered.

You see, I rewrote the email notification code some time ago, but hadn't fully tested it yet. Then, a few days ago I decided to add in custom error pages and kept having issues. I knew I had done it before, then I realized I did, over there, but the custom error pages weren't working over here. I thought maybe it was a different version of the code.

So I checked out a fresh copy over at the other place to see if I broke whatever it was that made the custom pages work (it was using an older code base there), and it still worked. But since I'm not using email notification over there, the new email notification code was still untested.

So I checked out a fresh copy here. The custom error pages were still broken.

Turns out it was the installation of Apache on the server here (I used the distro-installed version for a change)—seems that it has a directory alias for /error/, which just so happens is what I named the directory. Had I named it /errors/ (plural) things would have worked the first time and all of this wouldn't have happened (or rather, would have happened at a later time).


But I did.

But notice that I hadn't tested the email notification code yet.

Until yesterday and today.

And boy, did things blow up.

The program kept crashing. Normally, that isn't much of an issue (well, okay, it is an issue) because normally, one is in front of the program to watch it crash, but in this case, I wasn't aware of the crash, because I used the email interface.

Now, mod_blog takes the entry (from a web page, a file, or through email), adds it to the archive, generates the new page, and then, if enabled, sends the email notifications.

It was crashing (unbeknowst to me) during the email notifications.

Postfix has been instructed to send emails to a particular address to mod_blog, which it does. But Postfix also notices that the program crashed. So it requeues the email.

And when the program crashes, the update lock it has is released (technically, it's a file lock that the kernel maintains, but hey, the program goes away, so does the lock).

Next entry comes along, process repeats, and Postfix realizes it has some email queued up, and tries to send that at the same time. Now we have two processes trying to update the blog. Normally, this isn't an issue because of the update lock. But the lock is released in an uncontrolled state and …

Things blow up and get ugly.

But what I'm seeing is a blog that failed a validation check, I fix it, only to have it fail the validation check again, which I fix, only to fail the validation yet again, only now I notice that the same entry I thought I fixed twice keeps coming back to haunt me and even worse, the entire front page is a mess, and is remaining a mess no matter what I do.

I tracked the problem down, but I may have sent some spurious notifications in doing so. Once I realized it was the new email notification code (and man, how did I ever check that code in? Leaks memory like you wouldn't believe! Sheesh) I reverted to the old version, cleared out the mail queue and hopefully, got this situation under control.

Wednesday, May 02, 2007

Yeah, yeah yeah, I know … if it ain't broke, don't fix it. But we're phasing out that equipment …

I only stopped by The Office to pick up a cross-over network cable. Oh, I thought, I might as well move the wireless connection to the other router while I'm here. It's not as arbitrary as I make it seem—we're in the process of phasing out one of our routers and the wireless shot to the building behind us is one of the last things still on that particular router. I'm also not in The Office as much as I used to be, so this was a perfect opportunity. It should only take a few minutes, I thought, as I started running a new cable …

An hour later and I think I have things back to normal. I had made the switchover, and it didn't work. After troubleshooting it to the depth of my knowledge (mainly, clearing ARP tables), I decided to give a call to R, the guy who actually handles the wireless shots for us. Turns out, he can't get to some of his equipment. So now we're both trying to trouble shoot the issue when I decide to put things back.

On the way to a customer's site, I get a call from Smirk, asking if I can check on a down server. I tell him I can't as I'm on the way to a customer site to do some work (that required the cross-over cable I mentioned earlier). Since P wasn't available at the time, Smirk said he'd drive to The Office to check it out.

An hour later I'm back at The Office for our weekly meeting. I bump into R, who's headed towards the roof to check the wireless connection. I tell him I'll be in a meeting but if anything comes up, give me a call. I then bump into P, who informed me that the server in question was down because the network cable had worked loose.


P and I head over to the meeting and not one minute in the Internet is down. Down hard enough for us to call Dan, the Network Engineer to investigate. Then, R calls, saying his equipment was unplugged from the network!

This is getting weirder by the minute. I excuse myself from the meeting and head over to the Data Center. I meet R there, and sure enough, one of the network cables leading to the wireless shot had been unplugged. Plug it back in, and the wireless stuff comes back online. Then Smirk calls; Dan said our network connection to the Internet was down (small note: we share Internet connectivity with another company—our Internet providers come in through a single router, and are then split out to each company; it was this link between the Internet router and our core router that was down).

Turns out, that network cable was loose.


We have gremlins in our Data Center!

How else to explain three unplugged network cables?

(Oh, and after everything was plugged back in, I was able to move the wireless connection to the other router without problem—sigh).

Thursday, May 03, 2007

Fixing code

I fixed the small problem in the code and I see that it's behaving itself.


I also spent some time making sure the codebase on the development server and the webserver were in sync (good thing because they weren't), cleaning up the code (getting rid of code that isn't used) and making sure it's still portable (by compiling it under Mac OS-X).

I also started to address some issues I have with internal duplicate content, which are two different pages having the same content.

Boy, do I have that in spades.

For instance, the link to todays page is (note the leading zeros) but the link will also work (note the lack of leading zeros). Google says it doesn't matter, but for me, it's an issue of aesthetics, and I would prefer the former style (with the leading zeros) over the latter (sans leading zero, and yes, mod_blog doesn't always generate links like I want it to). I added code to detect the non-leading zero references (which I didn't do) but was amused to find that I had code to detect some other variations (which aren't used that much, if at all) that's been there probably from the beginning (late 1999).

So I was aware of the issue seven years ago (imagine that!) but didn't finish that particular feature (since getting it running was more of a priority than getting all the fiddly bits right). I suspect I didn't finish it because handling the generalized case will take a bit more code than I expected, in order to generate redirects to a “canonical” URL.

Friday, May 04, 2007

Polyglut redux redux

The CLR has good support for dynamic languages today. IronPython-1.0 demonstrates this. The new Dynamic Language Runtime (DLR) adds a small set of key features to the CLR to make it dramatically better. It adds to the platform a set of services designed explicitly for the needs of dynamic languages. These include a shared dynamic type system, standard hosting model and support to make it easy to generate fast dynamic code. With these additional features it becomes dramatically easier to build high quality dynamic language implementations on .NET. More importantly, these features enable all of the dynamic languages which use the DLR to freely share code with other dynamic languages as well as with the existing powerful static languages on the platform such as VB.NET and C#.

Via Lemon Odor, Dynamic Languages on .NET—IronPython and Beyond

(This post is in reference to “Polyglut” and “Polyglut redux”). My only comment to this news is, “How long will Microsoft hype this, and when will they then pull the rug out from everybody?”

I only mention this because of MFC, OLE, COM and DCOM, just a few of the heavily hyped but long since dropped and unsupported technologies Microsoft developed over the years.

Saturday, May 05, 2007

Responsible party


So he's responsible for Scrappy-Doo (Part II, Part III).


This is almost grounds for not reading his blog anymore, but the story of how Scrappy-Doo was developed is fascinating.

Sunday, May 06, 2007

Another silly date meme

Okay, this one hits at 02:03:04 am today, 05/06/07.

Neat, huh?

Yeah, I didn't think so either.

“Oversight? What oversight?”

On what complaint or authority did these detectives say they were talking to you?
On the complaint that I may have made terroristic threats through computers. At least, that's what was passed down to me from the State's Attorney through the detectives on the phone.
So who is it that you're supposed to have threatened? Is it now law in the state of Maryland that if anybody anywhere unknown to you feels uneasy at something you write, it's a crime?
Well, a terroristic threat is an old legal concept. Basically, it's calling in a bomb scare or something similar.

Now, in the second comic, there's the verbatim transcript of what I said that got me fired. And there's a co-worker who overhears it, which as far as I know is what happened. And Ian [McConville]'s drawing resembles someone in the office to an uncanny degree. Of course, he's never met her, because he lives in California.

Via Snarkoleptics, Interview With The Vampire Terror Suspect

This is for Smirk, with whom I've gone back and forth over topics like this. Matt Boyd got fired over something he said at work and was later investigated for making terrorist remarks.

Okay Smirk, how much do you want to bet Matt Boyd's name is on the No Fly List? (Also interesting is this list of people on the list, including a few American military and government workers)

Junk science vs. junk science

Finally, CFL critics like to remind you that CFL bulbs contain mercury, a highly toxic pollutant. This is true. The typical CFL bulb contains approx. 5mg of mercury. (Manufacturers are working to reduce this. Phillips is said to have developed a bulb that only has 1.5mg of mercury.)

If a CFL bulb is broken, special care must be taken to properly clean up and dispose of the remnants to prevent health risks. Further, CFLs must be recycled or properly disposed of to prevent the mercury from escaping into the environment. Here are the federal government guidelines for CFL disposal and cleanup.

What the critics forget to mention, however, is that coal-fired power plants are a major source of mercury pollution. Further, most of this mercury is emitted into the air, and is thus not contained or containable. Mercury in a CFL is already contained unless it is broken, and if properly recycled is fully containable.

Via Instapundit, Everything you wanted to know about Compact Fluorescent Bulbs, including the mercury problem

Snopes weighs in as well (link also via Instapundit), so that pretty much puts the whole “We're gonna die by Mercury poisoning!” thing to rest.

Monday, May 07, 2007

Why do I keep doing this to myself?



Spring has been complaining that the DSL connection is sluggish. I did some tests and yes, there is a definite bottleneck at the DSL modem.

Now, a few months back when we (The Company) controlled both sides of the connection, it wasn't slow. But back then, I had enough public IP addresses to give both the DSL modem and my firewall (an old 486) a public address. The DSL modem just slung packets around leaving the firewall to do all the filtering and NATting.

When The Company stopped providing DSL (because of the Monopolistic Phone Company charging us about twice their rate) we went with another DSL provider (and The Company is paying for it). Now, because we only got a single public IP address, things on my network had to change. Basically, the DSL modem is now doing the filtering and NATting for my network, and it might not be able to keep up with the load.

So today I tried to fix it. Moved the public IP address to my old 486, gave the DSL modem some private IP addresses and had it route the public IP address to the 486.

It should work. The DSL modem gets the packet for the public IP address on the WAN port but the routing table in the DSL modem should then forward the packet towards my firewall.

Only it didn't work.

The Monopolistic Phone Company (which actually owns the DSLAM—the device that provides DSL) requires PPPoE with authentication (a few years ago this wasn't the case). So the DSL modem does a PPP negotiation, which, for whatever reason, sets the WAN port to the public IP address. Which is not what I want.

And the DSL modem I use doesn't do bridging, which is what I want.

Then Wlofie noticed the DSL modem supported a feature called “PPP Half Bridge,” which seems to do what I want—it forwards packets to the public IP address to a given host.

Only, the host has to use DHCP to get the public IP address, which I don't need because the public IP address I have is static.

But whatever.

I tried it.

It didn't work (subsequent research shows I might have set it up incorrectly—more testing is needed, but later, when I'm calmed down and not “at work”). And it took a ridiculously long time to reset the modem to a factory configuration (because once I set “PPP Half Bridge” mode, I couldn't get to the DSL modem anymore—turns out all I had to do was pull out the ADSL cable and powercycle the DSL modem, but I found that out after reconfiguring the device).


Tuesday, May 08, 2007

How desperate do you have to be to spam someone?

This is rich. I'm starting to get a bunch of bounce messages that look like:

From (Mail Delivery System)
Undelivered Mail Returned to Sender
Tue, 8 May 2007 05:09:17 -0400 (EDT)
[-- Attachment #1: Notification --]
[-- Type: text/plain, Encoding: 7bit, Size: 0.5K --]

This is the Postfix program at host

I'm sorry to have to inform you that your message could not be delivered to one or more recipients. It's attached below.

For further assistance, please send mail to <postmaster>

If you do so, please include this problem report. You can delete your own text from the attached returned message.

The Postfix program

<>: host[] said: 550
    Requested action not taken: mailbox unavailable (in reply to RCPT TO
[-- Attachment #2: Delivery report --]
[-- Type: message/delivery-status, Encoding: 7bit, Size: 0.4K --]
Tue, 8 May 2007 05:09:16 -0400 (EDT)
X-Postfix; host[] said: 550 Requested action not taken: mailbox unavailable (in reply to RCPT TO command)
[-- Attachment #3: Undelivered Message --]
[-- Type: message/rfc822, Encoding: 7bit, Size: 1.3K --]
The Boston Diaries Update Notification [1178615356-28614]
Tue, 08 May 2007 05:09:16 EDT

Thank you for your interest in The Boston Diaries. To start receiving email notifications of new entries, you will need to reply to this email. You don't need to do anything other than reply to this email. Once you do that, you'll be entered into The Boston Diaries Update Database.

If you have no idea what this email is in reference to, someone submitted your email address for notification of new entries to my weblog/online journal (at If you want to, you can still reply and get notifications of new entries, but you can also ignore this and there will be no futher emails from my server. That is, unless someone submits your email address *again* without your knowledge.

Sean Conner

Basically, some spammer is trying to spam people using my Obligatory Email Notification form, but the form is very basic—only one field is supported and the script generates a precanned email to send (shown above). That part is very basic and I don't see what there is to exploit.

Then again, I wrote the code so I know how it works. The spammer (or spammers; it could be multiple people) may be trying to reverse engineer the script. Heck, if they're that curious, I'll send them the code.

But to investigate this a bit further, I modified the code to record the request (where it came from, what the spammer is trying to send) so I can figure out what they're actually trying to accomplish.

Wednesday, May 09, 2007

But I have to ask, “What exactly is the appeal?”

For Spring (and maybe possibly Gregory who loves this type of stuff)—how to make your own drive-in movie theater (link via Instapundit).

How to make a film in just eight hours

If Hoade and I had access to this film school (link via news from me—and yes, I'm still reading his blog) then we might have actually made a film!.

It doesn't sound like a bad deal actually, and if (and that's a big “if”) I lived in southern California, I might actually do it just for the novelty of it all.

Because I'm told to do these things.

Well, it wasn't broken.

So of course, I fixed it.

This time, I managed to phase out the “old” router for the new “router” (even though they were nearly identical) without a hitch.


Update on Thursday, May 10th, 2007 at 10:03 am

Not so woot.

I forgot to update the routing information for one customer (technical explaination: I forgot to add their interface to the OSPF cloud).

At least it was an easy problem to fix.

Thursday, May 10, 2007

“Common sense? We don't need no steeenkin' common sense!”

At the botton of an email I received from a friend today, I following bit of legal verbiage appeared:

NOTICE OF CONFIDENTIALITY: The information contained in this email and any document attached hereto is intended only for the named recipient(s). It is the property of XXXXXX XXXXXXXXXX XXXX and shall not be used, disclosed or reproduced without the express written consent of XXXXXX XXXXXXXXXX XXXX. If you are not the intended recipient or the employee or agent responsible for delivering this message in confidence to the intended recipient(s), you are hereby notified that you have received this transmittal in error, and any review, dissemination, distribution or copying of this email or its attachments is strictly prohibited. If you have received this email in error, please notify the sender immediately by return email or by calling (561) XXXXXXXX. Thank you.

I found it amusing.

[The following three paragraphs were written based upon an incorrect assumption. See below for an update]

Let's see … the company my friend works for (and it's not a law firm by the way) is claiming ownership of a stream of bits that have been delivered to my inbox. Well, I think they're claiming ownership of a stream of bits—it can't be the electrons because the electrons used to transmit the bits have long since been recycled into other bits streaming hither and yon. I can't see it being the magnetic flux on the harddrive that's storing the message, because once I delete the email, there is no message with which to claim ownership over (okay, technically, deleting the message isn't enough since the bits comprising the message still exist on the harddrive unless I overwrite the message with a different pattern of bits, which I may have to do).

So, they're claiming ownership over the bits that comprise the message. Or rather, the bits in the order they appear in the message, because the bits in a different arrangement:

((())), ,, ,,,…‥156:ACCD EEF FIIIIIIILNN NOOOTTTTT XX XXXX XXXXX XXX XXX XXXXXXXX XXXXXXXX XXXXXX XX XXXXXXXY aaaa aaa aaa aaaaa aaaaaaaaaaaaa aa ab bbb bbbccccc cc cccccc ccccdddddd dddd ddd ddddd ddd dd ddddd eeeeeeeee ee eeeeeeeeee eeeeeee eee eeeeeee eeeeeee eeeeeee ee eeeeee eeeeeeeeee eeeee ee eef fff fff fff fggggghh hhhhhhhhh hh hhh hhhhhhhh ii iiiii iiiiiiiiiii iii iiiiiiiiii iiii iiiiiii ii iiiiiiiiii ii kll llllllll lllllllmmmmmm mmm mmm mmnnnn nnnnnnnn nnnn nnn nnnn nnnnnnnn nnnn nnnnnnnnnnn no oooooo ooo ooo ooooooo oooooooooooooo oooooooppppp pp ppppprr rr rrrr rrrrr rr rrr rrrrrrrrrrr rr rrrrrrrr rssssssssss ss sss ssss ssssssss ssst ttttt tt tttttt tttttt tttttt ttt tttttt ttttttttttt tt tttttt uuuuu uu uu uuvvvvv vwwwx yyyyyyyyy yyyyy yyy

lose all meaning (except for the preponderance of “X”, which I used to cut out any identifying identification, you can determine with a high likelihood of chance that the text was originally written in English due to letter frequency). Unless they really are claiming ownership of the bits reguardless of order they're in, but that's not made clear.

Now, the part that goes “shall not be … reproduced without the express written consent …” Obviously, I don't have written consent to reproduce the message here on the blog (although I could claim “Fair Use” in this instance) but in reading the email initially I didn't have prior written consent because the very act of receiving the email caused a reproduction to be constructed—a copy from the bits streaming in from the network to electrical charges in memory and then a copy from said electrical charges in memory to the magnetic flux on the harddrive.

Two copies in which I had no written consent for reproduction.

And then there's the four reproductions made when I viewed the email initially (from disk to memory, from memory to network, from network to memory, and from memory to video screen).

I'm thinking their lawyers need a clue-by-four in how email works.

Then there's the last bit that goes “[i]f you are not the intended recipient or the employee or agent responsible for delivering this message in confidence to the intended recipient(s), you are hereby notified that you have received this transmittal in error, and any review, dissemination, distribution or copying of this email or its attachments is strictly prohibited.” Assuming I wasn't the intended recipient of this message, I would have had to “disseminate” the message (from the server to me) and “review” it to see that it was in fact, not intended for me. The theoretical legal implications of this are staggering.

Which is why I found this all so silly.

(And to my friend who sent this—yes, I realize you have no say in this, but that still doesn't mean your company isn't silly for including this in the first place)

Update some time later today

I misread what they were claiming ownership of—the information, not the actual bits.

When I was constructing the different arrangement, I briefly debated about using the original, non-censored paragraph, since the letters would be scrambled anyway. Then I thought that no, someone could conceivably reconstruct the censored portion, by removing the letters in the known portion, and unscrambling the remaining letters, which wouldn't be that hard. Scrambling the letters didn't hide the information enough to my liking, so I kept the Xs (which is what I use to censor information in case the associated CSS isn't used).

Which meant, it really was about the information.

How desperate do you have to be to spam someone? Part II

Okay, two days later and I have more information about that spammer: they're not trying to send email, they're trying to spam guestbooks and forums.

Before I get there, let me explain how the Obligatory Email Notification System works. When you fill in the form, your email address is added to an “optin” list, and an email is then sent. Only when you reply to that email is your email address moved from the “optin” list to the “verified” list and it's from the “verified” list that emails are sent when I make a new entry.

So I decided to check the “optin” list, and boy, was I in for a surprise. I haven't checked the actual “optin” list for, oh, three years or so? It would be an understatement to say the email addresses were predominately sex related. I grabbed one ( and lo, look at all that guestbook spam.

My guess: the spammer searched the net for HTML forms that looked like guestbook for forum forms, and since many guestbook forms have an email field (usually named email) they tagged my Obligatory Email Notification as a possible guestbook script (since it, too, has a field named email).

But here's where things get weird: the only fields they fill out, in regards to my Obligatory Email Notification form, are the fields defined in that form. I had hoped to see some additional fields being sent in, like comments or message (which wouldn't do anything anyway) but nope, the only fields they sent in were the fields defined for my form.

I thought maybe because I didn't have a field named comments or message they weren't sending in such a field. So I added a field named comments (it's a <TEXTAREA> but with a style of display: none).

Still, only the fields I had originally defined were being sent in.

Checking the logs, and yes, the spammer has definely cached the original form (because the spammer is simply doing a POST to the form, and not retrieving it before doing the POST). I'm going to rename the form and see if that has any effect.

One more thing though: It's one spammer doing all this, and while you would think I could just block that one IP address, I can't. That's because this particular spammer, running their script from, is using a series of open web proxies to submit the form, so the actual IP address to block changes all the time. So anyone who is getting spam to a guestbook or forum, and you're running Apache, you might want to check the environment variable HTTP_X_FORWARDED_FOR.

Friday, May 11, 2007

A Panel from a Richie Rich comic devoid of any context and presented here without comment

[I wonder why it should work better now?]

Okay, maybe a small comment: makes you want to read the rest of the story, huh?

Saturday, May 12, 2007

The only way to travel

Bunny and I headed down to the Gold Coast Railroad Museum, located in Miami. It was well worth the drive down, to see how the masses travelled prior to the jet age.

In some ways, it's a shame that travel by train isn't as popular as it was, but even if it was, I'm sure that it wouldn't be nearly as nice as riding on the Silver Crescent. If it was, I'd probably be more inclined to travel more.

[This would make a beautiful diner.]
[See?  Now this is a dining car!]
[What people think of when they think trains.]
[I love blueprints.]
[Railroad map of Florida, circa 1904]
[I was not expecting to see this, evidence of our checkered past.]
[I found this passenger car very depressing—the seats are smaller than what you would find on an airplane!]
[The rail equivilent of Air Force One—U.S. Car #1]

Presidential Rail Car, U.S. Number 1

[The Meeting Room on U.S. Car #1]
[The Observation Room on U.S. Car #1]
[Now THIS is a train!]

Silver Crescent

[If travel was like this, I might actually travel more.]
[The bar on the Califorina Zephyr]
[Dig this obersavation lounge.]
[The upper deck looking down towards the observation lounge.]
[On the weekends, you can get tickets to ride this train, either in the caboose or the engine itself.]

Sunday, May 13, 2007

Maybe I'll get a film done someday …

Via Spring, I see that National Novel Writing Month has a new sibling: Script Frenzy, writing a screenplay in a month.

Now, traditionally, a screenplay is measured in pages, with each page approximately translating to a minute of screen time, but in this, they're counting words—20,000 to be exact. However, they scanned a bunch of screenplays and found the average length was 20,000 words, so that's the target.

Sounds intriguing.

I guess it's time to check out The Nine Act Film Structure among other screenplay structures, and dust off the ol' Quick and Dirty B-Movie Plot Generator (which gives more plots than the one found on the Script Frenzy home page).

Monday, May 14, 2007

Lies, damned lies, and mandated government charges on your phone bill

The whole DSL fiasco stemmed from a misunderstanding between Spring and The Monopolistic Phone Company. She felt that she was paying too much for our use of phone, when all we really use it for is DSL. When it was finally resolved, I told Spring that I wanted to see the next phone bill.

Total Current Charges (Due May 27) … $50.30

Odd, considering Spring signed us up for the $13.22/month basic service plan only includes local calling—no other options (including long distance) are part of this plan.

I went over the bill line by line and I finally understand how The Monopolistic Phone Company arrived at such a figure.

First off, the billing period actually covers April–May, and May–June, so it's two months. Even so, it's still twice as much as one would expect. Well, $3.35 of that is due to a miscommunication about what plan we signed up for. Another $5.86 fell under the Government Mandated and Authorized Charges, and break down thusly:

Government Mandated and Authorized Charges
Line # Charge Amount  
5 Charge for Increase in Rates for Federal Universal Service Charge, Due to Changes in the Rules of the FCC (04/06/07–05/05/07) ($.13/mo) .13  
6 Federal Excise Tax 1.34  
7 FL—State Communications Tax 1.06  
8 FL—Local Communications Tax 2.68  
9 Telecommunications Access System Act Surcharge .15 **
10 Emergency 911 Charge. This charge is billed on behalf of Palm Bc Unic County .50 **

The Federal Excise Tax (thank you so much President Clinton for vetoing the repeal of this tax) is 3%. It was a bit confusing, but the two Floria Communications Tax rates are 2.37% for the state taxes (residents are exempt from the state portion of the communications tax, but are subject to the state gross receipts) and 6.02% for the local taxes.

Line 5 is because The Monopolistic Phone Company forgot to bill us at the higher Federal Universal Service Charge Rate for April (it appears to have gone up on April 1st—ha ha–from 63¢ to 76¢).

And lines 9 and 10? Here's what The Monopolistic Phone Company says about those lines:

If you do not pay the rest of your bill, which includes unregulated charges—all of which are identified by ** on your bill:

So, I could avoid paying 65¢ but my (well, Spring's, since the phone is in her name) credit rating will go to hell.


And then there's $14.65 worth of charges:

Surcharges and Other Fees
Line # Charge Amount  
11 Fed Univ Svc Chg ($.63/mo) [note—this is the old rate —Editor] .61  
12 FCC Authorized Charge for Network Access ($6.50/mo) [aka Subscriber Line Charge —Editor] 6.28  
13 Storm Recovery Fee .50  
14 FCC Authorized Charge for Network Access 6.50  
15 Federal Universal Service Charge .76  

[I should note that the bill doesn't quite cover the entire month of April, so that's why some of the figures are a few cents low —Editor]

Hmmm … I'm curious about that “FCC Authorized Charge for Network Services” (also known as the “Subscriber Line Charge”) there. Let's see what the Government has to say about it:

What is the Subscriber Line Charge and why do I have to pay this charge?

The Subscriber Line Charge is a fee that you pay to your local phone company that connects you to the telephone network. Local telephone companies recover some of the costs of telephone lines connected to your home or business through this monthly charge on your local telephone bill. Sometimes called the federal subscriber line charge, this fee is regulated and capped by the FCC, not by state Public Utility Commissions. It is not a tax or a fee charged by the government. The money received from the subscriber line charge goes directly to local telephone companies. To ensure that all Americans can afford at least a minimal level of basic telephone service, the FCC will not allow phone companies to charge more than $6.50 for a single line. More information on the Subscriber Line Charge and other charges on your phone bill.

FCC Telephone FAQ

Isn't that already part of the $13.22/month price we're paying?

Oh wait … there's a definitions part of the bill:

FCC Authorized Charge for Network Access

A charge to recover costs associated with connecting to a telecommunications service provider's interstate network. [emphasis added —Editor]

The $13.22/month plan does not include long distance. In fact, in another part of the bill:

You have elected not to choose a local toll carrier for XXX-XXXX

You have elected not to choose an InterLATA Long Distance Carrier for XXXX-XXXX

We're not making interstate network calls from our phone. So I don't see how the FCC Authorized Charge for Network Access applies in either case. I'd like to hear their spin on this.




“Welcome to The Monopolistic Phone Company; we don't have to care. For English, press one—”


“Please enter the phone number on the account you are calling about.”

Beep beep beep Beep beep beep boop boop beep boop.

“To pay your outstanding balance, please press one. To hear your outstanding balance, please press two. To avoid us from having a real live human to talk to you, please press three. Please press four. … Oh, all right, to wait for the slight chance that you'll even talk to a human, please press five. To hear these options again, please—”


“You may have to give the phone number of the account you are calling about again because we're The Monopolistic Phone Company; we don't have to care.” Five minutes of classical music. I wonder if the RIAA knows about this?

“Hello?” It's a human! Fantasitic!

“Yes, I'm here,” I said.

“Whom am I speaking to?”


“Okay, and what account do you have a question about?”

“The number is XXXXXXXXXXX and the name on the account is Spring Bew.” Yes, the last name is incorrect on the account, but Spring said not to bother changing it since the account is just for DSL anyway.

“Okay, and what is your question?”

I mentioned the miscommunication about which plan we signed up for, and over the course of half an hour of listening to classical music, I was able to recover the #3.35, so that's good. Then I asked them about the “FCC Authorized Charge for Network Access.” “What is that all about?”

“It's a Federal mandated charge for connecting to our network, sir.”

“But I checked the FCC website,” I said. “And it says, ’it is not a tax or a fee charged by the government. The money received from the subscriber line charge goes directly to local telephone companies.’ So, how is that any different than the $13.22 you're charging for the account?”

“It's different, sir, because it's a state mandated charge.”

“A state mandated charge?” What? First it's Federal, now it's state? Methinks the operator knows not what we're talking about.


“Even though it's from the FCC?”

“It's a state mandated charge.”

“But how is that any different than charging me $13.22 for connecting to the network?”

“It's mandated by the state. If you want, you can call the FCC about it.”

“Okay … ”

“The phone number is 1-888-225-5322.”

“Thank you.”

“Is there anything else?”

“No, that's it.” And the call was ended.

Okay, let's see what the FCC has to say about this.

Fifteen minutes of navigating through the FCC phone system, and listening to a definition of the “FCC Authorized Charge for Network Access,” I was able to talk to an actual human there (and for any RIAA moles out there, the FCC phone system plays no music whatsoever when on hold). The operator was sympathetic to what I was saying, but said that the advertising practices The Monopolistic Phone Company engaged in, selling a $13.22/mo plan and tacking on an addtional $6.50/mo, wasn't illegal (note, didn't say “legal”—there's a subtle difference there). It's also not “mandated.” It's optional, and the local phone company can charge nothing for this, but if they do, they can only charge up to $6.50 (more if there are additional lines or a commercial business).

But note that word there—“optional.”

The operator was also surprised when I mentioned that The Monopolistic Phone Company told me it was a state mandated charge. “Congress and the FCC set that charge,” I was told. “You might get some answers if you call the State Public Service Commission. The number is 1-800-342-3552.”

“That's the number for Florida, right?”

“Yes it is.”

“Thanks,” I said. And that call was ended.

Now, on to the Public Service Commission.

Oh, they were closed by the time I got around to calling them.

Guess this will have to wait until tomorrow then.

Tuesday, May 15, 2007

A light delay in my investigative reporting …

I was unable to call the Public Service Commission today as I needed to help light a T1 that was supposed to light last week but was delayed until today, and to help light a Metro Ethernet circuit that we were expecting to light up sometime during the next Ice Age (The Monopolistic Phone Company sure keeps us on our toes).

Perhaps tomrrow …

How desperate do you have to be to spam someone? Part III

After writing about this potential guestbook spammer, I changed the program name for the Obligatory Email Notification script to see what would happen.

Not terribly surprising, Mr. stopped spamming my form. I guess his spamming software was smart enough to handle 404 errors (although technically, I should return a 410 response code but … eh, whatever).

Three days later, and someone else (and I suspect it's someone else, since the email addresses being submitted are “from” colleges and universities, and are not from Gmail, like Mr. was using) is now spamming my Obligatory Email Notification script.

The first spam seemed to be a test (submitted a comment of “Hi My Name Is ivahag.”) but the rest appeared to be the type of spam you would find on a guestbook (“buy this male performance enhancer drug online!”) and at first, I couldn't figure out why the spammer was linking to the faculty page at East West University in Bangladesh.

But then I checked the source code (and this is why I'm not linking to this):

<html><iframe width=0 height=0 frameborder=0
src= marginwidth=0
marginheight=0 vspace=0 hspace=0 allowtransparency=true
<html><iframe width=0 height=0 frameborder=0
src= marginwidth=0
marginheight=0 vspace=0 hspace=0 allowtransparency=true
<html><iframe width=0 height=0 frameborder=0
src= marginwidth=0
marginheight=0 vspace=0 hspace=0 allowtransparency=true
<html><iframe width=0 height=0 frameborder=0
src= marginwidth=0
marginheight=0 vspace=0 hspace=0 allowtransparency=true


Here's how this works.

The spammer plasters links to the faculty page at East West University in Bangladesh in guestbooks for hot search terms based around male fertility drugs. Some poor sap who's Porsche 911 didn't help goes looking for said male fertility drugs and comes across the links to the faculty page at East West University in Bangladesh (due to the page rank generated by all the links) and thinks he's about to score cheap male fertility drugs.

Only what he sees is a list of academics at some obscure university on the other side of the world and goes back to some search engine to locate other sources of male fertility drugs (and Lord knows what type of ads I'm going to start getting from Google AdSense based on this entry). But unbeknownst to our inadequate feeling fellow, his browser has just generated four requests to some site that pays out money based upon page views. Since the page was requested by a real browser, the assumption that said site makes is that someone viewed the page from a link by Mr. Razec (or who's affiliate code is “razec”) and so Mr. Razec's account is credited by some small amount.

Which, over time, adds up.

Neat little scam, isn't it?

So yesterday I changed the names of the fields for the Obligatory Email Notification form, changing email to atthingy and comments (which, if you remember, is a non-displaying <TEXTAREA>) to blahblah and sure enough, Mr. Razec picked up on the changes and spammed the form again.

Only this time, the link he sent is to a guestbook that's already been spammed.

Wednesday, May 16, 2007

“Hey, let me own that for a while!”

Via news from me comes this little fluff piece about the Avis Car Rental company. What I'm confused by though, is the business of Avis—is it car rentals, or being bought out?

The story of Avis goes something like:

Warren E. Avis (1946)

Richard Robie (1954)

Amoskeag Co. (1956)

Lazard Frères Co. (1962)

ITT Corporation (1965)

Avis (1972)

Norton Simon (1977)

Esmark (1983)

Beatrice Foods (1984)

Kohlberg Kravis Roberts & Company (1986)

Wesray (1986)

PHH Group, Avis Europe P.L.C (1986) (see article)

Avis, employee owned (1987)

General Motors 26% ownership (1989)

HFS (1996)

Avis goes public (1997)

Cendant 34% ownership (1997)

Cedant (1999)

Avis Budget Group (2006)

and I'm sure a lot of people got rich along the way, but what exactly did they do?

I mean, other than push some paper back and forth?

Thursday, May 17, 2007



I'm stuck here at a client site, waiting for either G, our Cisco consultant, to call back, or Smirk to return, around 7:30 pm, whichever happens first.

I know what the problem is—I just don't know how to solve the problem using Cisco equipment.

Update a few minutes later

Ah! G just called! He's going to swing by the client site in about half an hour and help us out. Until then, I have to sit tight here.

Thankfully, there's a Linux box I can use in the meantime ...

Friday, May 18, 2007

At the saltmines

Still stuck at the client site.

It's actually been a rather crazy week here at The Company, as Smirk is trying to wrap up as much as possible before a business trip next week.

Today, bonding two T1s together (to make them appear as one 3Mbps pipe instead of two 1.5Mbps pipes) and a pair of new managed switches at another company site, and then finding out their firewall is totally inadequate since it's a consumer model, not one meant to handle a 50+ computer network.

Then, on to the other client site (same as yesterday) to totally reconfigure the site network (shared among three companies—we're providing Internet access to the building they're in), which was something I wasn't expecting, and while there are no show stopping problems, it is taking longer than expected.

One of these days I'll get around to calling the Public Service Commission (perhaps unsurprisingly, it's the same circuits we were dealing with earlier this week).

Saturday, May 19, 2007

I've seen my share of sunrises, but I never get up for them.

We left the client site at 5:30 am.


And we still have a ton of stuff left to do before Smirk leaves for Charlotte next week. Me? I got a ton of equipment to configure for Charlotte.


Spammers—can't live with them, can't take them out behind the shed with a sawed off double barrel shotgun …

I got my very first comment spam today, on my LiveJournal account (which has since been deleted):

XXXXXXXX gives users access to some of the best games and reviews online. No need to waste your time looking for your arcade fix. is the hub of online gaming. Flash, Java and Shockwave powered high-quality games, 24 hours a day, 7 days a week! If you're not sure, you can choose trial!!! Vizit http://XXXXXXXXXXXX/

When I saw that it was authenticated through OpenID (see also: Wikipedia) my initial thoughts were: OpenID is dead. It's just too easy for spammers to set up self-authorizing hosts (or obtain “accounts” at AOL or even LiveJournal).

Perhaps I'm overreacting. Perhaps spammers are only targetting accounts with no (or very little) activity on them (I have the account to respond to friends who do use LiveJournal; my posting an entry once-per-year is mostly a joke). But I do expect to see more and more of this in the future.

Sunday, May 20, 2007

The Odd Couple

In the years that followed and up until his death, he'd come to see me every time he was in California. We'd have interesting philosophical conversations. We'd exchange personal Christmas cards. He'd show me pictures of his grandchildren. I was with him in Florida once when he complained about his health and his weight, so I suggested that he go on a diet that had worked for me. I faxed a copy to his wife when I got back home.

The truth is, the reverend and I had a lot in common. He was from Virginia, and I was from Kentucky. His father had been a bootlegger, and I had been one too in my 20s before I went into the Navy. We steered our conversations away from politics, but religion was within bounds. He wanted to save me and was determined to get me out of “the business.”

Via news from me, Larry Flynt: My friend, Jerry Falwell

Larry Flynt.

Jerry Falwell.


Now that's an odd couple.

I also think it's neat that Larry Flynt has nothing but good things to say about Jerry Falwell, showing that one doesn't have to be a Christian to forgive and forget, or at least, be friends with your enemy.

Yet another restaurant story I can tell

A group of us (Spring, Wlofie, Jessica, her boyfriend Rob and their friend Brian) went to a Chinese/Japanese restaurant in Coral Springs.

When the waiter brought us the check, he mentioned that we caused a fellow member of the wait staff to quit. It seems that when we were seated, the “wrong” waiter was assigned to our table, which upset the “right” waiter so much that he quit, right then, after working there for some twenty years.

Such drama.

And here I thought I left that back in high school.

Monday, May 21, 2007

Small forays into multiprocessing programming

% a parallel sudoku solver.  each cell on the grid is a separate
% process, aware of - and negotiating with - its "neighbours" (those
% cells it must not conflict with).

% a cell is very simple - it contains just two integer values as
% "mutable" state: the current digit and a "confidence" in that value.

% the negotiation protocol is defined below.  cells "ping" the
% controller when the exchange results in a change of value.  the
% controller stops the system when there has been no change in any
% value for CONTROL_TIMEOUT (currently 1s).

% this is terribly, terribly brain-dead and inefficient (takes several
% - sometimes tens of - minutes to solve the test case on my newish
% linux box).  tuning the doubt parameter may help slightly (a value
% of 0.1 seem to work).

% i think some very interesting graphics could be generated from this
% code - think of the solution as a kind of crystallisation, with
% competing centres of nucleation.  please contact me
% ( if interested...

Parallel Sudoku Solver in Erlang :o)

It's an intriguing little program, written in Erlang, to solve a certain class of puzzles (Smirk might find this interesting).

But it does point out the problems of multiprocess coding:

There's a bug. I don't know what it is, but there is one - at least one non-certain cell is stuck at a fixed value.

Parallel Sudoku Solver in Erlang :o)

It's not easy, even in seemingly simple programs.

I came across this little gem of a program (this version in C):

#include <stdio.h>
#include <stdlib.h>
#include <math.h>

#define MAX	32768

int main(void)
  double a;
  double b;
  double c;
  int    i = 0;

  for (c = 2 ; c <= MAX ; c++)
    for (b = 1 ; b < c ; b++)
      a = sqrt(c * c - b * b);
      if (trunc(a) == a)

This counts the number of Pythagorean triples within the first 32,768 integers. An “easy” way to speed up this program is to spread the calculations across mutiple processors. Easy enough, just break the main loop across the number of processors. So a uniprocessor box will do all 32,768 iterations, while a dualprocessor box, each processor will do 16,384 iterations, etc.

The first attempt broke the calcuations like that—1–16,383 on one processor, 16,384–32768 on the second one. And much to my surprise, the runtime went from 28 seconds on a single processor run to just a mere 27 seconds across two processors.

Well then …

It took some thinking about what's actually going on to find out the way to properly portion out the work (which I'll leave as an exercise to the reader to figure out). And even then, the time on a quad-processor box went from 28 seconds running on a single processor to 12 seconds across all four (where upon the expected time would be 7 seconds across all four, and oddly enough, the total user time accumulated went from 28 seconds on a uniprocessor to 44 seconds across all four, which makes accounting sense, but it's still odd to see), so the speed up isn't quite linear.

Even on a problem that seems simple to partition there are still “gotcha's” along the way.

Update on Wednesday, May 23rd, 2007

A reply to this post.

Update on Thursday, May 24th, 2007

How I got the code to work.

Tuesday, May 22, 2007

We've just spent the past two weeks mucking with their network and this is what we get.

One of our connectivity clients keeps insisting that the connection is slow. And for proof, he shows us the results from the Speakeasy speed test.


“See?” he says, pointing to a result that shows 300Kbps speed.

“Okay,” we say, “that just shows the traffic from here to the Speakeasy network in Atlanta. Try the Chigaco test. See? 2.8Mbps. That test means nothing.”

“But they're in the Central Time Zone,” he said. I swear, I am not making this up. “They're an hour ahead of us.” [I think his reasoning was this: it's about 5:30 pm Eastern when he said this, and as people get home, the network starts getting congested. At least, I think that was his reasoning. —Editor]

Sigh. “Okay, try the New York test. See? 2.9Mbps. The test is meaningless.”

So, why is the test meaningless? Because once the traffic leaves our network, we have no control over speed issues. The only meaningful test is one that runs across their connection to our network. Or maybe across our network to the exit point. But that's it.

Okay, we might have some influence with our carriers for the first hop or so into their network, but that's about the extent of it. But nooooooooo! “I paid for a 3Mbps circuit and by God I want 3Mbps to Afghanistan!” (okay, he didn't say that, but I suspect he still didn't believe us)

Murphy was laughing at me all along

We've been battling with client networks for the past week or so, and I think the problems have finally abated. The last spot of trouble was the new Metro-Ethernet circuit. The Monopolistic Phone Company kept insisting it was 10Mbps clean both ways. At best we could get 3Mbps one way, and maybe 300Kbps the otherway (and no, this is a different client).

Smirk was insistant upon a test using a different router, but I was hesitant. I was fed up (so was Smirk) and I felt that doing a test with a different router would be a waste of time. Well, that, and it would be a bitch to configure the equipment to use VLANs (long story short: it takes some coaxing to get Cisco equipment to support VLAN IDs above 1024, yet our Metro-Ethernet connection requires a VLAN ID above 1024).

Since Smirk signs the checks, he won.

We called G, our Cisco consultant for help. “Well Sean me boy,” he said, “let's work through the theory of what we're trying—”

“Sorry G but I don't want the theory. I just want the configuration to test this thing and be done with it.” Had I not said that, it would have taken us another three hours. Don't get me wrong, I like G—it's just that he tends to be loquacious.

“Oh,” said G. “In that case, type … ” and inside of ten minutes we were running a test.

9.7Mbps down.

9.8Mbps up.


Color me surprised.

The Cisco router we were using was defective.

Oh my.


Once that was settled, things wrapped up rather quickly.

Wednesday, May 23, 2007

More forays into multiprocessor programming

"andrew cooke" <XXXXXXXXXXXXXXXXX>
Erlang bugs
Wed, 23 May 2007 08:12:35 -0400 (CLT)


Found your page (which references my Erlang Sudoku solver) via Technorati.

I can't for the life of me remember exactly what the cause was for the bug that you mention in that post, but I am pretty sure it wasn't to do with messaging or otherwise related to concurrency. A better explanation of why it was hard to track down is that the program is largely “indeterminate” in that the flow of control is unpredictable (because of random choices rather than concurrency itself).

However, when I added extra communication for the “community” version——that did have serious deadlock issues that were directly related to concurrency. And I was surprised at how easy they were (ie how easy it was to introduce errors)—I had somehow convinced myself that Erlang made everything much safer. In retrospect its advantage is not that Erlang's message passing somehow magically avoids deadlocking, but that (1) it provides a clean framework for thinking about message passing that's nicely isolated and easy to read and manage and (2) assuming you stick to the pure functional parts of the language, state is already explicit and so easier to reason about.


(Couldn't see a way to comment on the page, so emailing instead)

Just another datapoint that writing concurrent programs, even in a langauge like Erlang which makes it easy, isn't easy.

More steampunk Star Wars stuff

For Jeff Cuscutis: a steampunk Darth Vader mask.

Way cool.

Thursday, May 24, 2007

Small forays into multiprocessing programming II

So, my attempt at parallelizing the Pythagoran Triples program. I rewrote it as a function to make it easier to parallelize:

struct params
  double start;
  double end;
  int    count;

int pythagorean_triple(void *data)
  struct params *p = data;
  double         a;
  double         b;
  double         c;

  for (p->count = 0 , c = p->start ; c <= p->end ; c++)
    for (b = 1 ; b < c ; b++)
      a = sqrt(c * c - b * b);
      if (trunc(a) == a)

That way, I could then do:

; the reason for these structures
; is that threads created with clone()
; only get a single pointer parameter.  
; This way, I can pass in more data 
; using that one pointer.
; And yes, I'm using C.  Nyah.

struct param t1;
struct param t2;

t1.start = 2;
t1.end   = 16383;
t2.start = 16384;
t2.end   = 32768;


And I was surprised that it only took one second less when the processing was split using this method than when it ran not split at all.

I ran it several times, and yes, both threads were being created, but one was finishing way sooner than I expected. It was then that I realized the reason—it takes less time to count to a thousand than it does to thirty thousand.


Obvious in hindsight.

Basically, thread one was doing:

for (c = 2 ; c <= 16383 ; c++)
  for (b = 1 ; b < c ; b++)
    ... ;

but thread two:

for (c = 16384 ; c <= 32768 ; c++)
  for (b = 1 ; b < c ; b++)
    ... ;

Now … how to split the load evenly between two (or more) processors? Obviously splitting the range in half wasn't cutting it, but is that the only way to split the workload? What if I were to have one processor do even numbers, and the other one odd numbers? Something like:

for (c = 2 ; c <= 32768 ; c += 2)
  for (b = 1 ; b < c ; b++)
    ... ;

for (c = 3 ; c <= 32768 ; c += 2)
  for (b = 1 ; b < c ; b++)
    ... ;

Yeah, that might work.

And it did—the workload was evenly distributed across the processors. The code slightly changed though:

struct params
  double start;
  double end;
  double delta;
  int    count;

int pythagorean_triple(void *data)
  struct params *p = data;
  double         a;
  double         b;
  double         c;

  for (
        p->count = 0 , c = p->start ; 
        c <= p->end ; 
        c += p->delta
    for (b = 1 ; b < c ; b++)
      a = sqrt(c * c - b * b);
      if (trunc(a) == a)

  struct params t1;
  struct params t2;

  t1.end   = t2.end   = 32768; = = 2;
  t1.start = 2;
  t2.start = 3;


This concurrent programming certainly requires a different way of thinking about things. And obvious ways of splitting up workloads don't always work out as expected.

Friday, May 25, 2007

“Stop all this silliness at once!”

Okay, LOLCATS has gone on long enough. Can I please have my computer scientists back please?

Saturday, May 26, 2007

I am so going to hell over this

I have a few friends who will get a kick out of this Flash game (especially Rob, my old roommate). But let me say, that Satan is a very worthy adversary, so beware.

Sunday, May 27, 2007

IP Maps

Via a comment at Strange Maps, I came across this neat IPv4 Map (which is based off this xkcd IPv4 map). What's neat is that this map shows you the ownership of IP blocks. It also allows you to zoom in to see the finer detail of ownership (for instance, Level 3 Communications owns, but has leased out to Verizon).

I think Smirk will like this.

Monday, May 28, 2007

A Lazy Memorial Day Celebration

It was a calm Memorial Day today. The plans originally called for us going to the Palm Beach Zoo (free admission to anyone showing a Military, Military Reserve, Coast Guard, Police, EMT, Paramedic or Fire ID card), followed by grilling burgers, and then a Memorial Day Concert in Boca Raton.

But as the old military saying goes: no plan survives first contact with the enemy, and our plans were no exception (“So … so … who's the enemy?” “Shut up!”). We ended up at Bunny's house grilling burgers and just hanging out all day.

And I think that suited all of us just fine.

Tuesday, May 29, 2007

This is what I get for trying to prove to myself that I'm not lazy.

You know, I thought, I'll get gas later. I get gas at Costco, and while Costco is on the way to Boca Raton, right on the corner of Lantana Road and I-95, it's not on the way. You have to turn left off Lantana onto a side street, then enter Costco on one corner of the lot. The gas station, however, is on the opposite corner of the lot, which requires some deft navigation, since the law in Florida is that “thou shalt make a labyrinth of thy parking lot.” Then the same deft navigation to get out of the Costco lot, back on the side street, then a left onto Lantana Road and an immediate right onto I-95. It's too much of a pain, I thought.

Then another thought from some other part of my brain forced its way to center stage: Boy, are you lazy. And because of that thought, I thought You know, you're right! Just for that, I will get gas!

So I turned onto the side street, into the Costco lot, deftly navigated my way to the opposite corner through a crowded parking lot only to find the lines at the gas station wrapping back around the main Costco building. It was like 1973 all over again.

Screw this, I thought, I'll get gas later as I turned around amidst blaring horns in an attempt to deftly navigate through the Costco lot to the exit.

I then mentally beat up that part of the brain that called me lazy.

Finally on my way to Boca Raton, I noticed that the traffic today was unusually heavy, especially given the time of day. What? I thought. Don't these people have jobs? Now I realize that Florida is one of the major tourist attractions in the United States, but Tourist Season™ is well past and now we're getting to late spring, early summer, when the alligators start to sweat. A tourist with any brains whatsoever should have left a long time ago.

What gives?

A frightening minor epiphany on computer user interfaces

But most systems these days are not designed with linguistic operation in mind. If you have to manipulate the same stuff in the same order every day, you'd welcome being able to reduce that to a single line command (or even batch script) You'd take the effort to learn.

The Return Of The Command Line

I had a minor epiphany when I read that, one that put (shudder) control panels into a new light. I'm still pondering the implications of said minor epiphany, but to quickly get it out: the GUI (and (shudder) control panels by extension) were created to give the end user a consistent, simple and largely non-abstract metaphore for using the computer, but more importantly, one that promotes a shared environment between users (I'm flying blind here, trying to get this out, and “shared environment” isn't quite the right word, but it's close enough for now). By that, I mean that Alice can sit down at Bob's computer and still manage to interact with it without problem.

One could argue that a command line is just as “sharable” an experience as a GUI, but in my experience, it isn't.

Back in FAU, I knew a guy that littered his Unix account (a command-line account, by the way) with scores of shell scripts (“batch scripts”) to do all sorts of things. And these weren't large shell scripts either—they were all one or two line scripts that did stuff like, oh, list the contents of the temporary directory, or search through all files for a particular term and have the output paged. But it wasn't like I couldn't use his environment (say, he asked me for some help) as I could just bypass his score of “commands” for the more tranditional ones one finds under Unix, but our common language wasn't there. He'd type in one of his “commands” and I would have no idea what exactly it did. I would type out a rather long command line, piping the data between Unix commands, and he would look at me like I was crazy for doing all that typing.

It's hard to say it was a culture clash, since we were both “using” Unix, but it was certainly a style clash.

And this “cultural” or “style” difference bit me again years later when Smirk was hired to run a small ISP, and I tagged along as “Unix Sysadmin.” The previous sysadmin wrote extensive scripts to manage the systems in question, and left precious little documentation. These scripts often massaged critical configuration files, and the actual “master” copy was stored somewhere else on the system (most of the time, in the old sysadmin's home directory). Often times I would fix something only to have it break when one of his scripts ran (through cron, or by one of the remaining tech support crew).

In other words, while I developed one way of “talking Unix,” the guy in college developed another way of “talking Unix” and the previous admin of the ISP developed yet a third way of “talking Unix.” And none of us got along (so to speak). This “cultural divide” wasn't on the order of, say, the Queen's English vs. American English, but more like the divide between American English and Bavarian German—the roots are the same, but you'd hardly know it—dialect continuum in the extreme.

GUIs, on the other hand, restrict the language available to the user, thus enforcing an interactive conformity—much like L'Académie française does for the French langauge (or rather, tries to do). It's not so much about enhancing productivity as it is usability in general (or communication, take your pick).

This minor epiphany is actually frightening to me, because looking over my history here, I've decried the language drift and incomprehensibility occuring between hard core Unix users, as well as decried (over and over again, ad nauseam) control panels for restricting how I can interact (and fix usually) the computer.

And like I said, I'm still pondering this.

Wednesday, May 30, 2007

… on the other hand, if it was an IBM Model M …

I metioned a steampunk keyboard a few months ago, and now, it looks like someone is actually making and selling them (link via shadesong). But even though these are made with modern USB keyboards and not an IBM Model M like the original, it's probably still in the “if you have to ask, you can't afford it” range.

Ah well …

Thursday, May 31, 2007

I learned this lesson years ago

It was October of 1998. I was sitting in my cubicle when Chuck, my partner, walked by and dropped some papers in front of me.

“Could you please take care of this,” he said. “Mmmm-kay? Thanks. Bye.” He then wandered off to terrorize the sales department.

I read the papers in front of me, and was rather alarmed to find out I had been served a cease and desist letter from some law firm representing the company that owns the trademark to “Welcome Wagon®” who took exception to this particular page on my site.

Now, at the time, I was working for Armigeron Information Services, Inc and my personal website at the time was appearing under the URL of I think that the fine people who owned the trademark Welcome Wagon® took offense that my use of Welcome Wagon® fell under a commercial site and using due diligence to protect the Welcome Wagon® trademark, sent Chuck, as owner of Armigeron Information Services, Inc., a cease and desist letter. Now, because the particular page fell under my personal website there on the company site, the letter got passed to me to take care of.

I had no idea that “Welcome Wagon®” was a trademark!

I didn't even create those pages!

I was hosting those pages as a favor to a group of people hanging out in the USENET group alt.society.generation-x of which I was an active member at the time.

It was at that time that I registered my own domain, (since the obvious choices,, and, were already taken), and moved my site from to and configured the company website to send permanent redirects from the old location to the new location (and thus, that's why my personal pages appear under /people/spc/ under my own domain).

That was apparently appeasement enough for the owners of Welcome Wagon® since I've never heard back from them in the nearly nine years since.

I learned two important lessons that day:

  1. companies, no matter how benevolent, will not help litigate that which they do not fully control (in this case, my personal pages under the Armigeron Information Services, Inc. website) and
  2. it's always to your advantage to have your own domain if you want to have any significant Internet presence.

So it's with bemused detachment that I watch the public fervor over LiveJournal suspending accounts willy-nilly. As I posted on a friend's locked journal entry at LiveJournal:

I'm aware of the situation, and I'm of two minds on it. If the accounts deleted were free, then well, you get what you pay for. It would be nice if LiveJournal notified free users of the account being blocked, or whatever, but not legally necessary. If they were paid accounts, then yeah, LiveJournal has some 'splaining to do, and may have acted heavy handed.

But bookshop's 7 Day Response plan is just way over the top. Dude, download the LiveJournal code base, and set up your own fanfic LiveJournalesque site. You perceive a demand for it, and LiveJournal has shown they're not interested. Pick up the market! Make money! It's the American Dream!


This is one reason why I maintain my own server. I'm not beholden to some large faceless corporation to maintain my data for me (then again, I am beholden to a corporation that houses my server, but that corporation is The Company, so I have a bit more autonomy than if I had a sever at, say, DreamHost—and believe me, I am very grateful for that).

To those who can't maintain their own server (or can't afford their own server), I can only say, “read the fine print closely” (“The Bold Print Giveth, and the Fine Print Taketh Away”) and make sure you understand exactly what you are getting into and you can't do, and the company whose services you are using, can do (years ago, I got an idea that involved the use of Moveable Type, but when I read the fine print I realized that I couldn't do what I planned as Six Apart would sue me out of existence).

And another tip: the Internet treats censorship as damage and routes around it. And there's probably money to be made in that …

Update on Thursday, June 7th, 2007

Since writing this, Six Apart has announced a licensing change for Moveable Type---it's now open source under the GNU GPL.

Figures it would change after I mention it.

Alas, it's also not based upon the IBM Model-M

It looks like it took two years, but Optimus Maximus keyboard is for sale! (link via spin the cat) They even have a demo of the keyboard so you can see how it works.

Unfortunately, it's a bit pricey; at $1,600.00, I don't think I'll be getting one any time soon …

“That's your problem!”

It's been over a week since I mailed in my Netflix rental and I still haven't received my next film. Curious to see if it may have been lost in the mail, I check, and oops—my Netflix queue is empty!


Obligatory Picture

[The future's so bright, I gotta wear shades]

Obligatory Contact Info

Obligatory Feeds

Obligatory Links

Obligatory Miscellaneous

You have my permission to link freely to any entry here. Go ahead, I won't bite. I promise.

The dates are the permanent links to that day's entries (or entry, if there is only one entry). The titles are the permanent links to that entry only. The format for the links are simple: Start with the base link for this site:, then add the date you are interested in, say 2000/08/01, so that would make the final URL:

You can also specify the entire month by leaving off the day portion. You can even select an arbitrary portion of time.

You may also note subtle shading of the links and that's intentional: the “closer” the link is (relative to the page) the “brighter” it appears. It's an experiment in using color shading to denote the distance a link is from here. If you don't notice it, don't worry; it's not all that important.

It is assumed that every brand name, slogan, corporate name, symbol, design element, et cetera mentioned in these pages is a protected and/or trademarked entity, the sole property of its owner(s), and acknowledgement of this status is implied.

Copyright © 1999-2024 by Sean Conner. All Rights Reserved.