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:
![“'Ere you go! Earase to your ear's content!” [An image of a pencil eraser in the shape of a human ear] “'Ere you go! Earase to your ear's content!”](/2025/09/07/earaser.jpg)
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:
- 1 cup whole milk
- 1 pint heavy cream (or 2 cups)
- 1 teaspoon vanilla extract
- ¾ cup sugar (using 1 cup makes the ice cream too soft in my experience)
- ¾ cup cocoa powder
In the metric system, you get some really weird values though:
- 237mL whole milk
- 474mL heavy cream
- 5mL vanilla extract
- 150 grams sugar (using 200 grams makes the ice cream too soft in my experience)
- 72 grams cocoa powder
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:
- 250mL whole milk
- 500mL heavy cream
- 5mL vanilla extract
- 150 grams sugar
- 70 grams cocoa powder
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 “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!”
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 “XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX” 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.
“XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX!”
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:
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!
![Glasses. Titanium, not steel. [Self-portrait with new glasses] Glasses. Titanium, not steel.](http://www.conman.org/people/spc/about/2025/0925.jpg)
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:
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 XXXXXXX censor bars in my posts.
The above will render the block as:
- From
- John Doe <XXXXXXXXXXXXXXXXXXX>
- 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 MyLinkedFaceTikInstaPinMeTokBookTrestSpaceGramInWe 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:
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.
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.