A Lovely Harmless Monster

Crafting

Crafting is how I conceptualize most of my creative work. We often think of "crafting" as something done with physical materials, but I use words and code to craft digital objects like this website, stories and computer games. We already think of writing as a craft, and I don't think it's a leap at all to think of other forms of digital creation as crafts.

Some of what I craft could be art, but I'm more comfortable thinking of myself as a crafter than an artist, since art is more subjective and undefinable. Plus, the term "art" is strongly linked to visual media, which isn't my strong suit. If anyone else thinks of something I make as art, I'm very flattered, but I'll probably always be uncomfortable self-identifying as an artist.

Tags: topics, crafting

Android Browsers are Weird

Tuesday May 06th, 2025

Tags: blog, crafting, phones, tech

In the old days, Android phones all came with an app installed that was just called Browser. This was usually an official Google app, and it was just a wrapper around android's WebView. This is a system component that's always been part of Android, and it's a web renderer that any app can use. If you use an app like Instagram or Facebook and click a link, it often uses WebView to render it, rather than opening a dedicated browser. This is because Facebook wants to keep you using Facebook, and if it opens a full browser, you can type in a URL or open a new tab to go somewhere else. Facebook wants you to just tap the "back" button and go back to Facebook, so unless you start clicking links, that's the only option you get.

The popular third-party browsers on early Android, like Kiwi and Dolphin, were simply wrappers around the WebView API that offered additional features or a better UI than the default Android browser. Some mobile browsers, like Brave and Opera,1 market themselves heavily and include malware or deceptive services to profit off the users in some way; but fundamentally they're just the same WebView implementation under the hood.2

There are exceptions; the android version of Firefox still uses a version of their Gecko engine, but as a result it's slower and clunkier than the ones that use WebView.

I use Via. It's also just a wrapper around WebView like Kiwi and Dolphin were, but unlike those browsers, it hasn't yet capitalized on its popularity by adding ads or other malware. It's fast, it stays out of the way, and it even has some basic ad-blocking functionality. It's not as comprehensive as uBlock Origin, but it makes the corporate web somewhat usable on a mobile device.

Now, I haven't mentioned the elephant in the room, which is Chrome: at some point, Android stopped coming with an app called "Browser"3 and started including Chrome, which makes sense: they want to unify all their OS stuff under the Chrome umbrella, because in many ways, everything is becoming a web app. ChromeOS can run Android apps, and many modern Android apps are made with the same javascript frameworks that websites are made with. The distinction is becoming less meaningful.

Here's what I don't understand: surely the android version of Chrome is also a wrapper around WebView, right? So why do sites look different on Chrome than they do in Via? I've been mildly obsessed with this question, because I opened my site in Chrome and noticed a lot of text is the wrong size. Other than <h1> <h2> etc, and the navigation bar and footer, all the text on this site should be exactly the same size. I carefully crafted page elements so that, for example, the Browse section of the front page is two neat columns in harmony with the rest of the text. But on Chrome, the text in those columns is smaller. The "browse" item in the navbar is too small, the navbar items don't line up nicely in three rows, and the overall text size is much larger than it should be.

I've pored over the CSS. I can't figure out where the discrepancy is coming from. I can't figure out why it doesn't look exactly the same as it does in Via. It should. Chrome must use WebView under the hood, right? Or maybe now it's more accurate to say WebView is using Chrome. Either way, it should all be the same. The Chrome app is 30MB, which is bigger than Via's 12 MB, but that's probably accounting for Chrome's google profile integration and other data-mining malware. There's no way it contains an entirely separate rendering engine; the desktop version is around 200MB. Idkwtf.

In Mobile Data Banditry, I used my browser's development tools4 to modify my mobile carrier's web site to insert an <iframe> and see if it would allow me to bypass their data restrictions.5 I complained about the user experience on a phone:

But it was at least possible in 2022. Now it doesn't seem to be. There may be some browser that offers this functionality, but crucially, I can't use the developer tools on mobile Chrome to see what CSS it's applying and why. Mobile Chrome doesn't even seem to have a view source function. It's 100% for consumption.

I have a tendency to fixate on small details---you wouldn't believe how long it took me to make sure the little arrow on the "Browse" drop-down changes back and forth correctly---but here, I'm going to have to tap out. I don't have a comb fine-toothed enough to figure out how to make the CSS look normal in Chrome, nor do I have the spoons to care. My official recommendation is not to use Chrome; if you do, zooming out to 90% makes it look closer to how I intend. Beyond that, I can't help you 🦝

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. Opera used to be great; it was my go-to browser for most of the 2000s, back when there was an actual browser ecosystem. It was bought by a vulture capital cabal in 2016 and has since used its name recognition to facilitate scams↩︎

  2. Reader Goofpunk believes Brave and Opera are in fact using Chromium components rather than WebView; I haven't installed either browser (for obvious reasons) but if true, this makes the whole ecosystem that much more confusing to me: Why would they choose to use Chromx instead of WebView? What's the difference, but more importantly, why is there a difference?? ↩︎

  3. Your phone may still come with an app called Browser, but it's probably from your phone manufacturer or carrier, not Google. Samsung phones in particular like to change your default browser back to Samsung's Browser every time your device has an update: it's a wrapper around WebView with some added malware. ↩︎

  4. In that entry, I incorrectly stated that Android browsers are based on Chromium; my understanding now is that "Chromium" is just the name used by the open-source components of Chrome. If you want to get technical, the engine used by all of these browsers is called Blink. Hopefully you can understand my confusion. What is the exact relationship between WebView, Blink and mobile Chrome?  ↩︎

  5. It didn't, but I still think it was a clever idea. ↩︎

IP Theater, Congrats to Rabbit, Bloggodynamism

Thursday May 01st, 2025

Tags: blog, copyright, correspondence, crafting, meta, no-ai

I was thinking about the art I use from openclipart and opengameart and it made me feel bad about publishing with a noderivs license. Having public domain art to draw from adds a lot of life to this website and my other projects, and it would be cool if someone liked one of my stories and wanted to turn it into a comic, or read it on a podcast, or use it as inspiration for a game. I'd be proud if something I made could contribute to open culture, too; I just put the noderivs clause on there as a feeble protest against AI scraping. But this is kind of silly. Technically the "non-commercial" clause should protect me, now that OpenAI is no longer a "non-profit" there's no legal argument that their activity is non-commercial, but the sad reality is that corporations are going to do whatever the fuck they want and I as an individual have no legal recourse, because the system is designed to protect capital and nothing else. So fuck it, I'm going to switch to CC-BY-SA. The only thing ND does is discourage the people who might actually get some value from my work and use it ethically. I'll keep the no-ai disclaimer even though I don't think it legally does anything; I can't legally do anything, anyway. Maybe someday I'll be part of a class-action brought by the EFF or something, that's the best I can hope for. Maybe I should just go full public domain with everything. In practice this is all just intellectual property theater. Legal cosplay. I'm not a member of the class that's allowed protection so I get exploited. That's the game I'm forced to play, so I might as well try to help my team.

Congrats to Rabbit!

Rabbit at jackalope.city finished 100 days to offload! Completing a challenge to blog 100 days in a year doesn't sound that hard on paper, it only requires a 27.4% posting frequency, but if you're not used to that amount of output, it can be quite an adjustment. It takes moxy to stick with a new habit. It takes grit to stay self-motivated. It takes courage to write even on days it doesn't come easy. Well done!

I finished the challenge in July 2022, and in typical me fashion, I didn't tag any of my posts or really talk about it much until I was done. I don't know why I'm so resistant to self-congratulation; I have this knee-jeek reaction that I would be perceived as conceited or narcissistic, but I don't think it's conceited or narcissistic when other people are proud of their accomplishments. Maybe I should try the Be Kind To Myself For 100 Days challenge.

My 100-day challenge was the self-imposed kick in the butt I needed to think of myself as a writer again. Although my output slowed down in 2023 and significantly in 2024, the bug is still with me, hopefully for good.

I'm not doing any kind of official challenge this year, but I'm well on my way to 100 posts again: 40 posts already and it's only May. I think I'm going to be more motivated to write now that I'm doing it on my own website, too. I don't have to worry about spamming any feeds, because I'm not sharing it with anyone else. I have free reign over my domain! Oops, there I go thinking like a landlord. It's hard not to when most of the rest of the internet treats us like digital serfs.

Bloggodynamism

So, I went kind of ham with the custom dynamic variables: I have not one but three custom emoji: pat, nb and lander give you 1

I'm sure I'll add a few more, but I'll try to use them sparingly in the blog: they probably won't show up right in the feed, because they rely on external stylesheets for the formatting. You can't just drop an img src tag into the middle of a sentence and call it good, you have to make a tiny div that uses the image as a background if you want to be able to size and position it properly. Way too much hassle to do it manually, but a piece of cake with the power of PHP.

But, it kind of leaves feed readers out in the cold, so I'll try not to rely too heavily on them. In fact, most of this stuff is only going to be relevant to page visitors, sorry! Feed readers can skip this section.

I created variables for each of the buttons at the bottom of the blog post: likebutton, sharebutton and replybutton. Just in case I ever want to use them individually. Hey, it could happen! But I also made pagebuttons so I can drop in all three at once, which is what I'll be doing all the time.

This wasn't that much friction before, because I could include the code in my post template, but now all that ugly HTML is hidden away in the guts of the computer, instead of messing up my nice orderly markdown files. Plus, if I want to change something about them, I can do so on every page at once! If I decide I don't want them, I can replace them with an empty string. Anything I want repeated over and over, it's always better to have a function rather than doing it by hand.

I also created blogtop, which generates the entire top section of the blog post: the h1 title (including the pagetitle id attribute that makes the share button work), the block quote div, the date and the tags. For pages, there's pagebottom which shows a blockquote div with the tags and the date the page was last modified. Ideally, there shouldn't be a single page that you look at and wish you knew when it was from. I find that sort of thing frustrating. There are pages where it's not necessary, I don't think anyone is going to look at the contact page and think "what's the context for this??!", and it seems excessive to use the full pagebottom on every single topic page. But all the main stuff should have some form of date stamp.

I also cleaned up the buttons: the share button previously broke everything if it was on a page without a pagetitle id, but now if that attribute doesn't exist, it'll just copy the URL. To encourage inter-blog communication, the reply button will now show you a field to enter a URL to ping me from your own site (a great idea shamelessly stolen from Rabbit), with a link to the contact form if you want to send a message. I'm not using webmentions or anything, it just uses the same script as the contact form and guestbook to send me an email. Webmentions would be cool if every blog was running them and set up to automatically ping every other blog that's mentioned, but since that's not a thing, it might as well just be an email. Maybe the glorious webmention future will arrive someday.

Rather than post all the new code, I'll just link to the repository I set up as a site backup. It's a snapshot of all the HTML generated in static mode, all the markdown files and all the bits of custom code in conveniently-labeled folders. The idea is to do backups on the last day of each month, so if anything happens and I lose my webhosting again, I won't lose that much history. I kinda wish I was doing that with my oddmuse site, there's probably some stuff in there that I would like to have kept maybe I'll try to do weekly backups of my markdown...

Anyway, there are only two more features I want to hack in to call it "done":2 I want the "what's new" section to automatically display the dates and titles of the three most recent blog posts with links to view more,3 and I want the /blog landing page to automagically show links to all the blog posts. I use a lot of images and footnotes, so I don't think doing a simple tag sort will be the best way to browse the entire blog, especially once I have hundreds of posts here.

I'd prefer if tag search worked more like bear, where it just shows you links to everything with that tag instead of full pages, and I'd like it if I could have a page that shows every tag. There's no easy way to do that with kiki. Which isn't a big deal right now, but you know, I'd like this to be my forever home. Someday, muse willing, this site will contain vast multitudes. I think I'll be able to hack all this in, I feel more confident after messing with dynamic variables and looking at the pagegen code. It'll be a lot more complicated, but it's doable. I know how to do a for loop. I can see which part of the code looks at the page tags and how. I know how to put a div together piece by piece. The main problem is figuring out at which point in the program the variables I need to work with are in scope. It's challenging to figure out by reading the code which variables I can use where.

I know I can do it, but I really, really need to take a break from programming now. I love it but it has taken over my brain. I have a site that I'm really happy with, it's time to use and enjoy it

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. And now sad gives me , which I added for this post. ↩︎

  2. But I have the curse of the tinkerer, nothing will ever be done unless I force myself to accept it as done, there will always be bits I look at and think "I should make this different". Lord grant me the wisdom to not change the things that don't need changing. ↩︎

  3. I was using an RSS 2 HTML widget for this, which is really handy when you're on neocities and stuck with HTML and js, but I can find a much more elegant way to do it here. Plus, it would sometimes take too long and prevent the rest of the page from loading for several seconds, and for whatever reason the async attribute was making it break the page layout, so something about it doesn't play nice with the pagegen code. ↩︎

Coding as a Craft

Saturday April 26th, 2025

Tags: blog, crafting, kiki, mental health, meta, programming

Learning about bash and working on whirltube has got me feeling the programming itch again, and I'm not sure what to do with it. Part of me wants to keep adding stuff to whirltube even though I don't need to, but that way lies madness. I need to find a new project (or go back to an existing one.)

I've never approached coding like a programmer. My interest in programming lies in my ability make tangible things. I wasn't blessed with natural artistic talent, I can't paint a painting, or record an album, or build a chair, or grow a garden, or weave a tapestry; but I can create a program. I can visualize what I want a piece of software to look like and do, and I can start with nothing, and I can build it brick by brick.

Most professional software devs will tell you you're a fool if you start from scratch, that you should use existing libraries as much as possible. Why reinvent the wheel? But to me, the invention is the joyful part of the process. It's fun to invent the wheel. There are a lot of wheels I could use, but this one is mine. To me, it's like saying "why paint Mt. Fuji? There are already lots of paintings of Mt. Fuji, just look at one of those."

It's inefficient, of course it is, the same way painting a picture is inefficient compared to taking a photo, or writing a blog post is inefficient compared to telling an ai to write one for me, or watching the sunset is inefficient compared to work. The inefficiency is the point.

This is an unorthodox view of programming, because historically, the efficiency has always been the point. Back in the 60s and 70s, computers had so little processing power and memory to work with, efficiency was everything. You had to be a technical sorcerer to make a computer do anything, much less do it well. High level languages like BASIC and COBOL made computing more approachable, but you had to use machine code to make anything real-time or impressive.

Fast-forward to today, and computers can do billions of things per second, many of them simultaneously, and hold vast libraries in their volatile memory. A bit of inefficiency isn't going to hurt anything. I have no interest in optimizing my program until it can execute commands in 0.005 seconds instead of 0.01.

Video Game Tangent

This optimization fetish is still fairly common among programmers, and we see it manifest in niche game genres. I was excited for the Zachtronics game Exapunks, and pre-ordered the edition that came with the physical zines and other feelies. I loved the retro hacker aesthetic (still do) and was excited to jump into a game that involves actual programming. I thought it would be right up my alley.

I got nothing out of the game and gave up on it almost immediately. I was solving the puzzles, but it didn't feel like fun to me, it felt like work. The game showed me how quickly my friends' programs completed and in how few lines of code. It expected me to want to try to beat their scores, but why would I? I solved the puzzle. Why would I care about solving it better? I achieved the goal.

We see the same zeal for optimization in sims like Factorio and Stardew Valley, and in sandbox games like Minecraft. I get no dopamine at all from these sorts of games. I bought My Time at Portia thinking it'd be an Animal Crossing-esque chill social life sim game with more mechanical depth, and was disappointed when it devolved into optimization porn. I reached a point in the gameplay loop where I was expected to build intricate clockwork systems of widgets creating and refining materials to use to make other widgets, and I was done. It started feeling like drudgery. I came to realize that playing and creating are two very different mindsets for me. With play, I'm extrinsically goal-oriented. I want a game to present fun systems for me to interact with to achieve concrete goals. I also want an interesting world to explore and a character to represent "me" in the world.

Creation is different. My goals are all intrinsic. I want to visualize a thing and have the building blocks I need to make it, self-directed. I want to turn nothing into something. My attitude when I play Minecraft is, why would I build something in this game when I could be building my own game? As usual, this bridge between what I like and what everyone else likes is a shaky one of unattainable passage, but at least I've figured out how my brain works and can adjust my expectations accordingly.

Back To Programming

That was a very long tangent, but hopefully it helps illustrate why I approach programming as a craft and not a science. This isn't to downplay the importance of efficient, optimized, low-level code for the functions that need it. For example, compression algorithms. Our entire media ecosystem is dependent on image, audio, and video compression. These are getting better all the time, and we've seen some truly staggering gains in file size and efficiency, which means we need less bandwidth and less storage for media of higher quality than was possible just a few years ago. I can't even begin to grok the math and physics required to make this possible, and I'm in no way comparing myself to the actual computer scientists. I'm grateful for all their work.

I guess in technical terms one could call me a "front-end developer", although most folks who self-identify this way would probably not accept me into their club, either. My idea of what makes a good interface isn't state of the art.

I think TUIs, or text user interfaces, are cool. I think mouse-driven interfaces are good for UIs that require a lot of non-linear decisions in a small amount of space, like a hypertext document or a LucasArts adventure game. But for a menu-driven interface where each menu only has a few options, I think keyboard control is the way to go. If a menu only has four things to do, why make me move my mouse between them? Why hide options behind multiple clicks? If a menu can be controlled exclusively by the four main fingers of my left hand, it requires almost no thought or effort.

When GUIs were the new hotness in the late 80s and early 90s, and everyone was getting used to this strange new tool called the "mouse", every peg started getting hammered into the "mouse" slot whether it made sense or not. I think that's a shame.

On the extreme other end, which I also don't like, is the command line interface, which I don't really think is an interface at all. It's an interface for other programs, not people. One of my main beefs with linux is that many programs are written with the assumption that people will enjoy interacting with the computer this way, and I don't. I don't want to have to type --help and scroll through a myopia-inducing codex of arcane glyphs to figure out how to do what I want. I strongly believe that if you invoke a program without any arguments, it should give you a basic TUI with the most commonly-used options and let you select one. That's what whirltube is, it's what I would expect to see if I type "yt-dlp" on the command line and press enter, if the world worked in a way that makes sense to me.

So, TUIs are cool. You know what else is cool? Websites.

What's Next

When I started writing this, I didn't know what my next project would be, but now I know. It's my website.

Kiki came along, and it's exactly what I've been looking for in a "CMS".1 It's a wiki and a blog engine written in PHP, but it's not a gigantic monster of a framework like Wordpress or Mediawiki. It's also not a stripped-down static site generator that requires building on the command line.2 It's a web 1.0 creation tool for the 21st century. You don't have to install node or react or ember or any JavaScript frameworks; you don't need any frameworks whatsoever. Just a webserver that supports PHP (or any webserver at all if you're using it in static mode.)

In Self-Hosting Again I reckoned that I wouldn't be moving off bear anytime soon:

It'd be nice if there was a self-hostable CGI blog CMS for normal people, but [...] that's not really a thing.

Kiki is that thing! It exists! It supports a markdown flavor that's basically exactly the same as what bear uses, so my writing workflow is the same. I can post entries and create pages from my website, without needing to FTP into my site. When I can FTP into my site, that's when it gets really fun.

I forgot how much I enjoy having full control over the l tech stack. I can edit HTML and CSS, but I can also get in and hack the PHP engine itself. I can change any aspect that doesn't suit me. I can add new functionality! I just need to learn how to do it in PHP, which despite what the tech world would have you believe is still quite functional and stable. I can even add a bit of javascript, for fun. I've softened on my anti-javascript stance. Writing raw JS is a good time. I can add all sorts of fun little widgets and Easter eggs. No, as I noted in a recent footnote, the enemy isn't javascript, it's frameworks.

The Mozilla Developer Network says:

JavaScript frameworks are an essential part of modern front-end web development

I live in the modern era, so I guess I still don't qualify as a front-end developer; but you can call me a web crafter 🦝

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. "Content Management System" is such a gross turn of phrase. I feel like no one uses "CMS" anymore, which is good, but I don't know if anything has replaced it. Can we call them "hypertext engine construction kits"? HECK yeah, we can. ↩︎

  2. But it can be used this way! It's very flexible. ↩︎

Website, Kiki, Brain

Tuesday April 29th, 2025

Tags: blog, crafting, kiki, mental health, meta, programming

Most of my creative energy for the past few days has gone into my website. I'm really happy with how it's coming along. My goal was a design that combined the simplicity of my bearblog with the colorful personalization of my old neocities site, and I think I nailed it. I solved the navigation problem by putting all the major site categories in a well-designed and accessible drop-down menu in the navigation bar. I've always wanted a site with a drop-down menu, but always balked because doing it with pure CSS or a details/summary hack never looked or behaved quite the way I wanted. Like I'm sure it's possible if I beat my head against it long enough, but instead, I just used javascript. Every big website is three javascript frameworks in a trenchcoat, so I can have a little script or two. It looks great.

I think I'm pretty happy with the design and structure of my site, most of the changes I want to make now will involve hacking the PHP to streamline and automate some processes. I'm not going to rush it, because I need to take a break from programming for awhile. I love it, but I tend to get "lost in the sauce" a little bit. It's like the good version of what I experienced during my Linux ordeal. Instead of addiction fueled by frustration, it's fueled by the joy of creation. It's good, but hacking the PHP will be much more challenging than anything I've done with kiki this far and I need to slow my brain down.

Kiki

Speaking of kiki, I'm still very happy with it. There are some functions from other wiki/blog solutions I wish it had, but it's still been a joy to work with. I can't believe how long my workflow for having a website was "writing HTML in the Neocities editor". I don't like writing HTML under the best circumstances, and I love neocities philosophically, but their file management/editing UI is straight-up dog trash. Maybe it's just the devil I know, but markdown works for my brain. Making a new page on neocities involved: deciding what template I want to use, copying and pasting the template, making sure to change all the fiddly bits (there are still pages on the old portfolio site with the wrong title attribute because I just couldn't make myself care,) writing the page, checking the formatting, fixing the formatting, checking the page again, checking the links, fixing the links, and hopefully adding a link to the main page (checking it 2 or 3 more times to make sure everything works properly, usually fixing at least one more thing after it's live...)

With kiki, the process is: create a link to the new page. Click the link. Fill out metadata. Write markdown. Save. Done. I'm still not perfect, but I make way fewer mistakes because markdown stays out of my way. It feels like writing++, not writing subsystem for hypertext.

Anyway, I've copied most of my stuff from the old site and linked to most of my stuff on third-party sites. There's still probably a lot of blog posts I want to copy over to the archive, but so far I've just got a few recent ones and a few old ones that stick out in my memory. If you've been a reader on bearblog and you think any particular entries are worth highlighting, please let me know.

In other website news, I'm thinking of ditching the guestbook, at least for now. I checked my dashboard to see if all the recent activity has impacted my hosting fees at all, and no, not really; but I noticed that the cost of a SQL database is almost as much as the rest of my website combined. Which is still barely anything, but like, the guestbook is kind of broken anyway. It doesn't escape characters properly, which wouldn't be a big deal, except that it breaks if someone uses an apostrophe,1 which is a pretty important character. Like if you're going to write English with a limited character set, you can get by with just periods, commas and apostrophes. Losing any of those 3 is kind of a dealbreaker. I can fix it by editing the database, but I don't relish the idea of it looking like trash until I notice it and am at home where I can fix it.

I could debug it, but I'd rather spend my energy on a guestbook module I can cleanly incorporate into kiki, preferably using flat files instead of a database.

I mean... I guess the simplest option would be to just use my existing contact form, and if you put "guestbook" in the subject line then I'll add your message to a guestbook. I'll just make a "guestbook" tag and give each entry its own page. Boom, problem solved. People might not want to use it if the message doesn't appear instantaneously, but then they can just not use it. There are plenty of places on the internet for instantaneity, my personal website doesn't have to be one of them. It's cool.

Also, I realized my captcha approach was totally unnecessary. I changed it to a "negative captcha". The idea is, bots that spam forms on websites will put something in each input field. They're not designed to leave anything blank. So I have a captcha field on the form that's invisible to humans but visible to bots. If that field contains anything when the form is submitted, it's identified as a bot submission and rejected. I read about this technique years ago, and apparently it works, I don't know why I didn't think to do that before now. I guess "bots fill out every field" feels slightly more superstitious to me than "bots can't identify emoji". Like, is it true? I feel like I've seen spam comments on blogger where the bot didn't bother to fill out the URL field. Which seems counter-intuitive to the purpose of spam, but nothing about spam makes sense to me. Anyway, I guess I'll see if I get any spam and report back. If it doesn't, I might try giving the bot traps ID attributes like "message" and "email" and see if it's more inclined to fill them out. The actual message and email fields could have gibberish IDs, they only matter to me and the computer.

Brain

So, I just did all the work I talked about for the guestbook. At work, on my phone, even though it would've been way easier if I waited til I got home. This is the problem with my brain problems: if I have an idea, I need to act on it immediately, because I have the motivation now, I may not have the motivation later. A lifetime of ADHD executive dysfunction has trained me to strike while the iron is hot, do the thing now because when I get home, it may be too late. Even though my ADHD is treated, and I'm a lot more likely to be able to follow up on an idea, old habits die hard.

Even as I was writing this, I thought "Now that I integrated the guestbook page into kiki, I know I can do the same with the contact form." Previously both functions were in their own separate sandbox, and I crudely copied the HTML generated from one of my pages to make it appear to be smoothly integrated. But there were seams. I knew I could do it right.

The only PHP function in the form is one that parses the URL for a ?subject= query and auto-fills the subject field if there's anything in there. Following the instructions in the user guide, I added a new variable to the load_page() function to allow me to do this from within kiki:

if ($page_source)
{
... snip ...
if (isset($_GET["subject"]))
    {
        $dynamic_content["subject"] = $_GET["subject"];
    } else {
    $dynamic_content["subject"] = "";
    }   
... snip ...    
}

Now in my contact form all I have to do is add value="$subject$"2 to the subject field, and it works! It's seamless!

This is something I was never able to do with oddmuse. I had to use the "copy the HTML" method and keep the contact form sandboxed, because the contact form was PHP and oddmuse was perl.

It's a very small thing, but this is the first time I've actually changed the kiki code for a dynamic function, and not just adding a <title> attribute or header image. Getting it to work feels incredible, I'm unstoppable. I already know what my next hack will be: custom emoji! It should be dead simple to add a $$headpat$$ variable that will drop in this critter:

See, this is what my brain does. I shouldn't be doing any of this. Remember what I said the other day about debugging PHP on your phone? And how you should not? I can't take my own advice. I said I needed to take a break from programming and slow down and then I did this in the same afternoon. My brain makes me do things I shouldn't. I wish it didn't have a mind of its own

If you mentioned this post on your own site and would like to notify me, please enter the URL here:

Otherwise, click here to send a message.

  1. Yes, technically it's a "single quotation mark", but you know what I mean. It's the key on the keyboard that everyone uses as an apostrophe. ↩︎

  2. But with two dollar signs on each side instead of one. Even in <pre> tags and using HTML shortcodes, dynamic variables still get parsed! ↩︎