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.
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: XXXXXXXXXXXXX
URL: XXXXXXXXXXXXXXXXXXX
Category: malware
Oh … really?
And in apparent unrelated news, it appears we are no longer capable of logging into LinkedMyFaceMeSpaceBookWeIn 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:
“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.
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.
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).
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.
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.
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.
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.
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:
- his car was never registered in Florida;
- it still has a California plate;
- said plate has been expired for over two years;
- which means the registration has been expired for over two years;
- 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.