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.

Saturday, September 06, 2025

Notes on an overheard conversation of two people opening a package

“Oh, it's a mug from Sunny Farms, in Sequim, Washington.”

“It's pronounced ‘skwim.’”

“Pardon?”

“It's pronounced ‘skwim.’”

“So, you're saying the ‘E’ is silent?”

“Yes.”

“…”

“It's Washington! What can I say?”

Sunday, September 07, 2025

There's a van Gogh joke in here somewhere

Bunny went to the local Michaels Craft store to pick up a project, and she returned with a small gift for me:

[An image of a pencil eraser in the shape of a human ear] “'Ere you go! Earase to your ear's content!”

An eraser (or as it states on the package, a gomme à effacer) in the shape of a human ear. And it also appears not to be for kids between newly born and 12 years old if I'm reading the small graphic icon in the corner of the package correctly. Maybe not for kids less than a year old? I don't know, it just has a small kid face with the text “0–12,” encased in a circle with a slash.

I … don't know what to say, other than “Thank you!” but aside from that … I have nothing.

Thursday, September 11, 2025

Some musings on the Metric system

I just watched this amusing video “Why Didn't America Go Metric? Now I Finally Get It” where Busted Knuckle Woodworks goes into the history of the matric system and why the US doesn't use it. Yes, it goes into the whole “pirates stole the metric system from the US” story, but it also mentions the late 1800s Pyramid Power movement that also put the kibosh on the metric system here in the US (and one I had not heard and sadly, such mystical thinking is still very much in the main stream). And it's interesting that the Imperial System is still in main stream use in the UK.

But one advantage I see for the Imperial System is that it's mostly based on factors of two and three, like two cups per pint, two pints per quart, three teaspoons per tablespoon, and three barlycorns per inch. The downside of that advantage is the sheer number of units available, like drams, furlongs, pennyweights and gills. I don't think it's that bad though.

For instance, the chocolate ice cream recipie I've been using contains the following ingrediants:

In the metric system, you get some really weird values though:

I think the amount for cocoa powder is correct, as I found answers from 75‥95g of cocoa powder per cup, and as I like chocolate, I used ¾ the upper value.

I suppose one could get by with:

for more “round” amounts in metric. I do wonder if such rounding up (or even down) might affect the results though (probably not). Personally, I find the Imperial version easier to remember, but that might be bias on my part.

Wednesday, September 17, 2025

To think that my previous pair of glasses lasted nearly twenty years, and yet my current pair almost two

So there I was, sitting in the Compute Room at Chez Boca cleaning my glasses. I was holding them in my left hand, and I had finished cleaning the left lens and had started cleaning the right lens when …

SNAP—

I now had a literal pair of glasses. The bridge on my glasses had snapped cleanly in half.

Well, gosh darn it, I thought to myself. What I said out loud, though, was “XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­X!”

I did my best tape job, and then Bunny drove us (because I wasn't about to drive with a pair of glasses that might fall apart at any second) to the store where I had purchased my glasses.

Of course they don't sell those frames any more. They still sell Flexon frames, just not the ones I have. And because they can't just take the existing lenses and recut them for new glasses (because I now have progressive lenses) it'll take a bit over a week for the new glasses to be ready.

Aaaaaaaaaahhh!

In the meantime, it was suggested I try going to a jewelry store to see if they could temporarily solder the two halves together, because the clear tape clearly wasn't cutting it.

So then Bunny and I went to a nearby jewelry store, and while they didn't have the equipment to do that, they did suggest we head out to International Jewelers Exchange out in West Boca. It's a large, flea-market like jewelry store with multiple merchants inside, some of which do repairs.

West Boca and the International Jewelers Exchange it is!

Asking around, we found Mike, who also does eye glass repairs. When he saw the glasses, he had bad news for us. “That's titanium—my equipment doesn't get hot enough to properly repair it,” he said. “You can try the laser and welding store upstairs, they might have the proper equipment.”

So we trudged upstairs to the laster and welding store and asked. “Sorry, no,” that guy said. “I mean, we can try soldering titanium, but any slight pressure and ‘POP!’ it will fail. Our equipment just isn't hot enough to properly handie it.”

Well, I thought, gosh darn it. This time, I managed not to say “XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­X” out loud.

So now I'm back home at Chez Boca. The 3M micropore tape and a small segment of a toothpick for structural support appears to be working, although my glasses are now a bit floppy. But it's holding, and it should be fine until next week.

XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­XXXXX­X!”

Wednesday, September 24, 2025

I wonder how long it will be until my new registrar is bought out

Over a week ago, I saw the registrar that Dan Lyke uses was bought out (at least he got the memo) and it prompted me to look at alternative registrars. After some consideration, I signed up with Porkbun, a registrar out of the Pacific Northwest. They're about half the price of Network Solutions, and they don't upsell on every link, which is nice. And also unlike Web.com and Network Solutions, they make it easy to update credit card information so you can, you know, give them money!

So on the 16th, I logged into Network Solutions to start a domain transfer. I picked a domain that wasn't that important to me just to test the process out and get a feel for how it works.

First, Network Solutions said it wouild take up to three days to generate a transfer token, but it was more like five days. Then they took yet another four days to give me time to ponder my decision to leave them (no! I want to leave now!). But once the nine days were over, the domain transferred without incident. I just have to be paitent with Network Solutions.

Now it's just a matter of transferring the rest of my domains over.


Now that's a keyboard

Via Lobsters, I came across this incredibly insane Japanese keyboard:

[A closeup of a gargantuan Japanese keyboard] Just this portion of the keyboard represents only 6% of all the keys

The photo itself is from DeskThority, and it's described as an an Alps CP10SJ550A kanji keyboard from Japan. It has 542 keys and weighs around 27 pounds (12kg for those with a sane measurement system). It's an insane keyboard, and … I kind of want one.

I'm not sure what I would use it for. I suppose I could map each ASCII code to its own key, map syntatic constructs for multiple languages to its own key, and still have some left over for … oh … I don't know … simulating a piano.

I don't even know where one would get such a keyboard, but I'm sure Bunny can find one in time for Christmas (muahahahahahahaha!).

Thursday, September 25, 2025

Maybe these will last longer than two years

Eight days later and I finally have my new glasses!

[Self-portrait with new glasses] Glasses.  Titanium, not steel.

I no longer have to tape them to my head to keep them on. Even better, I can now clean my glasses with cursing like a sailor.

Woot!


This is my markup language. There are plenty of others, but this is mine

The Lobster's Blog Carnival is up, and the theme is “What have you made for yourself?” While I have plenty of programs I wrote, there's one that I specifically wrote for my own use: MOPML.

I wrote it to make writing blog entries easier for me. For twenty years, I was hand-crafting HTML for each entry and I finally got tired of it. I wanted an easier way to make entries, so I started down the path of implementing my own markup language. Existing languages like Markdown or AsciiDOC didn't appeal to me and were a bit too generic in how they did things. I also wanted to steal ideas from TeX and Org Mode, as well as some ideas I had to support tags like <ABBR> (which not many sites bother doing).

As I already had twenty years of entries in HTML, one design goal was not to store the entries as MOPML, but to keep them their final HTML-rendered state. This meant that I could play around with the syntax of MOPML and not have to worry about breaking existing entries. Besides, if I had to edit a post after publication, I can edit the HTML directly; I have been doing that for years anyway. For the impementation, I chose Lua, specifically so I could use LPEG.

The TeX inpsired syntax are for items like M-dashes, where I can type three dashes like --- and get a single M-dash on output: —. Or even type typographical quotes where I can type ``This is quoted'' and get “This is quoted”. I even extended that so that when I type “1/2” I get “½”. It's also easy to add new entries to the particular parsing rule.

And while I was inpired by Org Mode for things such as tables and block quotes, I did not care for the syntax, so I changed it to suit my needs. A table is easy to generate:

#+table This is a caption
*header	foo	bar	baz
**footer	foo	bar	baz
Entry 1	3	14	15
Entry 2	92	62	82
Entry 3	8	-1	4
#-table

The #+table starts a table defintion, and is followed by an optional caption. A header row is marked by a starting asterisk, and a footer row is marked by two asterisks. Each field is separated by a tab character. The above example will produce the following table:

This is a caption
header foo bar baz
footer foo bar baz
Entry 1 3 14 15
Entry 2 92 62 82
Entry 3 8 -1 4

The above sample is yet another Org Mode inspried block:

#+source MOPML
#+table This is a caption
*header	foo	bar	baz
**footer	foo	bar	baz
Entry 1	3	14	15
Entry 2	92	62	82
Entry 3	8	-1	4
#-table
#-source

(For the record, I did have to go in after rendering this post and fix the above example, but I never intended to nest #+source blocks in the first place.)

I also have a defined block for when I quote email:

#+email
From: John Doe <{{johndoe@example.net}}>
To: sean@conman.org
Subject: Re: Morbi in lorem ut lectus accumsan
        placerat. Morbi TLA enim id turpis
Date: Mon, 1 Apr 2019 18:12:41 +0200

Lorem ipsum dolor sit amet, consectetur adipiscing elit.  Donec gravida
justo et aliquam lobortis.

#-email

The From: header has another formatting quirk—the {{ and }} denote text that is to be censored in the output. This is how I get those XXXXX­XX censor bars in my posts. The above will render the block as:

From
John Doe <XXXXX­XXXXX­XXXXX­XXXX>
To
sean@conman.org
Subject
Re: Morbi in lorem ut lectus accumsan placerat. Morbi TLA enim id turpis
Date
Mon, 1 Apr 2019 18:12:41 +0200

Lorem ipsum dolor sit amet, consectetur adipiscing elit. Donec gravida justo et aliquam lobortis.

The Markdown-inspried bits are mostly with inline markup, such as *emphasis* for emphasis, and `code` for code. I never did like the Markdown or Org Mode syntax for links, so I played around with it for quite a bit until I got a syntax I like. So when I want to link to this page, I type {^https://www.conman.org/people/spc/about/ this page}. It's a minimal syntax that isn't likely to appear in normal text. And if I ever do want to include a “}” in a link, I can always escape it like {^/ sample \} text} to get sample } text.

But I think the best feature is how I handle abbreviations. HTML contans the <ABBR> tag to semantically mark up TLAs and what not. I wish most web authors would do this, as it would make reading about the MPZ easier to understand, and most browsers on the market will show a tooltip with the TITLE attribute if you hover over it.

I was moaning about this way back in 2003, and I finally have a method I'm happy with. All I do is include a block of abbreviations at the top of the post:

abbr:	HTML	HyperText Markup Language
	MOPML	My Own Private Markup Language
	LPEG	Lua Parsing Expression Grammar
	URL	Uniform Resource Locator
	TLS	Three Letter Acronyms
	MPZ	Medial Palisade Zone

The code will read this block and generate the LPEG code to recognize the acronym, such as TLA, and generate the appropriate HTML: <abbr title="Three Letter Acronym">TLA</abbr>, thus giving us our TLA with semantic markup.

I even solved what I called the IRA problem back in 2003, you know, when the IRA steals the IRAs from members of the IRA; or in other words, when you have the same TLA that maps to different meanings. And I can even mention IRA GERSHWIN without fear of it becoming Initial Risk Assessment GERSHWIN. The IRA problem is solved with yet another block definition at the top of the post:

abbr2:	IRAa	IRA	Irish Republican Army
	IRAr	IRA	International Reading Association
	IRAm	IRA	Individual Retirement Account

So I type IRAa and the code will generate <abbr title="Irish Republican Army">IRA</abbr>.

I suppose I could always include definitions of common TLAs I use in the code itself, but it hasn't been that big of an issue for me to just define the TLAs I use in the post itself.

That's pretty much all I have for a markup language. Yes, it's tailored to what I write and how I want to present it. I don't expect anyone to use this engine as it makes sense to me, but maybe not to you. And that's the point, this is for me to use. I made this for myself. And I'm lucky enough to be able to do so.

Friday, September 26, 2025

Yet more notes on web bot activity

For the past few months, every other week my server (which hosts this blog) would just go crazy for a day and require a full reboot to get back to normal. I haven't tracked down a root cause for this, but I do suspect it has to do with web bot activity increasing over the past few months. I ran a query over the logs for August, generating the number of requests per second and here are the top ten results:

timestamp host RPS
26/Aug/2025:03:26:36 -0400 76.14.125.194 740
26/Aug/2025:03:26:29 -0400 76.14.125.194 735
26/Aug/2025:03:26:35 -0400 76.14.125.194 697
26/Aug/2025:03:26:37 -0400 76.14.125.194 693
26/Aug/2025:03:25:54 -0400 76.14.125.194 666
26/Aug/2025:03:25:53 -0400 76.14.125.194 607
26/Aug/2025:03:26:28 -0400 76.14.125.194 589
26/Aug/2025:03:26:38 -0400 76.14.125.194 576
26/Aug/2025:03:26:17 -0400 76.14.125.194 574
26/Aug/2025:03:25:49 -0400 76.14.125.194 539

Websites like Google or My­Linked­Face­Tik­Insta­Pin­Me­Tok­Book­Trest­Space­Gram­In­We might be able to handle loads like this, but I'm running a blog on a single server. These numbers are insane! Fortunately, this level of activity didn't last for long, but it certainly made it “interesting” on my server for a few minutes:

# requests per minute
timestamp RPM
03:23 27
03:24 72
03:25 4752
03:26 11131
03:27 1185
03:28 58
03:29 26

It's looking like spikes in activity might be a reason for my server freaking out.

Apache doesn't come with a way to limit IP connections. A search lead me to mod_limitipconn, a simple module that limits an IP address to a maximum number of concurrent connections. There's nothing about rate limiting per se, but it can't hurt, and it's a simple enough to install.

So earlier this week, I installed it. I set a maximum connection limit of 30—that is, no single IP address can connect more than 30 times concurrently. I just picked a high enough number (possibly too high) to still allow legitimate traffic through while keeping the worst abuse away. The code as downloaded will return a “503 No Service” when it kicks in, but I changed it to return a “429 Too many requests” which better reflects the actual situation (I think the code was originally written before 429 was a valid response code).

And it's working. It's already caught 18 bots (or rather, bots with distinct IP addresses), and they are all from the same ASN: GOOGLE-CLOUD-PLATFORM, US (and the user agents are all obviously forged). But what's curious about these is that a subset of the requests include a referrer URL. Most browsers these days restrict sending the referring link, or outright don't send it at all (to respect privacy). So to see them is unusual by a web bot.

Even more curious is these referring links have nothing to do with the link being referenced. There are, so far this month, 147 requests from the GOOGLE-CLOUD-PLATFORM ASN sending a referrer to Slashdot. And I don't mean to a page on Slashdot, but to the main page of Slashdot. There are also referrers to Cisco (on 201 requests), Petrobras (on 581 requests), NBC News (on 221 requests) among 435 other websites being referenced on requests. I don't understand the reasoning here. It's not like I'll let through a request just because it came from Slashdot. I don't publish referring links. I know sites used to publish referring links back in the day, and spammers used this to gain Page Rank for their own pages (or for their clients) but that can't be worth it these days? Can it? Are these still old bots running but long forgotten? What is the angle here?

Anyway, I'll have to wait and see if limiting IP connections will solve my server issues. I do hope that's all it is.


Oh, it's a bug on my side that prevents full conditional requests

I'm still pouring through web sever log files and I'm noticing that many of the feed readers fetching my various feeds files aren't using conditional requests. I was in the process of writing to the author of one of them describing the oversight when I noticed that particular feed reader using both methods of conditional requests: the If-Modified-Since: header and the If-None-Match header in conjunction with a HEAD request. I thought I should test that with my web server, just to make sure it was not a bug on my side.

It's a bug on my side!

Specifically, an Apache bug where compressed output interferes with the If-None-Match method. There is a workaround though:

RequestHeader edit "If-None-Match" '^"((.*)-gzip)"$' '"$1", "$2"'

That rewrites the incoming If-None-Match header to work around the bug. Now maybe that whole conditional request thang with my webserver will now work properly.

Sigh.

Obligatory Picture

[Self-portrait with my new glasses]

Obligatory Contact Info

Obligatory Feeds

Obligatory Links

Obligatory Miscellaneous

Obligatory AI Disclaimer

No AI was used in the making of this site, unless otherwise noted.

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

https://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-2025 by Sean Conner. All Rights Reserved.