“Apart from the side-mounted railguns, I demand very little from my car but that it get me around in reasonable comfort and dubious safety.”
— J Greely, who has completely forgotten when, where, or why he said thisThere’s hints of a very slow-burn romance between Human-chan and Our Allergic Handyman, but that’s not going to go anywhere this season. Instead, we get a look into the skritchable underbelly of the idol industry, as Waitress Kitty’s deep dark secret is finally revealed. Extra credit for making the plastic-surgery victim look just wrong.
(this is not her secret…)
I like Nagomi’s instincts. When faced with a loss of audience to Her One True Rival, she immediately reaches for a powerful weapon: the zipper on her skirt. Despite the bountiful cheesecake on display, most of the battle is actually in their heads, with both she and Our Hot Teacher reviewing their shared history and rediscovering The Joy Of (Busty) Cosplay. The whiplash of being faced with two goddesses holds the crowd long enough for Our Cuddly Noob to get fully dressed and make her (busty) debut, as Teacher rushes to get back into her civvies so she can watch. A brief reaction shot suggests that she’s going to get cornered by her former partner, Our Helpful (busty) Elf Maiden, for showing up out of nowhere like that.
Verdict: good clean fun, and hopefully now we can work the (not-busty) tsuntail back into the story.
It’s cosplay week in the dungeon, as Our Dungeon Mistress renegotiates her contract with the kingdom and convinces Our Dress-Up Darling Clay to wear a maid costume. Not having much non-dungeon life experience, she thoroughly misunderstands the king’s reaction to the sight of a strong cute maid.
Verdict: they’re really enjoying the just-missed-it fan-service dodges. I’d be annoyed if it weren’t otherwise fun to watch.
First you told me that my guaranteed-Friday package would not arrive until the 12th, and was “delayed in transit” (somewhere; it had not yet been handed off to a non-Amazon carrier). Then you rewrote history and declared that it was “left on the dock” at 9:30 AM and signed for by “L. Keil”. Two claims that come as quite a surprise to me, since I have neither a dock nor a Keil.
The original Friday notice had a UPS tracking ID, but the replacement timeline has it delivered by FedEx. What will reality be tomorrow?
WIRED has the vapors over third-party auth services like Google, Apple, Patreon, X, Line, etc, being used to… authenticate to web sites; specifically, the sort that paste heads onto naked bodies. I’m sure they tried to blame Elon Musk, but reluctantly had to admit that X’s auth wasn’t the only one being used.
So, nothing to see here. Literally; it’s like the folks at WIRED and Ars have never heard the phrase “pics or it didn’t happen”. 😁
I’m sure there’s a ToS issue in there somewhere, but they seem to be particularly upset at the idea of teenage boys using the sites to generate imaginary nudes of their female classmates, demonstrating that they’ve never met a teenage boy.
…asks Slashdot, quoting The Verge’s transportation editor.
Answer: electric cars.
See also “winter”, “spontaneous combustion”.
Building a test suite for a PDF generator requires some way of
validating what ends up in the binary output file. For PDF::Cairo, I
supplied a reference PDF file and used
Poppler’s pdftocairo
to render to
PNG for comparison. Unfortunately, what this really ended up testing
was the underlying libraries rather than my code, which is why the
CPAN automated tests keep breaking.
For this script, my testing can be limited to determining that known
text ends up in the correct region of the page, at the correct size,
and it doesn’t have to be precise. It turns out that Poppler’s
pdftotext
extraction utility has a -tsv
option that reports the
bounding box of each word on every page, which will suffice.
Once that’s in place, I think I’ve got everything compatible as far back as Python 3.9.x and Reportlab 3.6.x, and for the regular test suite I can just dump the internal state object to compare to a reference version stored in Configparser format.
But I still think I’ll work on page-styling first.
This week, we get the backstory of Our Junior Adventure Gals, with a dramatic reveal of a typical anime vaguely-described fatal illness where everything looks fine right up to the end. There is no cure, but there are Internet rumors about a Very Rare Dungeon Drop, an elixir that can cure anything, so that’s why they became adventurers. Now the gang has a mission and the clock is ticking, since she’s supposed to be dead by New Years and we got a shot of cute girls wearing Santa suits. Also, we only have two more episodes.
Verdict: will they find it in time, even with Our Hero’s power to stumble over rare drops? Will Crush-chan’s Missing Daddy be involved? Will they do it all next week and spend the last episode on fan-service? Let’s find out!
As has become typical for this show, last week’s cliffhanger crisis was resolved effortlessly, like cheers in the rain. But first we had to spend most of the episode watching them stumble around sadly, wondering if they’d ever get the band back together.
Verdict: the cuteness of the character designs is really all that’s holding the show together at this point.
Cosplay Harem: The Mobile Game launches Tuesday.
Senko-san is also getting a game this week. Pretty sure this one won’t be always-online with micro-transactions. Pretty sure. Okay, mostly sure.
I tried to see how much work it would be to run the script under older versions of Python. I’ve identified at least three syntax changes and an API change, and the way the Python interpreter works, I can’t be sure those are all the bad spots unless I build a full test suite that exercises all the code. Which is another project epicycle.
Oh, well. Maybe move that idea down the to-do list.
(and have I mentioned just how much I enjoy searching multiple web pages to find clear module explanations and example code? and how much more fun it is when the language and libraries are moving targets with changing APIs?)
Human-chan has broken through the last barrier to full acceptance at the shop: Waitress Kitty not only called her by her first name, but shortened it and added a -chan.
I wasn’t sure how they were going to set it up, but I fully expected Our Hot Teacher to end up in her sexy succubus costume this week, and not only does she deliver, she mentors Our Crushed Heroine as both teacher and idol, learning a few things about herself in the process. Meanwhile, Our Goofball Mean-Girl Pro struts her stuff and works the crowd, but it turns out her 2D crush bears a striking resemblance to someone we know…
With the costume and confidence crises resolved, it’s time for Our Heroine to suit up and start the show, but how can they keep the crowd from leaving while she’s changing? Next week, Battle Of The Legendary Cosplay Queens.
Verdict: this is better than it has any right to be. And I’m not just talking about Teacher’s barely-there succubus outfit.
Molesting Magical Girls continues to have a lot of success running promotions at cafés with themed drinks and snacks. I think this show should should do the same, and their first offering should be the Lust-A-Latte, in honor of Our Hot Teacher’s favorite character.
I’m not sure whether I lost the plot or they did. The lengthy revelation about the local god seemed utterly out of place in the middle of a battle where dozens of spear-carriers have already died and Our Boring-Bath Catgirl was barely rescued in time.
Verdict: this is either a highlight reel from a book that explains everything in immense detail, or a faithful adaptation of a complete clusterfuck.
“Do you have a floor preference?”
"Yeah, I would like a floor."
“No, I mean, what level?”
"Beginner."
This week, Our Intrepid Explorer is given the chance to design a new version of dungeon level five, which not only exposes her to some practical design issues, but to the secret of why they really lock the door to the boss room. She also learns that spirits do not respect your personal space; in another kind of show, that would have been a major buy-the-bluray scene. If we’re lucky, fan-artists will pick up the ball and run with it.
Verdict: low-key fun, as usual.
(Lily remains my favorite dungeon pick-up)
Typical Nigerian money-scam email, but the person seeking my assistance in “processing” the fund has an Arabic name in the body of the message and a Korean name in the headers (“트라피스트수녀원” = “Trappist Monastery”. It has also been stripped down to the essence of the scam, not bothering to mention the source of the money or even what country the bank is in that’s holding it. I particularly enjoyed this phrasing:
“I am reaching out to you for a sincere collaboration in partnership to actualize this potential.”
Totally legit, I’m telling you.
I’ve cleaned up the code and documentation, added error-checking in all the useful places, tested a number of edge cases, embedded my font and set up a well-defined font search path, packaged it with Poetry, etc. What I haven’t done yet is implement any page styles other than the old Enscript Gaudy, or support for defining them.
Which isn’t a problem for me, since I’ve been using Gaudy since the Eighties, but the point of making this a real project was to make something useful for people other than just me. 😁
Enscript’s flexible page-layout system was based on template files
written in raw PostScript, which doesn’t translate well into PDF, so I
need to convert the box-splitting and text layout code into a
mini-language that can be loaded from the config file, which is a
classic project epicycle. For now, I’ll define a minimal framework for
style code and just eval()
it; that will let me make progress on
supporting multiple styles without taking time out to write a parser.
The second priority on my to-do list is testing the actual version dependencies against what Poetry baked into the install. I think I used some 3.12-specific syntax for f-strings, but if I change those, it should run in a much older version of Python with a much older version of Reportlab. Which would be sociable of me.
Third priority is to flesh out the documentation for the included box-manipulation library, which I ported over from PDF::Cairo; this will be necessary for the box-related operators.
I miss Perl’s in-place POD documentation, which is so much nicer than the Python culture of API dumps that sometimes link to web pages; you can put real documentation into docstrings alongside your code, but for some reason almost nobody does.
(I think it’s the same mindset that led the NetPBM clowns to change
--help
output to say “go read the manpage, dipshit”, and then make
the manpages a deprecated optional install that just contain “go read
our website, you
troglodyte”)
TL/DR, in the style of an isekai title: Obviously Cobbled Together From Footage Intended For More Episodes, The Contractual-Obligation Season That Would Have Been Merely Bad Was Reduced To A Steaming Pile Of Crap.
Longer review: the most entertaining characters from the earlier seasons, Klaus, Five, and Dad, are forced to play against their strengths, making room for Diego’s other family’s Indian soap-opera drama and El Page’s increasingly-hard-to-swallow cosplay. Seriously, she’s so focused on “acting like a stereotypical male” that she often forgets to act the character, and she looks and sounds awful; it is distracting in every one of her scenes.
With only six episodes to set up and dispose of an even-bigger-than-ever-before catastrophe, the story is a complete mess. Characters and plot points are placed on the board at random, then removed without any inconvenient “story advancement” or “character growth”. And the ending is a classic down-in-flames.
Verdict: I feel sorry for the actors who tried hard to make it work. Not for the writers or director; someone wrote this self-indulgent garbage, and someone put it on screen. For instance, 90% of the character development for completely-new-characters Gene and Jean is their country dance scene set to Cher’s “Gypsies, Tramps, and Thieves”, and the rest is the fact that their names are Gene and Jean.
This one has everything: Shota power! New skills! Rich-girl mansion! Jealous Crush-chan! Easily-distracted Adventure Girls! Soaking wet Crush-chan in clingy outfit! Girl bonding! Cold showers for boys who really need them! Insert song in implausible voice! Victory in battle! …and a payoff on last week’s foreshadowing, as Our Rich Mage Princess collapses. That didn’t take long.
Verdict: I’m pleased that Our Chibi Devil Shota did not get weird and gay this week. Also that Our Chibi Devil Devil is out for another taste of that sweet sweet life-drain that powers up her bustline, er, “powers”, yeah I meant to say “powers”.
In which Our Cheer Gals discover that turning your hobby into a job creates exhaustion, friction, conflict, and social-media haters. They still live in an idealized world where outcall cheer delivery does not result in being sex-trafficked to Saudi Arabia or Hollywood, and where the haters are mildly rude and don’t make a single lewd comment. But it’s not that kind of show.
Verdict: the summer slump continues.
I’m amused at the culture shock. I’m actually surprised that Safari isn’t remembering his tabs, since my usual problem is getting MacOS to not reopen everything I had open when I logged out, rebooted, or an app crashed; it’s done in a way that is not useful. The primary thing I remember about configuring Safari is uncheck ‘Open “safe” files after downloading’; this should never have been on by default.
The menubar follies were likely related to one of those settings I carefully disabled years ago and it’s followed me from Mac to Mac ever since. There’s a whole bunch of stuff hidden vaguely under “accessibility”, like not making things translucent to show the colors in your background screen.
I have no idea how he’s getting screencap to launch Photos, since I’ve been using Cmd-Shift 3 and Cmd-Shift-4 since before Macs ran Unix, and the most annoying thing they’ve done to that is put some stupid preview image in the lower right corner for several seconds before actually saving it to the Desktop like Tog intended. Tip: open /Applications/Utilities/Screenshot.app once, select the options menu, and disable “show floating thumbnail”.
As for dingus-click, I hesitated to google that one, but it sounds like Ctrl-Left-Click in Terminal.app. That’s another app where I’ve been using it for so long and copying config files around that I had no idea what the default behavior was like until I got my new work Mac.
(I think I spent about a week de-iPadding that machine and getting it to work sensibly; somewhere there’s a Github page that documents “Macs for Engineers” or some such, but I did it by hand again)
(Update: macOS Setup Guide, a subset of this github repo)
…I’ve discovered that I still have a double-fuckton of resource-fork Type 1 fonts, and while there are a number of “free” “converters”, they always seem to leave out the part about extracting the metrics files. Converting them to PFB format isn’t terribly useful unless you have the matching AFM or PFM files.
Anyway, I found an abandoned project on my NAS where I was trying to clean up the mess. The files have timestamps from 2002…
(“What’s that”, Frieren asks, “You think 22 years is a long time? Amateur.”)
Surprisingly, the resource forks have somehow not been deleted in
all that copying around. Although some of them are in AppleDouble
format, some are in the modern MacOS’ vestigial
file/..namedfork/rsrc
format, and I even found some BinHex and
Stuffit files crufting up some directories. Blech. NextStep was the
best thing ever to happen to Apple.
(why was I looking through old fonts? because the Adobe suite I pay for that lets me use a pornucopia of fonts for free does not include Barmeno, and Berthold wants $367.99 for the complete family, or $45.99 per weight. Not having won the lottery yet, I groveled over the NAS and managed to find a backup of a backup of a Windows box that had Adobe Type Basics installed on it, with four weights in PFB/AFM/PFM; it also had all the fonts from Illustrator 7 and Corel Draw 4 (the Bitstream/URW collection that replaced their earlier lower-quality pirated shovelware fonts).
“…you other coders can’t deny”
I want the t-shirt. And the girl, although this isn’t that kind of show.
(this, on the other hand, is definitely that kind of show)
This week, Our Heroes take a stand, refusing to hide what they’re really up to just because everyone’s going to think they’re pervy freaks. This reignites the passion in Our Hot Teacher’s heart, and she backs them up as they head to the battlefield. But first, a good look at the competition, the lickable cosplay queen “753”, Nagomi.
Who promptly pounds Our Heroic Newbie’s confidence into the dust. Next week: drama at the event hall!
Verdict: Nagomi presents as Our First Mean Girl, but they soften the blow by showing what a giant nerd she is, in many ways Our Obsessed Hero’s evil twin. So we not only added more depth to Our Hot Teacher this week, we didn’t get a one-dimensional antagonist stereotype.
(relevant fan-art! and I want a copy of Teacher’s final cos-rom…)
Yeah, I have no idea where this is going. Rather than tying up all the strings from last week, it tugs half-heartedly on a few of them and then throws out half a dozen more. And they managed to make a Belle/catgirl bath scene boring.
Verdict: please make sense next week.
I’ve decided that this is basically the same show as Red Cat Ramen. Except for, y’know, the magic. And the monsters. And the willingness to kill. They’re both just cozy.
If you use sort -n -u
, it will only consider the first field when
deciding if lines are “unique”. That is:
% cat sample.txt
3 pony
1 cat
2 fish
2 dog
% sort -u sample.txt
1 cat
2 dog
2 fish
3 pony
% sort -n -u sample.txt
1 cat
2 fish
3 pony
I was not expecting it to eat the dog. Basically, I’ve always thought
of sort -u
as shorthand for sort | uniq
, but that ain’t quite so.
-n
is actually shorthand for -k1n
, and when you specify a key
field, -u
only considers uniqueness of that field; it doesn’t
matter if the rest of the line differs.
Major progress on analyzing font color.
Thirty-six flights were cancelled at an airport in Japan, because a pair of scissors went missing. Spoiler: the scissors weren’t actually missing, they just weren’t in the secure locker where they were supposed to be stored between authorized uses.
International political comparison left as an exercise for the reader.
(this is one of those shows that has a triple fuckton of fan-art, almost none of which is any good)
Y’know, I often disagreed with Tog’s classic Apple User Experience standards, and with many of his later recommendations, but it was all evidence-based; his teams tested the hell out of everything, and produced clear, usable rules. Now, with the modern Apple feels-over-facts lack of any standards, I realize that the reason I’m having difficulty communicating with the author of Typeface is that we don’t even speak the same language. Neither in UI design nor in typeface management.
He doesn’t seem to understand why scattering information all over the screen is bad design, or why adjusting the font display with a mix of menus, buttons, popups, pulldowns, and modifier keys, often requiring you to move the mouse 6+ inches between steps, is bad design. Sigh.
I’ve completely overhauled my old termanal
script that analyzes
fixed-width fonts for their suitability for coding (vertical alignment
of characters commonly used together in code, common width for math
operators, precise metrics, and full metadata), and it now generates
JSON output for all the fonts you feed it, allowing me to generate
comparison tables for my whole collection, as a technical companion to
programmingfonts.org.
All of this is being done by calling the tx
and ttx
tools from the
Adobe Font Development Kit for Opentype
(AFDKO). With the right
options, they can export pretty much all the usable data from a font,
including the actual glyph outlines.
This gave me an idea for calculating something termanal
doesn’t do:
estimate the color of the font. That is, how thicc are the glyphs,
and therefore how dark does a line of text look.
ttx
exports selected glyphs from a font as an SVG font.inkscape
renders each glyph to individual PNG files.magick
counts the number of black pixels.And it even worked on the first try, more or less, although the launch
overhead for inkscape
seems to dominate, producing the odd result
that it takes twice as long to render everything at 10% of the size,
while 50% is twice as fast. I’m going to tinker with batching things
up so I can call inkscape
and magick
only once and have them work
from tempfiles instead of directly piping from one to the other. This
might involve switching it to Python, since all the components appear
to have some degree of API support.
I named it coloranal
, of course.
Anyway, have some cheesecake:
Inkscape doesn't actually support SVG fonts (in fact it silently ignores them, hence the "more or less" for my first try), but the "d" attribute of a glyph is identical to the "d" attribute of a path. They're just vertically flipped. Which, honestly, doesn't matter for this use. 😁
<glyph unicode="y" horiz-adv-x="600" d="M131,-217C241,-217 300,-140 338,-42l213,552l-78,0l-106,-287C350,177 332,124 315,76l-4,0C291,125 270,178 251,223l-119,287l-83,0l227,-512l-14,-36C236,-105 196,-149 128,-149C113,-149 97,-146 84,-142l-17,-65C84,-213 108,-217 131,-217z"/>
<path id="y" d="M131,-217C241,-217 300,-140 338,-42l213,552l-78,0l-106,-287C350,177 332,124 315,76l-4,0C291,125 270,178 251,223l-119,287l-83,0l227,-512l-14,-36C236,-105 196,-149 128,-149C113,-149 97,-146 84,-142l-17,-65C84,-213 108,-217 131,-217z" transform="scale(1,-1)"/>