Compare commits

..

1 Commits

Author SHA1 Message Date
Cadey Ratio 3f917a73de footnote
Signed-off-by: Christine Dodrill <me@christine.website>
2021-06-15 17:16:40 +00:00
471 changed files with 1953 additions and 14864 deletions

2
.envrc
View File

@ -1 +1 @@
use flake eval "$(lorri direnv)"

2
.gitignore vendored
View File

@ -6,5 +6,3 @@ cw.tar
/result /result
.#* .#*
/target /target
.patreon.json
.direnv

1559
Cargo.lock generated

File diff suppressed because it is too large Load Diff

View File

@ -1,7 +1,7 @@
[package] [package]
name = "xesite" name = "xesite"
version = "2.4.0" version = "2.3.0"
authors = ["Xe Iaso <me@christine.website>"] authors = ["Christine Dodrill <me@christine.website>"]
edition = "2018" edition = "2018"
build = "src/build.rs" build = "src/build.rs"
repository = "https://github.com/Xe/site" repository = "https://github.com/Xe/site"
@ -9,28 +9,21 @@ repository = "https://github.com/Xe/site"
# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html # See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html
[dependencies] [dependencies]
axum = "0.5" color-eyre = "0.5"
axum-macros = "0.2"
axum-extra = "0.2"
color-eyre = "0.6"
chrono = "0.4" chrono = "0.4"
comrak = "0.12.1" comrak = "0.10"
derive_more = "0.99"
envy = "0.4" envy = "0.4"
estimated_read_time = "1"
futures = "0.3" futures = "0.3"
glob = "0.3" glob = "0.3"
http = "0.2"
http-body = "0.4"
hyper = "0.14" hyper = "0.14"
kankyo = "0.3" kankyo = "0.3"
lazy_static = "1.4" lazy_static = "1.4"
log = "0.4" log = "0.4"
mime = "0.3.0" mime = "0.3.0"
prometheus = { version = "0.13", default-features = false, features = ["process"] } prometheus = { version = "0.12", default-features = false, features = ["process"] }
rand = "0" rand = "0"
reqwest = { version = "0.11", features = ["json"] } reqwest = { version = "0.11", features = ["json"] }
serde_dhall = "0.11.0" serde_dhall = "0.10.1"
serde = { version = "1", features = ["derive"] } serde = { version = "1", features = ["derive"] }
serde_yaml = "0.8" serde_yaml = "0.8"
sitemap = "0.4" sitemap = "0.4"
@ -39,31 +32,25 @@ tokio = { version = "1", features = ["full"] }
tokio-stream = { version = "0.1", features = ["net"] } tokio-stream = { version = "0.1", features = ["net"] }
tracing = "0.1" tracing = "0.1"
tracing-futures = "0.2" tracing-futures = "0.2"
tracing-subscriber = { version = "0.3", features = ["fmt"] } tracing-subscriber = { version = "0.2", features = ["fmt"] }
warp = "0.3"
xml-rs = "0.8" xml-rs = "0.8"
url = "2" url = "2"
uuid = { version = "0.8", features = ["serde", "v4"] } uuid = { version = "0.8", features = ["serde", "v4"] }
# workspace dependencies # workspace dependencies
cfcache = { path = "./lib/cfcache" } cfcache = { path = "./lib/cfcache" }
go_vanity = { path = "./lib/go_vanity" }
jsonfeed = { path = "./lib/jsonfeed" } jsonfeed = { path = "./lib/jsonfeed" }
mi = { path = "./lib/mi" } mi = { path = "./lib/mi" }
patreon = { path = "./lib/patreon" } patreon = { path = "./lib/patreon" }
[dependencies.tower]
version = "0.4"
features = [ "full" ]
[dependencies.tower-http]
version = "0.2"
features = [ "full" ]
# os-specific dependencies # os-specific dependencies
[target.'cfg(target_os = "linux")'.dependencies] [target.'cfg(target_os = "linux")'.dependencies]
sdnotify = { version = "0.2", default-features = false } sdnotify = { version = "0.1", default-features = false }
[build-dependencies] [build-dependencies]
ructe = { version = "0.14", features = [ "mime03" ] } ructe = { version = "0.13", features = ["warp02"] }
[dev-dependencies] [dev-dependencies]
pfacts = "0" pfacts = "0"

View File

@ -6,28 +6,3 @@ nix](https://builtwithnix.org/badge.svg)](https://builtwithnix.org)
![Rust](https://github.com/Xe/site/workflows/Rust/badge.svg) ![Rust](https://github.com/Xe/site/workflows/Rust/badge.svg)
My personal/portfolio website. My personal/portfolio website.
## <big>Information for people wishing to use this code</big>
Don't. This code is not made for you to be able to use without extensive
modification. The [license](https://github.com/Xe/site/blob/main/LICENSE) of
this code is intentionally chosen in such a way that it will make reuse of this
website code verbatim very difficult.
If you are still adamant about using this backend, please keep several things in
mind:
1. All blog content is all rights reserved. I aggressively pursue and report
content theft.
2. You _must_ fully comply with the license. I will aggressively pursue people
that are not in compliance with the license.
3. You are on your own. I will not help you. This is code I made for myself and
it's only really open source as a side effect of making deployment on NixOS
easier. Please do not be the person that makes me have to take this repo
closed source.
4. Upon security issues being found and remediated, you will not be notified
about issues or remediation instructions.
This is probably not what you are looking for. Make your own website. Look into
[Hugo](http://gohugo.io/) or [Zola](https://www.getzola.org/). They are going to
be better maintained than this site will be.

1
VERSION Normal file
View File

@ -0,0 +1 @@
2.1.0

View File

@ -1,93 +0,0 @@
---
title: Compiling Code to Matter in My Living Room
date: 2022-03-28
tags:
- openscad
- 3dprinting
---
In a moment of weakness, my husband and I got a 3d printer. It's mostly been sitting around and not doing much since we got it, but recently I found a great use for it: I wanted a controller stand for my Valve Index controllers and VR full body trackers.
After doing some digging on Thingiverse, I found [this stand](https://www.thingiverse.com/thing:4587097) that looked like it had promise. So I downloaded the model, sliced it and then sent it over to Kyubey:
<blockquote class="twitter-tweet"><p lang="tl" dir="ltr">Kyuubey is happy <a href="https://t.co/atTLN8MSgc">pic.twitter.com/atTLN8MSgc</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1507485129907871747?ref_src=twsrc%5Etfw">March 25, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[Kyubey's name is a reference to <a href="https://madoka.fandom.com/wiki/Kyubey">Kyubey</a> from Puella Magi Madoka Magika</a>.](conversation://Mara/hacker)
Once it was done I ended up with a stand that I could feed [these cables I got from Amazon](https://www.amazon.ca/gp/product/B09LSF8XL9/) through. The tracker holes worked great, but the controller holes were just barely too small.
This was kinda frustrating and I almost gave up on the project, but then I remembered that [OpenSCAD](https://openscad.org) existed. OpenSCAD is a weird programming environment / 3D modeling hybrid program that I've seen used on Thingiverse. It works by letting you position platonic solids into a 3d environment, and from there you can create anything you want.
One of the primitives that OpenSCAD offers is a cylinder. So I wondered if I could use one of those to widen the hole in the index stand and then reprint the part with the wider hole.
[Wait, you're using a CAD program to fix your 3D print by modifying the model instead of using, I don't know, a drill and 5 minutes to make it fit that way?](conversation://Numa/dismay)
[There's no doing like overdoing!](conversation://Cadey/enby)
After some finangling, I managed to get the cylinders in the right place with this OpenSCAD code:
```scad
//difference() {
color("magenta") translate([0, 0, 0]) import("./assets/ValveTrackerDeckEditedByInugoro.stl");
// bores for controller holders
color([0, 1, 0]) translate([63, 44, 0]) cylinder(h = 55, r = 4.75);
color([0, 1, 0]) translate([-63, 44, 0]) cylinder(h = 55, r = 4.75);
//}
```
<blockquote class="twitter-tweet"><p lang="en" dir="ltr">Some finagling required <a href="https://t.co/7T0R6x1XoP">pic.twitter.com/7T0R6x1XoP</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508566854926745614?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
And when I uncommented out the `difference()` block, it ends up looking good enough:
<blockquote class="twitter-tweet" data-conversation="none" data-dnt="true"><p lang="und" dir="ltr"><a href="https://t.co/fiShvlN8QH">pic.twitter.com/fiShvlN8QH</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508567556759728141?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
So then I took a good solid look at the rest of the 3D printed part to see if I could improve on anything else before I sent it to another round of the printer. The last stand took _14 hours_ to print and used a lot of material. I want to avoid waste.
Something I noticed is that the front of the print where all the cables come out was a bit too thin. All 5 of the cables wouldn't fit in there (my braided cables must have been thicker than the ones that the original modeler used). So again I grabbed a few platonic solids and managed to make it work out:
```scad
// widen the paths
color("green") translate([0, -16, 1.3]) rotate([0, 0, 90]) cube([10, 57, 7.8], center = true);
color("green") translate([0, 0, 1.7]) rotate([0, 0, 0]) cube([25, 30, 7], center = true);
```
<blockquote class="twitter-tweet" data-conversation="none" data-dnt="true"><p lang="und" dir="ltr"><a href="https://t.co/pKAVtiPfDS">pic.twitter.com/pKAVtiPfDS</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508568858650685440?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Then I wanted to add some wedges into the underside of the part to help me get the print off the bed. Most people have a problem with bed adhesion being too little. I have too much bed adhesion. So I added some angled rectangles:
```scad
// wedges to help get the print off the bed
color([1, 1, 0]) translate([-120, 0, 0]) rotate([15, 0, 90]) cube([10, 11, 2], center = true); // right
color([1, 1, 0]) translate([120, 0, 0]) rotate([-15, 0, 90]) cube([10, 11, 2], center = true); // left
color([1, 1, 0]) translate([0, -85, 0]) rotate([0, 15, 90]) cube([10, 11, 2], center = true); // back
color([1, 1, 0]) translate([60, 56, 1]) rotate([0, -15, 90]) cube([10, 11, 2], center = true); // front left
color([1, 1, 0]) translate([-60, 56, 1]) rotate([0, -15, 90]) cube([10, 11, 2], center = true); // front right
color([1, 1, 0]) translate([32.5, 41, 1]) rotate([0, -15, 130]) cube([10, 11, 2], center = true); // front left inner
color([1, 1, 0]) translate([-32.5, 41, 1]) rotate([0, -15, 60]) cube([10, 11, 2], center = true); // front right inner
```
<blockquote class="twitter-tweet" data-conversation="none" data-dnt="true"><p lang="und" dir="ltr"><a href="https://t.co/XUQ9ZeYk1H">pic.twitter.com/XUQ9ZeYk1H</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508569796253827077?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
And then once I spun it around for a bit and thought it was good, I sliced it in PrusaSlicer and sent it off to Kyubey. It was going to take 14 hours, so I went off to do other things, ate dinner and then went to bed while the printer continued.
<blockquote class="twitter-tweet" data-conversation="none" data-dnt="true"><p lang="fr" dir="ltr">Diligent bean <a href="https://t.co/yPgnJA0ZdW">pic.twitter.com/yPgnJA0ZdW</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508397506031460352?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
Then when I woke up, Kyubey was done:
<blockquote class="twitter-tweet" data-conversation="none" data-dnt="true"><p lang="und" dir="ltr"><a href="https://t.co/2E1IS810EH">pic.twitter.com/2E1IS810EH</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508407046995156992?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
I was excited and chiseled the print off the bed (the wedges helped a little, but it ended up making the print look kinda weird so I don't know if I will do that again), but the hole for the middle tracker didn't fit perfectly. Everything else did though.
[If you want to get prints off your printer easier, see this video for the method we're starting to use: <br /><br /><iframe width="560" height="315" src="https://www.youtube.com/embed/VCCbzCvtRzU" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe>](conversation://Mara/hacker)
I looked on my desk and found that a random pen that I had sitting around for months was about the right size, so I pushed it into and out of the hole a few times and then the cables fit perfectly. I assume some plastic was in a weird state or something.
Then I set everything up and I had my Index controller stand:
<blockquote class="twitter-tweet" data-conversation="none" data-dnt="true"><p lang="en" dir="ltr">Victory! <a href="https://t.co/A3aCtQMQt5">pic.twitter.com/A3aCtQMQt5</a></p>&mdash; Xe Iaso (@theprincessxena) <a href="https://twitter.com/theprincessxena/status/1508426229464064001?ref_src=twsrc%5Etfw">March 28, 2022</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
[I really need to get a table or something for this.](conversation://Cadey/facepalm)
I've uploaded my modified version to [Thingiverse](https://www.thingiverse.com/thing:5332988). If you want to see the OpenSCAD code, you can check it out on GitHub [here](https://github.com/Xe/3dstuff/blob/main/index_stand_hack.scad). I'm really liking OpenSCAD so far. It's very weird but it lets you do whatever you want by chaining together basic shapes to build up to what you want. I imagine I will be using it a lot in the future, especially once my husband's new sim racing gear comes in.
Having a 3D printer around is like having a very weird superpower on standby. You can compile matter in your living room, but you need a very pedantic description of what that should look like. You also can have any material you like as long as it's plastic. However when it's useful, it's a lifesaver. You can make something to fit a gap or mend something broken or even add functionality to something that lacked it. The cloud's the limit!

View File

@ -5,6 +5,8 @@ tags:
- ttrpg - ttrpg
--- ---
# The 7th Edition
You know what, fuck rules. Fuck systems. Fuck limitations. Let's dial the You know what, fuck rules. Fuck systems. Fuck limitations. Let's dial the
tabletop RPG system down to its roots. Let's throw out every stat but one: tabletop RPG system down to its roots. Let's throw out every stat but one:
Awesomeness. When you try to do something that could fail, roll for Awesomeness. Awesomeness. When you try to do something that could fail, roll for Awesomeness.

View File

@ -7,6 +7,8 @@ tags:
- release - release
--- ---
# OVE-20190623-0001
## Within Security Advisory ## Within Security Advisory
Root-level Remote Command Injection in the [V](https://vlang.io) playground (OVE-20190623-0001) Root-level Remote Command Injection in the [V](https://vlang.io) playground (OVE-20190623-0001)

View File

@ -9,6 +9,8 @@ tags:
- oh-dear-god - oh-dear-god
--- ---
# OVE-20191021-0001
## Within Security Advisory ## Within Security Advisory
Multiple vulnerabilities in the mysqljs API and code. Multiple vulnerabilities in the mysqljs API and code.

View File

@ -7,6 +7,8 @@ tags:
- golang - golang
--- ---
# TL;DR Rust
Recently I've been starting to use Rust more and more for larger and larger Recently I've been starting to use Rust more and more for larger and larger
projects. As things have come up, I realized that I am missing a good reference projects. As things have come up, I realized that I am missing a good reference
for common things in Rust as compared to Go. This post contains a quick for common things in Rust as compared to Go. This post contains a quick

View File

@ -6,6 +6,8 @@ tags:
- offmychest - offmychest
--- ---
# A Letter to Those Who Bullied Me
Hey, Hey,
I'm not angry at you. I don't want to propagate hate. In a way, I almost feel like I should be thanking you for the contributions you've made in making me into the person I am today. Without you all, I would have had a completely different outcome in life. I would have stayed in the closet for good like I had planned. I would have probably ended up boring. I would have never met my closest friends and some even more. I'm not angry at you. I don't want to propagate hate. In a way, I almost feel like I should be thanking you for the contributions you've made in making me into the person I am today. Without you all, I would have had a completely different outcome in life. I would have stayed in the closet for good like I had planned. I would have probably ended up boring. I would have never met my closest friends and some even more.

View File

@ -1,45 +0,0 @@
---
title: "Site Update: A Sigil"
date: 2022-01-11
---
<style>
.logo-wumbo {
background-color: #fdf5d7;
-webkit-mask: url("/static/img/xeiaso.svg");
-webkit-mask-repeat: no-repeat;
-webkit-mask-size: 100%;
mask: url("/static/img/xeiaso.svg");
mask-repeat: no-repeat;
mask-size: 100%;
width: 9.5em;
height: 16em;
display: inline-block;
}
@media (prefers-color-scheme: light) {
.logo-wumbo {
background-color: #1d2021;
}
}
</style>
The upper left-hand corner of my website has gotten more interesting as of
recently. I have decided to experiment with adding an SVG icon to the upper left
hand corner of the page.
This is the sigilized form of the name `Xe Iaso`. This sigil is equivalent in
meaning and semantics to the name `Xe Iaso`. Here is a version of it in a much
bigger size:
<center><span class="logo-wumbo"></span></center>
[Fun fact: the sigil is written using <a
href="https://greggshorthand.github.io/index.html">Gregg Shorthand</a>. It says
the phonetic equivalent of `Xe Iaso`.](conversation://Mara/hacker)
I have tested this in Edge on Linux, Firefox on Linux, Chrome on Android and
Safari on iOS. This should cover most of the big web browsers, but surely I've
missed something. If you use a _modern release_ of a _standards compliant_ web
browser and you don't see a logo anywhere on the page, please let me know so I
can go cry and then hopefully fix the issue.

View File

@ -1,27 +0,0 @@
---
title: A Tool to Aid Forgetfulness
date: 2022-01-12
series: stories
---
The Egyptian God Thoth lived in the Egyptian city of Naucratis. Thoth was the
inventor of many arts such as math and astronomy, but the most significant was
the invention of writing. Thoth showed writing to the king of Egypt, claiming
that it would make Egyptians wiser and give them better memories; that it it
would vastly improve both the memory and the wit of the Egyptian people.
The king replied: "Thoth, you invented this tool. As such you are not the best
one to judge such things. You have not created a tool to aid memory, you have
created a tool to aid forgetfulness. Learners will not use their memories, they
will blindly trust these sigils and not remember for themselves.
"You have discovered an aid to vague recollection, as the users of this tool
will not be given truth. They will only be given a semblance of truth.
"They will be hearers of many things and learners of nothing. They will appear
to know all the knowledge of the world yet when asked they will only be the
middleman to external forces that are trusted without verification. They will
know wisdom, but not truth."
Adapted from The Dialogues of Plato in Five Volumes, 3rd ed. Oxford
University, 1892. Vol. 1 pp. 483-489.

View File

@ -5,6 +5,8 @@ tags:
- freebsd - freebsd
--- ---
# A Trip into FreeBSD
I normally deal with Linux machines. Linux is what I know and it's what I've I normally deal with Linux machines. Linux is what I know and it's what I've
been using since I was in college. A friend of mine has been coaxing me into been using since I was in college. A friend of mine has been coaxing me into
trying out [FreeBSD](https://www.freebsd.org), and I decided to try it out and trying out [FreeBSD](https://www.freebsd.org), and I decided to try it out and

View File

@ -6,6 +6,8 @@ tags:
- o11y - o11y
--- ---
# Prometheus and Aegis
[*Last time in the christine dot website cinematic [*Last time in the christine dot website cinematic
universe:*](https://christine.website/blog/unix-domain-sockets-2021-04-01) universe:*](https://christine.website/blog/unix-domain-sockets-2021-04-01)

View File

@ -4,6 +4,8 @@ date: 2019-05-25
series: dreams series: dreams
--- ---
# All There is is Now
The dream scenario was going on for a while uneventfully. I saw an old man walking around and ranting about things. I decided to go and talk with him. The dream scenario was going on for a while uneventfully. I saw an old man walking around and ranting about things. I decided to go and talk with him.
"You fools! Time doesn't exist! The past is immutable! Don't worry about your trivial daily needs. All there is is Now!" "You fools! Time doesn't exist! The past is immutable! Don't worry about your trivial daily needs. All there is is Now!"

View File

@ -7,6 +7,8 @@ tags:
- makes-u-thonk - makes-u-thonk
--- ---
# Outsider Art and Anathema
This was going to be a post about [Urbit][urbit] at first; but in the process of discussing about my interest in writing something _positive_ about it, I was warned by a few people that this was a Bad Idea. I was focusing purely on the technical side of it and how closely it implemented a concept called [liquid software][liquidsoftware], but from what people were saying, it seemed like a creation that was spoiled by something outside of it, specifically the creator's political views (of which I had little idea at the time). This was going to be a post about [Urbit][urbit] at first; but in the process of discussing about my interest in writing something _positive_ about it, I was warned by a few people that this was a Bad Idea. I was focusing purely on the technical side of it and how closely it implemented a concept called [liquid software][liquidsoftware], but from what people were saying, it seemed like a creation that was spoiled by something outside of it, specifically the creator's political views (of which I had little idea at the time).
As much as I will probably return to the original concept in the future with another post, this feels like something I had to address first. As much as I will probably return to the original concept in the future with another post, this feels like something I had to address first.

View File

@ -1,127 +0,0 @@
---
date: 2021-07-03
title: My Thoughts About Using Android Again as an iPhone User
tags:
- android
- iphone
author: ectamorphic
---
I used to be a hardcore Android user. It was my second major kind of smartphone
(the first was Windows Mobile 6.1 on a T-Mobile Dash) and it left me hooked to
the concept of smartphones and connected tech in general. I've used many Android
phones over the years but one day I rage-switched over to an iPhone. My Samsung
Galaxy S7 pissed me off for the last time and I went to the Apple store and
bought an iPhone 7 on the spot. I popped my sim card into it (after a lovely
meal at Panda Express) and I was off to the races. I haven't really used Android
since other than in little stints with devices like the Amazon Fire 7 (because
it was so darn cheap).
Recently I realized that it would be very easy to package up my website for the
Google Play Store using [pwabuilder](https://www.pwabuilder.com/). I've been
shipping my site as a progressive web app (PWA) for years (and use that PWA for
testing how the site looks on my phone), but aside from the occasional confused
screenshot that's been tweeted at me I've never actually made much use of this.
It does do an additional level of caching (which is why you can load a bunch of
pages on the site, disconnect from the internet and then still browse those
pages that you loaded like you were online) though, which helps a lot with the
bandwidth cost of this site.
So, I decided to ship this site as an Android app. You can download it from the
Google Play Store
[here](https://play.google.com/store/apps/details?id=website.christine.xesite)
and get a partially native experience. It worked perfectly in the Android
emulator but you really need to experience it on a phone to know for sure. On a
whim I grabbed a [Moto g8
Power](https://www.gsmarena.com/motorola_moto_g8_power-10052.php) from Amazon
and then I used it for the final testing on the app before I shipped it on the
Google Play store. I unboxed the phone, set it up, plugged it into my MacBook
and then hit "run" in Android Studio. The app installed instantly and I saw [the
homepage for my site](https://cdn.christine.website/file/christine-static/blog/Screenshot_20210703-101654.png).
It was a magical experience. Me, someone that has no idea what they are doing
with Android app development was able to take an existing project I've poured
years of work into and make it work on a phone like a native app. I literally
just had the phone barely out of the box and my code was running natively on it.
I don't have to worry about the app timing out, I don't have to pay Google money
to test things on my own device, I just hit play and it runs.
This is the kind of developer experience I wish I could have on iOS. I used to
have a paid developer cert for resigning a few personally hacked up apps, but
when I moved to Canada and changed over my cards to have Canadian billing
addresses I lost the ability to purchase a renewal for my developer certificate.
I _can_ change my Apple account over to a Canadian one but doing that means I
have to delete my Apple Music subscription and that would delete all of the
custom uploaded music I have in the cloud. I have more music up there than I
have disk space locally, so this is not really a viable option.
Meanwhile on Android you just open the box, turn the phone on, set it up, press
on the build number 10 times, enable USB debugging, plug it in, confirm debug
access and bam, you're in. You can test an unlimited number of Android apps
forever. I can give the APK to people and then they can tell me if it works on
their device. You cannot do this on iOS. It's making me really consider if iOS
really is the best option for me going forward.
But then the claws of the Apple ecosystem show their face. I have an iPad,
MacBook Air, Apple Watch, iPhone and AirPods. If I end up switching to Android
as my main phone I make my watch significantly less useful. I won't have the
seamless notification syncing to my wrist unless I buy a new watch. I don't
really know if I want to do that.
At the same time though, Android lets me poke around and change things that
bother me. I can make animations faster, which makes the phone _feel_ so much
more snappy and responsive. I can rip out Chrome and replace it with something
else. I can choose which app to use for text messages. I have _agency_ and
_power_ over my experience in ways that iOS simply cannot match. As a tinkerer
that mains a NixOS tower this is a huge factor for me. And then I'm able to test
my apps for free. I can just do it. I don't have to worry about dev certs,
licenses or anything else. I just put the app on the phone and I'm done.
Android's UX is a lot different than it was when I used it last. The last
Android phone I used had hardware home, menu and back buttons. This Moto g8
Power seems to have some kind of gesture control mode that mostly emulates
modern iPhone gesture controls, so my muscle memory isn't totally freaked out.
It was a bit more sensitive than I would have liked out of the box, but I was
easily able to tweak the sensitivity until I got to a level I was comfortable
with. This would have never been able to happen on iOS.
I guess this post is a lot more rambly and less focused than I thought it would
be while I was outlining it on paper. I didn't go into this expecting a 1:1
experience matchup with what I have on iOS. This phone is not nearly powerful
enough to make them comparable, however I can easily just pick it up, do what I
need and it does it. I'm considering getting a burner sim for this thing so I
can take it with me instead of (or in addition to) my iPhone. The camera is
decent, but I don't really have any good comparison shots yet. Android and iOS
are at a state of convergent evolution at this point. They both do about the
same things. Android is more easily customizeable and iOS is more about a guided
experience. Neither is really "better" at this point, but I guess it really will
boil down to the ecosystem you want.
Apple's walled garden approach has a lot of
things in its favor. You can buy accessories from the Apple Store and they will
just work. You can seamlessly copy things from your phone to your tablet or your
laptop. iCloud and Airdrop glue your machines together, and in the future I can
only anticipate that each of those devices will get more and more muddled
together until there's not really a difference between them. Android has a lot
of options. There's over 15,000 Android devices out there with official Google
Play support. They're all at different patch states and have different gimmicks
to distinguish them, but you have an unparalleled amount of choice and agency.
This means that there's less of a consistent total experience, however it leaves
a lot of room for experimentation and innovation.
I like this phone and the instance of Android that runs on it. The only real
downside I've seen so far is that the update notes are in Spanish. I have no
idea why they're in Spanish, I don't speak Spanish and the phone's UI language
is set to English, but I get ["Seguridad de
Android"](https://twitter.com/theprincessxena/status/1411072416986587138/photo/1)
patches on it and that's my life now.
A lot of the Airdrop and integration features I've been missing have been
supplemented by [Taildrop](https://tailscale.com/kb/1106/taildrop/) and
Tailscale in general. It's really satisfying to be able to work for a company
that makes the annoyingly hard problem of "make computers talk to eachother" so
_trivial_.
Overall, it's a 7/10 experience for me. I'd likely choose Android if I wasn't so
entrenched in the Apple/iOS ecosystem. If only it wasn't so tied into Google's
fangs.

View File

@ -6,5 +6,7 @@ tags:
redirect_to: https://www.getrevue.co/profile/theprincessxena/issues/animal-crossing-new-horizons-an-island-of-stability-in-an-unstable-world-313933 redirect_to: https://www.getrevue.co/profile/theprincessxena/issues/animal-crossing-new-horizons-an-island-of-stability-in-an-unstable-world-313933
--- ---
# Animal Crossing New Horizons: An Island of Stability in an Unstable World
Check out this post [on my Check out this post [on my
newsletter](https://www.getrevue.co/profile/theprincessxena/issues/animal-crossing-new-horizons-an-island-of-stability-in-an-unstable-world-313933)! newsletter](https://www.getrevue.co/profile/theprincessxena/issues/animal-crossing-new-horizons-an-island-of-stability-in-an-unstable-world-313933)!

View File

@ -6,6 +6,8 @@ tags:
- aarch64 - aarch64
--- ---
# The Worst Experience I've Had With an aarch64 MacBook
I've had my hands on this M1 MacBook Air for a few weeks now and I have gotten a I've had my hands on this M1 MacBook Air for a few weeks now and I have gotten a
lot of opinions about it. I wanted to go over them and give my thoughts. This is lot of opinions about it. I wanted to go over them and give my thoughts. This is
an amazing laptop. Its battery life is iPad tier. I can run iPad and iPhone apps an amazing laptop. Its battery life is iPad tier. I can run iPad and iPhone apps

View File

@ -7,6 +7,9 @@ tags:
- vim - vim
--- ---
My Experience with Atom as A Vim User
=====================================
Historically, I am a Vim user. People know me as a very very heavy vim Historically, I am a Vim user. People know me as a very very heavy vim
user. I have spent almost the last two years customizing [my .vimrc user. I have spent almost the last two years customizing [my .vimrc
file](https://github.com/Xe/dotfiles/blob/master/.vimrc) and I have parts file](https://github.com/Xe/dotfiles/blob/master/.vimrc) and I have parts

View File

@ -1,8 +1,10 @@
--- ---
title: "Goodbye Kubernetes" title: "</kubernetes>"
date: 2021-01-03 date: 2021-01-03
--- ---
# &lt;/kubernetes&gt;
Well, since I posted [that last post](/blog/k8s-pondering-2020-12-31) I have had Well, since I posted [that last post](/blog/k8s-pondering-2020-12-31) I have had
an adventure. A good friend pointed out a server host that I had missed when I an adventure. A good friend pointed out a server host that I had missed when I
was looking for other places to use, and now I have migrated my blog to this new was looking for other places to use, and now I have migrated my blog to this new

View File

@ -6,6 +6,8 @@ tags:
- shell - shell
--- ---
# The Beautiful in the Ugly
Functional programming is nice and all, but sometimes you just need to have Functional programming is nice and all, but sometimes you just need to have
things get done regardless of the consequences. Sometimes a dirty little hack things get done regardless of the consequences. Sometimes a dirty little hack
will suffice in place of a branching construct. This is a story of one of these will suffice in place of a branching construct. This is a story of one of these

View File

@ -6,6 +6,9 @@ tags:
- beego - beego
--- ---
Web Application Development with Beego
======================================
Beego is a fantastic web application framework from the Go China Beego is a fantastic web application framework from the Go China
community. It currently powers some of the biggest websites in China, community. It currently powers some of the biggest websites in China,
and thus the world. and thus the world.

View File

@ -1,191 +0,0 @@
---
title: "My Next Life as an Imaginary Bottle of Window Cleaner"
date: 2021-09-24
author: Mai
tags:
- isekai
- fiction
---
Today was another boring day, like all the other boring days. I was almost done
with my commute to the office, not looking forward to spending another day
working on the same spreadsheet. I don't believe in monsters, ghosts or spirits,
but I do believe that thing is haunted.
"Next stop is Broughton Junction, end of the line!"
That was my stop. I thought I got it easy by getting an apartment right next to
the train, but I never thought that my job would move so far away. I got up with
the others and walked my way to the exit of the station. The crowd was lifeless
and dead today. The usual morning rush of the station I got on the train at had
turned into a lazy slump towards the exit.
The only solace from these doldrums was the barista at the coffee shop by the
doors. She had such a lovely smile; sometimes it was the only thing that kept me
going. _I wonder what her name is_, I thought to myself as I breached the
darkness of the station and was enveloped in the light of the outside world.
Nubypool was the financial hub of the province. My work was in the Ministry of
Accounting, taming the beast that was their spreadsheets. As I walked towards
the entrance of the building I looked around, seeing the gray, drab skyscrapers
around me sully the lively deep blue above them.
I crossed the street and walked to the double doors, but then there was a noise.
I looked up and saw something falling towards me, then suddenly there was a loud
noise and everything went dark.
The darkness persisted for a while, I couldn't touch, see or hear myself. I was
alone in a silent hell with only my thoughts to break the sheer emptiness of it
all. Suddenly, it hit me. _I'm dead, aren't I? I'm never going to get that
barista's number, am I?_
A noise filled my awareness. I couldn't recognize it, but it came with a
friendly presence. It felt like my best friend, mother, and more all in one. I
felt like I knew this person intimately even though we had never spoken before.
I could pick out that there were words, but nothing usable other than that.
The words stopped after a while, and that was the saddest part of the whole
thing. I was so alone without the words, but I didn't feel like I had any
control over when they started. They started and stopped without any indication
of where or when they were coming from.
Then they started again and I knew that I needed to capitalize on this. The
voice was going to go away if I didn't do anything about it. All I could do was
think, so I decided to think as loud and hard as I could. I screamed in my mind.
I would have woke the neighbors if this was in the apartment back home. Those
thin walls would have made the entire floor wake up. I shouted and shouted like
my life depended on it. As I shouted and screamed the darkness started to gain
color. There was a small pinhole of light that expanded and filled my awareness
until it grew to everywhere I could see. _Is this reincarnation?_
As if a blindfold had been lifted, I could finally get to see myself in some
level of detail. I looked down and all I saw was a bright poster with what
looked like words on it. I looked behind me and I saw what appeared to be a
poster with more smaller words. I looked to the sides and saw what appeared to
be clear plastic with a blue liquid in it.
I started panicking. I didn't know what was going on. _Aren't I supposed to be
some kind of animal? Why am I this?_
The voice started again, a lot more clearly. I could pick out the words: "So
_that's_ why they call it a 'head pressure'! Wow I don't even know how to
describe this feeling other than that!"
I looked ahead and I saw a young boy, something like 18 years old. I was in some
kind of small apartment. There was a ritual circle of some kind, I was right in
the middle of it. Looking around there was a pentagram made out of a white and
blue powder, cards I've never seen before and a bottle of red liquid. There was
a mirror to the side of me though. I took a long and detailed look at myself.
I saw an orange nozzle look back at me. There was what appeared to be a handle
under the nozzle, looking like it was screwed on top of a bottle of...
_No, this can't be!_
It was screwed on top of a bottle of window cleaner.
"I'M A BOTTLE OF WINDOW CLEANER????"
The boy in front of me winced and grunted, my shouting must have hurt him. I
suddenly got a feeling of fear washing over me. I felt the tip of my nozzle
screw itself shut and my self-image vanished from the mirror. Had I interrupted
the ritual?
The boy composed himself and looked down at me. "So, you're the succubus I
summoned? What's wrong with you?"
"S...succubus? I'm not a succubus, I could swear that a few days ago I was...
well not this. I don't know what I am other than apparently..."
I tried to gesture at my own body but only ended up making my handle flail about
meaninglessly, spraying a bit of blue fluid out of my nozzle. It felt like it
had come out of my mouth. It had no taste initially, but it left a slightly sour
taste after a moment.
"A bottle of window cleaner??"
"...What. How did this happen?"
"Why are you asking me? You apparently summoned me. What did you expect to get?"
The boy looked at me like I had lobsters crawling out of my ears. Assuming I had
ears that were big enough for lobsters crawling out of them that is.
"I...what...how...okay"
There was suddenly a knock at the door. "SHIT!", the boy said to himself without
saying it. He started scrambling around and frantically trying to clean things.
He swept up the white powder and put away the playing cards, but try as he might
he couldn't grab me to put me away. His hand phased through me like I wasn't
there. He got up and let the other person in. It was a pizza delivery person.
The boy handed over some money and then took the pizza and placed it on top of a
clear spot of his desk.
I suddenly found myself on top of a metal surface. I could feel something
spinning under me and heard the soft hum of an idle fan. I had just teleported
across the room. "W..what, why am I here?"
"I didn't...know that would do anything. I thought it would be nice if you were
on top of my computer and you just appeared there." Another knock came at the
door. There was a female voice.
"Shit, play it cool."
"I don't know how I can do anything other than what I am doing now, but okay."
A woman entered the room. She appeared to be in a very skimpy outfit, showing
off her curves. She also seemed to have a pair of demonic looking wings that she
let open in the middle of the room. The boy awkwardly made conversation with her
for a while. I tried to get the boy's attention by spraying at him. I definitely
got his attention. "What're you looking at, roomie? Aren't you gonna give your
poor roomie some pizza?"
I didn't think she could see me. I tried spraying more. The boy looked over at
me angrily. "Cut it out bottle, I'll throw you out with the trash if you keep
that up!"
"What are you talking about? I'm not a bottle, I'm hungry." She walked over to
the pizza and grabbed a slice, pushing the boy into his desk. She looked dead at
me when she had her slice. I don't think she saw me. She turned around and
bumped one of her wings into the boy, causing them to fall off. "Nooo! My
costume!"
"That's what you get for wearing a succubus costume in a dorm hall."
She stuck her tongue out sarcastically at the boy and picked up her wing. "Okay
sarcasm boy, you're gonna help me get this on~. If you do I may have a fun time
planned for you~."
"I know what you're planning Mike. I'm not going to bang you. We agreed that I
wouldn't before you did this."
"No fun."
Her name is _Mike_? I thought about it and decided that it was better to leave
things be.
"Hey, dude, I don't really know what's going on. Where am I? Who am I? What am
I? Are you just gonna keep me in the dark about all of this?" I tried to direct
this to the boy with a burst of energy, spraying him to be sure I got his
attention.
He looked over at me like I was cock-blocking him. I felt myself blush and
backed off. It looks like there would be plenty of time later to get those
questions answered.
"Hey Conner, when are you going to get into your costume? Did the ritual I gave
you work?"
"Yeah...about that..."
---
Elsewhere at a random cleaning product factory, it was business as usual. The
production lines were running smoothly. The trucks of cleaner continued as
normal and every bottle was being filled at the normal rate.
A woman in a skimpy outfit suddenly appeared on the production line, causing one
of the workers to hit the "emergency stop" button. The woman had a demonic aura
about her. Her bewitching gaze stunned the factory floor. She got off the
production line and walked out of the building, with that worker in tow;
seemingly enamored with her. _This is going to be fun~_, she thought to herself.

View File

@ -4,6 +4,8 @@ date: 2018-11-29
series: conlangs series: conlangs
--- ---
# Blind Men and an Elephant
or or
# le'i ka na viska kakne ku e le xanto # le'i ka na viska kakne ku e le xanto

View File

@ -7,6 +7,8 @@ tags:
- 100th-post - 100th-post
--- ---
# Blog Feature: Art Gallery
I have just implemented support for my portfolio site to also function as an art I have just implemented support for my portfolio site to also function as an art
gallery. See all of my posted art [here](/gallery). gallery. See all of my posted art [here](/gallery).

View File

@ -7,6 +7,8 @@ tags:
- borgbackup - borgbackup
--- ---
# How to Set Up Borg Backup on NixOS
[Borg Backup](https://www.borgbackup.org/) is a encrypted, compressed, [Borg Backup](https://www.borgbackup.org/) is a encrypted, compressed,
deduplicated backup program for multiple platforms including Linux. This deduplicated backup program for multiple platforms including Linux. This
combined with the [NixOS options for configuring combined with the [NixOS options for configuring

View File

@ -7,6 +7,8 @@ tags:
- blender - blender
--- ---
# How I Converted my Brain fMRI to a 3D Model
AUTHOR'S NOTE: I just want to start this out by saying I am not an expert, and AUTHOR'S NOTE: I just want to start this out by saying I am not an expert, and
nothing in this blogpost should be construed as medical advice. I just wanted nothing in this blogpost should be construed as medical advice. I just wanted
to see what kind of pretty pictures I could get out of an fMRI data file. to see what kind of pretty pictures I could get out of an fMRI data file.

View File

@ -1,105 +0,0 @@
---
title: You Win, Broken Database Schemas
date: 2022-01-10
tags:
- rant
---
There is [no software that correctly handles
names](https://www.kalzumeus.com/2010/06/17/falsehoods-programmers-believe-about-names/)
that exists on this planet. One of the major things I have bashed my head into
as of late is the assumption that people have a first and a last name. The first
name is usually what identifies the person, and the last name usually identifies
the family.
I have wanted to use `Xe` as my name places (no last name, like Socrates), but
everyone has broken database schemas that make it impossible. These schemas
usually look like this:
```sql
CREATE TABLE IF NOT EXISTS people
( id VARCHAR PRIMARY KEY DEFAULT (uuid4())
, first_name VARCHAR NOT NULL
, last_name VARCHAR NOT NULL
-- draw the rest of the owl
);
```
And as a result things like `Xe` (no last name) cannot fit into this schema. I
have found out the depth of this shitshow while trying to use my handle as my
name on newly registered account things and the amount of stuff that breaks or
works in weird ways is _staggering_. Email salutations look like this:
> Hello Xe ,
Forms will break if I don't put a last name in the field. The assumptions about
names are _so deep_ that it's rapidly becoming not worth it to only have my name
as `Xe`. Not to mention [overzealous journalists that will argue with you over
what your name is due to name
collisions](https://twitter.com/theprincessxena/status/1479197000667181061?s=20).
You win, broken database schemas. I give up trying to deal with you to encode my
name correctly. You just don't let me and I am tired of fighting it, opening
support tickets and arguing with people over what my name is. I give in. I'm
going to use a last name for my handle, which is absolutely ridiculous, but here
we are.
It took me a few hours to dig through ideas over the weekend and today, but I
think I have found something satisfactory enough that I can keep it for the long
haul: [Iaso](https://en.wikipedia.org/wiki/Iaso) (ai-uh-so, /aɪ.ə.soʊ/), the
minor Greek goddess of recovering from illness.
Hopefully I don't have to deal with professional issues as a result of me trying
to be more true to myself about my identity. At the very least I want very
little to do with the last name that I was born into. Some day that name will be
removed from the last database with it set, but today is not that day.
If you work on systems that handle names, please, please, please take the time
to reconsider if you actually need to deal with a last name for more reason than
it's the cultural standard. There are valid reasons to have a mononym, and by
supporting mononyms you will make people's lives easier.
Until then, I am `Xe Iaso`. Let's see where this phase of the identity
experiment goes. It's still really complicated. Anyone who claims to have their
identity figured out is either in denial or stopped digging into it for the time
being. The rabbit hole truly never ends.
The main thing I don't like about this name is how ambiguous it shows up in
sans-serif fonts:
<div style="font-family:sans-serif">
Xe Iaso
</div>
It looks like `Xe laso`. I've edited my email signature to try and compensate
for this:
```
Xe Iaso (zi ai-uh-so)
https://christine.website
.i la budza pu cusku lu
<<.i ko snura .i ko kanro
.i ko panpi .i ko gleki
```
Let's see if that helps. It will probably look bad when things are put into
sans-serif fonts, but what can you do lol.
---
Also I would _prefer_ you call me `Xe` from now on when possible. This conflicts
with and supercedes suggestions I made in [this article](/blog/xe-2021-08-07). I
consider most of that experiment to have worked out and I am going into the next
phase, albeit less "pure" than I wanted.
Thank you for sticking with this blog. This started out as a place for me to get
better at writing but has rapidly turned into something that has helped me
explore my identity in ways that I never would have thought it would. Thanks for
following the rabbit hole. Thank you for supporting me being more authentic to
myself about who I am. Your support means more than you possibly will know.
I wonder if my SEO craft is strong enough to get me high on the list of google
results for `Iaso`.

View File

@ -5,6 +5,8 @@ tags:
- career - career
--- ---
# Advice to People Nurturing a Career in Computering
Computering, or making computers do things in exchange for money, can be a Computering, or making computers do things in exchange for money, can be a
surprisingly hard field to break into as an outsider. There's lots of jargon, surprisingly hard field to break into as an outsider. There's lots of jargon,
tool holy wars, flamewars about the "right" way to do things and a whole host tool holy wars, flamewars about the "right" way to do things and a whole host

View File

@ -1,115 +0,0 @@
---
title: Change
date: 2021-10-20
tags:
- enby
- trans
---
[Content warning: this post talks about the transgender/nonbinary coming out of
the closet experience. If you are not in the best headspace for that, feel free
to skip this post until you're in a better headspace. This post isn't going to
randomly vanish. It will be there when you're ready. There are some descriptions
of subconscious body functions and bodily fluids that may gross some people
out.](conversation://Cadey/enby)
Coming out as transgender/nonbinary to someone you care about one of the most
terrifying things you can do. At least it feels that way, it feels like things
are going to change and you'll lose that person. It can be gut-wrenching,
especially for family.
For me the scariest part of this whole thing has been the change in how people
see me. It can be a huge abrupt difference for some people, and the unknowns in
how people will react to that can make you paralyzed with fear. So, let's look
at change a little.
[Annoyingly, the same kinds of people that get upset about someone changing
their name and pronouns for coming out as transgender/nonbinary are _instantly_
and _immediately_ tolerant of someone changing their last name for marriage and
"get used to it" almost instantly.](conversation://Cadey/facepalm)
Life is a constant change. Stop for a moment right now and feel your body. Feel
how the pressure in your chest changes as your lungs subconsciously inhale and
exhale. If you have a watch, look at the seconds hand (or equivalent digital
display) and watch it tick forward for a bit. Change is constant, yet still
continuously moving forward. Even though the change is happening though,
everything is still roughly the same as it was before. Blood continues to move
through your body, constantly cycling its oxygen with other parts, but it
continues.
Coming out to my parents was one of the most terrifying things I have ever done.
I was nervous beyond belief. I hardly ate that day I hit send. I turned off my
phone after doing it and got lost in a game that I liked playing. The real
reason it was so scary to me though is that I had already tried to come out to
them in the past but I was shut down.
Middle school was rough for me. I don't really remember much of it (other than
they banned high fives for "gang activity"), but that was when my parents found
my diary app. I don't remember why they were going through my laptop (I grew up
in one of _those_ kinds of Jesus freak households), but they found it somehow
and my entries where I was questioning my gender came to their attention and
they confronted me about it. I was not ready at all. I was completely blindsided
by it. That attempt to come out failed and I was put into Christian
"counseling". I was pushed deep back into the closet and I still have trouble
writing down my thoughts in a journal to this day.
So that day I hit "send" on [the
email](https://christine.website/blog/coming-out-2015-12-01) was mortally
terrifying. All that fear from so long ago came raging up to the surface and I
was left in a crying and vulnerable state. However it ended up being a good kind
of cry, the healing kind.
My relationship with my parents (and later my siblings) has deteriorated since,
and not just for religious differences. However, I am fine. I am still healing
and I probably will be healing for a long time and I have accepted that. In
place, I have found something more powerful to put in their place. I have found
a new family of choice.
[For the parents that read this blog, please do not repeat this kind of
suffering if you can avoid it. I don't want anyone else to suffer the way I have
if I can help to avoid it.](conversation://Cadey/enby)
This was a huge change, but it ended up being for the better. That change was a
tool to help me live a better life surrounded by the people I wanted to be
around as opposed to the people I inherited.
There's an idiom that comes to mind, something that is in the "completely
misunderstood" brand of idioms: "blood is thicker than water".
It's often used by people to emphasize the importance of familial relationships
over friendships or the like (family is the "blood" part of that idiom, and
friendships are the "water" part). The full form of the idiom is closer to this:
> The blood of the covenant is thicker than the water of the womb
This overall sentiment is [commonly interpreted by Christian
scholars](https://www.blueletterbible.org/Comm/murray_andrew/two/two09.cfm) to
have a meaning closer to "the bond between Jesus and someone who chooses to
believe in Him is stronger than the bond between family members", however we can
afford to interpret this differently for the sake of this message.
The bonds you choose are stronger than the bonds you inherited. The bonds I have
with my friends, my husband, my closest companions and all those who I keep
close to me are stronger than the bonds with my family will ever be.
In a way, coming out as transgender to people and that level of associated
change has become a _tool_ to help me figure out who really cares about me and
who I should bother keeping around me. It's my life. I can live it as honestly,
openly and real as I want to. I don't have to justify it to anyone but myself.
You don't really have to justify this level of change to anyone else but
yourself either. It'll let you know who your real friends are, for better and
for worse. You don't have to keep anyone around you that can't accept you for
who you are. Your family of choice will _always_ have stronger bonds than your
family of origin.
<center>
<picture>
<source srcset="/static/blog/change/the-dude-dither.avif" type="image/avif">
<source srcset="/static/blog/change/the-dude-dither.webp" type="image/webp">
<img src="/static/blog/change/the-dude-dither.png" alt="The dude abides">
</picture>
</center>
The Dude abides, so will you. Change as a result of coming out can be a good
thing as much as it can be a bad thing. Don't let inherent negativity biases
blind you to that.

View File

@ -5,6 +5,8 @@ thanks: CelestialBoon
series: magick series: magick
--- ---
# Chaos Magick Debugging
Belief is a powerful thing. Beliefs are the foundations of everyone's points of view, and the way they interpret reality. Belief is what allows people to create the greatest marvels of technology, the most wondrous worlds of imagination, and the most oppressive religions. Belief is a powerful thing. Beliefs are the foundations of everyone's points of view, and the way they interpret reality. Belief is what allows people to create the greatest marvels of technology, the most wondrous worlds of imagination, and the most oppressive religions.
But at the core, what *is* a belief, other than the sheer tautology of *what a person believes*? But at the core, what *is* a belief, other than the sheer tautology of *what a person believes*?

View File

@ -9,6 +9,8 @@ tags:
- garlic - garlic
--- ---
# Chicken Stir Fry
This recipe was made up by me and my fiancé. We just sorta winged it every time This recipe was made up by me and my fiancé. We just sorta winged it every time
we made it until we found something that was easy to cook and tasty. We make we made it until we found something that was easy to cook and tasty. We make
this every week or so. this every week or so.

View File

@ -5,6 +5,9 @@ tags:
- cinemaquestria - cinemaquestria
--- ---
CinemaQuestria Orchestration
============================
### Or: Continuous Defenstration in a Container-based Ecosystem ### Or: Continuous Defenstration in a Container-based Ecosystem
I've been a core member of the staff for [CinemaQuestria](http://cinemaquestria.com) I've been a core member of the staff for [CinemaQuestria](http://cinemaquestria.com)

View File

@ -1,38 +0,0 @@
---
title: "Book Release: Closed Projects"
date: 2022-03-24
tags:
- shortstory
- fiction
- retrospective
---
Closed Projects is a retelling of [a four-part series](/blog/series/freenode) on
my blog where I process the events that lead to the death of freenode, the
largest IRC network for peer-directed projects.
freenode was the reason that I managed to get into tech. Without freenode I
would be a vastly different person today. The death of freenode last year
brought up many lingering memories and emotions. I talk about my history with
freenode, the events that happened in the wake of its death and how a new
community took its place.
Each part of this story is written by weaving the narrative of the last
caretaker trying to protect the discussion halls against the darkness, and
things continue as the darkness gets more crafty and clever.
I have included versions of this for all common eBook reader devices and
formats. I have tested this on my Kindle Oasis and iPad Pro, but I see no reason
that at least one of these formats wouldn't work for you.
<iframe frameborder="0" src="https://itch.io/embed/1454153?dark=true" width="552" height="167"><a href="https://withinstudios.itch.io/closed-projects">Closed Projects by Within</a></iframe>
If you are a [Patreon supporter](https://patreon.com/cadey), you can get this
for free by clicking [this
link](https://withinstudios.itch.io/closed-projects/patreon-access).
If you are a part of a marginalized group and cannot afford this but want to
read it anyways, please [contact me](/contact).
Thank you for reading what I put out to the world. I only hope I can continue to
create and inspire you.

View File

@ -3,6 +3,8 @@ title: My Magical Adventure With cloud-init
date: 2021-06-04 date: 2021-06-04
--- ---
# My Magical Adventure With cloud-init
> "If I had a world of my own, everything would be nonsense. Nothing would be > "If I had a world of my own, everything would be nonsense. Nothing would be
> what it is, because everything would be what it isn't. And contrary wise, what > what it is, because everything would be what it isn't. And contrary wise, what
> is, it wouldn't be. And what it wouldn't be, it would. You see?" > is, it wouldn't be. And what it wouldn't be, it would. You see?"

View File

@ -5,6 +5,8 @@ tags:
- ipad - ipad
--- ---
# Coding on an iPad
As people notice, I am an avid user of Emacs for most of my professional and As people notice, I am an avid user of Emacs for most of my professional and
personal coding. I have things set up such that the center of my development personal coding. I have things set up such that the center of my development
environment is a shell (eshell), and most of my interactions are with emacs environment is a shell (eshell), and most of my interactions are with emacs

View File

@ -4,6 +4,8 @@ date: 2020-08-22
series: colemak series: colemak
--- ---
# Colemak Layout - First Week
A week ago I posted the last post in this series where I announced I was going A week ago I posted the last post in this series where I announced I was going
all colemak all the time. I have not been measuring words per minute (to avoid all colemak all the time. I have not been measuring words per minute (to avoid
psyching myself out), but so far my typing speed has gone from intolerably slow psyching myself out), but so far my typing speed has gone from intolerably slow

View File

@ -4,6 +4,8 @@ date: 2020-08-15
series: colemak series: colemak
--- ---
# Colemak Layout - Beginning
I write a lot. On average I write a few kilobytes of text per day. This has been I write a lot. On average I write a few kilobytes of text per day. This has been
adding up and is taking a huge toll on my hands, especially considering the adding up and is taking a huge toll on my hands, especially considering the
Covid situation. Something needs to change. I've been working on learning a new Covid situation. Something needs to change. I've been working on learning a new

View File

@ -5,6 +5,9 @@ tags:
- personal - personal
--- ---
Coming Out
==========
I'd like to bring up something that has been hanging over my head for a I'd like to bring up something that has been hanging over my head for a
long time. This is something I did try (and fail) to properly express way long time. This is something I did try (and fail) to properly express way
back in middle school, but now I'd like to get it all of my chest and let back in middle school, but now I'd like to get it all of my chest and let

View File

@ -7,6 +7,8 @@ tags:
- vrchat - vrchat
--- ---
# My Convoluted VRChat Google Meet Setup
Recently the place I work for sent us all VR headsets. I decided to see what it Recently the place I work for sent us all VR headsets. I decided to see what it
would take to use that headset to make my camera show a virtual avatar instead would take to use that headset to make my camera show a virtual avatar instead
of my meat body face. This is the story of my journey through chaining things of my meat body face. This is the story of my journey through chaining things

View File

@ -1,34 +0,0 @@
---
title: COVID Burnout
date: 2021-09-25
---
NOTE: This was written out in
[longhand](https://twitter.com/theprincessxena/status/1441842150824718337?s=21)
in my diary. This post was converted to text using iPadOS 15's handwriting to
text recognition. I hope I have cleared up all of the major errors in the
conversion. My handwriting is horrible.
---
I am an introvert. I usually spend a lot of time in my cave. most of my work was
alreary done remotely, when I first found out about the COVID-19 pandemic, I
thought there would be at most 4-8 weeks of hardcore lockdown and then it would
die out. Then life would go back to normal and I would be able to see my friends
at conventions during the summer.
As of the time of writing this post, it is currently the 84th week OF COVID
being a major presence in how I handle daily life. I am exhausted, I was
scheduled to give talks at two conventions that were canceled, meet ups with
friends at places across the us and Canada were postponed into oblivion. My
relationship with my parents has fractured into no-contact. I feel powerless to
do anything more to stop this.
I am the most connected I have ever been and I am the lonliest I have ever been.
Most of the people I talk to are people I have never met in person, even my
coworkers. My manager is someone I talk with near daily yet have never seen
without the aid of video conferencing.
This is exhausting. I hate it. My Netflix queue is empty. I feel so alone.
This post doesn't have a message or moral.

View File

@ -6,6 +6,9 @@ tags:
- frontend - frontend
--- ---
Crazy Experiment: Ship the Frontend as an asar document
=======================================================
Today's crazy experiment is using an [asar archive](https://github.com/electron/asar) for shipping around Today's crazy experiment is using an [asar archive](https://github.com/electron/asar) for shipping around
and mounting frontend Javascript applications. This is something I feel is worth doing because it allows and mounting frontend Javascript applications. This is something I feel is worth doing because it allows
the web frontend developer (or team) give the backend team a single "binary" that can be dropped into the the web frontend developer (or team) give the backend team a single "binary" that can be dropped into the

View File

@ -7,6 +7,8 @@ tags:
- coc - coc
--- ---
# [Creator's Code](https://github.com/Xe/creators-code)
I feel there is a large problem in the industry I have found myself in. There is, I feel there is a large problem in the industry I have found myself in. There is,
unfortunately, a need for codes of behavioral conduct to help arrange and align unfortunately, a need for codes of behavioral conduct to help arrange and align
collaboration across so many cultural and ideological barriers, as well as collaboration across so many cultural and ideological barriers, as well as

View File

@ -4,6 +4,8 @@ date: 2018-11-21
series: dreams series: dreams
--- ---
# My Experience Cursing Out God
This was a hell of a dream. This was a hell of a dream.
It was a simple landscape: a hill, a sky, a sun, a distance, naturalistic buildings dotting a small village to the east. I noticed that I felt different somehow, like I was less chained down. A genderless but somehow masculine moved and stood next to me, gesturing towards me: "It's beautiful isn't it? The village has existed like this for thousands of years in perfect harmony with its world. Even though there's volcano eruptions every decade that burn everything down. It's been nine years and 350 days, but they aren't keeping track. How does that thought make you feel, Creator?" It was a simple landscape: a hill, a sky, a sun, a distance, naturalistic buildings dotting a small village to the east. I noticed that I felt different somehow, like I was less chained down. A genderless but somehow masculine moved and stood next to me, gesturing towards me: "It's beautiful isn't it? The village has existed like this for thousands of years in perfect harmony with its world. Even though there's volcano eruptions every decade that burn everything down. It's been nine years and 350 days, but they aren't keeping track. How does that thought make you feel, Creator?"

View File

@ -5,6 +5,8 @@ thanks: Sygma
series: magick series: magick
--- ---
# Death
Death is a very misunderstood card in Tarot, but not for the reasons you'd think. Societally, many people think that this life is the only shot at existence they get. Afterwards, there is nothing. Nonexistence. Oblivion. This makes death a very touchy subject for a lot of people, so much so it forms a social taboo and an unhealthy relationship with death. People start seeing death as something they need to fight back and hold away by removing what makes themselves human, just to hold off what they believe is their obliteration. Death is a very misunderstood card in Tarot, but not for the reasons you'd think. Societally, many people think that this life is the only shot at existence they get. Afterwards, there is nothing. Nonexistence. Oblivion. This makes death a very touchy subject for a lot of people, so much so it forms a social taboo and an unhealthy relationship with death. People start seeing death as something they need to fight back and hold away by removing what makes themselves human, just to hold off what they believe is their obliteration.
Tarot does not see death in this way. Death, the skeleton knight wearing armor, does not see color, race or creed, thus he is depicted as a skeleton. He is riding towards a child and another younger person. The sun is rising in the distance, but even it cannot stop Death. Nor can royalty, as shown by the king under him, dead. Tarot does not see death in this way. Death, the skeleton knight wearing armor, does not see color, race or creed, thus he is depicted as a skeleton. He is riding towards a child and another younger person. The sun is rising in the distance, but even it cannot stop Death. Nor can royalty, as shown by the king under him, dead.

View File

@ -8,6 +8,8 @@ tags:
- what - what
--- ---
# Death Stranding Review
NOTE: There's gonna be spoilers here. Do not read if you are not okay with this. NOTE: There's gonna be spoilers here. Do not read if you are not okay with this.
For a summary of the article without spoilers, this game is 10 out of 10 game of the For a summary of the article without spoilers, this game is 10 out of 10 game of the
year 2019 for me. year 2019 for me.

View File

@ -3,6 +3,9 @@ title: Dependency Hell
date: 2014-11-20 date: 2014-11-20
--- ---
Dependency Hell
===============
A lot of the problem that I have run into when doing development with A lot of the problem that I have run into when doing development with
nearly any stack I have used is dependency management. This relatively nearly any stack I have used is dependency management. This relatively
simple-looking problem just becomes such an evil, evil thing to tackle. simple-looking problem just becomes such an evil, evil thing to tackle.

View File

@ -5,6 +5,8 @@ tags:
- release - release
--- ---
# Deprecation Notice: Elemental-IRCd
[Elemental-IRCd](https://github.com/Elemental-IRCd/elemental-ircd) is a scalable, lightweight, high-performance IRC daemon written in C with heritage in the original IRC daemon. It is a fork of the now-defunct ShadowIRCD and sought to continue in the direction ShadowIRCD was headed. This software has scaled to support live chat for thousands of users at once in one->one and one->many groups. Working on this software has legitimately been a vital driving force to my career and skill balance between administration, development, moderation and operations of distirbuted communities at scale. Without this software, my closest friends (and even my fiancé) would be strangers to me. [Elemental-IRCd](https://github.com/Elemental-IRCd/elemental-ircd) is a scalable, lightweight, high-performance IRC daemon written in C with heritage in the original IRC daemon. It is a fork of the now-defunct ShadowIRCD and sought to continue in the direction ShadowIRCD was headed. This software has scaled to support live chat for thousands of users at once in one->one and one->many groups. Working on this software has legitimately been a vital driving force to my career and skill balance between administration, development, moderation and operations of distirbuted communities at scale. Without this software, my closest friends (and even my fiancé) would be strangers to me.
However, the result is something I don't know if I can continue to keep maintaining. It's been through a lot. The code has been through so many hands, some files had different licenses compared to the rest of the software. It is a patchwork of patches on top of a roughly solid core, and it's become a burden to maintain. However, the result is something I don't know if I can continue to keep maintaining. It's been through a lot. The code has been through so many hands, some files had different licenses compared to the rest of the software. It is a patchwork of patches on top of a roughly solid core, and it's become a burden to maintain.

View File

@ -5,6 +5,9 @@ tags:
- release - release
--- ---
Instant Development Environments in Docker
==========================================
I have been using a few shell scripts for turbocharging development I have been using a few shell scripts for turbocharging development
using Docker and today I have released the first version of a simple using Docker and today I have released the first version of a simple
tool I call "[dev](https://github.com/Xe/dev)". Usage is very very simple. tool I call "[dev](https://github.com/Xe/dev)". Usage is very very simple.

View File

@ -8,6 +8,8 @@ tags:
- kernel - kernel
--- ---
# How I Implemented /dev/printerfact in Rust
Kernel mode programming is a frightful endeavor. One of the big problems with it Kernel mode programming is a frightful endeavor. One of the big problems with it
is that C is really your only option on Linux. C has many historical problems is that C is really your only option on Linux. C has many historical problems
with it that can't really be fixed at this point without radically changing the with it that can't really be fixed at this point without radically changing the

View File

@ -7,6 +7,8 @@ tags:
- witchcraft - witchcraft
--- ---
# Dhall for Kubernetes
Kubernetes is a surprisingly complicated software package. Arguably, it has to Kubernetes is a surprisingly complicated software package. Arguably, it has to
be that complicated as a result of the problems it solves being complicated; but be that complicated as a result of the problems it solves being complicated; but
managing yaml configuration files for Kubernetes is a complicated task. [YAML][yaml] managing yaml configuration files for Kubernetes is a complicated task. [YAML][yaml]

View File

@ -4,6 +4,8 @@ date: 2018-08-27
for: Sam for: Sam
--- ---
# Died to Save Me
People often get confused People often get confused
when I mention the fact that I when I mention the fact that I
consider myself before I consider myself before I

View File

@ -6,6 +6,8 @@ tags:
- big-rewrite - big-rewrite
--- ---
# Dont Look Into the Light
So at a previous job I was working at, we maintained a system. This system So at a previous job I was working at, we maintained a system. This system
powered a significant part of the core of how the product was actually used (as powered a significant part of the core of how the product was actually used (as
far as usage metrics reported). Over time, we had bolted something onto the side far as usage metrics reported). Over time, we had bolted something onto the side

View File

@ -9,6 +9,8 @@ tags:
- gitea - gitea
--- ---
# Continuous Deployment to Kubernetes with Gitea and Drone
Recently I put a complete rewrite of [the printerfacts Recently I put a complete rewrite of [the printerfacts
server](https://printerfacts.cetacean.club) into service based on server](https://printerfacts.cetacean.club) into service based on
[warp](https://github.com/seanmonstar/warp). I have it set up to automatically [warp](https://github.com/seanmonstar/warp). I have it set up to automatically

View File

@ -1,147 +0,0 @@
---
title: Emoji is not a Language
date: 2021-07-14
tags:
- linguistics
- philosophy
---
What is a language? This is something that is surprisingly controversial.
There's some easy ways to tell when something is a language (one of them being
that they have an army), but what about things like emoji? Is emoji a language?
In this article I will attempt to argue that emoji is not a language unto
itself.
At a high level, language is a tool that we use to represent
spatial/temporal/conceptual relations between objects/ideas/things, statements
about reality and similar things among that nature. Many languages are broken
into units of meaning that we call words. Here are some example words:
- the
- taco
- is
- beautiful
We can break these words into two basic classes like this:
| Content | Grammar |
| :------- | :------- |
| taco | the |
| beautiful | is |
It's worth noting that not all verbs fall into the "grammar" category. Things
like "eat" would fall into a content word, however "is" is a special case
because it is directly drawing a relation between two things. In the sentence
"The taco is beautiful", there is a relation being made from one specific taco
and the abstract concept of beauty.
I want to argue that emoji has plenty of content words, but no grammar words. If
we wanted to assemble an analog to "The taco is beautiful" in emoji, we could
make 1:1 correlations between English words and emoji like this:
| English | Emoji |
|:------- |:----- |
| the | |
| taco | 🌮 |
| is | |
| beautiful | 🎀 |
I dug through the entire emoji chart and was unable to find things that could be
used for "the" and "is". Heck, even the word I used for "beautiful" was a
stretch because the ribbon emoji is normally used that way. Is a language
defined by words that have inherent meaning or is that meaning arbitrarily
assigned by its users? Can I just firng out words like "xnoypt" as in "realizing
how the word would be pronounced, Tom [xnoypted](https://youtu.be/aMgCBYgVwsI)
out of existence"? Does that mean "xnoypt" is a word?
The closest I was able to get to "the" and "is" would be metaphors that would
fall apart when you want to discuss the actual things involved. Let's say that
you assign arbitrary emoji at least to "is" so that you can end up with this
sentence in emoji:
🌮➡️🎀
What if you want to talk about the concept of right though? Say you want to
convey that the taco store is to the right of the office building. You'd need to
say something like:
🌮🏪➡️➡️🏢
And this could be easily confused with the interpretation "taco store right
right office building".
But how do you know that it's a taco store? That's just a convention English
follows where the thing being described is the right-most thing and other things
on the left are just qualifiers or determiners to what's going on about it. It's
a "taco store", not a "store taco". Other languages like French do have this
reversed, so it could easily become a source of confusion.
So what if you ripped out the grammar entirely? What if you just had something
that was pure content? Could utterances like "🌮🏪➡️🏢" function in place of
something that breaks apart the words into groups? How would people know the
difference between that being a giant list of descriptors on top of a taco or an
office building?
How would you express verbs like "to eat"? Emojipedia says that 🍴 is used to
signify eating, but what about cultures that don't use cutlery to eat with?
Would this really be global enough to work in places like China? Cultural
cross-contamination would likely be enough at this point that most people could
get the message, but is this really representing the idea of eating or the idea
of something that you can use to eat other things? Would using this mean that
you could express what you ate with emoji? What would make it more of a concept
of eating than "to eat", "mangxi" (Esperanto), "manger" (French), or "citka"
(Lojban)?
If language is a tool that we can use to describe relations, then we can sorta
get them across with emoji by piggy-backing on top of the grammar of other
languages. You can derive new words like "taco store" with phrases like "🌮🏪".
You can use these to create meaning, I guess, but it wouldn't be very precise.
You could get across the most common words and cultural ideas, but not much
else.
Certainly not technical things where detail is important. Where is that taco
store in relation to the office building? Is it 5 meters to the right of it or
500 meters? What color is the office building? What name does it have? What is
the name of the road? What is the name of the taco store?
What can you really convey with emoji that isn't also conveyed with words?
You can create new words easily with some chat platforms and how they use emoji
though. You can either describe "nonbinary people" as "🚫🔢01🧍" or you can just
upload an image of the [nonbinary pride
flag](https://gender.wikia.org/wiki/Pride_Flags#Nonbinary_Flag) to use as a
direct descriptor of the concept instead. In a way emoji gives you a level of
freedom of expression that simple words can't. The word "xnoypt" makes sense to
people that know the word, but the picture has a greater chance of being closer
to understood on its own. Here is an emoji that my coworkers use as a loving
description:
<center>
![](https://cdn.christine.website/file/christine-static/blog/friday_deploy.png)
</center>
This one is called `friday_deploy` and is used as the avatar of our deployment
bot as well as a way to describe the abstract horror of deploying software on a
Friday. By being an emoji it can represent something more than just the
pictograph that it is.
These all certainly encode meaning on their own, but meaning on its own doesn't
make a language. Emoji certainly could become a language, but it would need a
lot of work to become one. Even then it would likely fall into the other
failings that International Auxiliary Languages that have fell into. It is
easier to type emoji than it is to type things like Esperanto's "ĉ", but it's
going to inherently encode assumptions in the creator's first language.
Emoji is not a language, it's used to augment existing languages.
> If you want to claim that emoji is a language, you should be able to make that
> same claim using emoji. Not an ad hoc cypher of the english sentence; just use
> emoji the way people commonly use them, which you're saying counts as a
> language, to say "Emoji is a language".
- allthingslinguistic
I'd be willing to be proven wrong if you can write "Emoji is a language"
unambiguously using emoji without it being a baroque cipher of English.

View File

@ -6,6 +6,8 @@ tags:
series: freenode series: freenode
--- ---
# Epilogue
The last caretaker's absence rippled throughout the halls. The darkness was all The last caretaker's absence rippled throughout the halls. The darkness was all
that remained. that remained.

View File

@ -1,192 +0,0 @@
---
title: "Things I'm Excited for in 2022"
date: 2021-12-28
author: ectamorphic
---
2021 has been...a thing. However there are a lot of things that I am looking
forward to in 2022 that I'm gonna summarize in a few categories.
## VR
2021 has been a really dry year for VR tech. The chip shortage has really hurt
the budding VR industry, but there are some things that have been announced that
I am looking forward to.
[VR has really been one of the main things that's been keeping me sane over the
eternal plague. It's become one of my main activities and I am looking forward
to the improvements that come with new generations of VR
tech.](conversation://Cadey/enby)
### Simula One
[Simula](https://simulavr.com/) is trying to create a VR headset that can
function as a monitor replacement. This is something I am _really_ excited for.
The Simula One has a lot of potential to change how people use computers.
Right now a lot of the "working in VR" kinds of projects try to recreate the
_experience_ of using a desktop PC in VR. This makes sense, the existing
paridigm is already there and people are already familiar with it. However there
is also a lot of room for ditching the constraints of the past and really
experimenting with what computing can be if you aren't constrained by monitors.
The Simula One headset is going to have [one of the highest pixels-per-degree on
the market for consumer VR](https://simulavr.com/blog/vr-comparison/). It's
going to be running NixOS and [Monado](https://monado.freedesktop.org/).
I don't really know if it is going to take off and if the result will be any
good, however it's very important that people try these kinds of things. Who
knows what will catch on? They are going to open up a kickstarter in January and
I plan to be one of the early high tier donators.
### Valve "deckard"
Valve has been working on the Steam Deck, but there's also a section of Valve
that has been hard at work on a VR headset codenamed
["deckard"](https://www.theverge.com/2021/9/29/22699914/valve-deckard-standalone-vr-headset-prototype-development).
The rumor mill says it will have an option to run as a standalone headset as
well as a traditional PCVR headset. Other digging into things have found a wifi
chip (a specific wifi6 realtek one) that would allow for streaming VR gameplay
over a network and there are also references to using
[xrdesktop](https://www.collabora.com/news-and-blog/news-and-events/moving-the-linux-desktop-to-another-reality.html)
as a way to run "flat" applications in a VR space. There are also rumors that it
will support "inside-out" tracking, which is also essential for being a portable
headset.
I would absolutely love to have such a thing. I travel occasionally for work and
I would really love to have a quality PCVR experience on the go. It would let me
be able to not skip my workout days when I'm in a hotel room.
The VR space on Linux is slightly stagnated at the moment due to most of the
investment either being in SteamVR on Windows or on Oculus' fork of Android.
This does make sense though, there is a lot of money to be made in the VR space.
Hopefully Valve can improve the state of VR on Linux with the "deckard".
## Video Games
2021 has had some banger releases. Halo Infinite finally dropped. Final Fantasy
7 Remake came to PC. [Metroid
Dread](https://christine.website/blog/metroid-dread-review-2021-10-10) finally
came out after being rumored for more than half of my lifetime. Forza Horizon 5
raced out into the hearts of millions. Overall, it was a pretty good year to be
a gamer.
[I was going to do a writeup of my thoughts on Halo Infinite, however I really
want to reserve that for when I can do it co-op. From what I've heard of the
development of Infinite there were many points where they didn't think that the
game would ship at all. It came out though. It's decent, movement is really fun,
but overall I don't feel it's going to be genre-defining in the ways they would
have hoped.](conversation://Cadey/coffee)
However 2022 looks like we're going to finally start returning to "normal" with
development schedules. Here's what I'm the most excited for:
### Steam Deck
The [Steam Deck](https://www.steamdeck.com/en/) is a handheld PC that will let
you play games. It's also likely going to be my first "next gen" console, as
despite my repeated attempts I have been unable to get an Xbox Series console or
a PS5.
[Is the Steam Deck really a console? It's much more like a PC, but it's not as
much of a console as the Oculus Quest 2 is.](conversation://Mara/hmm)
[Let's just call it a console for the sake of
argument.](conversation://Cadey/coffee)
I'm excited for this on multiple levels. Valve is going to make it run SteamOS 3
by default. SteamOS is based on Arch Linux and they have been making improvement
after improvement to the Linux kernel and all of the software they are going to
use on it. Valve hopes to have most games on Steam playable like they are on a
PC running windows.
It's also a bit of a chunky boi. It's gonna be a bit hefty, but I'm excited for
what it is going to bring to the ecosystem. It may lead to the year of Linux on
the desktop!
[Isn't that every year though?](conversation://Mara/hmm)
### Splatoon 3
Splatoon is one of my favorite game series. It's a game where you have a bunch
of ink guns and your goal is to cover as much turf as possible. The game feels
like Quake in the best ways. You use your sticks to lead and the gyroscope to
refine your aim, just like you would with a Steam Controller.
[I'm still sad that the Steam Controller failed in the
market.](conversation://Cadey/coffee)
Splatoon 3 looks like it will build on the fundamentals in great ways. I can't
wait to see what they have in store!
### The Sequel to The Legend of Zelda: Breath of The Wild
I have over 400 hours logged in Breath of The Wild. It is in the running for my
favorite games of all time. The really innovative part of Breath of The Wild was
the fact that it was a jRPG without a leveling mechanic, experience points or a
hard-defined story path. You are dumped into the world, given tools to explore
through it and then given free reign to do whatever you want. It is a massive
open world (probably one of the biggest in a Nintendo game save maybe Xenoblade
Chronicles X) and you are given the agency you need to play the game how you
want. You can run straight to Ganon and finish the game in less than an hour.
You can spend hundreds of hours exploring the world to solve all the puzzle
shrines.
Most of all though, the really great part about Breath of The Wild is the fact
that as you play, your skill as a player improves. You learn to chain together
mechanics to do basically whatever you want and the game doesn't stop you. You
can do _whatever you want_ and the real progression system is your skill.
[This sounds weird, but tying progression to player skill is incredibly
anti-meta as far as these games go. Usually jRPGs are very tailored experiences
where you go through the standard "fetch bread -> kill god" kind of power skill
tree, but with Breath of The Wild you can "kill god" right out of the gate and
"fetch bread" later.](conversation://Cadey/enby)
I have no idea what to expect for the sequel to Breath of The Wild, but I'm
excited as heck to see what they come up with.
[This is going to have an article written about it once I've gotten a chance to
play through it. This may take a week to a month. It's gonna be worth the
wait.](conversation://Cadey/enby)
## My Projects
I don't really like having too many project plans ahead of time, but here are
the biggest things I'm already committing myself to do next year. Something
something forward looking statements something something.
### Daily Workout Streams
I love rhythm games. I haven't really had good rhythm games to play until I got
back into VR. I've been playing a lot of [Beat
Saber](https://store.steampowered.com/app/620980/Beat_Saber/) and more recently
[Synth Riders](https://synthridersvr.com/). I've been streaming my play on
[Twitch](https://twitch.tv/princessxen) and I have a playlist of the VODs on
[YouTube](https://www.youtube.com/playlist?list=PLJDDsMrk2tSH3nhLWqV8IZLgae1CNYurH).
I live a very sedentary lifestyle, even before COVID, and I want to start to get
back into shape. Doing it [dancing on the
internet](https://youtu.be/q3F06mKP2uk?list=PLJDDsMrk2tSH3nhLWqV8IZLgae1CNYurH&t=4342)
is fun, so why not?
### Spellblade
I have a bunch of unreleased material for Spellblade that I need to go in and
edit up and post.
### V-Tubing
I got a webcam for Christmas that I plan to use for V-Tubing coming soon. I want
to use it for recording conference talks as well as for doing some non-VR gaming
streams.
I have been working on getting a V-Tuber model hacked up out of the one that
I've been using in VRChat, but having no idea what I am doing in Unity has
really not been helping.
---
Hope this was an interesting view into what I'm excited for. This may be my last
post for the year. Stay safe out there, things have been rough.

View File

@ -3,6 +3,8 @@ title: I Put Words on this Webpage so You Have to Listen to Me Now
date: 2018-11-30 date: 2018-11-30
--- ---
# I Put Words on this Webpage so You Have to Listen to Me Now
Holy cow. I am angry at how people do thing with tool. People do thing with tool so badly. You shouldn't do thing with tool, you should do other thing, compare this: Holy cow. I am angry at how people do thing with tool. People do thing with tool so badly. You shouldn't do thing with tool, you should do other thing, compare this:
I am using tool. I want to do thing. I flopnax the ropjar and then I get the result of doing thing (because it's convenient to flopnax the ropjar given the existing program structure). I am using tool. I want to do thing. I flopnax the ropjar and then I get the result of doing thing (because it's convenient to flopnax the ropjar given the existing program structure).

View File

@ -8,6 +8,8 @@ tags:
- heroku - heroku
--- ---
# Farewell Email - Heroku
## May our paths cross again ## May our paths cross again
Hey all, Hey all,
@ -18,7 +20,7 @@ The people I've worked with at Heroku have been catalytic to our success as a le
There is no doubt in my mind that you all will build fantastically useful and stable tools for Salesforce customers. Keep your eyes on what matters, let your heart guide your actions, and you all will continue to construct and refine the finest possible infrastructure that is possible. We may be limited as humans, but together in groups like this we can surpass these arbitrary differences and create things that really shine. There is no doubt in my mind that you all will build fantastically useful and stable tools for Salesforce customers. Keep your eyes on what matters, let your heart guide your actions, and you all will continue to construct and refine the finest possible infrastructure that is possible. We may be limited as humans, but together in groups like this we can surpass these arbitrary differences and create things that really shine.
> As one being we repeat the words: > As one being we repeat the words:
> >
> Flow in compassion > Flow in compassion
> Release what is divine > Release what is divine

View File

@ -6,6 +6,8 @@ for: Twilight Sparkle
series: stories series: stories
--- ---
# Fear
_I must not fear._ _I must not fear._
_Fear is the mind-killer._ _Fear is the mind-killer._
_Fear is the little-death that brings total obliteration._ _Fear is the little-death that brings total obliteration._

View File

@ -5,6 +5,8 @@ tags:
- gemini - gemini
--- ---
# RSS/Atom Feeds Fixed and Announcing my Flight Journal
I have released version 2.0.1 of this site's code. With it I have fixed the RSS I have released version 2.0.1 of this site's code. With it I have fixed the RSS
and Atom feed generation. For now I have had to sacrifice the post content being and Atom feed generation. For now I have had to sacrifice the post content being
in the feed, but I will bring it back as soon as possible. in the feed, but I will bring it back as soon as possible.

View File

@ -7,6 +7,9 @@ tags:
- nim - nim
--- ---
FFI-ing Golang from Nim for Fun and Profit
==========================================
As a side effect of Go 1.5, the compiler and runtime recently gained the As a side effect of Go 1.5, the compiler and runtime recently gained the
ability to compile code and run it as FFI code running in a C namespace. This ability to compile code and run it as FFI code running in a C namespace. This
means that you can take any Go function that expresses its types and the like means that you can take any Go function that expresses its types and the like

View File

@ -6,6 +6,8 @@ tags:
series: freenode series: freenode
--- ---
# Final Chapter
The last caretaker looked at the last light lit in the empty halls. They looked The last caretaker looked at the last light lit in the empty halls. They looked
out across their home. It used to be filled with thousands of people. There were out across their home. It used to be filled with thousands of people. There were
discussions about every topic imaginable from people of as many backgrounds. discussions about every topic imaginable from people of as many backgrounds.

View File

@ -6,6 +6,8 @@ tags:
series: freenode series: freenode
--- ---
# Footnote
- [Final Chapter](/blog/final-chapter-2021-05-20) - [Final Chapter](/blog/final-chapter-2021-05-20)
- [Epilogue](/blog/epilogue-2021-05-26) - [Epilogue](/blog/epilogue-2021-05-26)

View File

@ -4,6 +4,8 @@ date: 2019-05-19
series: conlangs series: conlangs
--- ---
# A Formal Grammar of `h`
## Introduction ## Introduction
`h` is a conlang project that I have been working off and on for years. It is infinitely simply teachable, trivial to master and can be used to represent the entire scope of all meaning in any facet of the word. All with a single character. `h` is a conlang project that I have been working off and on for years. It is infinitely simply teachable, trivial to master and can be used to represent the entire scope of all meaning in any facet of the word. All with a single character.

View File

@ -1,382 +0,0 @@
---
title: Fun with Redirection
date: 2021-09-22
author: Twi
tags:
- shell
- redirection
- osdev
---
When you're hacking in the shell or in a script, sometimes you want to change
how the output of a command is routed. Today I'm gonna cover common shell
redirection tips and tricks that I use every day at work and how it all works
under the hood.
Let's say you're trying to capture the output of a command to a file, such as
`uname -av`:
```console
$ uname -av
Linux shachi 5.13.15 #1-NixOS SMP Wed Sep 8 06:50:21 UTC 2021 x86_64 GNU/Linux
```
You could copy that to the clipboard and paste it into a file, but there is a
better way thanks to the `>` operator:
```console
$ uname -av > uname.txt
$ cat uname.txt
Linux shachi 5.13.15 #1-NixOS SMP Wed Sep 8 06:50:21 UTC 2021 x86_64 GNU/Linux
```
Let's say you want to run this on a few machines and put all of the output into
`uname.txt`. You could write a shell script loop like this:
```sh
# make sure the file doesn't already exist
rm -f uname.txt
for host in shachi chrysalis kos-mos ontos pneuma
do
ssh $host -- uname -av >> uname.txt
done
```
Then `uname.txt` should look like this:
```
Linux shachi 5.13.15 #1-NixOS SMP Wed Sep 8 06:50:21 UTC 2021 x86_64 GNU/Linux
Linux chrysalis 5.10.63 #1-NixOS SMP Wed Sep 8 06:49:02 UTC 2021 x86_64 GNU/Linux
Linux kos-mos 5.10.45 #1-NixOS SMP Fri Jun 18 08:00:06 UTC 2021 x86_64 GNU/Linux
Linux ontos 5.10.52 #1-NixOS SMP Tue Jul 20 14:05:59 UTC 2021 x86_64 GNU/Linux
Linux pneuma 5.10.57 #1-NixOS SMP Sun Aug 8 07:05:24 UTC 2021 x86_64 GNU/Linux
```
Now let's say you want to extract all of the hostnames from that `uname.txt`.
The pattern of the file seems to specify that fields are separated by spaces and
the hostname seems to be the second space-separated field in each line. You can
use the `cut` command to select that small subset from each line, and you can
feed the `cut` command's standard input using the `<` operator:
```console
$ cut -d ' ' -f 2 < uname.txt
shachi
chrysalis
kos-mos
ontos
pneuma
```
[It's worth noting that a lot of these core CLI utilities are built on the idea
that they are _filters_, or things that take one infinite stream of text in on
one end and then return another stream of text out the other
end. This is done through a channel called "standard input/output", where
standard input refers to input to the command and standard output refers to the
output of the command.](conversation://Mara/hacker)
[That's a great metaphor, let's build onto it using the `|` (pipe)
operator. The pipe operator lets you pipe the standard output of one command to
the standard input of another.](conversation://Cadey/enby)
[You mentioned that you can pass files as input and output for commands, does
this mean that standard input and standard output are
files?](conversation://Mara/happy)
[Precisely! They are just files that are automatically open for every process.
Usually commands will output to standard out and some will also accept input via
standard in.](conversation://Cadey/enby)
[Doesn't that have some level of overhead though? Isn't it expensive to spin up
a whole heckin' `cat` process for that?](conversation://Mara/hmm)
[Not on any decent system made in the last 20 years. This may have some impact
on Windows (because they have core architectural mistakes that make processes
take up to 100 milliseconds to spin up), but this is about Unix/Linux. I think
these should work on Windows too if you use Cygwin, but if you're using WSL you
shouldn't have any real issues there](conversation://Cadey/coffee)
Let's say we want to rewrite that `cut` command above to use pipes. You could
write it like this:
```sh
cat uname.txt | cut -d ' ' -f 2
```
[The mnemonic we use for remembering the `cut` command is that fields are
separated by the `d`elimiter and you cut out the nth
`f`ield/s.](conversation://Mara/hacker)
This will get you the exact same output:
```console
$ cat uname.txt | cut -d ' ' -f 2
shachi
chrysalis
kos-mos
ontos
pneuma
```
Personally I prefer writing shell pipelines like that as it makes it a bit
easier to tack on more specific selectors or operations as you go along. For
example, if you wanted to sort them you could pipe the result to `sort`:
```console
$ cat uname.txt | cut -d ' ' -f 2 | sort
chrysalis
kos-mos
ontos
pneuma
shachi
```
This lets you gradually build up a shell pipeline as you drill down to the data
you want in the format you want.
[I wanted to save this compiler error to a file but it didn't work. I tried
doing this:](conversation://Mara/hmm)
```console
$ rustc foo.rs > foo.log
```
But the output printed to the screen instead of the file:
```console
$ rustc foo.rs > foo.log
error: expected one of `!` or `::`, found `main`
--> foo.rs:1:5
|
1 | fun main() {}
| ^^^^ expected one of `!` or `::`
error: aborting due to previous error
$ cat foo.log
$
```
This happens because there are actually _two_ output streams per program. There
is the standard out stream and there is also a standard error stream. The reason
that standard error exists is so that you can see if any errors have happened if
you redirect standard out.
Sometimes standard out may not be a stream of text, say you have a compressed
file you want to analyze and there's an issue with the decompression. If the
decompressor wrote its errors to the standard output stream, it could confuse or
corrupt your analysis.
However, we can redirect standard error in particular by modifying how we
redirect to the file:
```console
$ rustc foo.rs 2> foo.log
$ cat foo.log
error: expected one of `!` or `::`, found `main`
--> foo.rs:1:5
|
1 | fun main() {}
| ^^^^ expected one of `!` or `::`
error: aborting due to previous error
```
[Where did the `2` come from?](conversation://Mara/wat)
So I mentioned earlier that redirection modifies the standard input and output
of programs. This is not entirely true, but it was a convenient half-truth to
help build this part of the explanation.
For every process on a Unix-like system (such as Linux and macOS), the kernel
stores a list of active file-like objects. This includes real files on the
filesystem, pipes between processes, network sockets, and more. When a program
reads or writes a file, they tell the kernel which file they want to use by
giving it a number index into that list, starting at zero. Standard in/out/error
are just the conventional names for the first three open files in the list, like
this:
| File Descriptor | Purpose |
| :------ | :------- |
| 0 | Standard input |
| 1 | Standard output |
| 2 | Standard error |
Shell redirection simply changes which files are in that list of open files when
the program starts running.
That is why you use a `2` there, because you are telling the shell to change
file descriptor number `2` of the `rustc` process to point to the filesystem
file `foo.log`, which in turn makes the standard error of `rustc` get written to
that file for you.
In turn, this also means that `cat foo.txt > foo2.txt` is actually a shortcut
for saying `cat foo.txt 1> foo2.txt`, but the `1` can be omitted there because
standard out is usually the "default" output that most of these kind of
pipelines cares about.
[How would I get both standard output and standard error in the same
file?](conversation://Mara/hmm)
The cool part about the `>` operator is that it doesn't just stop with output to
files on the desk, you can actually have one file descriptor get pointed to
another. Let's say you have a need for both standard out and standard error to
go to the same file. You can do this with a command like this:
```
$ rustc foo.rs > foo.log 2>&1
```
This tells the shell to point standard out to `foo.log`, and then standard
error to standard out (which is now `foo.log`). There's a footgun here though;
the order of the redirects matters. Consider the following:
```
$ rustc foo.rs 2>&1 > foo.log
error: expected one of `!` or `::`, found `main`
--> foo.rs:1:5
|
1 | fun main() {}
| ^^^^ expected one of `!` or `::`
error: aborting due to previous error
$ cat foo.log
$ # foo.log is empty, why???
```
We wanted to redirect stderr to `foo.log`, but that didn't happen. Why? Well,
the shell considers our redirects one at a time from left to right. When the
shell sees `2>&1`, it hasn't considered `> foo.log` yet, so standard out (`1`)
is still our terminal. It dutifully redirects stderr to the terminal, which is
where it was already going anyway. Then it sees `1 > foo.log`, so it redirects
standard out to `foo.log`. That's the end of it though. It doesn't
retroactively redirect standard error to match the new standard out, so our
errors get dumped to our terminal instead of the file.
Confusing right? Lucky for us, there's a short form that redirects both at the
same time, making this mistake impossible:
```
$ rustc foo.rs &> foo.log
```
This will put standard out and standard error to `foo.log` the same way that
`> foo.log 2>&1` will.
[Will that work in every shell?](conversation://Mara/hmm)
[It's a bourne shell (`bash`) extension, but I've tested it in `zsh` and `fish`.
You can also do `&|` to pipe both standard out and standard error at the same
time in the same way you'd do `2>&1 | whatever`.](conversation://Cadey/enby)
You can also use this with `>>`:
```
$ rustc foo.rs &>> foo.log
$ cat foo.log
error: expected one of `!` or `::`, found `main`
--> foo.rs:1:5
|
1 | fun main() {}
| ^^^^ expected one of `!` or `::
error: aborting due to previous error
error: expected one of `!` or `::`, found `main`
--> foo.rs:1:5
|
1 | fun main() {}
| ^^^^ expected one of `!` or `::`
error: aborting due to previous error
```
[How do I redirect standard in to a file?](conversation://Mara/hmm)
Well, you don't. Standard in is an input, so you can change where it comes
_from_, not where it goes.
But, maybe you want to make a copy of a program's input and send it somewhere
else. There is a way to do _that_ using a command called `tee`. `tee` copies
its standard input to standard output, but it also writes a second copy to a
file. For example:
```console
$ dmesg | tee dmesg.txt | grep 'msedge'
[ 70.585463] traps: msedge[4715] trap invalid opcode ip:5630ddcedc4c sp:7ffd41f67700 error:0 in msedge[5630d8fc2000+952d000]
[ 70.702544] traps: msedge[4745] trap invalid opcode ip:5630ddcedc4c sp:7ffd41f67700 error:0 in msedge[5630d8fc2000+952d000]
[ 70.806296] traps: msedge[4781] trap invalid opcode ip:5630ddcedc4c sp:7ffd41f67700 error:0 in msedge[5630d8fc2000+952d000]
[ 70.918095] traps: msedge[4889] trap invalid opcode ip:5630ddcedc4c sp:7ffd41f67700 error:0 in msedge[5630d8fc2000+952d000]
[ 71.031938] traps: msedge[4926] trap invalid opcode ip:5630ddcedc4c sp:7ffd41f67700 error:0 in msedge[5630d8fc2000+952d000]
[ 71.138974] traps: msedge[4935] trap invalid opcode ip:5630ddcedc4c sp:7ffd41f67700 error:0 in msedge[5630d8fc2000+952d000]
[ 1169.163603] traps: msedge[35719] trap invalid opcode ip:556a93951c4c sp:7ffc533f35c0 error:0 in msedge[556a8ec26000+952d000]
[ 1213.301722] traps: msedge[36054] trap invalid opcode ip:55a245960c4c sp:7ffe6d169b40 error:0 in msedge[55a240c35000+952d000]
[10963.234459] traps: msedge[104732] trap invalid opcode ip:55fdb864fc4c sp:7ffc996dfee0 error:0 in msedge[55fdb3924000+952d000]
```
This would put the output of the `dmesg` command (read from kernel logs) into
`dmesg.txt`, as well as sending it into the grep command. You might want to do
this when debugging long command pipelines to see exactly what is going into a
program that isn't doing what you expect.
Redirections also work in scripts too. You can also set "default" redirects for
every command in a script using the `exec` command:
```sh
exec > out.log 2> error.log
ls
rustc foo.rs
```
This will have the file listing from `ls` written to `out.log` and any errors
from `rustc` written to `error.log`.
A lot of other shell tricks and fun is built on top of these fundamentals. For
example you can take a folder, zip it up and then unzip it over on another
machine using a command like this:
```
$ tar cz ./blog | ssh pneuma tar xz -C ~/code/christine.website/blog
```
This will run `tar` to create a compressed copy of the `./blog` folder and then
pipe that to tar on another computer to extract that into
`~/code/christine.website/blog`. It's just pipes and redirection all the way
down! Deep inside `ssh` it's really just piping output of commands back and
forth over an encrypted network socket. Connecting to an IRC server is just
piping in and out data to the chat server, even more so if you use TLS to
connect there. In a way you can model just about everything in Unix with pipes
and file descriptors because that is the cornerstone of its design: Everything
is a file.
[This doesn't mean it's literally a file on the disk, it means you can _interact
with_ just about everything using the same system interface as you do with
files. Even things like hard disks and video cards.](conversation://Mara/hacker)
Here's a fun thing to do. Using [`curl`](https://curl.se/) to read the contents
of a URL and [`jq`](https://stedolan.github.io/jq/) to select out bits from a
JSON stream, you can make a script that lets you read the most recent title from
my blog's [JSONFeed](/blog.json):
```sh
#!/usr/bin/env bash
# xeblog-post.sh
curl -s https://christine.website/blog.json | jq -r '.items[0] | "\(.title) \(.url)"'
```
At the time of writing this post, here is the output I get from this command:
```
$ ./xeblog-post.sh
Anbernic RG280M Review https://christine.website/blog/rg280m-review
```
What else could you do with pipes and redirection? The cloud's the limit!
---
Thanks to violet spark, cadence, and AstroSnail for looking over this post and
fact-checking as well as helping mend some of the brain dump and awkward
wording into more polished sentences.

View File

@ -6,6 +6,8 @@ tags:
- fe21 - fe21
--- ---
# The Relaxing Surreality of VRChat Furry Conventions
Author's Note: you may want to view this post in a GUI browser for the best experience. Author's Note: you may want to view this post in a GUI browser for the best experience.
It is no secret that I am a furry. The main way that a lot of my friends and I meet up is at conventions. COVID has lead to a year without cons for my friend groups. It's gotten bad enough that in one server the convention coordination channel had its name changed from `#conventions` to `#cancelled`. These conventions are expensive (flight/hotel/badge/the dealer's den), tiring and weirdly recharging all at once. It is no secret that I am a furry. The main way that a lot of my friends and I meet up is at conventions. COVID has lead to a year without cons for my friend groups. It's gotten bad enough that in one server the convention coordination channel had its name changed from `#conventions` to `#cancelled`. These conventions are expensive (flight/hotel/badge/the dealer's den), tiring and weirdly recharging all at once.

View File

@ -8,6 +8,8 @@ tags:
- twitch - twitch
--- ---
# Gamebridge: Fitting Square Pegs into Round Holes since 2020
Recently I did a stream called [Twitch Plays Super Mario 64][tpsm64]. During Recently I did a stream called [Twitch Plays Super Mario 64][tpsm64]. During
that stream I both demonstrated and hacked on a tool I'm calling that stream I both demonstrated and hacked on a tool I'm calling
[gamebridge][gamebridge]. Gamebridge is a tool that lets you allow games to [gamebridge][gamebridge]. Gamebridge is a tool that lets you allow games to

View File

@ -7,6 +7,8 @@ tags:
- gods - gods
--- ---
# The Gears and The Gods
If there are any gods in computing, they are the authors of compilers. The If there are any gods in computing, they are the authors of compilers. The
output of compilers is treated as a Heavenly Decree, sometimes used for many output of compilers is treated as a Heavenly Decree, sometimes used for many
sprints or even years after the output has been last emitted. sprints or even years after the output has been last emitted.

View File

@ -6,6 +6,8 @@ tags:
- web - web
--- ---
# The Fear Of Missing Out
Humans have evolved over thousands of years with communities that are small, Humans have evolved over thousands of years with communities that are small,
tight-knit and where it is easy to feel like you know everyone in them. The tight-knit and where it is easy to feel like you know everyone in them. The
Internet changes this completely. With the Internet, it's easy to send messages, Internet changes this completely. With the Internet, it's easy to send messages,

View File

@ -8,6 +8,8 @@ tags:
- draft - draft
--- ---
# Get Going: Hello, World!
This post is a draft of the first chapter in a book I'm writing to help people learn the This post is a draft of the first chapter in a book I'm writing to help people learn the
[Go][go] programming language. It's aimed at people who understand the high [Go][go] programming language. It's aimed at people who understand the high
level concepts of programming, but haven't had much practical experience with level concepts of programming, but haven't had much practical experience with

View File

@ -4,6 +4,9 @@ date: 2015-01-28
series: howto series: howto
--- ---
Getting Started with Go
=======================
Go is an exciting language made by Google for systems programming. This article Go is an exciting language made by Google for systems programming. This article
will help you get up and running with the Go compiler tools. will help you get up and running with the Go compiler tools.

View File

@ -7,6 +7,8 @@ tags:
- release - release
--- ---
# gitea-release Tool Announcement
I'm a big fan of automating things that can possibly be automated. One of the I'm a big fan of automating things that can possibly be automated. One of the
biggest pains that I've consistently had is creating/tagging releases of biggest pains that I've consistently had is creating/tagging releases of
software. This has been a very manual process for me. I have to write up software. This has been a very manual process for me. I have to write up

View File

@ -1,153 +0,0 @@
---
title: "GNU Doesn't Care About Your Agency"
date: 2022-02-10
tags:
- gnu
- libre
- rant
---
<div class="warning">
[EDIT(2022-02-10 12:47 EST): I apparently misread part of the GNU #guix channel
rules and made an unreasonable assumption that violators of the rules could be
banned. I have amended a conversation fragment accordingly. My intent was not to
lie, but to point out that some users actually need stuff that nonguix provides
but they just have to know that it exists in the first place.](conversation://Cadey/coffee)
</div>
Or: Ubuntu gives the user more agency about how they want to use their computer
than fully libre GNU/Linux distros ever can.
There are many different kinds of Linux distributions, but today we're going to
think about a certain kind of distribution: ones where the distribution is
totally comprised of free software as much as possible.
These distributions aim to let users benefit by making it possible to study,
hack at and modify every byte of software on the machine's hard drive. This is a
fairly noble goal, however in the process of doing this they break core parts of
hardware compatibility by "de-blobbing" the kernel. Most of these distributions
have a very paternalistic implementation where the "de-blobbed" linux-libre
kernel is the _only_ option, thus limiting users' agency.
For example, let's think about the CPU that I'm using right now. The CPU I'm
using is designed to be able to load CPU microcode updates that are distributed
by the manufacturer in order to mitigate bugs in the microcode that released
with the CPU that can cause real-world impact on what I do. Due to Facts and
Circumstances that are immutable for the sake of argument, this microcode is not
open source and cannot be compiled from source code. The linux-libre kernel
removes the ability to load such firmware updates at runtime.
This means that if something like the FDIV bug or Spectre shows up again but it
can be patched trivially with a microcode update, by nature of using the
linux-libre kernel I am doomed until the base microcode gets updated from the
motherboard manufacturer. If they release a closed-source update that you cannot
inspect or modify.
This paternalistic view of "you shouldn't be able to load microcode updates
because they aren't open source" means that my CPU will be vulnerable to
potentially critical security flaws and I have no way to work around it. This
ends up creating a _limitation_ in how I use my computer. This is worse than the
limitations of proprietary hardware because there is the illusion of free choice
that the community will spout off about as the next coming of sliced bread. That
still doesn't change the fact that my wifi card won't work without the normal
kernel and firmware blobs.
Combine this with other things like wifi card firmware (some wifi cards don't
have the firmware stored on the device, they require the OS to send it firmware
at runtime to make it work at all), and you have actually limited the agency and
capability of users far, far more than if you just let them load the firmware in
the first place.
[Yes, Yes the companies made the hardware this way in the first place and are
responsible for the problem, but telling users they are wrong for wanting it to
work because of an implementation detail about how the hardware updates itself
feels a lot like victim blaming. I am aware of the Talos II being a magical
puppy and rainbow situation where all of this isn't an issue, but sadly the
world just didn't turn out that way and we have to deal with the results of
it.](conversation://Cadey/coffee)
Consider a situation like wanting to play an online game together with friends,
but through Facts and Circumstances you have an Nvidia GPU and the game is on
Steam with no open source option. If you are using a fully open source operating
system with no capacity to install Steam or the Nvidia drivers, you are screwed
and thus your freedom to use your computer how you want is severely limited.
This also extends to how those Linux distributions handle things like AWS. AWS
is largely the poster child of a proprietary cloud hosting platform that you are
made to work with as part of your job. Consider if something like Parabola
GNU/Linux created AWS images and gave users a best-in-class user experience for
using them. This would make the net cost of using a highly auditable environment
a lot lower than the current "don't use AWS lol" (which is again really close to
victim blaming), and would also create institutional knowledge that would let
other people benefit from this as a second or third order effect.
Parabola making AWS images means they can create more generic images, which
means that other people can use those images to do whatever they want with their
own hardware. This lets you have a net benefit to everyone in the project by
decreasing the friction of using it, so it will in turn make users more likely
to adopt it.
Remember the law of halves. Every additional step in adoption costs you half
your audience. Spinning up an AWS instance to mess around with it is a very
low-friction operation.
[But you can just not be a scrub and compile your own traitor kernel that lets
you load freedom-violating binary blobs!](conversation://Numa/delet)
[Then you have to hope your CPU is good enough to build a kernel, hope you can
pay attention to the kernel security mailing list enough to upgrade it when you
need to and finally hope you can upgrade the firmware blobset that the kernel
publishes separately! Hope is not a scalable strategy.](conversation://Cadey/angy)
If their goal is _really_ to liberate users and make it easy for them to have
control over what their computer is doing, they should make it trivial to escape
hatch into a less "pure" setup without having to install third party
repositories that you just have to know about or sidestepping the upstream
update process to install your own system software. This is more victim blaming.
The GNU project could be more than a circlejerk around things that the toe
cheese god said in the 80's and 90's. They could have been a source of reverse
engineering tools, institutions and overall inspire the kind of culture that
would make it _easy_ to understand arbitrary hardware, platforms and software
that you either come across or are made to use as a part of your job.
But they aren't. Instead, Guix, one of their if not their main flagship project
for making a fully GNU system, is addled by the use of the linux-libre kernel.
This makes the kernel fundamentally _incompatible_ with a shocking number of
computers, thus limiting users' freedom to use Guix at all.
[But wait, isn't there that one nonguix project that allows you to install a
normal kernel and Steam?](conversation://Mara/hmm)
[Yeah, but talk about that in the main #guix channel and you get told to not
talk about it. You just have to know that it exists and you can't learn that it
exists without knowing someone that tells you that it exists under the table,
like some kind of underground software drug dealer giving you a hit of wifi card
firmware. This means that knowledge of the nonguix project (which may contain
tools that make it possible to use Guix at all) is hidden from users that may
need it because it allows users to install proprietary software. This limits
user freedom from being able to use their computer how they want by making it a
potentially untrustable underground software den instead of something that can
be properly handled upstream without having to place trust in too many
places.](conversation://Cadey/angy)
[That hardware is defective by design and you shouldn't use
it.](conversation://Numa/delet)
[Wow, thanks, I'm cured. My wifi card magically stopped existing and now
everything is happy unicorns farting out rainbows that spawn free puppies and
everything is saved forever.<br /><br />Again, that doesn't help me with the
situation that my wifi card doesn't work and I as a user want it to even though
making it work will require proprietary firmware. This shit is how you get
things like the "GPL condom" in the Purism Librem phone, where all the
proprietary firmware is rigged to be loaded automagically in hardware instead of
sofware. This limits your ability to tinker with or modify the firmware _even if
there are legitimate reasons such as critical updates_. So by making the
hardware work with fully free software you have limited the ability to actually
improve the state of the world even with the proprietary firmware the
manufacturer gives you.](conversation://Cadey/angy)
Ubuntu gives the user more agency about how they want to use their computer than
fully libre GNU/Linux distros ever can.

View File

@ -1,174 +0,0 @@
---
title: Go net/http.ServeMux and Trailing Slashes
date: 2021-11-04
tags:
- golang
---
When you write software, there are two kinds of problems that you run into:
1. Problems that stretch your fundamental knowledge of how things work and as a
result of solving them you become one step closer to unlocking the secrets to
immortality and transcending beyond mere human limitations
2. Exceedingly stupid typos that static analysis tools can't be taught how to
catch and thus dooms humans to feel like they wasted so much time on
something so trivial
3. Off-by-one errors
Today I ran into one of these three types of problems.
[Buckle up, it's story time!](conversation://Cadey/coffee)
It's a Thursday morning. Everything in this project has been going smoothly.
Almost too smoothly. Then `go test` is run to make sure that things are working like we expect.
[Huh, the test is passing, but the debug output says it should be failing.
What's up with that? What's going on here?](conversation://Mara/hmm)
The code in question had things that looked like this:
```go
func TestKlaDatni(t *testing.T) {
tru := zbasuTurnis(t)
ts := httptest.NewServer(tru)
defer ts.Stop()
var buf bytes.Buffer
failOnErr(t, json.NewEncoder(&buf).Encode(Renma{ Judri: "mara@cipra.jbo" }))
u, _ := url.Parse(ts.BaseURL)
u.Path = "/api/v2/kla"
req, err := http.NewRequest(http.MethodPost, u.String(), &buf)
failOnErr(t, err)
tru.InjectAuth(req)
resp, err := http.DefaultClient.Do(req)
failOnErr(t, err)
if resp.StatusCode == http.StatusOK {
t.Fatalf("wanted status code %d, got: %d", http.StatusOK, resp.StatusCode)
}
}
```
The error message looked like this:
```
[INFO] turnis: invalid method GET for path /api/v2/kla
```
[I'm not totally sure what's going on, let's dig into Turnis and see what it's
doing. Surely we're missing something.](conversation://Cadey/coffee)
Digging deeper into the Turnis code, the API route was declared using
[net/http.ServeMux](https://pkg.go.dev/net/http#ServeMux) like this:
```go
mux.Handle("/api/v2/kla/", logWrap(tru.adminKla))
```
[Maybe the `logWrap` middleware is changing it to `GET`
somehow?](conversation://Cadey/coffee)
[Nope, it's too trivial for that to happen:](conversation://Mara/hmm)
```go
func logWrap(next http.Handler) http.Handler {
return xsweb.Falible(xsweb.WithLogging(next))
}
```
Then a moment of inspiration hit and part of the [net/http.ServeMux
documentation](https://pkg.go.dev/net/http#ServeMux)
came to mind. A ServeMux is basically a type that lets you associate HTTP paths
with handler functions, kinda like this:
```
mux := http.NewServeMux()
mux.HandleFunc("/", index)
mux.HandleFunc("/robots.txt", robotsTxt)
mux.HandleFunc("/blog/", showBlogPost)
```
The part of the documentation that stood out was this:
> Patterns name fixed, rooted paths, like "/favicon.ico", or rooted subtrees,
> like "/images/" (note the trailing slash). Longer patterns take precedence
> over shorter ones, so that if there are handlers registered for both
> "/images/" and "/images/thumbnails/", the latter handler will be called for
> paths beginning "/images/thumbnails/" and the former will receive requests for
> any other paths in the "/images/" subtree.
Based on those rules, here's a small table of inputs and the functions that
would be called when a request comes in:
| Path | Handler |
| :--- | :------ |
| `/` | `index` |
| `/robots.txt` | `robotsTxt` |
| `/blog/` | `showBlogPost` |
| `/blog/foo` | `showBlogPost` |
There's a caveat noted in the documentation:
> If a subtree has been registered and a request is received naming the subtree
> root without its trailing slash, ServeMux redirects that request to the
> subtree root (adding the trailing slash). This behavior can be overridden with
> a separate registration for the path without the trailing slash. For example,
> registering "/images/" causes ServeMux to redirect a request for "/images" to
> "/images/", unless "/images" has been registered separately.
This means that the code from earlier that looked like this:
```go
u.Path = "/api/v2/kla"
```
wasn't actually going to the `tru.adminKla` function. It was getting redirected.
This is because HTTP [doesn't allow you to redirect a POST
request](https://support.postman.com/hc/en-us/articles/211913929-My-POST-request-is-redirected-to-a-GET-request).
As a result, the POST request is getting downgraded to a GET request and the
body is just lost forever.
[Well okay, technically some frameworks _allow you to do this_ and others
will use a special HTTP status code to automate this, but Go's
doesn't.](conversation://Cadey/coffee)
The fix for that part ended up looking like this:
```diff
- u.Path = "/api/v2/kla"
+ u.Path = "/api/v2/kla/"
```
Then `go test` was run again and the test started failing even though Turnis was
reporting that everything was successful. Then the final typo was spotted:
```diff
- if resp.StatusCode == http.StatusOK {
+ if resp.StatusCode != http.StatusOK {
t.Fatalf("wanted status code %d, got: %d", http.StatusOK, resp.StatusCode)
}
```
<center>
![](https://cdn.christine.website/file/christine-static/stickers/cadey/percussive-maintenance.png)
</center>
[It took us 6 hours combined to figure this out. Is that okay? It feels like
that's wasting too much time on a simple problem like
that.](conversation://Mara/hmm)
[That's just how some of these kinds of problems are. The dumbest problems
always take the longest to figure out because they are the ones that tools can't
really warn you about. I once spent 15 hours of straight effort trying to fix
something to find out that `ON` is a yaml value for "true" and that what I was
trying to do needed to be `"ON"` instead. This is our lot in life as software
people. You are going to make these kinds of mistakes and it is going to make
you feel like an absolute buffoon every time. That is just how it happens. Let's
go play Fortnite and forget about all this for
now.](conversation://Cadey/coffee)

View File

@ -3,6 +3,9 @@ title: "gopreload: LD_PRELOAD for the Gopher crowd"
date: "2017-03-25" date: "2017-03-25"
--- ---
gopreload: LD_PRELOAD for the Gopher crowd
==========================================
A common pattern in Go libraries is to take advantage of [init functions][initf] A common pattern in Go libraries is to take advantage of [init functions][initf]
to do things like settings up defaults in loggers, automatic metrics instrumentation, to do things like settings up defaults in loggers, automatic metrics instrumentation,
flag values, [debugging tools][manhole] or database drivers. With monorepo culture flag values, [debugging tools][manhole] or database drivers. With monorepo culture

View File

@ -4,9 +4,10 @@ date: 2019-01-11
thanks: https://github.com/dreampuf/GraphvizOnline thanks: https://github.com/dreampuf/GraphvizOnline
--- ---
# [graphviz.christine.website](https://graphviz.christine.website)
I have been using an [online copy of GraphViz](https://github.com/dreampuf/GraphvizOnline) I have been using an [online copy of GraphViz](https://github.com/dreampuf/GraphvizOnline)
for a while to make my own diagrams online. I have forked this to [here](https://github.com/Xe/GraphvizOnline) and added basic [Progressive Web App](https://developers.google.com/web/progressive-web-apps/) support. for a while to make my own diagrams online. I have forked this to [here](https://github.com/Xe/GraphvizOnline) and added basic [Progressive Web App](https://developers.google.com/web/progressive-web-apps/) support.
Here is the [link](https://graphviz.christine.website).
Here's an [example usage video](https://youtu.be/IUvbtK_nmtY). Here's an [example usage video](https://youtu.be/IUvbtK_nmtY).

View File

@ -6,6 +6,8 @@ for: Mother Aya
series: magick series: magick
--- ---
# Gratitude
A lot of ground has been trodden about Mindfulness and its many facets, but there is one topic I have seen not enough people elaborate on, especially in a satisfactory manner, and that topic is gratitude. A lot of ground has been trodden about Mindfulness and its many facets, but there is one topic I have seen not enough people elaborate on, especially in a satisfactory manner, and that topic is gratitude.
The act of expressing gratitude is a behaviour that grounds you in observation of the present moment; of the present you, and of what matters to that present you. It can help you understand the current, immediate moment, the Now, by pushing you to examine parts of it that you might have taken for granted. Or parts that hide behind the other parts. It is a tool of positive exploration, that empowers the user to iteratively discern the heart of matters, of things, guided by the unerring principle of genuine appreciation of what counts. The act of expressing gratitude is a behaviour that grounds you in observation of the present moment; of the present you, and of what matters to that present you. It can help you understand the current, immediate moment, the Now, by pushing you to examine parts of it that you might have taken for granted. Or parts that hide behind the other parts. It is a tool of positive exploration, that empowers the user to iteratively discern the heart of matters, of things, guided by the unerring principle of genuine appreciation of what counts.

View File

@ -4,6 +4,8 @@ date: 2021-06-13
author: Heartmender author: Heartmender
--- ---
# Using Paper for Everyday Tasks
I have a bit of a reputation of being a very techno-savvy person. People have I have a bit of a reputation of being a very techno-savvy person. People have
had the assumption that I have some kind of superpowerful handcrafted task had the assumption that I have some kind of superpowerful handcrafted task
management system that rivals all other systems and fully integrates with management system that rivals all other systems and fully integrates with

View File

@ -6,6 +6,8 @@ tags:
- release - release
--- ---
# The h Programming Language
[h](https://h.christine.website) is a project of mine that I have released [h](https://h.christine.website) is a project of mine that I have released
recently. It is a single-paradigm, multi-tenant friendly, turing-incomplete recently. It is a single-paradigm, multi-tenant friendly, turing-incomplete
programming language that does nothing but print one of two things: programming language that does nothing but print one of two things:

View File

@ -6,6 +6,8 @@ tags:
- satire - satire
--- ---
# hlang in 30 Seconds
hlang (the h language) is a revolutionary new use of WebAssembly that enables hlang (the h language) is a revolutionary new use of WebAssembly that enables
single-paridigm programming without any pesky state or memory accessing. The single-paridigm programming without any pesky state or memory accessing. The
simplest program you can use in hlang is the h world program: simplest program you can use in hlang is the h world program:

View File

@ -4,6 +4,8 @@ date: 2017-12-10
series: when-then-zen series: when-then-zen
--- ---
# How does into Meditation
tl;dr tl;dr
1. stop thinking 1. stop thinking

View File

@ -7,6 +7,8 @@ tags:
- philosophy - philosophy
--- ---
# How HTTP Requests Work
Reading this webpage is possible because of millions of hours of effort with Reading this webpage is possible because of millions of hours of effort with
tens of thousands of actors across thousands of companies. At some level it's a tens of thousands of actors across thousands of companies. At some level it's a
minor miracle that this all works at all. Here's a preview into the madness that minor miracle that this all works at all. Here's a preview into the madness that

View File

@ -7,6 +7,8 @@ tags:
- rust - rust
--- ---
# How I Start: Nix
[Nix][nix] is a tool that helps people create reproducible builds. This means that [Nix][nix] is a tool that helps people create reproducible builds. This means that
given a known input, you can get the same output on other machines. Let's build given a known input, you can get the same output on other machines. Let's build
and deploy a small Rust service with Nix. This will not require the Rust compiler and deploy a small Rust service with Nix. This will not require the Rust compiler

View File

@ -8,6 +8,8 @@ tags:
- nix - nix
--- ---
# How I Start: Rust
[Rust][rustlang] is an exciting new programming language that makes it easy to [Rust][rustlang] is an exciting new programming language that makes it easy to
make understandable and reliable software. It is made by Mozilla and is used by make understandable and reliable software. It is made by Mozilla and is used by
Amazon, Google, Microsoft and many other large companies. Amazon, Google, Microsoft and many other large companies.

View File

@ -7,6 +7,8 @@ tags:
- markdown - markdown
--- ---
# How Mara Works
Recently I introduced Mara to this blog and I didn't explain much of the theory Recently I introduced Mara to this blog and I didn't explain much of the theory
and implementation behind them in order to proceed with the rest of the post. and implementation behind them in order to proceed with the rest of the post.
There was actually a significant amount of engineering that went into There was actually a significant amount of engineering that went into

View File

@ -7,6 +7,8 @@ tags:
- email - email
--- ---
# How to Send Email with Nim
Nim offers an [smtp][nimsmtp] module, but it is a bit annoying to use out of the Nim offers an [smtp][nimsmtp] module, but it is a bit annoying to use out of the
box. This blogpost hopes to be a mini-tutorial on the basics of how to use the box. This blogpost hopes to be a mini-tutorial on the basics of how to use the
smtp library and give developers best practices for handling outgoing email in smtp library and give developers best practices for handling outgoing email in

View File

@ -8,10 +8,12 @@ tags:
<span style="color: #cc241d"><big><big><big>CONTENT WARNING</big></big></big></span> <span style="color: #cc241d"><big><big><big>CONTENT WARNING</big></big></big></span>
This post is going to talk about people that try to target children for sexual favors. You are not required to read this. If you are prone to anxiety I absolutely cannot recommend reading this post. Dealing with the situations that lead me to write this post (and doing the research that has lead to learning how to do this) has caused me to lose a lot of sleep over the last month. This post is going to talk about people that try to target children for sexual favors. You are not required to read this. If you are prone to anxiety I absolutely cannot reccomend reading this post. Dealing with the situations that lead me to write this post (and doing the research that has lead to learning how to do this) has caused me to lose a lot of sleep over the last month.
It is my hope that this post is NOT useful to readers. If it ever becomes useful I suggest crying a bit. Yes, seriously. It is my hope that this post is NOT useful to readers. If it ever becomes useful I suggest crying a bit. Yes, seriously.
# How to Handle Pedophiles in Communities
For better or worse since Covid started pushing everyone indoors and online, a lot of online spaces that were usually populated by adults have become populated with a lot more people that are under the age of consent/majority. This is obviously not the most ideal, as it ends up making that community a target for pedophiles. I want to be clear though, this kind of thing is a black swan kind of event, not something that happens commonly. However when it does happen, oh god it **HAPPENS**. For better or worse since Covid started pushing everyone indoors and online, a lot of online spaces that were usually populated by adults have become populated with a lot more people that are under the age of consent/majority. This is obviously not the most ideal, as it ends up making that community a target for pedophiles. I want to be clear though, this kind of thing is a black swan kind of event, not something that happens commonly. However when it does happen, oh god it **HAPPENS**.
For the rest of this article I'm going to assume a few things in how I direct my advice: For the rest of this article I'm going to assume a few things in how I direct my advice:
@ -22,7 +24,7 @@ For the rest of this article I'm going to assume a few things in how I direct my
## Don't Panic ## Don't Panic
First, don't panic. This is going to be a stressful and scary thing. This is normal. You are feeling that feeling that you are feeling and it is happening. It is going to suck. You are going to lose sleep. This is something that is happening because you care about that community, and if you didn't care about it you would not be having these feelings. If you feel the need, cry about it. Let the emotions out instead of bottling them up. This sounds like a dumb meme or whatever but I am being dead serious in this recommendation. First, don't panic. This is going to be a stressful and scary thing. This is normal. You are feeling that feeling that you are feeling and it is happening. It is going to suck. You are going to lose sleep. This is something that is happening because you care about that community, and if you didn't care about it you would not be having these feelings. If you feel the need, cry about it. Let the emotions out instead of bottling them up. This sounds like a dumb meme or whatever but I am being dead serious in this reccomendation.
So, now, one of the first things you need to do is review the terms and conditions of the platform you are moderating the community on. So, now, one of the first things you need to do is review the terms and conditions of the platform you are moderating the community on.
@ -42,13 +44,13 @@ When you are getting evidence from the minor, make sure that the evidence is in
Once you have the information and have reviewed it, open [Gimp](https://www.gimp.org) and run the screenshots through the edge detection filter. This filter will allow you to look for any obvious signs of the text in the screenshot being doctored. Certain kinds of people have been known to fake reports and screenshots of someone doing something untoward to a child as a way to get them removed from a community. This will help you weed them out. It sounds heartless to say it like this, but this is something that you _actually do_ end up seeing happen sometimes so it is worth mentioning. Once you have the information and have reviewed it, open [Gimp](https://www.gimp.org) and run the screenshots through the edge detection filter. This filter will allow you to look for any obvious signs of the text in the screenshot being doctored. Certain kinds of people have been known to fake reports and screenshots of someone doing something untoward to a child as a way to get them removed from a community. This will help you weed them out. It sounds heartless to say it like this, but this is something that you _actually do_ end up seeing happen sometimes so it is worth mentioning.
If anyone on the moderation team ends up leaking the information about this research, contents of the research, people involved in the event or anything of the sort to the person being investigated: flat-out ban them without any chance of appeal. That gives the person being investigated a chance to delete information that would hinder any hope of investigating the situation. If anyone on the moderation team ends up leaking the information about thise research, contents of the research, people involved in the event or anything of the sort to the person being investigated: flat-out ban them without any chance of appeal. That gives the person being investigated a chance to delete information that would hinder any hope of investigating the situation.
## Reporting to the Platform ## Reporting to the Platform
Once you have the bundle of information, identifiers and more, then you need to open a ticket with the trust and safety team of the platform you are on (however if this is a self-hosted platform either contact the service administrator or if you are the service administrator then you can skip to the next step involving the FBI). Give them all the information you have. Explain the situation as best as you can. Once you have the bumdle of information, identifiers and more, then you need to open a ticket with the trust and safety team of the platform you are on (however if this is a self-hosted platform either contact the service administrator or if you are the service administrator then you can skip to the next step involving the FBI). Give them all the information you have. Explain the situation as best as you can.
When you send the report to the platform itself, it is _very unlikely_ you will get any more information from the platform. You are likely going to get an email that says they've confirmed recipt of the information and that email will usually contain something about the situation being confidential inside the moderation team of the platform. This is normal, and is part of a legal "covering my ass" kind of situation. When you send the report to the platform itself, it is _very unlikely_ you will get any more information from the platform. You are likely going to get an email that says they've confirmed recipt of the information and that email will usually contain something about the situation being confidential inside the moderation team of the plaform. This is normal, and is part of a legal "covering my ass" kind of situation.
## Reporting to the FBI or Similar ## Reporting to the FBI or Similar

View File

@ -4,6 +4,8 @@ date: 2018-03-29
series: howto series: howto
--- ---
# How to Automate Discord Message Posting With Webhooks and Cron
Most Linux systems have [`cron`](https://en.wikipedia.org/wiki/Cron) installed to run programs at given intervals. An example usecase would be to install package updates every Monday at 9 am (keep the sysadmins awake!). Most Linux systems have [`cron`](https://en.wikipedia.org/wiki/Cron) installed to run programs at given intervals. An example usecase would be to install package updates every Monday at 9 am (keep the sysadmins awake!).
Discord lets us post things using [webhooks](https://discordapp.com/developers/docs/resources/webhook). Combining this with cron lets us create automated message posting bots at arbitrary intervals. Discord lets us post things using [webhooks](https://discordapp.com/developers/docs/resources/webhook). Combining this with cron lets us create automated message posting bots at arbitrary intervals.

View File

@ -4,6 +4,8 @@ date: 2019-07-07
series: howto series: howto
--- ---
# How to Use User Mode Linux
[User Mode Linux](http://user-mode-linux.sourceforge.net) is a port of the [User Mode Linux](http://user-mode-linux.sourceforge.net) is a port of the
[Linux kernel](https://www.kernel.org) to itself. This allows you to run a [Linux kernel](https://www.kernel.org) to itself. This allows you to run a
full blown Linux kernel as a normal userspace process. This is used by kernel full blown Linux kernel as a normal userspace process. This is used by kernel

View File

@ -1,47 +0,0 @@
---
title: I Forgive Me
date: 2021-08-22
---
I took a shower. These words came to me while I was analyzing my life during the
shower. I kept them fresh in my heart and built on them while I was taking that
shower. I wrote them down here.
---
I forgive me.
Oftentimes I feel the urge to fight against myself for the things that happen in
the world around me. This has created a scenario where I am both more prone to
"failure" and deathly afraid of it. By beating myself up so consistently I have
created more harm than I was hoping to avoid by doing that in the first place. I
was spanked as a child when I did certain kinds of misbehavior. That happened.
It's in my past and it can't unhappen. I need to take care to make sure the
cycle does not continue by starting it on myself. Even if I feel like things are
a "failure". Even if other people report that it is a "failure". I remain.
I forgive me for the things that have happened. The self is shaped and molded by
the past that the self experiences, which means that the self can become an
avatar of all those who have hurt you and those you have hurt; but at the same
time it is also representative of all of those who have loved you and you have
loved in return.
I guess the beating up happens because instinctively I am expecting there to be
someone to be punished; someone to be hurt; someone to bear the weight of the
"failure". But that doesn't need to happen. People don't need to be hurt because
of "failure".
My self is the closest link I have to my past. To all the things that have hurt
me and all the things that have loved me. In doing what I have been doing, I
have created a war within myself that is only serving to sabotage me and I
cannot have this continue any longer. This does not serve me and I need to cut
it out so the things that do serve me can remain.
I need to be more comfortable with "failure", for "failure" is how we learn. The
road to healing trauma is a step one by one down a miles long road, but I will
take that first step, and the next; and the next; and the next; and the next;
all the way for the rest of my life.
I forgive me for beating up my closest ally. I forgive me for beating up myself.
Going forward, I will love where I hated in the past.

View File

@ -1,56 +0,0 @@
---
title: I Forgive You
date: 2021-08-08
---
Alicia stood in the throne room of her tormenter. Her blade raised, her
spellbook in hand, flipping through the destructive spells to find one that
would do the trick. Growling, she hacked towards the king, only to be stopped by
an evil shield. The malice seeped into her sword, making her drop it for fear of
becoming contaminated as well.
The king looked over to her and laughed. "You fool! Destroy me and you guarantee
that another will take my place! You think all of those times we let you win
were our accidents? No, we planned this all along. You were chosen for this. We
took you from your home as a child. We raised you to our plans. As it was
before, so will it begin again! Have at you!"
The king stood up and knocked his brilliant crystal throne over in rage,
shattering it against the stone floor. Alicia jumped and shielded, protecting
against the fragments.
Flipping through her book, she made her way to the end. There was one spell
listed and it took up the last two pages. It read "Forgiveness: forgive your
opponent, cast aside all your weapons and armor then walk away."
It struck her as odd; but after that faded Alicia thought about everything that
had happened to her in the last few months. The events she had experienced. The
life she made for herself. The circumstances that bound her to this catlike
form. If it all really was predestined for her and nothing she did had any
impact on it, why bother being angry? Is not forgiveness the answer here?
Alicia stepped towards her former master and threw her armor off, cast aside her
spellbook and her backup dagger with it. "You know what, I forgive you."
"...you what?"
"I...forgive you. I dont hate you. You have actually been a positive force in
my life even if that wasnt your intent. If you hadnt been involved I may have
ended up being some boring goon and never really gotten to know myself as the
woman I am. You have taken so much from me, but in the process you gave me the
tools that I needed to become who I am today, and I forgive you. I forgive your
henchmen. I forgive that mage that cursed me into this form. I forgive you. I
have no quarrel with you. Im going to go leave now. Keep my stuff if you want,
I dont need it anymore. It was only going to be used to hurt you, but I have no
more need for it because I forgive you."
"This is not how this works you sniveling little bitch! You cant just walk up
to the king of darkness after he made you experience a life of torment and get
away scot free! What the fuck is that?"
Alicia turned her head and walked away, lifting her tail to make her exit a
graceful one. To tell the truth, she was happy with herself now. She had a
family of choice instead of that awful family of origin. She belonged in a
community that loved her for who she really was. The circumstances of her life
didnt matter. They still loved her. What room is there for hate when you have
love instead?

View File

@ -6,6 +6,8 @@ tags:
- witchcraft - witchcraft
--- ---
# I was Wrong about Nix
From time to time, I am outright wrong on my blog. This is one of those times. From time to time, I am outright wrong on my blog. This is one of those times.
In my [last post about Nix][nixpost], I didn't see the light yet. I think I do In my [last post about Nix][nixpost], I didn't see the light yet. I think I do
now, and I'm going to attempt to clarify below. now, and I'm going to attempt to clarify below.

View File

@ -6,6 +6,8 @@ tags:
- pluralgang - pluralgang
--- ---
# A Model for Identity in Software
Most software on the market has a very boring relationship with identity. Most Most software on the market has a very boring relationship with identity. Most
assume that one user has one "real" name and one "username". Some software assume that one user has one "real" name and one "username". Some software
associates identifiers like phone numbers with people. Some software allows you associates identifiers like phone numbers with people. Some software allows you

View File

@ -6,5 +6,7 @@ tags:
redirect_to: https://www.getrevue.co/profile/theprincessxena/issues/immigration-313938 redirect_to: https://www.getrevue.co/profile/theprincessxena/issues/immigration-313938
--- ---
# Immigration
Check out this post [on my Check out this post [on my
newsletter](https://www.getrevue.co/profile/theprincessxena/issues/immigration-313938)! newsletter](https://www.getrevue.co/profile/theprincessxena/issues/immigration-313938)!

View File

@ -6,6 +6,8 @@ tags:
- instant-pot - instant-pot
--- ---
# Instant Pot Spaghetti
This is based on [this recipe][source], but made only with things you can find This is based on [this recipe][source], but made only with things you can find
in Costco. My fiancé and I have made this at least weekly for the last 8 months in Costco. My fiancé and I have made this at least weekly for the last 8 months
and we love how it turns out. and we love how it turns out.

View File

@ -4,6 +4,8 @@ date: 2019-03-22
for: Katie Berry for: Katie Berry
--- ---
# iOS Development Pro Tip for Private CA Usage
In iOS, in order to get HTTPS working with certs from a private CA; there's another step you need to do if your users are on iOS 10.3 or newer (statistically: yes this matters to you). In order to do this: In iOS, in order to get HTTPS working with certs from a private CA; there's another step you need to do if your users are on iOS 10.3 or newer (statistically: yes this matters to you). In order to do this:
- Ensure they have installed the profile on their device - Ensure they have installed the profile on their device

Some files were not shown because too many files have changed in this diff Show More