From 16e48ed8655528a81cbec84f0cbc1a211d663b37 Mon Sep 17 00:00:00 2001 From: Hannah Isopod Date: Sun, 9 Nov 2025 08:58:02 -0700 Subject: Probably final commit before the redesign Routine updates to various pages Accessibility fix in /guestbook Updated /uses im pretty sure Reorganized /blog/ a little under the hood --- blog/blog.atom | 16 ++- blog/post.php | 133 +++++++++++++++++++++ blog/posts/ai2/index.md | 6 +- blog/posts/ai2/index.php | 2 +- blog/posts/ai_art/index.php | 2 +- blog/posts/blog_questions/index.md | 2 +- blog/posts/blog_questions/index.php | 2 +- blog/posts/building_a_cooler_body/bg.png | Bin 0 -> 451690 bytes blog/posts/building_a_cooler_body/index.md | 57 +++++++++ blog/posts/building_a_cooler_body/index.php | 1 + blog/posts/building_a_normal_server/index.php | 2 +- blog/posts/building_a_regular_bed/index.md | 2 + blog/posts/building_a_regular_bed/index.php | 2 +- blog/posts/building_a_sensible_server/index.php | 2 +- .../index.php | 2 +- blog/posts/discord/index.md | 1 - blog/posts/discord/index.php | 2 +- blog/posts/fediverse_dms/index.php | 2 +- blog/posts/grow_spikes/index.php | 2 +- .../guide_blacklist_websites_searxng/index.php | 2 +- .../guide_blocking_user_agents_nginx/index.php | 2 +- .../guide_fix_youtube_buffering_firefox/index.php | 2 +- .../index.php | 2 +- blog/posts/guide_pihole_lepotato/index.php | 2 +- .../index.php | 84 ------------- .../wireguard_logo.png | Bin 12772 -> 0 bytes .../guide_things_i_keep_having_to_google/index.php | 126 ------------------- blog/posts/make_your_own_cables/index.php | 2 +- blog/posts/my_terrible_distro_hop/index.php | 2 +- blog/posts/post.php | 129 -------------------- .../posts/renting_an_unremarkable_server/index.php | 2 +- blog/posts/stop_using_chromium/index.php | 2 +- blog/posts/toshiba_chromebook/index.php | 2 +- .../index.php | 2 +- 34 files changed, 232 insertions(+), 367 deletions(-) create mode 100644 blog/post.php create mode 100644 blog/posts/building_a_cooler_body/bg.png create mode 100644 blog/posts/building_a_cooler_body/index.md create mode 100644 blog/posts/building_a_cooler_body/index.php delete mode 100644 blog/posts/guide_self_host_safely_with_wireguard/index.php delete mode 100644 blog/posts/guide_self_host_safely_with_wireguard/wireguard_logo.png delete mode 100644 blog/posts/guide_things_i_keep_having_to_google/index.php delete mode 100644 blog/posts/post.php (limited to 'blog') diff --git a/blog/blog.atom b/blog/blog.atom index 78b7b40..58e9927 100644 --- a/blog/blog.atom +++ b/blog/blog.atom @@ -12,12 +12,24 @@ + Building a Very Regular Bed building_a_regular_bed 2025-08-25T00:00:00+00:00 - 2025-08-25T00:00:00+00:00 + 2025-11-04T00:00:00+00:00 I just moved and the new digs are kinda lacking in square footage. In this one, I design and build a loft bed from scratch to try to fix that. @@ -37,7 +49,7 @@ ai2 2025-06-11T00:00:00+00:00 - 2025-06-11T00:00:00+00:00 + 2025-11-04T00:00:00+00:00 I'm still not very fond of the subject of the current tech hype cycle, but my thoughts on the matter have developed some nuance since I last posted about it. diff --git a/blog/post.php b/blog/post.php new file mode 100644 index 0000000..354472b --- /dev/null +++ b/blog/post.php @@ -0,0 +1,133 @@ +entry as $entry) { + if($entry->id == $cwd) { + $pdate = preg_replace('/T.*$/', ' ', $entry->published); + $udate = preg_replace('/T.*$/', ' ', $entry->updated); + $title = $entry->title; + $descr = htmlspecialchars($entry->summary); + } else if($title) { + $nextlink = $entry->link["href"]; + $nexttitle = $entry->title; + break; + } else { + $prevlink = $entry->link["href"]; + $prevtitle = $entry->title; + } +} +?> + + + + + + + + $title"); + $bgfile = glob('bg.*')[0]; + if(!is_null($bgfile)) { + echo(""); + } + ?> + + + + + isoblog

$title

Posted on $pdate$udates

"); + //echo("

I'm testing in prod right now. don't worry about it"); + + //Boilerplate for Parsedown + include($root."/Parsedown.php"); + $Parsedown = new Parsedown(); + echo $Parsedown->text(file_get_contents("index.md")); + $Parsedown->setSafeMode(true); + $return = $_GET["return"]; + ?> +


+ +
+

Comments

+
+ "; ?> + +
+ + + +
+ +
+ + +
+
+ + + diff --git a/blog/posts/ai2/index.md b/blog/posts/ai2/index.md index 37d7d0f..750d442 100644 --- a/blog/posts/ai2/index.md +++ b/blog/posts/ai2/index.md @@ -33,7 +33,7 @@ Of course, tech like this isn't the *point* of the hype cycle. Nvidia didn't bec ## The it's-complicated -LLMs are, by nature, endless fountains of grammatically-fluent drivel utterly devoid of real meaning. This makes it anywhere from unsettling to infuritating to see them used in contexts such as education, journalism, or software development3, but it makes them uniquely suited to two use cases: spam, and the sort of high-verbosity, low-meaning communication that's expected of you in a professional setting — in other words, the LLM has democratized the least valuable forms of written communication in existence. +LLMs are, by nature, endless fountains of grammatically-fluent drivel utterly devoid of real meaning. This makes it anywhere from unsettling to infuriating to see them used in contexts such as education, journalism, or software development3, but it makes them uniquely suited to two use cases: spam, and the sort of high-verbosity, low-meaning communication that's expected of you in a professional setting — in other words, the LLM has democratized the least valuable forms of written communication in existence. Naturally the addition of more spam to the world is never a good thing, but I can't honestly begrudge anyone using an LLM to expand a sticky note's worth of information into an appropriately vacuous cover letter or work email or whatever. I might just be autistic, but I frankly believe that this kind of writing deserves to be delegated to the verbose bullshit machine if it doesn't come naturally to you, especially if employers are going to, well, employ these tools themselves to field your job application. Of course, a just world would provide no incentive to create either of these types of writing anyway. @@ -62,7 +62,7 @@ Let's get one thing straight, however: If you use genai to generate memes or, li ## They did a conclusion on this one -Here's hoping this one comes off as less of an unhinged rant than the last time I posted about this. This is by no means a complete compendium of every thought I've had about genai, but it is everything I think I have something substantial to say about. For example, the whole concept of deepfakes is pretty horrifying, but I don't have anything to add to that conversation beyond gesturing vaguely at it and going like "wow, that's pretty fucked up, huh?". +Here's hoping this one comes off as less of an unhinged rant than the last time I posted about this. This is by no means a complete compendium of every thought I've had about genai, but it is everything I think I have something substantial to say about. For example, the whole concept of deepfakes is pretty horrifying, but I don't have anything to add to that conversation beyond gesturing vaguely at it and going like "wow, that's pretty fucked up, huh? anyway im rod serling". It's clear at this point that genai is here to stay in at least *some* capacity, but I'd be shocked if the push for unsolicited LLM chatbots and image generators in everything was able to sustain itself for much longer. I personally can't wait for a year or two from now when someone finds yet another novel way to make their Nvidia GPU draw 500 watts for hours on end and it gets marketed as Quantum Computing™ or some shit. @@ -93,7 +93,7 @@ Linked above:

1. Pronounced "gen-eye", with the "G" sound from "graphics". This is to annoy people who think genai is cool.

-

2. In particular, Microsoft's insistence on this garbage is Pissing me off. I'm genuinely considering getting a Macbook for some upcoming Adobe-requiring classes just to avoid Copilot/Recall/whatever nonsense they come up with next.

+

2. In particular, Microsoft's insistence on this garbage is Pissing me off. I'm genuinely considering (update: I did) getting a Macbook for some upcoming Adobe-requiring classes just to avoid Copilot/Recall/whatever nonsense they come up with next.

3. If you unironically self-identify as a "vibe coder" I'm coming to your house and confiscating every internet-capable device you own. Hand over the MacBook, dipshit, you've lost your computer priveleges until you're ready to develop a working understanding of how the technology you're working with professionally actually functions.

diff --git a/blog/posts/ai2/index.php b/blog/posts/ai2/index.php index f572f79..952e6d9 100644 --- a/blog/posts/ai2/index.php +++ b/blog/posts/ai2/index.php @@ -1 +1 @@ -explains it well: -
Here is how platforms die: first, they are good to their users; then they abuse their users to make things better for their business customers; finally, they abuse those business customers to claw back all the value for themselves. Then, they die. diff --git a/blog/posts/discord/index.php b/blog/posts/discord/index.php index f572f79..952e6d9 100644 --- a/blog/posts/discord/index.php +++ b/blog/posts/discord/index.php @@ -1 +1 @@ - - - - - - Guide - Self-Host Safe(r)ly with WireGuard - - - - - - -

guide:

-

Self-Host Safe(r)ly with WireGuard

- -

Warning: The information in this post is outdated and probably bad. I'd update it but I don't remember what I did. I'm pretty sure I had to circumvent UFW entirely. At any rate, probably don't do what I say to do here.

-

Preamble

-
- Show preamble -

If you're like me, you don't like relying on other people for your online services, either because you don't want to give out your data unnecessarily, or just because you don't want to shell out for subscription services. You might be willing to host such services yourself, and you might even have access to spare hardware to do it on.

-

One critical issue arises, however: your home network. Maybe you're behind some weird impenetrable NAT setup you don't control, or maybe your IP address is dynamic and changes regularly, or maybe you just don't want to expose your home IP to the world. What then?

-

Luckily for us, there's a way to circumvent all that nonsense. A custom VPN like the one we'll be setting up today, hosted on an external server like a VPS, can punch through any weird home internet configuration while also swapping out your home IP address for a static one that you can feel safe exposing to the world.

-

That said, this isn't the be-all end-all for security. I don't claim to know everything about that, and there's probably something you're missing in that regard if you stop here. This is intended as a basic guide for exposing a machine in your home to the internet without messing with your home network or exposing your home IP address.

-

This guide borrows heavily from the landchad.net WireGuard guide, but while their one is geared toward running a VPN for your personal machine (complete with a tutorial on setting up a WebSocket tunnel), this one will focus specifically on forwarding incoming traffic from one server to another over the internet.

-

There are some reasons you'd want to do this instead of just hosting everything on the same VPS - in my case, I wanted to host a Minecraft server, and I had a spare computer at home that was better up to the task than anything for rent in my price range. WireGuard can run on pretty much anything; the cheapest tier on Vultr, DigialOcean or Linode will be more than sufficient.

-

Now on to the good stuff

-
-

This guide will take you through the process of setting up a WireGuard VPN connection between two machines running Linux, and configuring it to forward incoming web traffic from one to the other. It assumes you already have two servers set up running Linux (Ubuntu Server in my case, but any distro should suffice) with UFW configured and enabled, and know what ports you'll need.

-

The machine running your WireGuard server should be an external one exposed to the internet, such as a VPS, for maximum effect. For our purposes, this machine will be the "server", and the one you're forwarding traffic to will be the "client".

-

We'll be configuring WireGuard with a 172.16.0.1/24 virtual network and forwarding port 25565, the default for Minecraft, but any private IP range and port will do.

-

Installation

-

First, we'll install WireGuard on both machines:

- $ apt install wireguard wireguard-tools -

And allow the port it uses in UFW:

- $ ufw allow 51820 -

On the server

-

Uncomment this line in /etc/sysctl.d/99-sysctl.conf to enable IPv4 forwarding:

- $ net.ipv4.ip_forward=1 -

And apply the change with this command:

- $ sysctl -w net.ipv4.ip_forward=1 -

On the client

-

We'll need to generate a public/private key pair for each machine on our VPN network. Do that now for our client like so:

- $ sudo bash -c "umask 077 ; wg genkey > /etc/wireguard/client_priv.key"
$ sudo bash -c "wg pubkey < /etc/wireguard/client_priv.key > /etc/wireguard/client_pub.key"
-

This generates a private key for WireGuard and then generates a corresponding public key based on it. Our client's keys can now be found in /etc/wireguard/client_priv.key and /etc/wireguard/client_pub.key for our private and public keys respectively.

-

Back to the server

-

Now do the same for the server:

- $ umask 077 ; wg genkey > /etc/wireguard/server_priv.key
$ wg pubkey < /etc/wireguard/server_priv.key > /etc/wireguard/server_pub.key
-

Our server's keys can now be found in /etc/wireguard/server_priv.key and /etc/wireguard/server_pub.key for our private and public keys respectively.

-

Now, create a WireGuard configuration file at /etc/wireguard/wg0.conf. wg0 will be the name of our network interface, you can name yours something else if you'd like.

- [Interface]
Address = 172.16.0.1/24
ListenPort = 51820
PrivateKey =   #(server's private key goes here)
# Firewall rules
PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE

[Peer]
# Client #1 details
PublicKey =   #(client's public key goes here)
# Traffic to route to this client
AllowedIPs = 172.16.0.2/32
-

Paste the server's private key after PrivateKey = in [Interface] and the client's public key after PublicKey = in [Peer].

-

With this setup, our server will use the virtual local IP 172.16.0.1 and our client will use the IP 172.16.0.2. You can also add up to 254 more clients by duplicating the [Peer] block and and updating it with the respective public key and a new local IP address.

-

Now, enable and start the WireGuard service with

- $ systemctl enable --now wg-quick@wg0.service -

wg0 being what we called our network interface before.

-

Back to the client

-

Create a WireGuard configuration file for our client at /etc/wireguard/myvpn.conf (you can replace myvpn with a different name if you so choose):

- [Interface]
Address = 172.16.0.2/24
PrivateKey =   #(client's private key goes here)
# Optionally, set to your desired DNS server
# DNS = 9.9.9.9

[Peer]
PublicKey =   #(server's public key goes here)
# Endpoint (server) can be a domain name or IP address
Endpoint = (server's public IP goes here):51820
# Traffic to route to server
AllowedIPs = 0.0.0.0/0, ::/0
PersistentKeepalive = 25
-

Make sure you use your server's public IP here. The PersistentKeepalive option is there because WireGuard closes the connection by default if no data comes through for a while and will only reopen it for the client, so here we send a KeepAlive packet every 25 seconds to prevent that in order to keep our client accessible from the internet.

-

Now we start WireGuard:

- $ sudo wg-quick up myvpn -

myvpn being whatever you called your vpn before. Shut WireGuard down by typing down instead of up here. At this point, you should be able to ping the server (172.16.0.1) or any URL from the client and get a response.

-

Port Forwarding

-

Now we'll configure the firewall and port forwarding. This bit assumes you already have UFW configured and enabled. You can set it up now if necessary.

-

On the server

-

Allow forwarding for the ports you need:

- $ ufw route allow proto tcp to 172.16.0.2 port 25565 -

25565 being your relevant port. Repeat this command as necessary.

-

Now we need to configure iptables. We can do this through UFW by adding the following onto the very end of the file /etc/ufw⁠/before.rules:

- *nat
:PREROUTING ACCEPT [0:0]
:POSTROUTING ACCEPT [0:0]
-A PREROUTING -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 172.16.0.2
-A POSTROUTING -o eth0 -j MASQUERADE
COMMIT
-

Where 25565 is, again, your relevant port. Copy the -A PREROUTING line for every port you need.

-

Now restart UFW:

- $ ufw reload -

On the client

-

Allow the relevant ports and restart UFW:

- $ ufw allow 51820
$ ufw allow 25565
$ ufw reload
-

And you're done! At this point, your client should be accessible from the IP address of your server on the ports you forwarded.

- - - diff --git a/blog/posts/guide_self_host_safely_with_wireguard/wireguard_logo.png b/blog/posts/guide_self_host_safely_with_wireguard/wireguard_logo.png deleted file mode 100644 index aaa4e03..0000000 Binary files a/blog/posts/guide_self_host_safely_with_wireguard/wireguard_logo.png and /dev/null differ diff --git a/blog/posts/guide_things_i_keep_having_to_google/index.php b/blog/posts/guide_things_i_keep_having_to_google/index.php deleted file mode 100644 index f6f9224..0000000 --- a/blog/posts/guide_things_i_keep_having_to_google/index.php +++ /dev/null @@ -1,126 +0,0 @@ - - - - - - Guide - Things I Keep Having to Google - - - - - - -

guide:

-

Things I Keep Having to Google

- -

This isn't really a guide to anything in particular, I just wanted an easily accessible reference for all the things I'm sick of wading through google results for, or otherwise seem to need help remembering. I've put it here in case someone else might find this helpful. I'll likely be adding to this as I find myself repeatedly googling things.

-

Binding things to just the Super key in KDE

-
    -
  1. Bind it to some other keyboard shortcut using KDE's typical GUI methods. Any shortcut will do.
  2. -
  3. Find the entry for it in ~/.config/khotkeysrc. There should be a line that looks like: Uuid={77575b17-36d6-4b4e-b01f-2f1156e38583}. Copy everything inside the curly braces, including the braces themselves.
  4. -
  5. Run the following commands:
  6. -
- $ kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "org.kde.kglobalaccel,/component/khotkeys,org.kde.kglobalaccel.Component,invokeShortcut,<YOUR UUID HERE>"
$ qdbus org.kde.KWin /KWin reconfigure
-

Linux command line/Bash stuff

- - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - - -

pipeline

command | command2uses the output of one command as the input to the next
command > filesaves the output of a command to a file
command < fileuses a file as the input to a command
command < fileA > fileBwill therefore run command with the contents of fileA as the input, and save the output to fileB
command <<< "string or $variable"will use the string or variable as the input to a command, the same as  < file

variables

variable=valueassigns a variable
$variablereferences it
$(command)lets you treat the output of a command like a variable reference
$((number+variable))does the same thing for integer math expressions.
$(( $(command) ))
$(( variable ))
This can also just convert strings into integers.
"te$(command)xt"
"as$((math))df"
Both can be inserted into strings.
"some $variable text"
"more${variable}text"
Both of these are valid ways to insert a variable into a string.

grep

-vInverts it, so matches are excluded
-E "/regex/"Lets you use regex

cut

-d 'string'Determines the delimiter string, the default is the TAB character
-f nSpecifies a field to output, delimited by -d
sed 's/  */ /g' | cut -d ' 'Piping your thing through this helps with parsing a lot of Linux commands that output tabular data

sed

sed "s/regex/replacement/flags"The basic sed replacement command, checks a line of input against the provided regular expression regex and replaces matches with replacement.
sed "s/a/b/;s/c/d/"Multiple sed commands can be strung together in one, like so.
sed "s/a/b/g"The g flag makes sed replace all occurences of the pattern, not just the first
sed "s/a/b/<number>"Insert any number to tell sed to replace only that occurence. Counts from 1. Theoretically, s/a/b/ is the same as s/a/b/1.
sed "s/a/b/i"GNU extension - Match case-insensitively.
sed "s/^a/b/"Require that a match be at the beginning of the line.
sed "s/a$/b/"Require that a match be at the end of the line.
sed "s/^a$/b/"Require that a match be both at the beginning and the end - in other words, require that a match be the entire line.

find

findLists every file and directory in the current working directory
find /dirDoes the same for the directory you specify
find -name "foo"Only lists things with a matching name. * can be used as a wildcard.
find -exec command {} \;Runs command on everything found by find. {} is replaced by the output.

misc

xrandr --output <display name> --brightness <brightness>Janky software-side display brightness setting with xrandr
wget "https://example.com/file.zip" -O temp.zip; unzip temp.zip; rm temp.zipBash one-liner to unzip a file from the internet to the current directory
yt-dlp -x --audio-format flac --audio-quality 0 -P ~/Music/Library/ -o "%(uploader)s - %(title)s.%(ext)s"My standard yt-dlp command for ripping music from Youtube and Soundcloud. I have an alias for this so I don't have to write it out every time.
alias myalias="command go here"Set an alias in bash. Put this in your .bashrc or similar to make it permanent.
-

Webdev stuff

-

Tables

-
    -
  • Force a <td> element not to wrap by adding the white-space:nowrap; CSS property to it.
  • -
  • Set the table-layout CSS property to fixed to force the the columns to be equal widths.
  • -
-

PHP

-
    -
  • The date() function in PHP returns date information. The first argument is a format string and the second is an optional integer for a Unix timestamp. The valid format characters as of PHP 8 can be found here.

    - The strtotime() function does the reverse operation, converting date strings to Unix timestamps. Storing dates as Unix timestamps and converting when needed is recommended.
  • -
-

Song Lyrics

-

I don't actually have a solution for this one, I just wish there was a resource for looking up the lyrics to songs and looking up songs by their lyrics that wasn't an SEO leech site.

- - - diff --git a/blog/posts/make_your_own_cables/index.php b/blog/posts/make_your_own_cables/index.php index f572f79..952e6d9 100644 --- a/blog/posts/make_your_own_cables/index.php +++ b/blog/posts/make_your_own_cables/index.php @@ -1 +1 @@ -entry as $entry) { - if($entry->id == $cwd) { - $pdate = preg_replace('/T.*$/', ' ', $entry->published); - $udate = preg_replace('/T.*$/', ' ', $entry->updated); - $title = $entry->title; - $descr = htmlspecialchars($entry->summary); - } else if($title) { - $nextlink = $entry->link["href"]; - $nexttitle = $entry->title; - break; - } else { - $prevlink = $entry->link["href"]; - $prevtitle = $entry->title; - } -} -?> - - - - - - - - $title"); - $bgfile = glob('bg.*')[0]; - if(!is_null($bgfile)) { - echo(""); - } - ?> - - - - - isoblog

$title

Posted on $pdate$udates

"); - //echo("

I'm testing in prod right now. don't worry about it"); - include("../../../Parsedown.php"); - $Parsedown = new Parsedown(); - echo $Parsedown->text(file_get_contents("index.md")); - $Parsedown->setSafeMode(true); - $return = $_GET["return"]; - ?> -


- -
-

Comments

-
- "; ?> - -
- - - -
- -
- - -
-
- - - diff --git a/blog/posts/renting_an_unremarkable_server/index.php b/blog/posts/renting_an_unremarkable_server/index.php index f572f79..952e6d9 100644 --- a/blog/posts/renting_an_unremarkable_server/index.php +++ b/blog/posts/renting_an_unremarkable_server/index.php @@ -1 +1 @@ -