aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorHannah Isopod <me@bathynomus.xyz>2025-11-09 08:58:02 -0700
committerHannah Isopod <me@bathynomus.xyz>2025-11-09 08:58:02 -0700
commit16e48ed8655528a81cbec84f0cbc1a211d663b37 (patch)
treea567a674392f08f24274fc8803323ebf6df7ad36
parent9792b0963772d8657e8c32bdd647995250daaada (diff)
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
-rw-r--r--README.md6
-rw-r--r--bg-dither.png (renamed from bg_dither.png)bin29909 -> 29909 bytes
-rw-r--r--bg-light-dither.pngbin0 -> 116319 bytes
-rw-r--r--bg-light.jpg (renamed from guestbook/bg.jpg)bin1184070 -> 1184070 bytes
-rw-r--r--bg.jxlbin130798 -> 0 bytes
-rw-r--r--blog/blog.atom16
-rw-r--r--blog/post.php (renamed from blog/posts/post.php)14
-rw-r--r--blog/posts/ai2/index.md6
-rw-r--r--blog/posts/ai2/index.php2
-rw-r--r--blog/posts/ai_art/index.php2
-rw-r--r--blog/posts/blog_questions/index.md2
-rw-r--r--blog/posts/blog_questions/index.php2
-rw-r--r--blog/posts/building_a_cooler_body/bg.pngbin0 -> 451690 bytes
-rw-r--r--blog/posts/building_a_cooler_body/index.md57
-rw-r--r--blog/posts/building_a_cooler_body/index.php1
-rw-r--r--blog/posts/building_a_normal_server/index.php2
-rw-r--r--blog/posts/building_a_regular_bed/index.md2
-rw-r--r--blog/posts/building_a_regular_bed/index.php2
-rw-r--r--blog/posts/building_a_sensible_server/index.php2
-rw-r--r--blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.php2
-rw-r--r--blog/posts/discord/index.md1
-rw-r--r--blog/posts/discord/index.php2
-rw-r--r--blog/posts/fediverse_dms/index.php2
-rw-r--r--blog/posts/grow_spikes/index.php2
-rw-r--r--blog/posts/guide_blacklist_websites_searxng/index.php2
-rw-r--r--blog/posts/guide_blocking_user_agents_nginx/index.php2
-rw-r--r--blog/posts/guide_fix_youtube_buffering_firefox/index.php2
-rw-r--r--blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.php2
-rw-r--r--blog/posts/guide_pihole_lepotato/index.php2
-rw-r--r--blog/posts/guide_self_host_safely_with_wireguard/index.php84
-rw-r--r--blog/posts/guide_self_host_safely_with_wireguard/wireguard_logo.pngbin12772 -> 0 bytes
-rw-r--r--blog/posts/guide_things_i_keep_having_to_google/index.php126
-rw-r--r--blog/posts/make_your_own_cables/index.php2
-rw-r--r--blog/posts/my_terrible_distro_hop/index.php2
-rw-r--r--blog/posts/renting_an_unremarkable_server/index.php2
-rw-r--r--blog/posts/stop_using_chromium/index.php2
-rw-r--r--blog/posts/toshiba_chromebook/index.php2
-rw-r--r--blog/posts/unity_runtime_fee_and_proprietary_software/index.php2
-rw-r--r--etc/index.php1
-rw-r--r--guestbook/index.php24
-rw-r--r--index.php1
-rw-r--r--links/index.php8
-rw-r--r--music/covers/simulation_theory.jpgbin0 -> 277685 bytes
-rw-r--r--music/index.php7
-rw-r--r--nav.php16
-rw-r--r--notes/notes.atom10
-rw-r--r--seasonal.php2
-rw-r--r--uses/compier/index.php18
48 files changed, 170 insertions, 274 deletions
diff --git a/README.md b/README.md
index 4b90390..63665c7 100644
--- a/README.md
+++ b/README.md
@@ -9,4 +9,10 @@ For my own reference, this is the command I use to dither the backgrounds:
```
magick bg.jpg -geometry x810 -gravity center -crop 1:1 -ordered-dither o3x3 bg_dither.png
+```
+
+To do it without cropping:
+
+```
+magick bg.jpg -geometry x810 -gravity center -ordered-dither o3x3 bg_dither.png
``` \ No newline at end of file
diff --git a/bg_dither.png b/bg-dither.png
index 347a171..347a171 100644
--- a/bg_dither.png
+++ b/bg-dither.png
Binary files differ
diff --git a/bg-light-dither.png b/bg-light-dither.png
new file mode 100644
index 0000000..466c179
--- /dev/null
+++ b/bg-light-dither.png
Binary files differ
diff --git a/guestbook/bg.jpg b/bg-light.jpg
index cd3b3a0..cd3b3a0 100644
--- a/guestbook/bg.jpg
+++ b/bg-light.jpg
Binary files differ
diff --git a/bg.jxl b/bg.jxl
deleted file mode 100644
index 3110cfb..0000000
--- a/bg.jxl
+++ /dev/null
Binary files differ
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 @@
<category term="personal"/>
<category term="blog"/>
<category term="tech"/>
+ <!--entry>
+ <title>Building a Cooler Body or: How to Get Estrogen In Alberta 2026 Updated Guide (No AHS)</title>
+ <id>building_a_cooler_body</id>
+ <link rel="alternate" href="https://isopod.cool/blog/posts/building_a_cooler_body/" type="html" title="Building a Cooler Body or: How to Get Estrogen In Alberta 2026 Updated Guide (No AHS)"></link>
+ <published>2025-08-25T00:00:00+00:00</published>
+ <updated>2025-08-25T00:00:00+00:00</updated>
+ <summary>A log of the process I went through to get estrogen in President's Choice Brand Texas.</summary>
+ <category term="guide"/>
+ <category term="project"/>
+ <category term="personal"/>
+ <category term="transgender"/>
+ </entry-->
<entry>
<title>Building a Very Regular Bed</title>
<id>building_a_regular_bed</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/building_a_regular_bed/" type="html" title="Building a Very Regular Bed"></link>
<published>2025-08-25T00:00:00+00:00</published>
- <updated>2025-08-25T00:00:00+00:00</updated>
+ <updated>2025-11-04T00:00:00+00:00</updated>
<summary>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.</summary>
<category term="diy"/>
<category term="project"/>
@@ -37,7 +49,7 @@
<id>ai2</id>
<link rel="alternate" href="https://isopod.cool/blog/posts/ai2/" type="html" title="Revisiting AI"></link>
<published>2025-06-11T00:00:00+00:00</published>
- <updated>2025-06-11T00:00:00+00:00</updated>
+ <updated>2025-11-04T00:00:00+00:00</updated>
<summary>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.</summary>
<category term="ai"/>
<category term="chatgpt"/>
diff --git a/blog/posts/post.php b/blog/post.php
index b541ada..354472b 100644
--- a/blog/posts/post.php
+++ b/blog/post.php
@@ -8,6 +8,8 @@ if($_SERVER['REQUEST_URI'] === "/blog/posts/post.php") {
die();
}
+$root = $_SERVER['DOCUMENT_ROOT'];
+
$cwd = preg_replace('/^.*\//', '', getcwd());
$feed = simplexml_load_file($_SERVER['DOCUMENT_ROOT']."/blog/blog.atom");
$pdate = "";
@@ -77,17 +79,19 @@ foreach($feed->entry as $entry) {
display: table-cell !important;
}
</style>
- <?php include($_SERVER['DOCUMENT_ROOT'] . '/seasonal.php'); ?>
+ <?php include($root . '/seasonal.php'); ?>
</head>
<body>
<?php
- include($_SERVER['DOCUMENT_ROOT'] . '/nav.php');
- include($_SERVER['DOCUMENT_ROOT'] . '/common.php');
+ include($root . '/nav.php');
+ include($root . '/common.php');
$udates = "";
if($pdate != $udate) { $udates = " | Updated&nbsp;on&nbsp;$udate"; }
echo("<h1>isoblog</h1><h2 id='caption'>$title</h2><p style='text-align: center;'><em>Posted&nbsp;on&nbsp;$pdate$udates</em></p>");
//echo("<p style='text-align: right;'>I'm testing in prod right now. don't worry about it");
- include("../../../Parsedown.php");
+
+ //Boilerplate for Parsedown
+ include($root."/Parsedown.php");
$Parsedown = new Parsedown();
echo $Parsedown->text(file_get_contents("index.md"));
$Parsedown->setSafeMode(true);
@@ -124,6 +128,6 @@ foreach($feed->entry as $entry) {
<input type="submit" value="Submit">
</div>
</form>
- <?php include('../../../guestbook/comments.php'); echo_comments(preg_replace("/^.*\//","",getcwd()), $Parsedown); ?>
+ <?php include($root.'/guestbook/comments.php'); echo_comments(preg_replace("/^.*\//","",getcwd()), $Parsedown); ?>
</body>
</html>
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 development<sup id="n3r"><a href="#n3">3</a></sup>, 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 &mdash; 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 development<sup id="n3r"><a href="#n3">3</a></sup>, 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 &mdash; 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&trade; or some shit.
@@ -93,7 +93,7 @@ Linked above:
<p id="n1"><a href="#n1r">1</a>. Pronounced "gen-eye", with the "G" sound from "graphics". This is to annoy people who think genai is cool.</p>
-<p id="n2"><a href="#n2r">2</a>. In particular, Microsoft's insistence on this garbage is <span style="color: yellow;">Pissing</span> 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.</p>
+<p id="n2"><a href="#n2r">2</a>. In particular, Microsoft's insistence on this garbage is <span style="color: yellow;">Pissing</span> me off. I'm genuinely considering (<strong>update</strong>: I did) getting a Macbook for some upcoming Adobe-requiring classes just to avoid Copilot/Recall/whatever nonsense they come up with next.</p>
<p id="n3"><a href="#n3r">3</a>. 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.</p>
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 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/ai_art/index.php b/blog/posts/ai_art/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/ai_art/index.php
+++ b/blog/posts/ai_art/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/blog_questions/index.md b/blog/posts/blog_questions/index.md
index 4f6ac6b..af44d9f 100644
--- a/blog/posts/blog_questions/index.md
+++ b/blog/posts/blog_questions/index.md
@@ -17,7 +17,7 @@ The backend for my blog is built around its RSS feed, which is to say, the autho
The posts themselves are stored as Markdown files with a smattering of HTML mixed in for the really custom stuff, and there's a second PHP file that renders them using a third-party PHP Markdown parser called [Parsedown](https://github.com/erusev/parsedown) (which, fun fact, is also responsible for the Markdown support in the comment section). The only unfortunate thing here is every markdown file has to be accompanied by a stub index.php that just `include`s the main post rendering script, but it's not like I ever have to touch those so it's fine. Here, I'll put all the code that's in every single one right here:
```
-<?php include("../post.php");
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php');
```
The comment section is fully custom too, and shares a backend with the [guestbook](/guestbook/). At its core it's all just PHP forms with a single JSON file as the database, which is more than fine at the scale I'm operating at. Everything else is just gravy, although there is at this point quite a preponderance of gravy.
diff --git a/blog/posts/blog_questions/index.php b/blog/posts/blog_questions/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/blog_questions/index.php
+++ b/blog/posts/blog_questions/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/building_a_cooler_body/bg.png b/blog/posts/building_a_cooler_body/bg.png
new file mode 100644
index 0000000..3bb7faf
--- /dev/null
+++ b/blog/posts/building_a_cooler_body/bg.png
Binary files differ
diff --git a/blog/posts/building_a_cooler_body/index.md b/blog/posts/building_a_cooler_body/index.md
new file mode 100644
index 0000000..702b97e
--- /dev/null
+++ b/blog/posts/building_a_cooler_body/index.md
@@ -0,0 +1,57 @@
+From the moment I understood the weakness of my flesh, it disgusted me.
+
+Kidding. Although that would be a cool project to do someday. The thing that actually disgusts me about my flesh is all this fucking testosterone it keeps making. This post is about the process I went through to fix that by forcibly replacing it with aftermarket estrogen.
+
+I like to be cagey about the specifics of where I live, but for the purposes of this post it's important that I live in Alberta, Canada. As of writing, everything I've done so far should apply regardless of where in Alberta you are. Which is annoying, since it means I waited until after the move to get started on this for no reason.
+
+## #Goals
+
+So obviously the goal is to get estrogen. The next question to answer [#goals](https://www.tumblr.com/search/%23goals) wise is my preferred method of delivery. I have my answer already, but just for fun, let's go through the options.
+
+According to someone I'll be talking to further down on the page, there are three common delivery methods for estrogen that are readily available in Alberta. There are some others out there, but I have no reason to believe you can get them here and they're not really strictly better, so I won't bother discussing them.
+
+The first of these, and the one you're probably thinking of, is oral. Titty Skittles, etc. You take a pill a couple times a day. Incredibly straightforward. This has a couple drawbacks for me: Firstly, health risks. Oral estrogen carries the highest risk of blood clots and it can put undue strain on your liver. I'm weird, but that doesn't sound like a good time to me personally. Secondly, you have to take this stuff pretty frequently for it to work, and I have ADHD. I don't trust myself not to miss doses fuckin' constantly.
+
+Then there's transdermal patches. You put a little adhesive patch somewhere inconspicuous and it absorbs through your skin over the course of several days. This avoids much of the health risk associated with pills, but patches have their own problems: Namely, they're the most expensive of the three options available to me, and they can fall off. If the adhesive is anywhere near the same grade as bandages. They're *gonna* fall off, constantly. No thanks. Plus, I've heard they're not the most reliable at getting you to desirable levels.
+
+A shared drawback of both of these methods is that they absolutely require that you use androgen blockers. Androgen blockers are a giant pain in the ass, requiring their own daily pill regimen and having their own side effects and health risks regardless of which chemical you pick. I have the choice between spironolactone and cyproterone acetate, of which the former is rather infamously a better diuretic than it is an androgen blocker (though it's not exceptionally good at either), and the latter is known to carry a risk of hyperprolactinemia and meningioma. Those are some big words that I'm not qualified to explain to you any better than Dr. Google could, but the casual Chubbyemu viewer may have caught on that that second one means brain tumors. Yeah.
+
+That's not to say you're, like, gonna die of brain cancer if you take cypro, or that you'll never see any results if you use patches or whatever. You can see good results from any combination of these, but they're just not quite as good at it and have more drawbacks than this next thing.
+
+The third delivery method, and the one I strongly prefer, is injections. This one has the benefit of being far and away the most conducive to monotherapy, which is when you don't use blockers. I would also only have to inject every week or so, which will be much easier for me and my wonky fucking brain to keep up, and it's not like the injection is gonna fall out. The only real downside to injections is that you have to stick yourself with a needle, but I'm nowhere near as squeamish about that as you probably are if you're seriously considering pills after learning all that.
+
+So that's what I want: Injection monotherapy. There's a couple different varieties of the injectable juice, and I have Opinions about which one is preferable, but it's kind of immaterial because based on my research only estradiol valerate is readily available in Alberta, so that's what I'm shooting for.
+
+I'm absolutely *not* an authority on this, by the way. As eagle-eyed readers, or just eyed readers, or readers with a functional screen reader know, I'm not a medical professional nor do I have any firsthand experience with any of these drugs as of writing. If you want more information from someone who knows her shit about this, [pghrt.diy](https://pghrt.diy) is a good resource for actionable information on this topic.
+
+## Actually getting the shit
+
+HRT availability here in Canadian Texas is a bit of a mixed bag. Any GP can technically prescribe it through informed consent, but most of them don't feel comfortable doing that and will instead refer you to a provincial clinic with a 2+ year waitlist. There's a couple of doctors in my area who seem to be pretty cool about this, but they're also hard to get in to actually see, with referral requirements and lengthy waitlists of their own. This sucks, and if it was my only option I'd be strongly considering DIY HRT right about now.
+
+Speaking of, I'm also not inclined to default to DIY, for a couple reasons. It seems like the drugs themselves are pretty safe if you know where to look, and I do, but I'd like to be able to get blood work done as part of this process, and I'm not sure how that would go in this context. Plus, availability seems limited from suppliers inside Canada, and I'm iffy on importing because I don't want my grey market drugs to be seized by customs.
+
+Luckily, I have other above-board options. My research into this topic led me to a private telehealth clinic called [Foria Clinic](https://www.foriaclinic.com/) whose main deal is prescribing HRT to trans people through informed consent, that's also covered under provincial healthcare so I can see them for free. Awesome! Unfortunately, the catch to that last part is that they have an extremely limited number of bookings per month. They distribute them on a "buying an RTX 3080 on launch day" type model, meaning on my first try booking with them I had about a 3 minute window to get the form filled out, and I wasn't fast enough. Unfortunate, but I can always try again if plan B falls through.
+
+### Plan B
+
+In the meantime, I started on plan B: There's a nonprofit out of Calgary called [Skipping Stone](https://www.skippingstone.ca/) that offers a bunch of different resources for trans Albertans (seriously, check them out) but relevant here is that they can refer you to a trans-friendly doctor to get a prescription. After dropping the ball on plan A, I filled out a form on their website to book what they call an intake appointment, and a week later I was on a video call with a very nice lady who took me through a questionnaire about my circumstances and needs and referred me to one Dr. Wang in Canmore. Luckily, this doctor was willing to also do telehealth as I don't live in Canmore. Unluckily, she apparently had a four month waitlist. Still, that's a damn sight better than two years or more.
+
+Oh, what's that? Sorry, bit of a mix-up there. Turns out I actually need to do something called a "readiness assessment" before I can see this particular doctor. On first blush that sounds to me like some pathologizing gatekeepy bullshit, but the person I'll be talking to has their pronouns listed as "they/she" on the release form, so hopefully it shouldn't be *too* bad.
+
+So, I like to draft these project logs as they happen to get everything down while it's fresh in my mind, and that last paragraph was written immediately after I got the email with that information, with the intent to try to convey how I felt finding this out.
+
+Anyway, soon after learning this information I got an email from this new person to set up an appointment, and then had to email them to get them to fix (or un-fix, I suppose) my name on the release form *they* sent me &mdash; they had entered "Ada" in the field where I'd been putting my *legal* name, which is presently something else, as opposed to the preferred name field, and legal name was one of three fields I wasn't allowed to edit &mdash; so that was fun. Especially since the response I got was to the effect that it literally did not matter.
+
+I also got a voicemail that day from the office of Dr. Wang to book the appointment I apparently hadn't yet jumped through all the hoops for, and then took like a week to get back to them because of how tight their phone hours are &mdash; I wound up calling them back sitting in my now-reparied Subaru in the campus parking structure before class. I was greeted by another very nice lady who went out of her way to call me Ada even after I opened by giving her my deadname to look up in the computer, and then told me there was no availability at present and to maybe call their sister clinic, which Dr. Wang apparently also works at, to see if they tell me something different. Calling the other clinic, I got effectively the same information but this receptionist promised to reach out the next time there was an opening. A couple hours later, the receptionist from the first clinic called me back and told me she was able to squeeze me in about 2 months out in December.
+
+So we're down from 4 months to 2. That's not half bad by the standards of most doctors in this country. Although, it seems plausible at this point that how this is gonna go down is that I'll have an initial meeting with this doctor, she'll order some blood work, and then I'll see her again to get a prescription, which at a two month wait per appointment would get us back to four months, so maybe that's what the woman from Skipping Stone meant by four months.
+
+With all that admin done, the next step was that readiness assessment thing. This was the only thing I had planned on Halloween, which is fine 'cause it was plenty scary, at least in the 10 minutes leading up the appointment. In reality, I was largely sketched out for nothing. The therapist I talked to was very nice, and they made it clear that their intent was not to try to tell me what to do with my body. The appointment itself lasted about an hour and a half and consisted of a questions about my mental and physical health, my history with regards to gender, what I was hoping to get out of this process and, importantly, what kind of regimen I wanted. She also went over the risks and effects of estrogen and what getting gender affirming care looks like here to make sure my expectations were in line with reality, which they were, because I looked the fuck into this before getting this far.
+
+The end goal here was to compile all this information into a letter to send to Dr. Wang prior to me meeting with her, so she would know all that and, presumably, be able to skip directly to the part that actually requires a doctorate in medicine. It's also important to note that this appointment would have cost me $300 if I hadn't gone through Skipping Stone, who paid for it as part of their service. Genuinely can't recommend them enough.
+
+At this point, it's been just over three weeks since I first filled out an online form to this end, and I'm officially past everything that landing an appointment with Foria would have let me skip. From what I saw on that booking form, Foria was booking about a month out, so I'm actually not doing too bad for time from first attempt at booking until seeing a doctor compared to if I had just waited until the next opening there and landed a booking then. Your mileage may vary, though. At any rate, I'm probably not gonna try again with Foria unless this falls through. I'm kind of in for a pound at this point.
+
+### Plan B Part 2
+
+I plan to post this the day I start hormones, so the timestamp on here is my HRT anniversary, as it were. Expect an update some time down the road in the form of an addendum to this post or a whole new one. \ No newline at end of file
diff --git a/blog/posts/building_a_cooler_body/index.php b/blog/posts/building_a_cooler_body/index.php
new file mode 100644
index 0000000..952e6d9
--- /dev/null
+++ b/blog/posts/building_a_cooler_body/index.php
@@ -0,0 +1 @@
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/building_a_normal_server/index.php b/blog/posts/building_a_normal_server/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/building_a_normal_server/index.php
+++ b/blog/posts/building_a_normal_server/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/building_a_regular_bed/index.md b/blog/posts/building_a_regular_bed/index.md
index 0d856ae..4c01dc5 100644
--- a/blog/posts/building_a_regular_bed/index.md
+++ b/blog/posts/building_a_regular_bed/index.md
@@ -280,6 +280,8 @@ I guess that gives you a better idea, huh?
Honestly, this feels a lot less cramped both below and above than I was expecting it to be. I like it a lot. It's very cozy up top, and my ability to use my desk is thoroughly unimpeded. In fact, this structure provides a lot of convenient mount points for stuff in that area. Getting in is easier than I was expecting, but getting out is unsurprisingly kind of a pain. I intend to take the ladder off and modify it to be slanted, which should help.
+**LADDER UPDATE, NOV 4**: So I have yet to enslantify the ladder (I've found it's actually kind of a convenient shelf since I never actually put my feet on the top rung, and honestly you do get used to it after a while) but I have managed to rip out the threaded inserts that were holding the ladder to the bed. I'm learning new things about the limitations of threaded inserts in soft wood every day. Anyway, I ended up going out and getting two enormous six-inch bolts and sending them all the way through the 4x4's, which I really should have just done in the first place.
+
When I went up there for the first time, the person who helped me assemble it noticed a bit of flexing in the SKORVA beam when I moved around, which I can only logically assume is normal and is probably fine since it's designed for king beds with two people in them, but it's still scary for something with many, many dollars in computers underneath and my sleeping body up top. I have since gone to IKEA for a couple more to beef it up, plus some new blackout curtains to replace these bullshit fucking see-through ones I got from Amazon.
The bed also darkens the room considerably &mdash; it's directly below the ceiling light, meaning it blocks light to my desk area and a considerable portion of the room, and when my shiny new IKEA blackout curtains are closed that light effectively does nothing. I may have to invest in several lamps if I want this room to be as bright as it used to be &mdash; I've already bought one for the desk.
diff --git a/blog/posts/building_a_regular_bed/index.php b/blog/posts/building_a_regular_bed/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/building_a_regular_bed/index.php
+++ b/blog/posts/building_a_regular_bed/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/building_a_sensible_server/index.php b/blog/posts/building_a_sensible_server/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/building_a_sensible_server/index.php
+++ b/blog/posts/building_a_sensible_server/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.php b/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.php
+++ b/blog/posts/deeptwistycom_2nd_anniversary_-_a_history_of_this_bullshit/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/discord/index.md b/blog/posts/discord/index.md
index 6d188be..8f1f43e 100644
--- a/blog/posts/discord/index.md
+++ b/blog/posts/discord/index.md
@@ -16,7 +16,6 @@ Discord was never actually profitable - it's been able to keep the lights on for
This isn't a problem specific to Discord. A popular term for what's happening to it is "enshittification" - Cory Doctorow, the term's inventor, <a href="https://pluralistic.net/2023/01/21/potemkin-ai/#hey-guys">explains it well</a>:
-<blockquote></blockquote>
<figure class="quote">
<blockquote>
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 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/fediverse_dms/index.php b/blog/posts/fediverse_dms/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/fediverse_dms/index.php
+++ b/blog/posts/fediverse_dms/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/grow_spikes/index.php b/blog/posts/grow_spikes/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/grow_spikes/index.php
+++ b/blog/posts/grow_spikes/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/guide_blacklist_websites_searxng/index.php b/blog/posts/guide_blacklist_websites_searxng/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/guide_blacklist_websites_searxng/index.php
+++ b/blog/posts/guide_blacklist_websites_searxng/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/guide_blocking_user_agents_nginx/index.php b/blog/posts/guide_blocking_user_agents_nginx/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/guide_blocking_user_agents_nginx/index.php
+++ b/blog/posts/guide_blocking_user_agents_nginx/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/guide_fix_youtube_buffering_firefox/index.php b/blog/posts/guide_fix_youtube_buffering_firefox/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/guide_fix_youtube_buffering_firefox/index.php
+++ b/blog/posts/guide_fix_youtube_buffering_firefox/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.php b/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.php
+++ b/blog/posts/guide_how_to_automount_drives_on_boot_in_linux/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/guide_pihole_lepotato/index.php b/blog/posts/guide_pihole_lepotato/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/guide_pihole_lepotato/index.php
+++ b/blog/posts/guide_pihole_lepotato/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/guide_self_host_safely_with_wireguard/index.php b/blog/posts/guide_self_host_safely_with_wireguard/index.php
deleted file mode 100644
index fcc7f05..0000000
--- a/blog/posts/guide_self_host_safely_with_wireguard/index.php
+++ /dev/null
@@ -1,84 +0,0 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Guide - Self-Host Safe(r)ly with WireGuard</title>
- <link href="/style.css" rel="stylesheet" type="text/css" media="all">
- <link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
- <style>
- h1 {
- background-image: url('wireguard_logo.png');
- }
- </style>
- </head>
- <body>
- <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
- <h1>guide:</h1>
- <h2 id="caption">Self-Host Safe(r)ly with WireGuard</h2>
- <?php include("../post_dates.php"); ?>
- <p><strong>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.</strong></p>
- <h2>Preamble</h2>
- <details>
- <summary>Show preamble</summary>
- <p>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.</p>
- <p>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?</p>
- <p>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.</p>
- <p>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.</p>
- <p>This guide borrows heavily from the <a href="https://landchad.net/wireguard/">landchad.net</a> 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.</p>
- <p>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.</p>
- <h2>Now on to the good stuff</h2>
- </details>
- <p>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.</p>
- <p>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".</p>
- <p>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.</p>
- <h2>Installation</h2>
- <p>First, we'll install WireGuard on both machines:</p>
- <code>$ apt install wireguard wireguard-tools</code>
- <p>And allow the port it uses in UFW:</p>
- <code>$ ufw allow 51820</code>
- <h3>On the server</h3>
- <p>Uncomment this line in <code>/etc/sysctl.d/99-sysctl.conf</code> to enable IPv4 forwarding:</p>
- <code>$ net.ipv4.ip_forward=1</code>
- <p>And apply the change with this command:</p>
- <code>$ sysctl -w net.ipv4.ip_forward=1</code>
- <h3>On the client</h3>
- <p>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:</p>
- <code>$ sudo bash -c "umask 077 ; wg genkey &gt; /etc/wireguard/client_priv.key"<br>$ sudo bash -c "wg pubkey &lt; /etc/wireguard/client_priv.key &gt; /etc/wireguard/client_pub.key"</code>
- <p>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 <code>/etc/wireguard/client_priv.key</code> and <code>/etc/wireguard/client_pub.key</code> for our private and public keys respectively.</p>
- <h3>Back to the server</h3>
- <p>Now do the same for the server:</p>
- <code>$ umask 077 ; wg genkey &gt; /etc/wireguard/server_priv.key<br>$ wg pubkey &lt; /etc/wireguard/server_priv.key &gt; /etc/wireguard/server_pub.key</code>
- <p>Our server's keys can now be found in <code>/etc/wireguard/server_priv.key</code> and <code>/etc/wireguard/server_pub.key</code> for our private and public keys respectively.</p>
- <p>Now, create a WireGuard configuration file at <code>/etc/wireguard/wg0.conf</code>. <code>wg0</code> will be the name of our network interface, you can name yours something else if you'd like.</p>
- <code>[Interface]<br>Address = 172.16.0.1/24<br>ListenPort = 51820<br>PrivateKey = &nbsp;&nbsp;#(server's private key goes here)<br># Firewall rules<br>PostUp = iptables -A FORWARD -i %i -j ACCEPT; iptables -A FORWARD -o %i -j ACCEPT; iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE<br>PostDown = iptables -D FORWARD -i %i -j ACCEPT; iptables -D FORWARD -o %i -j ACCEPT; iptables -t nat -D POSTROUTING -o eth0 -j MASQUERADE<br><br>[Peer]<br># Client #1 details<br>PublicKey = &nbsp;&nbsp;#(client's public key goes here)<br># Traffic to route to this client<br>AllowedIPs = 172.16.0.2/32</code>
- <p>Paste the server's private key after <code>PrivateKey =</code> in <code>[Interface]</code> and the client's public key after <code>PublicKey =</code> in <code>[Peer]</code>.</p>
- <p>With this setup, our server will use the virtual local IP <code>172.16.0.1</code> and our client will use the IP <code>172.16.0.2</code>. You can also add up to 254 more clients by duplicating the <code>[Peer]</code> block and and updating it with the respective public key and a new local IP address.</p>
- <p>Now, enable and start the WireGuard service with</p>
- <code>$ systemctl enable --now wg-quick@wg0.service</code>
- <p><code>wg0</code> being what we called our network interface before.</p>
- <h3>Back to the client</h3>
- <p>Create a WireGuard configuration file for our client at <code>/etc/wireguard/myvpn.conf</code> (you can replace <code>myvpn</code> with a different name if you so choose):</p>
- <code>[Interface]<br>Address = 172.16.0.2/24<br>PrivateKey = &nbsp;&nbsp;#(client's private key goes here)<br># Optionally, set to your desired DNS server<br># DNS = 9.9.9.9<br><br>[Peer]<br>PublicKey = &nbsp;&nbsp;#(server's public key goes here)<br># Endpoint (server) can be a domain name or IP address<br>Endpoint = (server's public IP goes here):51820<br># Traffic to route to server<br>AllowedIPs = 0.0.0.0/0, ::/0<br>PersistentKeepalive = 25</code>
- <p>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.</p>
- <p>Now we start WireGuard:</p>
- <code>$ sudo wg-quick up myvpn</code>
- <p><code>myvpn</code> being whatever you called your vpn before. Shut WireGuard down by typing <code>down</code> instead of <code>up</code> here. At this point, you should be able to ping the server (<code>172.16.0.1</code>) or any URL from the client and get a response.</p>
- <h2>Port Forwarding</h2>
- <p>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.</p>
- <h3>On the server</h3>
- <p>Allow forwarding for the ports you need:</p>
- <code>$ ufw route allow proto tcp to 172.16.0.2 port 25565</code>
- <p><code>25565</code> being your relevant port. Repeat this command as necessary.</p>
- <p>Now we need to configure iptables. We can do this through UFW by adding the following onto the very end of the file <code>/etc/ufw&#8288;/before.rules</code>:</p>
- <code>*nat<br>:PREROUTING ACCEPT [0:0]<br>:POSTROUTING ACCEPT [0:0]<br>-A PREROUTING -i eth0 -p tcp --dport 25565 -j DNAT --to-destination 172.16.0.2<br>-A POSTROUTING -o eth0 -j MASQUERADE<br>COMMIT</code>
- <p>Where <code>25565</code> is, again, your relevant port. Copy the <code>-A PREROUTING</code> line for every port you need.</p>
- <p>Now restart UFW:</p>
- <code>$ ufw reload</code>
- <h3>On the client</h3>
- <p>Allow the relevant ports and restart UFW:</p>
- <code>$ ufw allow 51820<br>$ ufw allow 25565<br>$ ufw reload</code>
- <p>And you're done! At this point, your client should be accessible from the IP address of your server on the ports you forwarded.</p>
- <?php include("../../comment/form.php"); ?>
- </body>
-</html>
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
--- a/blog/posts/guide_self_host_safely_with_wireguard/wireguard_logo.png
+++ /dev/null
Binary files 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 @@
-<!DOCTYPE html>
-<html lang="en">
- <head>
- <meta charset="utf-8">
- <meta name="viewport" content="width=device-width, initial-scale=1">
- <title>Guide - Things I Keep Having to Google</title>
- <link href="/style.css" rel="stylesheet" type="text/css" media="all">
- <link href="/blog/comment/comments.css" rel="stylesheet" type="text/css" media="all">
- <style>
- /*h1 {
- background-image: url('wireguard_logo.png');
- }
- summary > * {
- margin-bottom: 0;
- display: inline-block;
- }
- details[open] > summary h6 {
- display: none;
- }
- td {
- padding: .2rem;
- }
- td h4 {
- margin: 0;
- }*/
- </style>
- </head>
- <body>
- <?php include($_SERVER['DOCUMENT_ROOT'] . '/nav.php'); ?>
- <h1>guide:</h1>
- <h2 id="caption">Things I Keep Having to Google</h2>
- <?php include("../post_dates.php"); ?>
- <p>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.</p>
- <h2>Binding things to just the Super key in KDE</h2>
- <ol>
- <li>Bind it to some other keyboard shortcut using KDE's typical GUI methods. Any shortcut will do.</li>
- <li>Find the entry for it in <code>~/.config/khotkeysrc</code>. There should be a line that looks like: <code>Uuid={77575b17-36d6-4b4e-b01f-2f1156e38583}</code>. Copy everything inside the curly braces, including the braces themselves.</li>
- <li>Run the following commands:</li>
- </ol>
- <code style="overflow: scroll;">$ kwriteconfig5 --file ~/.config/kwinrc --group ModifierOnlyShortcuts --key Meta "org.kde.kglobalaccel,/component/khotkeys,org.kde.kglobalaccel.Component,invokeShortcut,&lt;YOUR UUID HERE&gt;"<br>$ qdbus org.kde.KWin /KWin reconfigure</code>
- <h2>Linux command line/Bash stuff</h2>
- <table>
- <tr><td colspan="2"><h4>pipeline</h4></td></tr>
- <tr><td><code>command | command2</code></td><td>uses the output of one command as the input to the next</td></tr>
- <tr><td><code>command &gt; file</code></td><td>saves the output of a command to a file</td></tr>
- <tr><td><code>command &lt; file</code></td><td>uses a file as the input to a command</td></tr>
- <tr><td><code>command &lt; fileA &gt; fileB</code></td><td>will therefore run <code>command</code> with the contents of <code>fileA</code> as the input, and save the output to <code>fileB</code></td></tr>
- <tr><td style="white-space:nowrap;"><code>command &lt;&lt;&lt; "string or $variable"</code></td><td>will use the string or variable as the input to a command, the same as <code>&nbsp;&lt; file</code></td></tr>
- <tr><td colspan="2"><h4>variables</h4></td></tr>
- <tr><td><code>variable=value</code></td><td>assigns a variable</td></tr>
- <tr><td><code>$variable</code></td><td>references it</td></tr>
- <tr><td><code>$(command)</code></td><td>lets you treat the output of a command like a variable reference</td></tr>
- <tr><td><code>$((number+variable))</code></td><td>does the same thing for integer math expressions.</td></tr>
- <tr><td><code>$((&nbsp;$(command)&nbsp;))<br>$((&nbsp;variable&nbsp;))</code></td><td>This can also just convert strings into integers.</td></tr>
- <tr><td><code>"te$(command)xt"<br>"as$((math))df"</code></td><td>Both can be inserted into strings.</td></tr>
- <tr><td><code>"some&nbsp;$variable&nbsp;text"<br>"more${variable}text"</code></td><td>Both of these are valid ways to insert a variable into a string.</td></tr>
- <tr><td colspan="2"><h4>grep</h4></td></tr>
- <tr><td><code>-v</code></td><td>Inverts it, so matches are excluded</td></tr>
- <tr><td><code>-E "/regex/"</code></td><td>Lets you use regex</td></tr>
- <tr><td colspan="2"><h4>cut</h4></td></tr>
- <tr><td><code>-d 'string'</code></td><td>Determines the delimiter string, the default is the TAB character</td></tr>
- <tr><td><code>-f n</code></td><td>Specifies a field to output, delimited by <code>-d</code></td></tr>
- <tr><td><code>sed 's/&nbsp;&nbsp;*/&nbsp;/g' | cut -d ' '</code></td><td>Piping your thing through this <span title="It's not foolproof, though. Make sure you understand what this is doing so you can adapt it if it breaks.">helps</span> with parsing a lot of Linux commands that output tabular data</td></tr>
- <tr><td colspan="2"><h4>sed</h4></td></tr>
- <tr><td><code>sed "s/regex/replacement/flags"</code></td><td>The basic sed replacement command, checks a line of input against the provided regular expression <code>regex</code> and replaces matches with <code>replacement</code>.</td></tr>
- <tr><td><code>sed "s/a/b/;s/c/d/"</code></td><td>Multiple sed commands can be strung together in one, like so.</td></tr>
- <tr><td><code>sed "s/a/b/g"</code></td><td>The <code>g</code> flag makes sed replace all occurences of the pattern, not just the first</td></tr>
- <tr><td><code>sed "s/a/b/&lt;number&gt;"</code></td><td>Insert any number to tell sed to replace only that occurence. Counts from 1. Theoretically, <code>s/a/b/</code> is the same as <code>s/a/b/1</code>.</td></tr>
- <tr><td><code>sed "s/a/b/i"</code></td><td>GNU extension - Match case-insensitively.</td></tr>
- <tr><td><code>sed "s/^a/b/"</code></td><td>Require that a match be at the beginning of the line.</td></tr>
- <tr><td><code>sed "s/a$/b/"</code></td><td>Require that a match be at the end of the line.</td></tr>
- <tr><td><code>sed "s/^a$/b/"</code></td><td>Require that a match be both at the beginning and the end - in other words, require that a match be the entire line.</td></tr>
- <tr><td colspan="2"><h4>find</h4></td></tr>
- <tr><td><code>find</code></td><td>Lists every file and directory in the current working directory</td></tr>
- <tr><td><code>find /dir</code></td><td>Does the same for the directory you specify</td></tr>
- <tr><td><code>find -name "foo"</code></td><td>Only lists things with a matching name. * can be used as a wildcard.</td></tr>
- <tr><td><code>find -exec command {} \;</code></td><td>Runs <code>command</code> on everything found by <code>find</code>. <code>{}</code> is replaced by the output.</td></tr>
- <tr><td colspan="2"><h4>misc</h4></td></tr>
- <tr><td><code>xrandr --output &lt;display name&gt; --brightness &lt;brightness&gt;</code></td><td title="It would definitely for sure be better to change this via the monitor's built-in menus, but that requires navigating both of my monitors' built-in menus.">Janky software-side display brightness setting with xrandr</td></tr>
- <tr><td><code>wget "https://example.com/file.zip" -O temp.zip; unzip temp.zip; rm temp.zip</code></td><td>Bash one-liner to unzip a file from the internet to the current directory</td></tr>
- <tr><td><code>yt-dlp -x --audio-format flac --audio-quality 0 -P ~/Music/Library/ -o "%(uploader)s - %(title)s.%(ext)s"</code></td><td>My standard <a href="https://github.com/yt-dlp/yt-dlp#readme">yt-dlp</a> 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.</td></tr>
- <tr><td><code>alias myalias="command go here"</code></td><td>Set an alias in bash. Put this in your .bashrc or similar to make it permanent.</td></tr>
- </table>
- <h2>Webdev stuff</h2>
- <h4>Tables</h4>
- <ul>
- <li>Force a <code>&lt;td&gt;</code> element not to wrap by adding the <code>white-space:nowrap;</code> CSS property to it.</li>
- <li>Set the <code>table-layout</code> CSS property to <code>fixed</code> to force the the columns to be equal widths.</li>
- </ul>
- <h4>PHP</h4>
- <ul>
- <li>The <code>date()</code> 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 <a href="https://www.php.net/manual/en/datetime.format.php">here</a>.<!--, and examples are listed in this table:
- <details>
- <summary>Show table</summary><br>
- It is currently <?php echo date('l, F j, Y \a\t g:i:s A T');?><br><br>
- <table class="highlightrows" style="table-layout: fixed; width: 100%;">
- <tr style="font-weight: bold;"><td>Character</td><td>Output</td><td>Character</td><td>Output</td></tr>
- <tr><td>Y</td><td><?php echo date("Y");?></td><td>y</td><td><?php echo date("y");?></td></tr>
- <tr><td>o</td><td><?php echo date("o");?></td><td>L</td><td><?php echo date("L");?></td></tr>
- <tr><td>F</td><td><?php echo date("F");?></td><td>M</td><td><?php echo date("M");?></td></tr>
- <tr><td>m</td><td><?php echo date("m");?></td><td>n</td><td><?php echo date("n");?></td></tr>
- <tr><td>t</td><td><?php echo date("t");?></td><td>W</td><td><?php echo date("W");?></td></tr>
- <tr><td>l</td><td><?php echo date("l");?></td><td>D</td><td><?php echo date("D");?></td></tr>
- <tr><td>d</td><td><?php echo date("d");?></td><td>j</td><td><?php echo date("j");?></td></tr>
- <tr><td>S</td><td><?php echo date("S");?></td><td>z</td><td><?php echo date("z");?></td></tr>
- <tr><td>N</td><td><?php echo date("N");?></td><td>w</td><td><?php echo date("w");?></td></tr>
- <tr><td>A</td><td><?php echo date("A");?></td><td>a</td><td><?php echo date("a");?></td></tr>
- <tr><td>g</td><td><?php echo date("g");?></td><td>G</td><td><?php echo date("G");?></td></tr>
- <tr><td>h</td><td><?php echo date("h");?></td><td>H</td><td><?php echo date("H");?></td></tr>
- <tr><td>i</td><td><?php echo date("i");?></td><td>s</td><td><?php echo date("s");?></td></tr>
- <tr title="These are milliseconds and microseconds respectively. They will both return 0 when used with date() as it takes the Unix timestamp as an integer in seconds, but there are other functions that take this formatting and will return these accurately."><td>v</td><td><?php echo date("v");?></td><td>u</td><td><?php echo date("u");?></td></tr>
- <tr><td title="This one is so funny to me. This is Swatch Internet Time, a time system created in 1998 by the Swatch corporation to promote their &quot;Beat&quot; watches. It divides the day into 1000 equal chunks 86.4 seconds long. I encourage you to go read the Wikipedia page for this thing. It's great. Why PHP has a function for it I have no idea.">B</td><td><?php echo date("B");?></td><td>I</td><td><?php echo date("I");?></td></tr>
- <tr><td>e</td><td><?php echo date("e");?></td><td>O</td><td><?php echo date("O");?></td></tr>
- <tr><td>P</td><td><?php echo date("P");?><td>Z</td><td><?php echo date("Z");?></td></tr>
- <tr><td title="You can also use the function time() for this.">U</td><td colspan="3"><?php echo date("U");?></td></tr>
- <tr><td>c</td><td colspan="3"><?php echo date("c");?></td></tr>
- <tr><td>r</td><td colspan="3"><?php echo date("r");?></td></tr>
- </table>
- </details--><br><br>
- The <code>strtotime()</code> function does the reverse operation, converting date strings to Unix timestamps. Storing dates as Unix timestamps and converting when needed is recommended.</li>
- </ul>
- <h2>Song Lyrics</h2>
- <p>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.</p>
- <?php include("../../comment/form.php"); ?>
- </body>
-</html>
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 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/my_terrible_distro_hop/index.php b/blog/posts/my_terrible_distro_hop/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/my_terrible_distro_hop/index.php
+++ b/blog/posts/my_terrible_distro_hop/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
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 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/stop_using_chromium/index.php b/blog/posts/stop_using_chromium/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/stop_using_chromium/index.php
+++ b/blog/posts/stop_using_chromium/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/toshiba_chromebook/index.php b/blog/posts/toshiba_chromebook/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/toshiba_chromebook/index.php
+++ b/blog/posts/toshiba_chromebook/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/blog/posts/unity_runtime_fee_and_proprietary_software/index.php b/blog/posts/unity_runtime_fee_and_proprietary_software/index.php
index f572f79..952e6d9 100644
--- a/blog/posts/unity_runtime_fee_and_proprietary_software/index.php
+++ b/blog/posts/unity_runtime_fee_and_proprietary_software/index.php
@@ -1 +1 @@
-<?php include("../post.php"); \ No newline at end of file
+<?php include($_SERVER['DOCUMENT_ROOT'] . '/blog/post.php'); \ No newline at end of file
diff --git a/etc/index.php b/etc/index.php
index d8259ef..d1702b3 100644
--- a/etc/index.php
+++ b/etc/index.php
@@ -70,6 +70,7 @@
<img src="buttons/isopodhours.png" alt="isopod hours">
<a target="_blank" href="https://deeptwisty.com/"><img src="buttons/deeptwisty_button.png" alt="deep twisty"></a>
</div>
+ <p>Hotlink or don't. I doubt the traffic from your personal site is gonna bring my server to its knees.</p>
</body>
diff --git a/guestbook/index.php b/guestbook/index.php
index 299bf96..97e902b 100644
--- a/guestbook/index.php
+++ b/guestbook/index.php
@@ -33,28 +33,28 @@ error_reporting(E_ALL);
<textarea name="msg" placeholder="I know what you are." style="opacity: 0; position: absolute; left: -10000rem; height: 0; width: 0; overflow: clip;"></textarea>
<table>
<tr>
- <td>Name<span style="color:red;">*</span></td>
- <td><input type="text" name="name"></td>
+ <td><label for="name">Name</label><span style="color:red;">*</span></td>
+ <td><input type="text" name="name" id="name"></td>
</tr>
<tr>
- <td>Website</td>
- <td><input type="text" name="website" placeholder="https://"></td>
+ <td><label for="website">Website</label></td>
+ <td><input type="text" name="website" id="website" placeholder="https://"></td>
</tr>
<tr>
- <td>Link something cool</td>
- <td><input type="text" name="cool" placeholder="https://"></td>
+ <td><label for="cool">Link something cool</label></td>
+ <td><input type="text" name="cool" id="cool" placeholder="https://"></td>
</tr>
<tr>
- <td>How did you find me?</td>
- <td><textarea name="found"></textarea></td>
+ <td><label for="found">How did you find me?</label></td>
+ <td><textarea name="found" id="found"></textarea></td>
</tr>
<tr>
- <td>Message<span style="color:red;">*</span></td>
- <td><textarea name="message" placeholder="Now supports Markdown!"></textarea></td>
+ <td><label for="message">Message</label><span style="color:red;">*</span></td>
+ <td><textarea name="message" id="message" placeholder="Now supports Markdown!"></textarea></td>
</tr>
<tr>
- <td>Bot test (six-letter scientific term for a roly-poly or woodlouse)<span style="color:red;">*</span></td>
- <td><input type="text" name="botcheck" placeholder="*.cool"></td>
+ <td><label for="botcheck">Bot test (six-letter scientific term for a roly-poly or woodlouse)</label><span style="color:red;">*</span></td>
+ <td><input type="text" name="botcheck" id="botcheck" placeholder="*.cool"></td>
</tr>
<?php if($return) { echo("<tr><td colspan='2' style='text-align: center;''>".$gbform_messages[$return]."</td></tr>"); }?>
diff --git a/index.php b/index.php
index 59ebd4d..d7e4aa3 100644
--- a/index.php
+++ b/index.php
@@ -184,6 +184,7 @@
<body>
<?php include('nav.php'); bg(true, 11, "Pictured: The eponymous Deep Twisty"); ?>
<main>
+ <blockquote style="background-color: #1d16;">I've got a bit of a redesign in da works! <a href="/v4/">Check 'er out!</a></blockquote>
<img src="images/landing.png" alt="Isopod on her skinkpad (thinkpad but with added skink)" title="The Lenovo SkinkPad P15w is powered by a highly efficient, passively-cooled RISC-V processor and features an IP69 water resistance rating for reliable amphibious operation at virtually unlimited depths, making it the perfect laptop for the deep-sea crustacean in your life."/>
<div id="mainmidsection">
diff --git a/links/index.php b/links/index.php
index e181da0..71df8a8 100644
--- a/links/index.php
+++ b/links/index.php
@@ -300,6 +300,10 @@
<td><a href="https://limes.pink/errors">limes.pink/errors</a></td>
<td>Generates Nintendo console error dialogs</td>
</tr>
+ <tr>
+ <td><a href="https://obamify.com/">obamify</a></td>
+ <td>turns any image into Obama</td>
+ </tr>
</table>
<h3>Live</h3>
<table>
@@ -350,6 +354,10 @@
<td><a href="https://www.horg.com/">HORG</a></td>
<td>A comprehensive database of occlupanid taxonomy</td>
</tr>
+ <tr>
+ <td><a href="https://e-mail.wtf">e-mail.wtf</a></td>
+ <td>Everyone knows what an email address is, right? Right?</td>
+ </tr>
</table>
<!--h2>Articles</h2>
<table>
diff --git a/music/covers/simulation_theory.jpg b/music/covers/simulation_theory.jpg
new file mode 100644
index 0000000..cd3bac0
--- /dev/null
+++ b/music/covers/simulation_theory.jpg
Binary files differ
diff --git a/music/index.php b/music/index.php
index ca11b1c..c538100 100644
--- a/music/index.php
+++ b/music/index.php
@@ -70,18 +70,19 @@
<a style="--img: url(covers/ultrakill_imperfect_hatred.jpg);" target="_blank" href="https://heavenpierceher.bandcamp.com/album/ultrakill-imperfect-hatred"><span>Heaven Pierce Her - ULTRAKILL: Imperfect Hatred</span></a>
<a style="--img: url(covers/el_camino.jpg);" target="_blank" href="https://theblackkeys.com/?frontpage=true" ><span>The Black Keys - El Camino</span></a>
<a style="--img: url(covers/for_science.jpg);" target="_blank" href="https://waxlimbs.bandcamp.com/album/for-science" ><span>Waxlimbs - For Science!</span></a>
- <a style="--img: url(covers/peaks_and_valleys.jpg);" target="_blank" href="https://revolutionpeak.bandcamp.com/album/peaks-and-valleys" ><span>Revolution Peak - Peaks and Valleys</span></a>
- <a style="--img: url(covers/triangle_unicode.jpg);" target="_blank" href="https://wearemagonia.bandcamp.com/album/triangle-unicode-lp" ><span>We Are Magonia - Triangle Unicode</span></a>
<a style="--img: url(covers/unstoppable_force.jpg);" target="_blank" href="https://caliphate.bandcamp.com/album/unstoppable-force" ><span>CALIPHATE - Unstoppable Force</span></a>
<a style="--img: url(covers/walks_of_lung.jpg);" target="_blank" href="https://patriciataxxon.bandcamp.com/album/walks-of-lung" ><span>Patricia Taxxon - Walks of Lung</span></a>
+ <a style="--img: url(covers/raw_data_feel.jpg);" target="_blank" href="https://everythingeverything.bandcamp.com/album/raw-data-feel" ><span>Everything Everything - Raw Data Feel</span></a>
<a style="--img: url(covers/realign.jpg);" target="_blank" href="https://vine.bandcamp.com/album/realign" ><span>Red Vox - Realign</span></a>
+ <a style="--img: url(covers/simulation_theory.jpg);" target="_blank" href="https://www.muse.mu/music?album=simulation_theory" ><span>Muse - Simulation Theory</span></a>
<a style="--img: url(covers/with_teeth.jpg);" target="_blank" href="https://www.nin.com/" ><span>Nine Inch Nails - With Teeth</span></a>
<a style="--img: url(covers/two_house.jpg);" target="_blank" href="https://foodhouse.bandcamp.com/album/two-house" ><span>Food House - two house</span></a>
<a style="--img: url(covers/american_automatic.jpg);" target="_blank" href="https://en.wikipedia.org/wiki/Kill_Memory_Crash" ><span>Kill Memory Crash - American Automatic</span></a>
- <a style="--img: url(covers/raw_data_feel.jpg);" target="_blank" href="https://everythingeverything.bandcamp.com/album/raw-data-feel" ><span>Everything Everything - Raw Data Feel</span></a>
<a style="--img: url(covers/fucked_up_friends_3.jpg);" target="_blank" href="https://tobaxxo.bandcamp.com/album/fucked-up-friends-3" ><span>TOBACCO - Fucked Up Friends 3</span></a>
<a style="--img: url(covers/audio_video_disco.jpg);" target="_blank" href="https://etjusticepourtous.bandcamp.com/album/audio-video-disco-1" ><span>Justice - Audio, Video, Disco</span></a>
<a style="--img: url(covers/synthicate.jpg);" target="_blank" href="https://newretrowave.bandcamp.com/album/synthicate" ><span>LAZERPUNK - Synthicate</span></a>
+ <a style="--img: url(covers/peaks_and_valleys.jpg);" target="_blank" href="https://revolutionpeak.bandcamp.com/album/peaks-and-valleys" ><span>Revolution Peak - Peaks and Valleys</span></a>
+ <a style="--img: url(covers/triangle_unicode.jpg);" target="_blank" href="https://wearemagonia.bandcamp.com/album/triangle-unicode-lp" ><span>We Are Magonia - Triangle Unicode</span></a>
<a style="--img: url(covers/vast.jpg);" target="_blank" href="https://waterflame.bandcamp.com/album/vast" ><span>Waterflame - Vast</span></a>
<a style="--img: url(covers/tortured_waters.jpg);" target="_blank" href="https://newretrowave.bandcamp.com/album/tortured-waters" ><span>DEADLIFE - Tortured Waters</span></a>
<a style="--img: url(covers/spirit_phone.jpg);" target="_blank" href="http://www.neilcic.com/" ><span>Lemon Demon - Spirit Phone</span></a>
diff --git a/nav.php b/nav.php
index 0f9bb69..25e680c 100644
--- a/nav.php
+++ b/nav.php
@@ -47,7 +47,8 @@ if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) {
'I thought I\'d be able to come up with more Halloween captions to be honest',
'It\'s the Spooky Month&trade;!',
'I vant to suck your blood! Just kidding... Unless...?',
- 'This site uses $_HALLOWEEN_THEMED_COOKIE_EQUIVALENT'
+ 'This site uses $_HALLOWEEN_THEMED_COOKIE_EQUIVALENT',
+ 'YOUR TAKING TOO LONG'
);
$seasonal = true;
break;
@@ -78,9 +79,7 @@ if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) {
'Stream deep twisty',
'MySite.html',
'Over Construction',
- 'Real isopod hours',
- 'Version 3.1: The Accent Borders Update',
- 'Version 3.1: The Tables Don\'t Look Like Shit Anymore Update',
+ 'It is currently real isopod hours',
'depytwisty',
'[object Object]',
'* You found the [Moss]!',
@@ -119,7 +118,7 @@ if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) {
'AI (Aquatic Isopod) generated',
'crubge',
'Only unpickle data you trust.',
- 'Tested in prod!',
+ 'string(15) "Tested in prod!"',
'pwetty epic B)',
'Known to the state of California to cause cancer',
'Semi-modular!',
@@ -144,11 +143,16 @@ if(!preg_match('/(headless.*)/i', $_SERVER['HTTP_USER_AGENT'])) {
'Girl, we\'ve <em>been</em> knowing how to draw.',
'<span class="flipped">Upside Down!</span>',
'<span class="rainbowtext">RGB Gaming Webpage</span>',
- '<a href="/stuff/beat/">@'.date("B").'</a>',
+ 'It\'s <a href="/stuff/beat/">@'.date("B").'</a>. Do you know where your children are?',
'<a href="https://www.youtube.com/watch?v=N14uA0EhBAU">coke and fries halo</a>',
'Check it out, I\'m in the <span class="house">house</span> like carpet',
'Ordered dithering!',
'thats so weirdcore liminal analogue horror backrooms scp',
+ 'steals your data! gives you virus!',
+ 'this is where the funny randomly selected messages would go',
+ 'a8e!',
+ 'Better than Version 3.2 Gen 2x2!',
+ 'Partially responsive!',
'COUNTER',
'TUEADAY',
#'PLACEHIM',
diff --git a/notes/notes.atom b/notes/notes.atom
index 6da31ad..56a58b9 100644
--- a/notes/notes.atom
+++ b/notes/notes.atom
@@ -13,6 +13,16 @@
<category term="links"/>
<category term="tech"/>
<entry>
+ <title>Playing "Minecraft" without Minecraft</title>
+ <id>https://lenowo.org/viewtopic.php?t=5</id>
+ <link rel="alternate" href="https://lenowo.org/viewtopic.php?t=5" type="html" title="Playing 'Minecraft' without Minecraft"></link>
+ <published>2025-10-06T00:00:00+00:00</published>
+ <updated>2025-10-06T00:00:00+00:00</updated>
+ <summary>&lt;p&gt;Mojang should just open source Minecraft at this point lmao&lt;/p&gt;</summary>
+ <category term="gaming"/>
+ <category term="hacking"/>
+ </entry>
+ <entry>
<title>Payment Processor Fun 2025 -- Making Your Own MSP</title>
<id>https://voidfox.com/blog/payment_processor_fun_2025_making_your_own_msp/</id>
<link rel="alternate" href="https://voidfox.com/blog/payment_processor_fun_2025_making_your_own_msp/" type="html" title="Payment Processor Fun 2025 -- Making Your Own MSP"></link>
diff --git a/seasonal.php b/seasonal.php
index 9954795..1cca3e0 100644
--- a/seasonal.php
+++ b/seasonal.php
@@ -4,6 +4,6 @@ if($_SERVER["REQUEST_URI"] == "/seasonal.php") {
die();
}
if(date('m') == 10) {
- echo '<style type="text/css">#bubblecolumn {display: none;} body {background-color: black;} a {color: orange;} a:hover {color: yellow;} #leftsidebg, #rightsidebg {filter: grayscale(100%);}</style>';
+ echo '<style type="text/css">#bubblecolumn {display: none;} body {background-color: black;} a {color: orange;} a:hover {color: yellow;} #leftsidebg, #rightsidebg {filter: grayscale(100%);} @media only screen and (hover: none) { #leftsidebg, #rightsidebg {filter: grayscale(100%) brightness(0.3);} }</style>';
}
?> \ No newline at end of file
diff --git a/uses/compier/index.php b/uses/compier/index.php
index 50d420a..0b8b087 100644
--- a/uses/compier/index.php
+++ b/uses/compier/index.php
@@ -12,7 +12,6 @@
<h1>the comp<em title="Is that a Homestar Runner reference?">ier</em></h1>
<h2 id="caption">my main computer</h2>
<p>My main PC is an ever-shifting, questionably arranged agglomeration of components selected as if at random, initially designed and assembled by yours truly circa March of '22. Apparently, I have a lot to say about it.</p>
- <div class="gallery">
<figure class="media">
<div>
<picture>
@@ -31,7 +30,6 @@
<figcaption style="margin-top: 0;">Yes, I had to cut holes in the bottom for those fans. I think it looks pretty mint, if you ignore the fact that some of the chunkier expansion options down there are blocked.</figcaption>
</div>
</figure>
- </div>
<h2>Internals</h2>
<h3>CPU &mdash; AMD Ryzen 7 5700G</h3>
<p>The Ryzen 7 5700G is basically the 5800 except cheaper and you trade PCIe gen 4 support for an integrated GPU. This was important to me in case my dedicated GPU died or otherwise became unavailable. This has come in useful occasionally.</p>
@@ -78,9 +76,10 @@
<p>There were a handful of GPUs in this performance class and approximate price bracket that I was considering &mdash; in fact, my original upgrade plan was a 7700 XT. I went with the 6800 XT because I deduced through the awesome power of spreadsheets that, with the current state of the used market, it had all the others beat in price-to-performance ratio, and it wasn't even close. I specifically went for the AMD reference model, since it was the only version with a short enough heatsink that I was confident it would fit in my case without any modifications.</p>
<p>I want it on record here that if I ever drop north of a grand on a 4090 or whatever the biggest baddest new this-or-a-used-car AAA-cruncher is and I haven't won the lottery, I am to be taken out back and shot like a lame horse. Frankly, I probably need some sense beaten into me if I'm buying lottery tickets to begin with.</p>
<h2>Peripherals</h2>
- <h3>Mouse &mdash; Logitech G602</h3>
- <p>This is my forever mouse. Excellent build quality, more than good enough performance for my casual gamer ass, and it takes AAs. I recently took it apart to replace the first component to start failing, the switch for the left mouse button. I intend to keep using this mouse until I can't get replacement parts for it, or I get carpal tunnel and have to upgrade to something with better ergonomics.</p>
- <p>I generally prefer wired peripherals where possible, but the RF dongle this mouse uses has been rock-solid for me, as long as I don't keep it behind a bunch of EMI-blocking metal panels. My only real issue with this mouse is that the software for it doesn't work on Linux, but I only need that to configure the side buttons.</p>
+ <h3>Mouse &mdash; Logitech MX Vertical</h3>
+ <p>In a previous revision of this page I said my old G602 was my "forever mouse", but I also said I'd be willing to replace it for the sake of better ergonomics, which is what this new one is for: pre-empting carpal tunnel syndrome. Besides, that mouse is in declining condition anyway, and you can only get in there with a soldering iron so many times before it becomes more trouble (and money for replacement parts) than it's worth. The old mouse is now my "on-the-go" mouse, a slot that recently opened up in my life due to my now having to take a laptop to in-person classes.</p>
+ <p>This new mouse shape was a bit of an adjustment at first, but after a month or so of daily or so use I find it significantly more comfortable than standard mice with no major downsides as far as usability is concerned. That said, although popular consensus is that this model is on the larger side, it's still a touch small for my hands. I'm currently working on getting on estrogen to maybe solve this issue.</p>
+ <p>This particular mouse is kind of a straight downgrade from its Gaming&trade; predecessor in a couple ways: no reassignable macro keys, and a slower sensor. In my case, I honestly wasn't using all those extra buttons anyway since the software to assign them isn't on Linux, and as for the sensor, I'm not a skilled enough gamer nor do I play the right types of games for the difference between "about as fast as my monitors" and whatever four or five digit number the esports mouse gold standard is this year to realistically be a bottleneck. Besides, if I fancied myself a Pro Gamer, a premium office mouse like this wouldn't have even been on my radar.</p>
<h3>Keyboard &mdash; Keychron V6 Max</h3>
<p>The original plan was to just quietly update this part and purge all mention of my previous keyboard(s) because I was embarrassed that I bought this to replace an extremely similar keyboard (which I will be selling, I'm not completely stupid), but this new one is actually different enough that I want to talk about it.</p>
<p>See, I used to have the tenkeyless Keychron V3 paired with a Q0 numpad to make up for the V3's lack of one, a combination that I settled on as a workaround for the 100% V6 that I wanted only being available in Keychron's stupid bluish-grey colourway. I had no problems with those keyboards, but I still bought this because I wanted to consolidate them into the same USB connection to free up a port on the 4-port USB switch I use to share these peripherals with my school laptop.</p>
@@ -107,13 +106,14 @@
<img src="images/cans.jpg" alt="A pair of Beyerdynamic DT 770 Pro headphones with a removable mini XLR cable plugged in, a custom green headband wire, and aftermarket cat ears.">
</picture>
<h3>Drawing Tablet &mdash; HUION Kamvas Pro 12</h3>
- <p>Perfectly cromulent 12-inch display tablet. It doesn't completely work out of the box, but the proprietary driver program is at least available for Linux. I like that the stylus is completely passive and doesn't need to be charged, which is frankly an absurd thing for a stylus to require.</p>
+ <p>Perfectly cromulent 12-inch display tablet. It doesn't completely work out of the box, but the proprietary driver program is at least available for Linux, or there's OpenTabletDriver, which in my experience seems more reliable but is missing <a href="https://opentabletdriver.net/Tablets">one feature</a> from this specific model. I like that the stylus is completely passive and doesn't need to be charged, which, having grown up using a Nintendo DS, feels like an absurd thing for a stylus to require.</p>
<h3>Webcam &mdash; Logitech C925e</h3>
<p>It's a USB webcam. The picture is good enough &mdash; better than most laptops &mdash; but it does some annoying auto-adjustment stuff that makes chroma-key shenanigans difficult at times. Standout features are the privacy shutter, indicator light when the camera is in use, and screw mount. I'm sure the microphone is adequate in a pinch, but I have no reason to use it.</p>
- <h3>Microphone &mdash; Audio-Technica AT2020 USB+</h3>
- <p>Very good microphone. Probably as good as I'll ever need. Superb sound quality; my friends in voice chat complain whenever they hear me on anything else. I'd have gotten the XLR version but I did not yet own an audio interface and didn't want to shell out for one just for this.</p>
+ <h3>Microphone &mdash; Audio-Technica AT2020 XLR</h3>
+ <p>I'll be totally honest with you, I used to have the USB version of this exact microphone and replaced it with a used XLR variant to exchange an XLR input on my audio interface for a free USB port. Both versions are equally very good, probably as good as I'll ever need. The sound quality on this sucker is so good that my friends in voice chat complain whenever they hear me on anything else.</p>
<p>In what is becoming a running theme, it sits on a perhaps unbefitting $20 no-name mic arm from Amazon, with matching cheap shock mount and pop filter. They work, though. The springs on the arm are loud and, as my friends are keen to point out every time, quite audible through the mic.</p>
+ <p>Also, free bit of advice from me to you: for audio hardware, buy used professional or music gear, not gaming stuff. The sound quality and build quality is almost always way better.</p>
<h3>Audio Interface &mdash; Arturia Minifuse 2</h3>
- <p>Nothing to write home about for the most part. It's a good quality audio interface with the amount of I/O I presently need, which is to say two mono inputs, and it mostly works fine on Linux. Bizarrely, though, between this and my Benhringer Model D, the only device with a MIDI interface that's recognized by my computer is the analog synthesizer.</p>
+ <p>Nothing to write home about for the most part. It's a good quality audio interface with the amount of I/O I presently need, which is to say two mono inputs, and it mostly works fine on Linux. Bizarrely, though, between this and my Benhringer Model D, the only device with a MIDI interface that's recognized by my computer is the analog synthesizer. If I had to spend this kind of money on an audio interface again, I'd probably go for a used Behringer unit with more inputs.</p>
</body>
</html>