Cammy's Big Rambly Journal

Archived May 2025 entries


Hello! I notice you're using Netscape (or other CSS-noncompliant user agent—in which case, consider this an easter egg) to view this journal. Because Netscape is so titanically shit, I have disabled image viewing on Netscape specifically. If I didn't, you would notice random images being replaced with each other and similar such strangeness. The posts are still visible, but you'll be missing the images, which are half the context of these posts.

You should use RetroZilla if you can; it runs on Windows 95 and up and gives you a perfect cammy.somnol viewing experience, plus more comfortable Web browsing on retrocomputers in general. Failing that, Internet Explorer 3 (which amusingly also displays this message, since it doesn't support the display CSS property) and up will also work perfectly fine for seeing my journal posts.


May 31, 2025
Sippies and chatter

Caby got me into bubble tea because I'm a white girl


I was gonna do up a long piece explaining the MySQL MoodMatch thing for my album reviews I've been putting together, but eh. It can wait a couple days. Here's something I doodled up for Caby! She's been going through it a little lately, and I figured good vibes are what's needed right now. I really love how this came out. I was even having issues drawing Cammy the other day, let alone Wren, so the fact that both came out real easy (after a nice Saturday morning drive through the countryside) makes me very happy.

This post ties this month with June 2023 (when I switched the journal over to HTMLy) for the most posts made in a single month, fun fact. Here's to a productive June 2025 as well, folks. Lots more to come from me!


May 28, 2025
Lince!

coolwolfplushie.png


This is a little old news now, but I haven't posted it anywhere yet, so let's fix that tonight. Lince! There's a certain old Cammy drawing with a big stuffed marf (you can see it on his original original 2019 ref) that we learned a few months ago dcb was mildly obsessed with for a time, so I decided to draw him a Lince version (featuring his real life plushie Timber!) as a present for completing this semester. Came really quick for how complicated the pose is, and he loves it! I'm proud of it too. Crazy to think of a time not that long ago when I used to have a lot of trouble drawing cats, and now they're like my favorite thing to draw, behind badgers.

I've got stuff a-brewin' again. Tomorrow or so, I'll give you guys another WIP project writeup for a certain MoodMatch search thing for my album reviews. Are you familiar with database normalization, chat?


May 15, 2025
The DocBook deployment, day, uhhhh

Telling you, I do a lot of work so I have to do less work in the future


If you head out to any flavor of mari.somnol now, you'll see a story! Potentially more, by the time you're reading this! If you caught the previous post I did on my DocBook story build system, you know that it's been kind of a gigantic process already. It took another gigantic process to get it over the finish line, but I'm happy to say that I've hit all the targets I wanted to: one script to build six different versions of each story from a single double-click. I then put the output into my nofi/lofi/hifi AutoSite projects, build the project, and upload. That's all I need to do to keep a single story in sync across all three sites.

Since I've legit worked on nothing but this for days, I'm a little tired of thinking about it, but I figure I should probably get it into the journal for posterity. Besides, I am hugely proud of it, and I know I'll be rereading this in pride in a couple days anyway.

Step three: splitting the stories up with xinclude

Where I left it last, I wasn't sure if I'd be able to meet my requirement of being able to build both individual story pages and the whole story on one page. Turns out, I can! One of the glorious parts about XML is that you don't need an <html></html> sorta wrapper around your markup, you just have the markup, and if you declare your namespaces right, the processor will still understand what you wrote. In my case, I have the individual pages as separate files with wraparounds, and then I xinclude all of them into a master DocBook.

xinclude literally puts the content of the included XML file into the master file, as if you copied and pasted it in there. xsltproc and DocBook both can work with xinclude, again, with the proper namespaces. This means I can run xsltproc on any individual chapter or the master file, getting what I want out of each. Kino.

Step four: building into my AutoSite projects

Before this, for testing and learning purposes, I had my XSLT stylesheets set up to build full webpages with a doctype and everything. If you know AutoSite, you know that it's actually a templating system, where it takes stripped-down input pages with only the page's content and some metadata, and then smushes them into a rich layout template (the rest of your site markup). That way, you only have to edit the template to fix any errors or add to, say, a navbar.

As AutoSite's #1 fan now and forever, I wanted to be able to make use of my existing templates and use XSLT to output Autosite input pages I could drop into my existing projects for nofi, lofi, and hifi. This was pretty simple stuff, since input pages are still just HTML pages (or Markdown, but that's not relevant to us right now), but there were still snags.

For one thing, dcb wrote AutoSite to rely on specific whitespace around the attributes at the start of each input page, which xsltproc wasn't outputting using its <xsl:comment> processing. So this worked:

<!-- attrib title: Kevin and Theo's Multiverse Misadventure -->

But this (what xsltproc produces) did not:

<!--attrib title: Kevin and Theo's Multiverse Misadventure-->

As a result, these attributes were getting AutoSite confused, and it was passing them through as page content, breaking a lot of things in my templates as a result.

I could've worked around this with literal HTML outputting using the <xsl:text> element, but the good part of using your friend's tools is that they'll usually happily bugfix stuff for you. dcb rewrote his regex for parsing those, fixing another long-standing bug in the process (!), and I had an updated AutoSite that could handle these valid-but-odd attributes within a few days. Good lad.

The other issue was that xsltproc was spewing out an HTML doctype and some namespace attribute spam on all the pages it put out with no way to disable that. Even if I could write a new version of xsltproc to fix this, since it is open-source, that's just a lot of fucking work for no real purpose except this one niche edge case. I had a much better way to fix it, which I'd handle next step.

Step five: wrangling all this shit into a shell script

This was the most aggravating part of the process, because it required me to play with Linux. At least, something that works like Linux.

Remember, I've been basing this whole setup on Cygwin, which is a set of tools and a terminal of sorts meant to give you Linux functionality on Windows. xsltproc, coming from the GNOME camp, is naturally a Linux tool. If I wanted to automate it, I'd be writing a shell script. No big deal, nothing I haven't done before, but something always fucks up tremendously when I have to dive into the gooey guts of anything Linux-related, and this time, it was find that put me through the wringer.

find is a program that can search for files with certain criteria and then do something with them, like pass those files onto an executable or run a shell command on them. This is naturally what you want if you're trying to automate running xsltproc on a whole directory of XML files. The big frustration was that I obviously needed to make output directories for each file, named the file name but without the extension (01, 02, full, etc), and find doesn't provide functionality to pass the base name of the file to the executable you're running from it. That's because Linux doesn't care or use file extensions. At its silliest, find would try to run xsltproc on the output directories as well (also named stuff like "full.xml", despite being directories) and obviously that wouldn't work.

If that's gibberish, that's okay. I've blocked most of this out of my long-term memory for my health. My ultimate solution was to have find and xsltproc make the output directories whatever they'd be called and then use mv later on to simply scrape the .xml off each of the directory names. Hey, if we're already scripting it, might as well take the caveman approach.

This is also where I'd take care of the doctype and namespace cruft, again running find, this time on all the output HTML files it can find in the output directory, and then using sed to delete the first line of the file (the doctype) and any namespace cruft it finds anywhere in the document.

Anyway, it works. I now had xsltproc building AutoSite input pages for me. All that's left is to translate it to the other two sites.

Step six: writing lofi and hifi XSLT stylesheets

This was as much working on the AutoSite templates and CSS stylesheets for each project as it was doing stuff with XSLT. Now that I had the build process working, I just needed it to take those same files and make lofi and hifi compatible versions as well. This is also where I dragged forward my preferred story fonts (New York and Los Angeles, because the classic Mac OS fixation never dies) and also the color-coded character dialogue styling from my old sites to the new ones.

Kevin and Theo, now on lofi and hifi!

All is said and done, this had to happen. There was no way I was gonna be able to put stories on all three sites and then manage potentially six different versions of each story, even just to fix a single typo in each. Bigger changes or rewrites, not happening. This is a huge step towards being able to publish what I'm writing to my sites again like I always wanted, and I'm very proud of how it came out. Even better is the ease of updates: if I write a new chapter and want to publish it, I just add it to the DocBook, rerun the script, rebuild the AutoSite projects, and reupload. New chapter added, can link it to everyone, we're all good to go. If I want to build DocBook to some other XML-based language in the future (eBooks, maybe?), I can add that pretty quickly to the build system.

If you're curious to see the beast in all its messy glory, I made a GitHub repo for all the XSLT sheets and such. I'm sure there's lots to be cleaned up in them, but I really don't care. No one's gonna see it but me and the morbidly curious.

Anyway, all this techie junk distracts from the important stuff! Seriously, I've realized this is so techie-wonky that, when I try to explain it to friends who are less technically inclined and then show them the end result, all they see is the story—which is how it should be anyway, huh? And of course, there's the really immortal, million dollar question, "when will there be more stories, Cammy?"

Watch out. You might get what you're after.

Oh, totally random aside—can you believe I've lost weight in the past two weeks? I'm at 144lbs. That's 6lbs lighter than my stretch goal from this time last year, and nearly 30lbs lighter than I was last time I saw Caby. It feels good! Not really interested in snacking or drinking, just banging out projects and playing Guitar Hero. Lots to do, lots of time to do it. Happy Summer vacation.


May 13, 2025
World Within a Song

"Fuck Bon Jovi", says man in big hat


Like I said the other day, I've got a small pileup of books—mostly music books, but with a few oddball topics on there as well—that general lack of time and patience has kept me from digging into. Cold anything is a hard proposition, but especially cold reading. Just picking up a book and starting, I dunno, it's not something I normally find myself in the habit of. Desertbound on Kindle did get me going though, and I'm eager to keep it going.

I must've been in a Barnes and Noble last year with my mom around my birthday. Maybe I'm just deprived, but ending up in Wind Gap and going to check out even big box retailers up there is pretty fun. Books! Books I just said in the last paragraph I have trouble reading, but books! She'd plucked a Mudhoney biography from the shelves to get for me (can you believe I've still never owned anything Mudhoney, despite all the time I spent with Superfuzz Bigmuff in high school?), but this one caught my eye a little more, even: World Within a Song by Jeff Tweedy.

I've been slowly getting into Wilco courtesy of dcb, and Jeff is one of those kinds of legacy artists who's just as noteworthy for himself as he is for his music. Something about his hesitant, wary outlook and dry commentary, you really do get the sense he's kinda amazed anyone would want to listen to him, but we do! I wound up getting both books.

World Within a Song is an examination of the cross-section of life and music, the way that music colors the scenes of your life and the way that life colors the way you feel about songs, bands, and albums. That makes it sound really heady, but it's honestly pretty light reading. A lot of it is Jeff's storytelling and memorializing, and the rest of it is a peppering of outlook on the music business, some anecdotes about paying your dues at the crossroads of punk and country, and what music encourages us to do and feel and how it grows with us as much as it stands still, acting as a vantage point as we move through life.

Jeff picks out fifty songs (well, including every song by the Beatles, so slightly more than fifty) that take him through early childhood into his adult life touring with Uncle Tupelo and Wilco. That's the meat of the book, and thankfully, it's his strength. Lightly dissecting music, he's interesting. Telling these stories of his family terrorizing the neighbor's kid with ham radio gear, or the poor orderly at the rehab facility who, with pinpoint comedic timing, in the midst of Jeff's most horrific withdrawal symptoms, wanted to know if Wilco were still playing Coachella, or the Traumatic Toilet at CBGB's, he's quite funny. Not as funny when I retell them, but that's how it goes with these things.

Now for the less-than-positives. Jeff has a kinda bizarre writing style that I'm genuinely amazed his editors didn't clean up first. It becomes transparent fairly quickly, thankfully, but he has this wonderful habit starting sentences off with "and", "but", and "because", leading to what feel like fragments across the book. Apparently this isn't incorrect, as the AI slop articles and gleeful contrarian contrarians like to tell you, but my God, is it choppy. Perfect example, open the book, random page, page 64:

Is this song for everybody? No. It's not a song I would throw on at a BBQ. But it is special to me. Which is the point of this book.

Okay, it's not incorrect, sure, but is that elegant?

Truth be told, though, it's not like he can't write. In fact, I feel the urge to balance the previous example with another snippet I found interesting, about Carole King's "Will You Love Me Tomorrow", just so you guys don't think Jeff Tweedy is actually a caveman:

There was a period in my life, back in the early Wilco days, when singing this song as an encore—a ballad that I would often deliver lying on my back while being held aloft and passed by the outstretched arms of fans, crowd surfing in slow motion—felt like I was being as honest as I could ever be with an audience. Will you still love me tomorrow? All of you. Will you? Because this night is forever to me. I can feel you... I sense you mean it right now in this moment... I can allow myself to trust you. But you're going to move on, aren't you?

My only other complaint is that, by the time you get into the final ten songs, it does seem like he stops finding personal anecdotes and experiences to regale you with in the songs, and even he's a little lost as to how exactly to get them to fit in the lattice he's set up for himself. As he says exploring "I Love You" by Billie Eilish:

As the songs I'm excited to write about get closer and closer to the present moment, I'm finding them more difficult to write about.

Is that a bad thing? No, but given that the anecdotes and the way these songs personally shaped Jeff's life were such a driving force at the start, it does make things more diffuse as the book comes to a close. He still finds something interesting in them, though, so I suppose that justifies it. That said, that brings me to another holdup you might have: how much is someone not up on their Jeff Tweedy lore gonna get out of this? Plenty of it is universal enough, catching shows with your mom as a kid or finding shelter from the displeasure of the world in music that seems common only to you, but I dunno—did you know Jeff Tweedy collaborated with Mavis Staples (do you even know who Mavis Staples is?), and is that going to impact how you read her chapter?

Really, that's really the valley where World Within a Song dwells, a book that's deeply personal, and a book where the depth comes from examining what these little things mean to Jeff personally. He'll spend two pages telling you that it's okay if you just never get a song, that it's okay to dislike things as much as it is to like things, only to say "actually wait no, fuck Bon Jovi, you should not like Bon Jovi". He's human! Jeff's book, like his music, is interesting precisely because of how much light he finds in the shards of broken glass. It's imperfect and maybe a little wispy, but that suits it, I think. It's a good book to mail to dcb.


May 11, 2025
Media pickups from the last few months

I've been putting off making this post for whatever reason


Earlier today, my mom told me of a local flea market with metric shittons of vinyl and CDs going for cheap, and well, it reminded me that I hadn't even opened my previous cheap CDs, let alone catalogued them. (40 hour menial job work weeks are nightmarish, turns out.) Let's do that quick. Here's some CDs, DVDs, records, and games I bought this spring that I've yet to show off on here.

Quick notes and stories on some of these:

Okay, time to actually get listening to some of this stuff...


May 10, 2025
Shapeshifter

And some thoughts on when someone massively improves on your ideas


I have finished reading Desertbound! That's Savannah's still in-progress Pinède novel. She hasn't been too loud about it publicly, but believe me, it's a whopper—and contradicting that, also just a nice, tidy little adventure novel. I have a pretty unique perspective on it, partially because it stars (massively overhauled versions of) some of the characters she was kicking around back when I first met her, and we were just two awkward and sad preyed on teenagers that grouped under this "Somnolescent" umbrella. Back then, it was on Skype. The Skype times.

It's a simple enough request: a blind Volkhov fox royal wants a fake-ass, smooth-talking, thieving, conniving rabbit bard, enemies all around him and a bizarrely nice lute at his back, to guide her across the world to the deserts of Murad. What an ice queen could possibly want in the hot bazaars of opium and questionable magical practices becomes a question he soon doesn't want the answer to, but either as easy payment or an easy mark, he accepts. A snotty, annoying raccoon kit blessed with lightning magic complicates things, sure, but the three quickly learn that the long journey is actually the easy part.

Savannah's been pretty hard at work on this book for, Jesus, ten months now, I just checked? July 2024 was when the first mention of the name "Desertbound" started cropping up in our Discord. (That thing sure is handy for checking dates.) I read the novella back when it was just a tiny little thing, and the quick growth, constant edits, and just my general lack of free time meant I kinda avoided reading it for a while. That's not right of me, though, and my first priority since getting fired really has been to read through it all and enjoy and support a close friend's work.

Here you go, a review of a book you can't even read yet: It's really fucking good. Savannah has a great sense of humor and timing, which is not easy in novel form, and she has a knack for planting important bits among the weeds as passing details, which means you can read it a few times and get new things out of it each time. She loves the psychological aspect of characters, so you bet she digs into what makes Euphemia and especially Trapper the way they are, through nurture, the politics of the gods, or just what Trapper is and isn't capable of feeling. It goes quick, it's very easy to take, and it subverts expectations without ever being a pretentious, coy showoff of breaking genre norms. (For one thing, there's no true romance in it—Euphie is married to her god, and Trapper will never be more than a side hoe. That's the real tragedy.)

There's naturally some tone and pacing stuff early on that Savannah's been working with me and some of her other beta readers to tweak, but even as it is, it was thoroughly enjoyable. (I'm also in it, and Trapper tries to sell me a child that sneezes in people's mouths. I naturally do not take his offer.) Lots of memorable moments (the one where Trapper's pinned under a dead bandit body will forever stick with me, perfectly horrific), lots of good jokes, and it's just nice to see someone make this world of mine come alive.

That's the other reason I have a unique perspective on it. To see locales that were once just little places I built with Caby in Minecraft and OCs that have just been sitting unused turned into living, breathing backdrops for a good story is pretty humbling. For a while, I didn't know how to feel about that, that someone can come in and massively improve on your work like that, but then, I never know how to feel about it. One of my first interactions with jnack, who I worked on Guitar Hero II Deluxe with, was when he saw a really shitty main menu graphic I'd hacked up for Rocks the 360 and did me a much better one sight unseen, and I was pissed. Same thing happened with the Valve Developer Union logo once upon a time. (I've done it to other people too—ask me about the launch of DM4Jam sometime.)

In a lot of ways, over and over again, Savannah and her work has been kind of a kick in the ass and a reminder of how fucking silly I can get. I've felt locked out of Pinède plenty before, somehow, despite it not even being a thing yet. My time has grown limited over the years, my projects are numerous and ever more complicated, my skillset only so large and so skilled. I've chosen to do a lot of things alright instead of a few things really well, and sometimes, I feel outclassed by people who do specialize.

Fuck all that, come in with a clear head and just make something fun, something really enjoyable that I like and people will also probably like. What should I be putting into the world, self-doubt and jealousy that someone else is showing me up, or getting back up, getting better, and having fun with it? It seems obvious, and maybe it's just because I am an Egotistical Bad Person (as designated by the random shits from Neocities that still find their way to my old mariversary posts) that I've even had to learn this lesson, but y'know, valuable to remember. We're all human.


I've probably listened to "Shapeshifter" by Marcy Playground 200 times since discovering it yesterday. It was the cut title track to their album of the same name, which I reviewed very positively for my main site and usually credit with reviving my interest in finding new music after the lockdowns got me depressed and uninterested in it. Marcy in general has been a great backdrop for reading to. I think that's the key. Pick up the book, put on some music I'm super familiar with, and just read. I got a stack of music biographies and other assorted weirdness to get through. I'll share it all with you as I go.

When I was standing on the gallows
Nothing to say, I watched my sun
Go down

And light got dark around the edges
With no control, I felt my soul
Go down

When you're dead, there isn't anybody else
Nobody else at all

So darkness came upon the valley
And all the war machines broke down
Broke down

And all the children ran for cover
And all the animals broke down
Broke down

Ooh, and maybe they should not have
Been quite so bold to test me
'Cause I am a shapeshifter
And I will have my revenge


May 06, 2025
The DocBook Deployment, day one

SeXML and CockBook, hoho


I've had the idea kicking around for a few months now, but it's finally come time to put it into action: stories deployed on all three of my websites from a single source file. The issue with nofi/lofi/hifi is that it takes some novel ideas to synchronize content across all three. Even though my stories don't change a whole lot once they're posted, the fact that I need to maintain three different versions of the markup for each (owing to nofi using no CSS and lofi and hifi using different CSS), even with the help of AutoSite, has put me off writing more. That's just a lot of busywork—and for everything that's on these sites, plain text stories should be on all three.

I initially conceived of a system using PHP and databases, like my album reviews, but what makes sense for two paragraphs and a bunch of little data around it doesn't line up for more longform writing where the HTML changes so oten. I started scouring around for typesetting and documentation systems that would translate easily to the Web and I settled on DocBook, which is XML-based. This means that the conversion to HTML is, ideally, 1:1, everything that can be represented in the output HTML document has a place in the original DocBook file. Because it's XML, and all XML-based languages are interoperable assuming your document is well-formed and your namespaces are in order, you can use a standard XML processing language like XSLT to turn DocBook into HTML.

If that's a lot of jargon for you, the plain English version here is that I'm using a format for the book that I can easily turn into other things. That doesn't just include website stuff, there's all sorts of tools and converters to turn a DocBook document into eBooks or PDFs or whatever else. It's a good, long-term format to bet on for storing my writing, but in the short term, I just want stories on my sites again.

How I'm planning the workflow

Ideally, I want the conversion process to be as hassle-free as possible. I'd like to get the story into the right format, run a script to generate the necessary three versions, one for each flavor of mari.somnol, and then upload the files. Actually, it's more like six versions—one of my requirements is that I'd like stories that are segmented (like Kevin and Theo's Multiverse Misadventure, which I've been using as a test case for figuring out the tools) to also be viewable as a single page, if your retro computer or device can handle it.

To make things even simpler, I'd like to convert not to finalized HTML, but to AutoSite input pages that I can easily slipstream into the existing AutoSite projects that nofi, lofi, and hifi are generated from. This means I will, again ideally, never have to toy with the XSLT stylesheets after they've been written, because any changes to the rest of the site layout will be handled in AutoSite, not in XSLT along with AutoSite.

Step zero: generating the DocBook

So, obviously, the story has to be in the right format first. I'm used to copying over stuff from an RTF or a Works document into an HTML document, and XML works exactly the same. Elements, tags, attributes, that stuff is all just as much in XML as it is in HTML, with some minor changes to suit XML's idea of being a good interchange format (any XML tool, even if it can't make much sense of an XML document's meaning, can at least read it successfully so long as it's free of typos). You know the weird trailing slashes people insist on including in void elements in HTML?

<img src="bubsy.jpg" alt="what could pawsibly go wrong?" />

That's not an HTML thing, that's an XML thing. XML requires all elements to be closed, even void elements, so void elements act as both an open and a close tag in the same tag. (If you're wondering where the mixup happened, there was an attempt to promote XHTML, which is an XML-based version of HTML, over HTML4 back in the 2000s. This was so feature phones were able to access converted versions of HTML sites in languages more suited for their lack of processing power, like WML. Then phones got more powerful and could just read normal websites and suddenly there was no need, so XHTML, which wasn't very well implemented in browsers anyway, died on the vine. Still, parts of it stick around due to misconception and also nobody but me caring about the difference.)

Anyway, if you're wondering what a DocBook file looks like, here's an abridged snippet of my layout:

<?xml version="1.0" encoding="utf-8"?>
<book xmlns="http://docbook.org/ns/docbook" xmlns:xlink="http://www.w3.org/1999/xlink">
    <title>KEVIN AND THEO'S MULTIVERSE MISADVENTURE</title>
    <titleabbrev>Kevin and Theo's Multiverse Misadventure</titleabbrev>
    <info>
        <author><personname>
                <othername>mariteaux</othername>
        </personname></author>
        <bibliomisc role="canonical">http://mariteaux.somnolescent.net/writing/stories/pennyverse/kevin-and-theo/</bibliomisc>
    </info>
    <chapter label="1">
        <info>
            <title>PAGE ONE</title>
            <titleabbrev>Page One</titleabbrev>
            <bibliomisc role="canonical">http://mariteaux.somnolescent.net/writing/stories/pennyverse/kevin-and-theo/01/</bibliomisc>
        </info>
        <para>Musty books. An entire building of them, in fact. An abnormally large aardwolf in a baggy maroon jacket teetered on two legs, carrying a stack of the things from chest to snout. Evening had fallen on the Apricot Bay Public Library, another week had passed, and the void of patrons meant he could round up what books had been discarded around the first floor by impatient children and uncaring teenagers. They called him Kevin.</para>

Not every piece of information will get used on all three versions of the site. I have both an uppercase and a lowercase version of each page name, as nofi uses uppercase on the visible page and lowercase for the page title and lofi and hifi use lowercase everywhere. This will make more sense when you see the XSLT.

DocBook has a lot of elements, a lot of which I don't need and a lot of which people have proposed cutting from the language entirely. I worked through the documentation to convert Kevin and Theo to DocBook throughout the week and got it done this morning. Now for turning it into stuff.

Step one: setting up xsltproc

One method of converting XML into other languages or forms is through a language called XSLT. XSLT is, itself, valid XML, but it also drives XSLT processors that turn XML documents into either HTML or other XML-based languages. XSLT is normally run in a browser on XML documents on a Web server, and this is usually how you'll see it referred to and documented online, but I want to run the conversion step offline for flexibility and also because I'm targeting browsers that have no support for rendering XML themselves, like Netscape.

My XSLT processor of choice is xsltproc, courtesy of the GNOME folks. I run it on Cygwin because it's the most convenient way I have to run Linux terminal stuff with my setup. I made a directory junction so Cygwin stuff could run on files in my sitebuilding folder, and I was ready to roll.

Step two: writing the XSLT stylesheets

This is the part that made me stumble the hardest, partially due to the complete lack of documentation. XSLT is based on templates—through your XSLT stylesheet, you have the processor match chunks of your XML input, and then you tell it what to convert it to. Problem was, I wasn't getting XSLT to match any element. The only thing I could get it to match was /, which meant "the entire DocBook". Funny as it was to see literally everything I wrote get stuffed into the <title> of the page, that's not really what I want.

So here's what wasn't working:

<xsl:template match="chapter/para">
    <p><xsl:apply-templates /></p>
</xsl:template>

Seems innocent enough, right? Match all <para> elements underneath <chapter> elements. Nope! Doesn't work.

After some time bumbling around in the dark, I discovered that XSLT requires you to prefix your namespaces. A namespace is a technical way to tell a program what XML elements are valid in a document. Technically, you can have any element you want in XML—<name>, <victim>, <objectshoveduparse>—but two different XML languages can have the same element name and thus collide with each other, so specifying namespaces and prefixes prevents that collision. I only learned this from StackOverflow, regrettably. (Even more regrettable: this adventure has made me reconsider my rocky long-term history with W3Schools, because it's the only place with decent examples of this stuff in action.)

With prefixes:

<xsl:template match="db:chapter/db:para">
    <p><xsl:apply-templates /></p>
</xsl:template>

That does work.

So began the process of slowly writing templates to convert everything in the DocBook to HTML. Anything that doesn't get used on the page, I have a template that just outputs nothing for that element.

An HTML document generated entirely from DocBook and XSLT

Here's an example of the end result! It might just look like the story on nofi, but it was generated entirely using tools and scripting, not by me playing with the HTML directly.

This is where I left off for the day, though, because I've hit an additional snag: I don't think I can use xsltproc to output multiple separate files. Remember, I don't just want an all-in-one page, I want to have the pages split up and then have an all-in-one option. Seems I'll have to dig into xinclude to set something like this up, which doesn't look too hard, at least, and xsltproc does support it.

Isn't it funny how I do so much technical work to ideally not have to do as much technical work when I want to be artsy instead?


May 04, 2025
The hifi style selector

So that, when you tire of one side, the other serves you best


I've had a bit of a second wind with mari.somnol recently! There was talk on Aftersleep about other people implementing theme switchers on their sites, and it reminded me I put up something similar on hifi and then only gave people two themes to play with. I've now added two more and made a whole ton of improvements to how the style selector works as a whole and how the site loads assets based on the current theme.

As one of those projects I intended to get back to when I had more time (and now I do), let me take you through how the hifi style selector works. I always used to be curious how people implement these on their sites, so if you're not sure yourself, hopefully you can gleam something from my setup. (I'm gonna assume you know a bit about Web pages, how they're put together, and how they're scripted. Mostly, it's just terminology.)

There's three basic components to a theme switcher:

  1. Different stylesheets/assets for each theme, of course
  2. A mechanism to add and remove stylesheets to the page DOM as necessary
  3. A way for the browser to remember the selected theme

Working backwards, the third one is pretty much always going to involve cookies. Cookies always felt to me like a fancy "big site" thing I'd never play with, but they're super straightforward, literally just a line of text stored by the browser with various bits of information inside of it. The cookie for hifi stores the preferred theme, the paths over which the cookie data applies to (so, the whole site), and an expiration date, which I set to be a year past when the cookie is first set.

The second one involves a "frontend" way to select themes and a "backend" way to add and remove them from the DOM, which is just a fancy way of saying the page as seen by programming languages. You can technically use PHP for this, but even as a huge PHP acolyte, I can't really recommend it. PHP is a serverside language, so you'd have to submit an HTML form with the selected theme in the dropdown, parse it on the server, and send back the page with the new theme baked into the markup. I dunno, you don't bring a KitchenAid mixer to a gunfight. If it involves styling the client, you should script the client and use JavaScript for it, even if it is the Devil's Language.

And the first? Here's my setup for that:

The way theme assets are organized on hifi

Each style is given its own folder in my site files with fonts, images, and stylesheets that pertain only to that style. It's almost like a WordPress theme in execution, and it's very clean and self-contained. It's also really easy to make child versions of other themes. I have a dark version of Clean and Tidy, the default hifi theme, which was as simple as @importing in the clean.css in the dark stylesheet and then overwriting a couple of its rules to change the colors and background of the page. Any updates to Clean and Tidy also get applied to the dark version completely automatically.

Making a new theme is actually a lot simpler than I expected it to be. hifi's markup is very theme-agnostic, and the individual page components can be rearranged any which way using CSS grid. The markup is organized so the page collapses into a scrollable tower for phones without the desktop CSS rules, and then above a certain page width, the desktop CSS rules are loaded in using a media query and the layout takes shape. If there's any elements I don't want to appear on certain themes, I mark them with a [theme]_hide class in the markup, and then set that class to display: none; in the theme stylesheet. There is a little bit of duplicating elements on each page, and I could clean that up, but it doesn't seriously impact speed or functionality, so I don't really care to.

styleswitcher.js is where all the magic happens. I've commented up the code, and I guess it's not doing anything too crazy, but in case reading JavaScript makes you break out in hives (me too), I'll give you the rundown in plain English.

  1. readStyleFromCookie() gets called first—if the cookie exists, get the preferred style from it, if not, set the preferred style to the default, Clean and Tidy.
  2. Both of these options pass the preferred style to the setStyle() function, which does the actual heavy lifting of setting up the new stylesheet on the page.
  3. setStyle() starts by nuking all stylesheets from the page DOM. In other words, the page is now completely plain HTML.
  4. setStyle() then adds a new stylesheet to the head of the page by constructing a brand new element and setting it to load the stylesheet at /styles/[preferred style]/[preferred style].css.
  5. I also determine the date one year from now and set a variable to it. This is what we'll put in the cookie for an expiration date. If I don't set it, the cookie only seems to last a few days, which is annoying.
  6. I create/update the cookie. Whatever style is preferred, whether it's the default or an existing preference, is now set as the preference once again.
  7. The style selector dropdown gets set to the value of the preferred style as soon as the page is fully done loading, so that way the name in the box matches the name of the active theme.
  8. One more step! There's a function called loadStyleExtras() that the preferred style gets passed to. This is a big catch-all function for making elements that only exist on certain themes. Nostalgiamining Away (the minerteaux theme) and The Platypus Years (the mari_nc1 theme) load in header images. The Platypus Years also loads in a script of rotating footer lyrics from songs like mari_nc1 had. These would be unnecessary on other themes and add page bloat, so they're loaded in only if you're using that theme. Some themes have no extras at all.

Say the user then sets a new style from the style selector dropdown in the footer of my site. There's an onChange attribute attached to this dropdown that calls readStyleFromSelect(). This reads the value of the dropdown, passes its value to setStyle(), and the process begins from step three anew.

I've said it too many times now, but it bears repeating: this is so fucking satisfying to me. For one thing, it just works well. Modern HTML and CSS have enabled me to completely transmogrify any page into any layout; this kind of thing would simply not be possible on lofi, where the markup is far more closely tethered to the layout and functionality of the page. (And nofi doesn't use CSS at all! Or have much of a layout to change!) Beyond that, each theme is based on an older site I've had, and at any moment, I can just look at my modern, 2025 work and art and album reviews in any old random Cammy site layout, like the most bonkers kind of alternate reality time travel. My favorite at the moment has to be the minerteaux theme—for a site that was literally only up for a week at the time, I'm strangely attached to it. Must be those XFader textures. Pleasing to use and to look at.

I always thought that hifi and returning to mariteaux.somnolescent.net would come with a feeling of my identity online being solidified again, and it really has. I've just been feeling a lot more confident in myself and how I look to the world lately. It's lovely.

If you're curious about further themes—I think I've run out of Cammy sites to turn into themes, really. mari_v1 is now a theme. mari_v2 became lofi, so it doesn't really need to also be a theme on hifi. mari_v3 is the default hifi theme in light and dark variants. mari_nc1 is a theme now. mari_nc2 is a little too basic to turn into a theme. minerteaux is a theme now. I could do some meme layouts based on other Somnolians' sites, but those would date potentially with redesigns. I was thinking of doing a Bootstrap version of hifi a la dcb_bootstrap, but when I started adding Bootstrap grid classes to the markup, it started breaking the other themes, so that's a no, sadly.

I'm happy with this, honestly! If there do come more opportunities for theme fun, it's dead simple to make new ones and add them, but for now, the current set pleases me greatly. The final frontier of hifi work is honestly just to get my stories on there again. I've finally been poking at DocBook and XSLT, and as overwhelming as it is at first blush, I think it'll be everything I need to keep six (!) different versions of each story in harmony. That'll be a journal post for a day when I have that figured out, though.


May 02, 2025
Felix sketches!

Only took me 10+ years


If you've known me for a very long time, we're talking the teen years, and even then, you had to be close to me—okay, so basically, only Savannah knows, but still—I've actually had OC ideas and ambitions since I was 14, but a lack of drawing ability really kept me from sharing them widely. I tried to write them, but nobody reads that shit and it wasn't very good anyway. Even since I learned to draw, there's been a certain fear I've had of actually designing them for whatever reason. 2025 marks ten years of a lot of them existing with literally zero trace of them outside of private chats and the isolation of my mind.

This boy was the very first one! His name is Felix. I got into Pokémon and Mystery Dungeon early in 2014 as a way to pass the time stuck at home expelled from school, and I got obsessed. Oshawotts just became my favorite thing ever especially and are probably the reason I like mustelids so much these days. I was super creative, so originally, Felix was named Maru (y'know, Oshawott's Japanese name?), but somewhere down the line, he became Felix to me. He's soppy and easily frightened, often convinced he's cursed thanks to his shiny coloration, but unendingly loyal and will push through the pain when he knows he has to. He also loves sweets and seafood. He lives with his lifelong Chespin friend/sorta girlfriend Hazel, his headstrong, adventurous, protective other half (while Felix acts as her common sense and conscience).

Felix does have a more realistic anthro otter design I'll be designing for Pinède as well (and Caby encouraged me to come up with a species and Pinède design for Hazel as well, which is a great idea). This was just a sheet to figure out how I like to draw him, since I've never really done so before now. Shame, really—I've decided to start really cranking out toyhou.se bios, refs, and doodle sheets of all my neglected characters (which is basically all of them) to make up for it. They'd forgive me and appreciate the attention, I hope. I know I'm happy to see him.


Few more random thoughts while I've got the journal pulled up. Some more discussion with the Somnolians about me getting fired has led me to settle on the idea that it was probably financial, if they were replacing me with part time help that wasn't owed benefits or anything. Still majorly shitty, but whatever, less to do with me than I initially thought. If you're curious, the beer store was already tightly staffed—it was just the four of us, and that includes two store managers. I was the least senior of anyone there, so I guess it makes sense. Still shitty, but I've made peace with it.

Finally, if you cast your eyes back over to hifi, check the theme switcher! I cranked out a theme based on minerteaux earlier today in literally two hours, which is a far shorter turnaround for building a site theme than I anticipated. If you don't remember (lots of memberberries today), minerteaux was a literal week-long redesign I did of my Neocities site back in November 2018 to get back at the idea (thanks to my essay on nostalgiamining) that I just happened to hate old-looking websites. It was actually a pretty fun larp to go on, and I'm still fond of how it came out, so a theme it becomes! (You can read this slightly later essay on the project if you're wondering how I put it together. The modern version uses grid and CSS and just looks like a table layout.) That just leaves mari_v1 on the table for needing a theme...

Later though. I'm gonna keep working on the Guitar Hero II RetroAchievements set. Five-star Expert bass grind is hugely satisfying.


Previous months