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.

Monday, Debtember 09, 2019

Cards of Woo-woo

The majority of Dad's books were about, in order of volume, golfing, Buddhism, mental health, and poker (including this one by the same guy that wrote The Neo-Tech Discovery). But then Bunny came across one that is so out there it's way past left field—Introduction to the Cards: A comprehensive guide to understanding the ancient science of a deck of cards (here's the website for the curious—I could not find the “book” on Amazon, curiously enough). I could understand if Dad thought it had something to do with the mathematics of cards or poker, but even a cursory glance at it reveals it's nothing but Tarot with regular playing cards. It's hard to take this seriously. Even the the book itself doesn't take itself seriously: “Cards of Illumination Inc. takes no responsiblity for any interpretations presented.”

Wow.

I wonder what made Dad pay $5.00 (back in October of 2007) for this? Were the authors cute or something? What an odd find.

Thursday, Debtember 05, 2019

Attack of the feed fetchers

A question about my JSON feed prompted me to look a bit closer at the requests being made.

JSON feed requests per user agent
requests agent
3723 Ruby
306 Mozilla/5.0 (compatible; inoreader.com; 1 subscribers)
14 The Knowledge AI
12 Mozilla/5.0 (compatible; SeznamBot/3.2-test1; +http://napoveda.seznam.cz/en/seznambot-intro/)
10 Mozilla/4.0 (compatible; MSIE 6.0; Windows NT 5.1; SV1)

That “Ruby” agent is not only requesting the feed every 10 minutes, but doing so from the same IP address. It's excessive and it inflates the apparent popularity of the JSON feed, but it's not enough to get me to ban it, although it doesn't need to be quite so aggressive.


Nothing to see here, citizen … move along

So The Ft. Lauderdale Office of the Corporation is having a holiday lunch tomorrow. I'm checking the email that was sent announcing it to get the address, when I notice the link to the restaurant's website. Curious, I click on the link only to get:

Secure Connection Failed

An error occurred during a connection to serabythewater.com. PR_CONNECT_RESET_ERROR

The page you are trying to view cannot be shown because the authenticity of the received data could not be verified. Please contact the website owners to inform them of this problem.

Learn more…

Report errors like this to help Mozilla identify and block malicious sites

And no option to ignore the error and view the site anyway. So I decide to try loading the non-secure version of the restaurant's website and got:

Web Page Blocked

Access to the web page you were trying to visit has been blocked in accordance with company policy. Please contact your system administrator if you believe this is in error.

User: XXXXX­XXXXX­XXX

URL: XXXXX­XXXXX­XXXXX­XXXX

Category: malware

Oh … really?

And in apparent unrelated news, it appears we are no longer capable of logging into Linked­My­Face­Me­Space­Book­We­In from The Ft. Lauderdale Office of the Corporation. I have to wonder if the network changes last week have anything to do with this …

Wednesday, Debtember 04, 2019

The not-so-great car caper

We finally worked out what to do with Dad's car—we called a wrecking comapny and they came by to take it away. Since we never did find the title, the wrecking ompany couldn't buy it, but by the same token, they didn't charge us a dime to take it away, and it saved us the trouble of leaving it burning on the side of I-95. So a win-win all around.


It was 20 years ago today

It's amzing to think I've been doing this whole blog thing for a whole twenty years. When I started, I had been reading several “online journals” for several years and the idea of doing that myself was intriguing. As I have mentioned, the prospect of a temporary job in Boston was enough to get me started, both writing the blog, and the codebase for mod_blog, which was somewhat based on the work I did for The Electric King James Bible.

I recall spending way too much time writing the code, trying to get it perfect and worrying if I should use anchor points to intrablog links or how to automatically generate the archive page and how it should look. After nearly two years, I had enough, did the simplist thing I could and finally released the first version of the code sometime in October of 2001. And for the record, that release of the code did not use anchor points for intrablog links (and I still don't—that was the correct call in retrospect), it didn't bother with automatically generating the archive page (and it still doesn't—I have a separate script that generates it) and this is what the archive looks like today (you can see that 2012 was the year I blogged the least).

I also don't think there's a single line of code in mod_blog that hasn't been changed in the twenty years I've been using it. I know I've done a few major rewrites of the code over the years. One was to merge the two separate programs I had into a single program (to better support the web interface I have, which I think I've used less than 10 times in total), I think one was to put in my own replacement for the Standard C I/O and memory allocation functions (I don't recall if my routines were in place from the start, or I later replaced the standard functions—the early history of the code has been lost in time, like bits in an EMP blast) but I did rip them out years later in another rewrite when I finally realized that was a bad idea. I switched to using Lua for the configuration file (an overall win in my book) and a rewrite of the parsing code meant that the last of the original code was no longer.

But despite all the code changes, the actual storage format has not changed one bit in all twenty years. Yes, there is some additional data that didn't exist twenty years ago, but such data has been added in a way that the code from twenty years ago will safely ignore. I think that's pretty cool.

A few things I've learned having written and maintained a blogging codebase, as well as blogging, for twenty years:

  1. Do the simplest thing that could possibly work” is sound advice. I was trying to figure out everything when I started writing the code and it turns out half the ideas I wanted would not have been a good idea long term. I was also taking way too long to write the code because of trying to deal with issues that turned out to be non-issues.

  2. The storage format is probably more important than the code. The program can change drastically (and the code today has nothing left in common with the code from twenty years ago) but I don't have to worry about the data. It also helps that everything is stored as text, so I don't have to worry about things like integer length and endianess.

  3. All entries are stored in HTML, and always have been. Markdown didn't exist when I started blogging, and even if it had, I don't think I would have used it (I'm not a fan). By having all my entries in HTML, I don't have to worry about maintaining an ever evolving markup language rendering previous entries unrenderable, or being stuck with a suboptimal markup format because of the thousand previous entries (or even 4,974 entries, as of the time of this entry). It does mean that rendering the blog for a non-HTML platform is a bit harder, but possible (and I'll be talking about this topic more in the near future).

  4. My PageRank is still high enough to get requests from people trying to leach off from it. Partly this is because my URLs don't change, and partly from longevity. But it's also possible because I'm not trying to game the PageRank system (which is a “tit-for-tat” arms race between Google and the SEO industry) and just keep on keeping on.

  5. I gave up on dealing with link rot years ago. If I come across an old post with non-functioning links, I may just find a new resource, link to The Wayback Machine or (if I'm getting some spammer trying to get me to fix a broken link by linking to their black-hat-SEO laiden spamfarm) removing the link outright. I don't think it's worth the time to fix old links, given the average lifespan of a website is 2½ years and trying to automate the detection of link rot is a fools errand (a page that goes 404 or does not respond is easy—now handle the case where it's a new company running the site and all old links still go a page, but not the page that you linked to). I'm also beginning to think it's not worth linking at all, but old habits die hard.

  6. I maintain a list of tags for each entry. It's a manual process (I type the tags for each entry as I'm writing it) and it's pretty much free-form. So free-form that I currently have 9,597 unique tags, which means I have nearly two unique tags per entry. And despite that, I still have trouble finding entries I know I wrote. The tags are almost never what I want in the future, but I just don't know what tag I think I'll need in the future as I'm writing the entry.

    For instance, it took me a ludicrously long time to locate this entry because I knew I used the phrase “belaboring the inanimate equus pleonastically” somewhere on the blog, but the tags were useless. The tags for that particular entry were “control panels,” “rants,” and “Unix administration.” The tags “inanimate equus” or “pleonastically” never appeared (although that is being rectified right now in this post). I don't think this issue is actually solvable.

  7. Writing entries still takes longer than I always expect, and it's still not uncommon for me to visit around two dozen web sites to gather information and links per entry (which I'm not sure are worth it anymore, per the point above). I've tried to make this easier over the years, but I'm still not quite happy with how long it takes to write an entry.

  8. I find the following amusing:

    Popularity of the various feeds of my blog over the past month
    Format #requests last month
    JSON 4,093
    RSS 3,691
    Gopher 3,305
    Atom 1,458

    Gopher is surprisingly popular.

So, twenty years of a blog. Not many blogs can say they've been around that long. A few (like Flutterby or Jason Kottke) but not many.

And here's to at least twenty more.

Tuesday, Debtember 03, 2019

You know the process of the process is to process the process to ensure the process has processed the process

Yeah, I know, I wasn't going to talk about it again but alas, 'tis the season for self-evaluation and all that fun HR stuff. The major difference from last year is that the management this year isn't quite as … um … aggressive as last year, and my current manager (who was just a fellow cow-orker but promoted to management this year) was there last year during my self-review meltdown. He knows what I went through so he can run a bit of interference for me.

I spent the day basically copying what I had from last year (only in different words) and including referneces to all the trouble tickets I worked on this year. That should be good enough to get through this year.

I hope.

Saturday, November 30, 2019

Another minor issue with DoH

So I'm still having issues with my DoH implementation—this time it's Firefox complaining about not finding a server. I modified the script to log the request and response and as far as I could tell, the addresses were being resolved. It's just that Firefox was refusing to use the given answers. And trying to find an answer to “firefox server not found” is a futile exercise these days, giving me years old answers to issues that weren't quite what I was experiencing.

It's all very annoying.

But in looking over the script, again, I had a small epiphany.

local function output(status,data)
  if not data then
    io.stdout:write(string.format([[
Status: %d
Content-Length: 0

]],status))
  else
    io.stdout:write(string.format([[
Status: %d
Content-Type: application/dns-message
Content-Length: %d

%s]],status,#data,data))
  end
end

The code is running on Unix. By default, the “end-of-line” marker is just a line feed character. But the HTTP specification requires both a line feed and a carriage return character to mark the “end-of-line.” Given that the script works most of the time, I thought Self, perhaps there's a different codepath that is a bit more pedantic about the HTTP specification these particular sites hit for whatever reason. I changed the code:

local function output(status,data)
  if not data then
    io.stdout:write(
        string.format("Status: %d\r\n",status),
        "Content-Length: 0\r\n",
        "\r\n"
    )
  else
    io.stdout:write(
        string.format("Status: %d\r\n",status),
        "Content-Type: application/dns-message\r\n",
        string.format("Content-Length: %d\r\n",#data),
        "\r\n",
        data
    )
  end
end

And immediately, the sites I was having problems with started loading reliably in Firefox. Hopefully, this is the last bug with this service …

Friday, November 29, 2019

The Great Car Caper

We're still working out my Dad's estate and today Bunny and I decided to get the car from his place to Chez Boca. This was complicated because:

  1. his car was never registered in Florida;
  2. it still has a California plate;
  3. said plate has been expired for over two years;
  4. which means the registration has been expired for over two years;
  5. and we still haven't found the title to the car.

Fun times.

We worked out that Bunny would drive us to Dad's place, and I would drive back with the car, with Bunny following closely behind to obscure the expired California tag on the car. Even so, I was expecting the following scenario to play out:

Sean
Hello, Officer!
Officer
Driver's license, registration and proof of insurance, please.
Sean
Certainly. Here's my driver's license. Here's my proof of insurance. The car is not mine, but it did belong to my dad—here's his driver's license. He recently died, here's his death certificate, and my birth certificate to show that I'm his son. Also, I can't locate the registration to this car, which is expired, but I did find the bill of sale …
Officer
Sir, step out of the car.
Sean
Officer?
Officer
Sir, I have to ask you to step out of the car.
Sean
Oh bother …

Instead, it went more like this …

Sean
What the? He has an alarm?
Bunny
Hit the button on the fob! This one!
Sean
Thanks. Oh great! The interior lights don't work.
Bunny
I hope the battery is still good.
Sean
It started!
Bunny
Good!
Sean
But it's out of gas!
Bunny
We should have gone back for the gas can! I can't believe we forgot it! There's a gas station just around the corner.
Sean
Okay. Um … we best hurry, I'm not sure how much gas I have left.
Bunny
Okay.
Sean
Okay Bunny … why are you standing around? Get in the car … in the car … okay good! She's backing up … a bit more … a bit … oh, she's going first, okay. Let me back up and … um … Bunny? Go forward … forward … are you … are you turning around? Why are you turning around? I'm going to go that way … why? Aaaaah! Okay, got around her. I can drive to the gas station.
Sean
Oh, I don't know what side of the car the gas cap is on. Okay, I think that gas pump symbol means its on the passenger side. Let me pull up, stop the car and … no. It's on the other side. What? I've set off the alarm again? Sigh. Let me navigate around …
Sean
Okay, how do I open the fuel filler door? No visible latch. Pushing on the door doesn't open it. Oh, don't tell me there's a switch inside the cabin. Sigh. Okay, where's the latch? Oh, there. And it's not working. Oh, don't tell me the car has to be on for it to work? And it's still not working! Hey! What's with this seat? I'm being crushed by the seat! What the—
Sean
Okay, maybe there's a latch in the trunk to open the fuel filler door … okay, the trunk button on the fob isn't working … let me try the key … let me try the other key … let me try … oh yes, none of the buttons in the cabin will open anything. Okay … maybe I can borrow a crow bar …
Bunny
I didn't know there was a gas station here!
Sean
This is the gas station around the corner, right? And why did you turn around back at the apartment?
Bunny
No, there's one over there! And because that gas station was that direction. Have you filled up already?
Sean
Oh XXXX no. Try opening the fuel filler door.
Bunny
Um … okay is there something in the cabin? Oh, here … is it open?
Sean
Nope.
Bunny
Did you try opening the trunk?
Sean
Couldn't open it.
Bunny
Let me try. Oh, I guess you loosened it for me.
Sean
Oh, that's what I'm looking for—the “fuel filler door release emergency handle!” Good Lord!
Bunny
You good now?
Sean
Yes. Let me fill up and we can get going.
Bunny
Also, your head lights weren't on.
Sean
They were on!
Bunny
No they weren't.
Sean
See … oh, they aren't on.
Bunny
Now they are.
Sean
But those are the high-beams! I can't drive here with the high-beams on!
Bunny
You can't drive without lights! Just keep them on!
Sean
But …
Bunny
Just do it.
Sean
Okay, Nike.
Bunny
I'll follow you home.
Sean
Okay, I have enough fuel, I have the seat under control, now how the XXXX do I get out of here? Man, I can't see through this windshield, let me clean it … oh lovely! No fluid and the wipers are scraping across the windshield. Grrrrrrrrrr.
Sean
Oh Good Lord! The “check engine” light is on, the “parking break” light is on? What? Okay, where's the lever or button for that? Oh there … and it does nothing. Let me call Bunny … Hello?
Bunny
Hello! Where are you?
Sean
I'm on Dixie Highway headed home.
Bunny
I thought I was going to follow you home!
Sean
At this point, I just want this to be over! The dashboard is lit up like a Christmas Tree and I don't think the parking break works, so I don't think I'll be able to park in the driveway.
Bunny
Just park in the driveway. It'll be fine enough.
Sean
Okay.

Other than blinding everbody else on the road, a dirty windshield that I could barely see through, over 211,450 miles on it and a dash board light up like a Christmas Tree, nothing else happened on the way back to Chez Boca. Although the thought of leaving it burning on the side of I-95 has crossed my mind …

Sunday, November 24, 2019

The major reason why Intel needs to twist the tail of a Pentium so it will go 50 MIPS is because 45 of them are LOAD and STORE.

Via Lobsters comes this brief historty of the x86 architecture and the 1,000 ways to move data between registers, and by 1,000 ways, it really is 1,000 ways. Mind boggling. These days, the x86 has exceeded any known definition of CISC and is now into LICISC territory.

It's also interesting to see just how far back the x86 line goes—it pretty much starts with the Intel 4-bit 4004 back in 1971. So it seems we're running a 64-bit extension over a 32-bit extention over a 16-bit redesign of an 8-bit computer based on a 4-bit computer from a 2-bit company with just one CPU line. Nice.

Obligatory Picture

[It's the most wonderful time of the year!]

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: http://boston.conman.org/, then add the date you are interested in, say 2000/08/01, so that would make the final URL:

http://boston.conman.org/2000/08/01

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-2019 by Sean Conner. All Rights Reserved.