This commit is contained in:
Mira 2026-01-04 14:04:14 -05:00
parent 2d019b3979
commit 5d3e1a74bc
121 changed files with 3708 additions and 6 deletions

1
.gitignore vendored Executable file → Normal file
View file

@ -23,3 +23,4 @@ static/the-monospace-web/*.jpg
**.sync-conflict*
.stfolder
.stversions

View file

@ -1,5 +0,0 @@
# This directory is a Syncthing folder marker.
# Do not delete.
folderID: yz2bz-fshsf
created: 2025-11-30T03:50:07-05:00

View file

@ -0,0 +1,41 @@
---
title: "Generating an SSH Resident Key"
author: "ArgentumCation"
layout: ../../layouts/Layout.astro
pubDate: "19 Mar, 2023"
slug: "post-1"
---
import { Accordion, AccordionItem } from "accessible-astro-components";
## Here's how to create a resident SSH Key using a security key
```bash
ssh-keygen -t ed25519-sk -Oresident
```
## If that one doesn't work,
```bash
ssh-keygen -t ed25519-sk -Oresident -Oapplication=ssh:key
```
{
// ```js
// import { defineConfig } from "astro/config";
// import mdx from "@astrojs/mdx";
// export default defineConfig({
// markdown: {
// syntaxHighlight: "prism",
// },
// integrations: [
// mdx({
// // Markdown config now ignored
// extendMarkdownConfig: true,
// // No `remarkPlugins` applied
// }),
// ],
// });
// ```
}

View file

@ -0,0 +1,143 @@
---
title: "Getting up and running with Traefik"
author: "ArgentumCation"
layout: ../../layouts/Layout.astro
pubDate: "03 Apr, 2023"
slug: "traefik-setup"
---
- Okay so you've got a server now and need a reverse proxy
- Traefik is pretty decent at that, it'll set up your HTTPS certs and auto generate routes from your docker images
- only problem is its an absolute bitch to set up
- Here's a stripped down `docker-compose.yml` to give you an idea of how I have it set up
- The end result should be a lighttpd server running on `blog.argentumcation.com`
```yaml
# Just setting some default values for my containers
x-service_defaults:
&service_defaults
env_file: .env
restart: unless-stopped
extra_hosts:
- host.docker.internal:host-gateway
services:
traefik:
<<: *service_defaults
container_name: traefik
env_file:
- .env
# Cloudflare API token to add new paths
- $ENV_DIR/traefik.secrets.env
hostname: traefik
image: traefik:latest
labels:
- traefik.http.services.traefik-docker.loadbalancer.server.port=8080
# For the management interface
- '8080:8080'
# To let traefik receive incoming HTTP traffic
- '80:80'
# To let traefik receive incoming HTTPS traffic
- '443:443'
volumes:
# This lets traefik see your docker services
- $DOCKER_SOCK:/var/run/docker.sock:ro
# Traefik Configs
- $CONF_DIR/traefik/traefik.yml:/traefik.yml
- $CONF_DIR/traefik/traefik_dynamic.yml:/etc/traefik/traefik_dynamic.yml
# Let's Encrypt folder (for storing HTTPS cert related stuff)
- $CONF_DIR/letsencrypt:/letsencrypt
# Example container we're proxying with traefik
lighttpd:
<<: *service_defaults
container_name: public_lighttpd
image: sebp/lighttpd
labels:
# This is the hostname that traefik will proxy to this container
- traefik.http.routers.lighttpd-docker.rule=Host(`blog.$PUBLIC`)
# This is the port the container is listening on, often traefik can detect this
# automatically, but we'll just be explicit here
- traefik.http.services.lighttpd-docker.loadbalancer.server.port=80
```
- `traefik.secrets.env` contains my cloudflare API key so that Traefik can automatically add DNS routes
- For reference, here's my `.env` file
```sh
# GENERAL
PUBLIC=argentumcation.com
TZ=America/New_York
#for container specific env vars
ENV_DIR=./env
CONF_DIR=./config
DOCKER_DIR=/home/mira/docker
DOCKER_SOCK=/var/run/docker.sock
# So my containers run as a non-root user
UID=1000
GID=1000
PUID=1000
PGID=1000
USER_UID=1000
USER_GID=1000
```
- And of course, the actual traefik configuration files:
- `traefik.yml`:
```yaml
accessLog:
filePath: ./traefik-access.log
api:
dashboard: true
debug: true
insecure: true
certificatesResolvers:
letsencrypt:
acme:
dnschallenge:
provider: cloudflare #look, I know, don't judge me
email: [redacted]
storage: /letsencrypt/acme.json
entryPoints:
web:
address: ":80"
forwardedHeaders:
insecure: true
http:
middlewares:
- https_redirect@file
websecure:
address: ":443"
forwardedHeaders:
insecure: true
http:
tls:
certresolver: letsencrypt
domains:
- main: argentumcation.com
sans:
- "*.argentumcation.com"
log:
level: INFO
providers:
docker:
# Routes will be set to [container-name].argentumcation.com by default
defaultRule: Host(`{{ index .Labels "com.docker.compose.service" }}.argentumcation.com`)
endpoint: unix:///var/run/docker.sock
exposedByDefault: true # exposes auto-discovered containers by default, not secure but I'm lazy
network: docker_default
watch: true
file:
directory: /etc/traefik/
watch: true
```
- `traefik-dynamic.yml`
```yaml
http:
middlewares: #This should redirect incoming http connections to https
https_redirect:
redirectscheme:
scheme: https
permanent: true
```

View file

@ -0,0 +1,8 @@
<% "---" %>
title: <% tp.file.title %>
date: <% tp.file.creation_date("YYYY-MM-DD") %>
modified: <% tp.file.last_modified_date("YYYY-MM-DD") %>
draft: true
<% "---" %>
# <% tp.file.title %>

View file

@ -0,0 +1,225 @@
{
"main": {
"id": "7663cfdec50a2e60",
"type": "split",
"children": [
{
"id": "88b63dcf6741e6f9",
"type": "tabs",
"children": [
{
"id": "4e7fb0fa8a91a644",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "posts/numbers.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "numbers"
}
},
{
"id": "fdf200904a4209f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "license-docs/json.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "json"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "f4b976b97e7fd228",
"type": "mobile-drawer",
"children": [
{
"id": "9a9092e5af389cad",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "2d68e3a0b9422237",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "5f7d922fec445f5f",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "d6ada5d7cc6d1556",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "4a8876ca2b9a89ff",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
],
"currentTab": 0
},
"right": {
"id": "218c19081cc9759e",
"type": "mobile-drawer",
"children": [
{
"id": "960abadb2f6d83be",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "posts/licenses.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "f1269aab005c7711",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "lab-notes.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "e52f324db672aadb",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "lab-notes.md"
},
"icon": "lucide-list",
"title": "Outline"
}
}
],
"currentTab": 0
},
"left-ribbon": {
"hiddenItems": {
"templater-obsidian:Templater": false,
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false
}
},
"active": "4e7fb0fa8a91a644",
"lastOpenFiles": [
"posts/fp.md",
"lab-notes/k8s.md",
"posts/images/Pasted image 20250917211537.png",
"posts/images/Pasted image 20250918100952.png",
"posts/images/Pasted image 20250918100952.sync-conflict-20250918-112115-EI6QHE3.png",
"posts/images/Pasted image 20250918123928.png",
"posts/btrfs.md",
"posts/licenses.md",
"license-docs/json.md",
"license-docs/commons-clause-1.0.md",
"license-docs/Various Licenses and Comments about Them - GNU Project.pdf",
"license-docs/bsd-2+patent.md",
"license-docs/bsd-0.md",
"license-docs/bsd-4.md",
"license-docs/EUPL-1.2 EN.txt",
"license-docs/wtfpl.md.st",
"license-docs/wtfpl.md",
"license-docs/bsd-3.md",
"license-docs/bsd-2.md.st",
"license-docs/bsd-2.md",
"license-docs/mpl-v2.0.md.st",
"license-docs/mpl-v2.0.md",
"license-docs/mit.md.st",
"license-docs/mit.md",
"license-docs/unlicense.md",
"license-docs/apache-v2.0.md",
"license-docs/cc0.txt",
"license-docs/lgpl.md",
"license-docs/GPLv3.md",
"license-docs",
"posts/().md",
"lab-notes/An Idea for hexadecimal time.md",
"lab-notes/9p.md",
"lab-notes/postMarketOS for iPad Air 2 (iPad-5,3).md",
"lab-notes/Meshtastic.md",
"lab-notes/Poketch.md",
"lab-notes/redox.md",
"lab-notes/yuri.md",
"lab-notes/riscv",
"lab-notes",
"images/image-7.png"
]
}

View file

@ -0,0 +1,225 @@
{
"main": {
"id": "7663cfdec50a2e60",
"type": "split",
"children": [
{
"id": "88b63dcf6741e6f9",
"type": "tabs",
"children": [
{
"id": "4e7fb0fa8a91a644",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "posts/numbers.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "numbers"
}
},
{
"id": "fdf200904a4209f7",
"type": "leaf",
"state": {
"type": "markdown",
"state": {
"file": "license-docs/json.md",
"mode": "source",
"source": false
},
"icon": "lucide-file",
"title": "json"
}
}
]
}
],
"direction": "vertical"
},
"left": {
"id": "f4b976b97e7fd228",
"type": "mobile-drawer",
"children": [
{
"id": "9a9092e5af389cad",
"type": "leaf",
"state": {
"type": "file-explorer",
"state": {
"sortOrder": "alphabetical",
"autoReveal": false
},
"icon": "lucide-folder-closed",
"title": "Files"
}
},
{
"id": "2d68e3a0b9422237",
"type": "leaf",
"state": {
"type": "search",
"state": {
"query": "",
"matchingCase": false,
"explainSearch": false,
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical"
},
"icon": "lucide-search",
"title": "Search"
}
},
{
"id": "5f7d922fec445f5f",
"type": "leaf",
"state": {
"type": "tag",
"state": {
"sortOrder": "frequency",
"useHierarchy": true
},
"icon": "lucide-tags",
"title": "Tags"
}
},
{
"id": "d6ada5d7cc6d1556",
"type": "leaf",
"state": {
"type": "all-properties",
"state": {
"sortOrder": "frequency",
"showSearch": false,
"searchQuery": ""
},
"icon": "lucide-archive",
"title": "All properties"
}
},
{
"id": "4a8876ca2b9a89ff",
"type": "leaf",
"state": {
"type": "bookmarks",
"state": {},
"icon": "lucide-bookmark",
"title": "Bookmarks"
}
}
],
"currentTab": 0
},
"right": {
"id": "218c19081cc9759e",
"type": "mobile-drawer",
"children": [
{
"id": "960abadb2f6d83be",
"type": "leaf",
"state": {
"type": "backlink",
"state": {
"file": "posts/numbers.md",
"collapseAll": false,
"extraContext": false,
"sortOrder": "alphabetical",
"showSearch": false,
"searchQuery": "",
"backlinkCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-coming-in",
"title": "Backlinks"
}
},
{
"id": "f1269aab005c7711",
"type": "leaf",
"state": {
"type": "outgoing-link",
"state": {
"file": "lab-notes.md",
"linksCollapsed": false,
"unlinkedCollapsed": true
},
"icon": "links-going-out",
"title": "Outgoing links"
}
},
{
"id": "e52f324db672aadb",
"type": "leaf",
"state": {
"type": "outline",
"state": {
"file": "lab-notes.md"
},
"icon": "lucide-list",
"title": "Outline"
}
}
],
"currentTab": 0
},
"left-ribbon": {
"hiddenItems": {
"templater-obsidian:Templater": false,
"bases:Create new base": false,
"switcher:Open quick switcher": false,
"graph:Open graph view": false,
"canvas:Create new canvas": false,
"daily-notes:Open today's daily note": false,
"templates:Insert template": false,
"command-palette:Open command palette": false
}
},
"active": "4e7fb0fa8a91a644",
"lastOpenFiles": [
"posts/fp.md",
"lab-notes/k8s.md",
"posts/images/Pasted image 20250917211537.png",
"posts/images/Pasted image 20250918100952.png",
"posts/images/Pasted image 20250918100952.sync-conflict-20250918-112115-EI6QHE3.png",
"posts/images/Pasted image 20250918123928.png",
"posts/btrfs.md",
"posts/licenses.md",
"license-docs/json.md",
"license-docs/commons-clause-1.0.md",
"license-docs/Various Licenses and Comments about Them - GNU Project.pdf",
"license-docs/bsd-2+patent.md",
"license-docs/bsd-0.md",
"license-docs/bsd-4.md",
"license-docs/EUPL-1.2 EN.txt",
"license-docs/wtfpl.md.st",
"license-docs/wtfpl.md",
"license-docs/bsd-3.md",
"license-docs/bsd-2.md.st",
"license-docs/bsd-2.md",
"license-docs/mpl-v2.0.md.st",
"license-docs/mpl-v2.0.md",
"license-docs/mit.md.st",
"license-docs/mit.md",
"license-docs/unlicense.md",
"license-docs/apache-v2.0.md",
"license-docs/cc0.txt",
"license-docs/lgpl.md",
"license-docs/GPLv3.md",
"license-docs",
"posts/().md",
"lab-notes/An Idea for hexadecimal time.md",
"lab-notes/9p.md",
"lab-notes/postMarketOS for iPad Air 2 (iPad-5,3).md",
"lab-notes/Meshtastic.md",
"lab-notes/Poketch.md",
"lab-notes/redox.md",
"lab-notes/yuri.md",
"lab-notes/riscv",
"lab-notes",
"images/image-7.png"
]
}

View file

@ -0,0 +1,65 @@
---
draft: true
title: Numbers aren't real and can hurt you
---
# Numbers aren't real and can hurt you
Okay so like the question of 'What is a number' _should_ be an easy enough question to answer, but of course it isn't cause when is anything ever simple on this godforsaken plane of existence.
## Naturals
Let's start with the caveman bits, **Natural Numbers ($\mathbb{N}$)** (god I really hope latex renders here). This is the stuff every 3 year old knows, $1,2,3,\ldots$. Seems basic enough because it is.
Just fucking kidding is $0$ a natural number? who knows, I sure as hell don't.
Also, like what exactly _is_ $0$ or $1$?
> I mean if we want to use the Zermelo-Fraenkel definition, $0 = \{\}, 1 = \{0\}, 2 = \{0,1\}, \dots$ ad absurdum
## Ordinals
[Naturals](#Naturals)
Okay so baby steps, now that we have some semblance of a place to start, we can move onto the **ordinals**. The ordinals are basically numbers used for putting things in order. How are they different from the naturals?
Short answer: they aren't
Long answer: ...for finite numbers
## Cardinals
### Aleph and Beth
## Integers
## Rationals
## Algebraics?
## Reals
## Complex Numbers
### Vectors
### Matrices
## 2D Hypercomplex
## Quaternions
## Octonions and Sedenions
## RGB
### Color Charge
## Surreal Numbers
## Algebraic Structures
## p-adics
# Conclusion
> Q: What the fuck is a number?
> A: A miserable pile of math

View file

@ -0,0 +1,60 @@
---
title: plan9 FS investigations
date: 2025-01-21
---
Digested from:
- https://www.usenix.org/legacy/events/usenix05/tech/freenix/full_papers/hensbergen/hensbergen.pdf
- https://www.kernel.org/doc/Documentation/filesystems/9p.txt
- http://ericvh.github.io/9p-rfc/rfc9p2000.html
- http://ericvh.github.io/9p-rfc/rfc9p2000.u.html
- https://9fans.github.io/plan9port/man/man4/9pfuse.html
- https://github.com/pfpacket/rust-9p/tree/master/example/unpfs
# 9p2000 Opcodes
All messages take a `tag` parameter used to multiplex connections
## Session
- version
- parameter negotiations
- auth
- T
- afid: auth handle??
- uname
- username
- aname: mount name (root if blank)
- attach
- establish connection to server
- T
- fid is file handle, chosen by client?
- afid is an 'auth handle'
- -1 for no auth
- uname
- aname
- R:
- flush
- abort request
- error
## File
- walk
- lookup pathname
- open
- create
- read
- write
- clunk
- release a file?
## Metadata
- stat
- read metadata attrs
- wstat
- write metadata attrs
- Requests are T-messages
- responses are R-messages

View file

@ -0,0 +1,20 @@
---
title: An idea for hexadecimal time
date: 2025-07-22
modified: 2025-07-22
---
# An idea for hexadecimal time
- basic unit of time is the second
- epoch is the unix epoch
- this makes it compatible with unix time up to second level precision
- the equivalent of a millisecond would be a mibisecond (1/1024 sec)
- UTC time of writing: `687F 5394`
- YYMW DHmm
- hex minute: 0x100 seconds or 4.267 minutes
- hex hour: 0x10 minutes or 1.1378 hours
- hex day: 0x10 hex hours or 0.758 days
- hex week: 0x10 hex days
- hex month: 0x10 hex weeks
- hex year: 0x10 hex months
- hex century 0x100 hex years

View file

@ -0,0 +1,42 @@
---
draft: true
---
# 2025-06-18
## HW Overview
- I don't know what the fuck I'm looking at
- ESP32
- last year we needed an IO expander
- hopefully not needed this year
- should do wifi + bt
- ESP-WROOM-32E?
- battery meter
- reset circuit
- usb -> uart interface
- USB C hell yeah
- neopixel nanos for LEDs
- 4 Buttons
- power switch seems to have a high failure rate
- has a security chip thing
- ![](Pasted%20image%2020250618195636.png)
- I zoned out for this bit
- NEW: magnetometer
- Accelerometer
- 1WIRE/iButton is back this year
> [!TODO] Get ESP32 dev board
## Game/Theming
- Pandemic-type game
- semi co-op
- attendees VS us as game masters
- might involve Meshtastic?
### Next Steps
- uhh time to get on GitHub and Trello
- and dropbox?
- start looking at getting hardware
- ESP32: [https://www.amazon.com/dp/B09MQJWQN2](https://www.amazon.com/dp/B09MQJWQN2 "https://www.amazon.com/dp/B09MQJWQN2") iButton Reader: [https://www.amazon.com/dp/B09BM1SSBV](https://www.amazon.com/dp/B09BM1SSBV "https://www.amazon.com/dp/B09BM1SSBV") Screen: [https://www.amazon.com/dp/B072Q2X2LL](https://www.amazon.com/dp/B072Q2X2LL "https://www.amazon.com/dp/B072Q2X2LL") Buttons: [https://www.amazon.com/dp/B07WF76VHT](https://www.amazon.com/dp/B07WF76VHT "https://www.amazon.com/dp/B07WF76VHT") Lights: [https://www.amazon.com/dp/B07PG84V17](https://www.amazon.com/dp/B07PG84V17 "https://www.amazon.com/dp/B07PG84V17")

View file

@ -0,0 +1,72 @@
---
title: Plans for a chess/taikyoku shogi/what have you engine
date: 2025-02-18
---
```js
board: Array,
currentPlayer: 'white' | 'black',
moveHistory: Array,
enPassantTarget: {x, y} | null, // Updates each turn
halfMoveClock: number, // For 50-move rule
capturedPieces: Array
}
```
**3. Move Validation System**
Separate move generation into layers:
**Layer 1: Basic Move Patterns**
```
getPseudoLegalMoves(piece, position)
- Returns all squares the piece could move to
- Ignores check/pin considerations
- Each piece type has its own logic
```
**Layer 2: Board-Aware Filtering**
```
getLegalMoves(piece, position, gameState)
- Filters pseudoLegal moves
- Checks if king would be in check after move
- Handles special moves (castling, en passant)
```
## Handling Special Cases
**En Passant**
- After any pawn moves 2 squares forward, set `enPassantTarget` to the square it passed through
- Clear it at the start of the next turn
- When validating pawn captures, check if target matches enPassantTarget
**Castling**
- Track `hasMoved` flag on kings and rooks
- Check: king/rook haven't moved, squares between are empty, king doesn't pass through/end in check
- For arbitrary boards: castle king 2 squares toward rook, place rook on opposite side
**Pawn Promotion**
- Detect when pawn reaches opposite end (rank 0 or rank N-1)
- Pause game, show promotion UI
- Replace pawn with chosen piece
## Key Functions
```
isSquareAttacked(x, y, byColor, gameState)
- Critical for check detection
- Generate all opponent moves, see if any target this square
isKingInCheck(color, gameState)
- Find king position
- Use isSquareAttacked
makeMove(from, to, gameState)
- Validate move is legal
- Update board
- Handle captures
- Update en passant state
- Toggle current player
- Add to move history (for undo)
getGameStatus()
- Returns: 'playing', 'check', 'checkmate', 'stalemate', 'draw'

View file

@ -0,0 +1,12 @@
---
title: "Idea: turn a TI-84/ Gameboy/DS into a meshtastic client"
---
# communication between a client and meshtastic device over serial
- need to adapt from: https://github.com/meshtastic/Meshtastic-arduino
- https://store.rokland.com/products/rak-raspberry-pi-rp2040-core-module-for-lorawan-with-lora-sx1262-us915-mhz-rak11310-pid-116003 seems like a minimal device that would work well for this
Next Step: figure out how tf to get serial I/O on interesting devices
- TI-84: seems to not be viable? MirageOS has functions for using the TI protocol to send bytes but we'd need an intermediary to turn that into the meshtastic serial protocol

View file

@ -0,0 +1,94 @@
---
title: Mira Missingtexture's Mangled Mandarin Transcription System
date: 2025-06-24
---
# Initials
| Pinyin | Missingtexture | IPA |
| ------ | -------------- | --- |
| b | p | p |
| p | ph | pʰ |
| m | m | m |
| f | f | f |
| d | t | t |
| t | th | tʰ |
| n | n | n |
| l | l | l |
| g | k | k |
| k | kh | kʰ |
| h | x | x |
| j | tj | tɕ |
| q | tjh | tɕʰ |
| x | j | ɕ |
| zh | tz | ʈʂ |
| ch | tzh | ʈʂʰ |
| sh | z | ʂ |
| r | r | ɻ~ʐ |
| z | c | ts |
| c | ch | tsʰ |
| s | s | s |
| y | y | j |
| w | w | w |
| yu | yu | ɥ |
# Finals
| Pinyin | Pinyin | Mira | Mira (revised) | IPA | Notes |
| ------ | ------ | ---- | -------------- | ---------- | ---------------------------- |
| (N/A) | -i | -r | | ɹ̩\~z̩, ɻ̩\~ʐ̩ | after z, c, s, zh, ch, sh, r |
| a | a | a | | a | |
| e | e | e | | ɤ/ə | |
| ai | ai | ai | | ai̯ | |
| ei | ei | ei | | ei̯ | |
| ao | ao | ao | | au̯ | |
| ou | ou | ou | | ou̯ | |
| an | an | an | | an | |
| en | en | en | | ən | |
| ang | ang | aq | ang | aŋ | |
| eng | eng | eq | eng | əŋ | |
| (weng) | ong | uq | ung | ʊŋ~o̞ʊŋ | |
| er | er | er | | aɚ̯~əɹ | |
| yi | i | i | | i | |
| ya | ia | ia | | ja | |
| ye | ie | ie | | je | |
| yao | iao | iao | | jau̯ | |
| you | iu | iou | | jou̯ | |
| yan | ian | ien | | jɛn | |
| yin | in | in | | in | |
| yang | iang | iaq | iang | jaŋ | |
| ying | ing | iq | ing | iŋ | |
| yong | iong | ioq | iong | jʊŋ | |
| wu | u | u | | u | |
| wa | ua | ua | | wa | |
| wo | uo/o | uo | | wo | |
| wai | uai | uai | | wai̯ | |
| wei | ui | uei | | wei̯ | |
| wan | uan | uan | | wan | |
| wen | un | uen | | wən | |
| wang | uang | uaq | uang | waŋ | |
| weng | (ong) | ueq | ueng | wəŋ | |
| yu | ü | v | ü | y | |
| yue | üe | ve | üe | ɥe | |
| yuan | üan | ven | üan | ɥɛn | |
| yun | ün | vn | ün | yn | |
| ê | ê | eh | | ɛ | |
| o | o | oh | | ɔ | |
| yo | io | yoh | | jɔ | |
---
# Examples
| Chinese | Pinyin | Missingtexture | Missingtexture (Revised) |
| ------- | --------- | -------------- | ------------------------ |
| 北京 | Běijīng | pěitjīq | pěitjīng |
| 广州 | Guǎngzhōu | kuǎqtzōu | kuǎngtzōu |
| 西安 | Xī'ān | jī'ān | jī'ān |
| 青島 | Qīngdǎo | tjhīqtǎo | tjhīngtǎo |
| 奇迹 | Qíjì | tjhíjì | tjhíjì |
| 天津 | Tiānjīn | thiāqtjīn | thiāngtjīn |
| 四川 | Sìchuān | sìtzhuān | sìtzhuān |
| 南京 | Nánjīng | nántjīq | nántjīng |
| 旋律 | xuánlǜ | juánlv | juánlǜ |

View file

@ -0,0 +1,19 @@
---
title: Pico-8 Investigations
date: 2025-04-16
---
# Hardware
- 128x128 Screen
- 2 Controllers
- Dpad + Circle + X
- 16 official colors + 16 unofficial colors
- 256 8x8 sprites
- 32kb cart size
- 64kb RAM
- 4 channel audio
- uses p8scii
- != ascii
- runs at 30fps or 60fps
----
# P8PNG Format

View file

@ -0,0 +1,72 @@
---
title: My notes from trying to build a Poketch
date: 2025-01-21
---
# Hardware
- Display Resolution: 192x160
- potentially just upscaled from 96x80
- at 3x scaling that's 576x480, 32px pillarboxes if 640x480
- 384x320
- how small can the screen physically be?
- android guidelines say 48dp @ 160dpi or 0.3"
- android guidelines also say 48dp is about 9mm so who the fuck knows anymore
- apple says 44pt ~~or 44/72" or 0.61"~~
- 44pt is 44px, 88px, 132px depending on device
- 132px on iPhone X @ 448(?)dpi so ~ 0.294"
- 192x160 is 1.2"x1"
- 640x480 is 4"x5" for a 6.4" diagonal
- 28.8" x 24" needed to meet android accessibility guidelines jfc
- tl;dr: Apple and Google seem to want about 0.3"per target
- NDS screen size is 106.666 dpi
- poketch would be 1.8x1.5"
- **640x480 would be 2x1.5" or 2.5" diagonal**
- https://www.adafruit.com/product/2478 should do the trick
- 320x240 2.4"
- we use 288x240 (1.5x)
- 2 Bit grayscale
- Touch screen
- 5:4 aspect ratio
- 1/2 physical buttons
# etc
- will need a font
- sprite based?
- ttf based?
- https://lvgl.io/tools/fontconverter
# stretch goals
- use wifi/ble
- config applet
- also would handle right vs left handed
- mqtt/ntfy.sh
- display notifications using margins?
- android notifications sync
- requires adding to gadgetbridge long term
- pedometer
- needs extra hardware
# Sprites
- [x] Digital Watch
- [x] Calculator
- [ ] Memo Pad
- [x] Pedometer
- [x] Pokemon List
- [x] Friendship Checker
- [ ] Dowsing Machine
- [x] Berry Searcher
- [ ] Day-Care Checker
- [ ] Pokemon History
- [ ] Counter
- [x] Analog Watch
- [x] Marking Map
- [x] Link Searcher
- [ ] Coin Toss
- [ ] Move Tester
- [ ] Calendar
- [ ] Dot Artist
- [x] Roulette
- [ ] Chain Counter
- [x] Kitchen Timer
- [ ] Color Changer
- [ ] Matchup Checker
- [ ] Stopwatch
- [ ] Alarm Clock

View file

@ -0,0 +1,27 @@
---
title: A Hex encoding for Toki Pona
date: 2025-02-13
---
| | |
| --- | --- |
| a | A |
| e | E/* |
| i | 1 |
| o | 0 |
| u | 5 |
| n | 7 |
| | |
| j | 3 |
| k | 9 |
| l | 6 |
| m | 4 |
| p | B |
| s | C |
| t | D |
| w | 2 |
| ∅ | F/# |
D091 41 3A7 416A
Ports over to DTMF as well

View file

@ -0,0 +1,49 @@
---
author: ArgentumCation
date: "1970-01-01"
slug: disorganized-notes
title: Disorganized Notes
---
# NixOS/Nix
- Show channels: `sudo nix-channel --list`
- add unstable channel: `sudo nix-channel --add https://nixos.org/channels/nixpkgs-unstable unstable`
- update repos: `sudo nix-channel --update; sudo nix search -u`
---
# SSH
- Set up port forwarding in existing connection:
```sh
$ ~C
ssh> -D [port number]
[Enter]
[Enter]
$
```
---
# Shell
- `!!:s/foo/bar/`, replace first instance of `foo` with `bar` in the previous command
- `^foo^bar` same thing but shorter and less flexible
- `!foo` rerun last command containing `foo`
---
# Keepalived
- don't ever use use_vmac, it's fucky
---
# Toki Pona Prop 65 Warning
- ⚠️ toki pi (ike ken)! ni li ken pana e ijo Esutolosen tawa sina. ma Kaliponja li sona e ni: ijo Esutolosen li ken pakala e jan. o sona mute: http://www.P65Warnings.ca.gov.
- ⚠️"O' L n K! \\|/ > K "n'>> O Esutolosen A_b. (+) Kaliponja > "[]' > \\|/: O Esutolosen > K \[Z\] >> ,O,. \`o "[]' |||: http://www.P65Warnings.ca.gov.
- ⚠️󱥬󱥍󱦗󱤍󱤘󱦘! 󱥁󱤧󱥌󱤉󱤌󱦐󱤉󱥦󱥬󱤫󱥚󱦆󱦑󱥩󱦗󱥞󱦘. 󱤰󱦐󱤗󱤪󱥔󱦆󱤑󱦑󱤧󱥡󱤉󿬂: 󱤌󱦐󱤉󱥦󱥬󱤫󱥚󱦆󱦑󱤧󱤘󱥈󱤉󱤑.󱥄󱥡󱤼: http://www.P65Warnings.ca.gov.
- ⚠️ tk P iG g! N l g bn e **iJ ezt~\[** Tw sn. M **Kl=Y** l Sn e N: iJ **ezt~\[** l g bKL e j. o Sn uE: http://www.P65Warnings.ca.gov.

Binary file not shown.

After

Width:  |  Height:  |  Size: 103 KiB

View file

@ -0,0 +1,92 @@
---
title: Mira attempts to lock the fuck in and figure out how to k8s
date: 2025-04-07
---
# Current Setup
Auxin (HTPC):
- OS: NixOS
- Service Runtume:Docker Compose
- Services:
- Syncthing
- Jellyfin
- Caddy (as reverse proxy only)
- Kodi
- Service Storage:
- Bind Mounts to NFS on NAS
Lipotropin (NAS):
- OS: Proxmox
- Services Runtime: K3S
- Services:
- adminer
- caddy
- copyparty
- forgejo
- jackett
- mariadb
- ntfy
- paperless+gotenberg+tika
- qbittorrent+gluetun
- radarr
- redis
- slskd
- Service Storage:
- NFS to spinning rust on same system
- Baremetal storage:
- 6 HDDs in BTRFS5 (50TB raw, 38TB usable)
Motilin (working hostname, Unused)
Other Client Devices:
- Access files over NFS/SMB
- Access services via hostname (local), or URL (external)
----
# Endn't Point
Auxin
- Exclusive Services:
- Kodi
- Distributed Services via K8S
- Service Storage: ????
- Baremetal storage:
- Various HDDs as available
Motilin + Lipotropin
- Distributed Services via K8S
Client Devices
- Still need to be able to access files over NFS/SMB
- Still need to access services via hostname (local), or URL (external)
---
# Still need to figure out:
- How to handle jellyfin requiring GPU access
- nodes not guaranteed to have GPU, or may have heterogenous GPUs, need to lock to nodes with GPUs
- How do I handle failover
- current setup has SSH and HTTP traffic go to auxin, which proxies to lipotropin as needed
- how would I handle auxin going down
- ~~where the fuck would ssh go in general, it's not something reverse proxyable~~
- Move SSH to router, use proxyjump from there
- see if Auto proxy and fallback are options
- can we do crowdsec and fail2ban on openwrt
- if I fucked up a config, how could I recover without incurring downtime
- How the *fuck* do I handle storage
- how do I do concurrent access, which services even allow that
- how the ever loving fuck do I make syncthing work
- ~~the intent is graceful failover, but can I do load balancing?~~
- I do not have a good reason to have multiple instances of, cap replicas at 1
- at best, jellyfin might benefit from multiple GPUs but also nobody is using your instance
- some services use SQLite, is there a way to mitigate concurrency issues with that
- on that note SQLite shits itself when FS access is too slow (eg NFS or ISCSI), how deal with that
- How to gradually migrate to new setup from 6 BTRFS drives on one machine
- The end goal is at least 3 nodes, but at some point there's only going to be 1 or 2
- how would I minimize buying more storage/spending more money, while maintaining some redundancy
- is the best option just `btrfs remove` -> move drive -> format drive -> copy files from btrfs to new drive?
- new storage setup should be easy to add to (at a minimum, no homogenous drives)
- Is tiered storage something I can make use of, could I grab an SSD and use it as cache somehow
- how to give client devices and services access to the same filesystems
- eg (accessing `/downloads` from `qbittorrent`, `sonarr` and my phone via NFS/SMB)
---
# Rook: does it solve my storage issues?
- Needs raw devices/partitions
- requires migration
# Longhorn: will it do shit?

View file

@ -0,0 +1,64 @@
---
date: 2025-01-21
title: Miraidon (Airplay Server)
---
## Reference Impls
- https://github.com/mikebrady/shairport-sync/tree/master?tab=readme-ov-file
- https://github.com/ckdo/airplay2-receiver
- registers mdns service
- starts http server on port `7000`
- forwards requests to `AP2Handler`
- SETUP
- should receive a bplist
- if it contains `streams`
- TODO
- else
- seems to be sending event?
-
- GET
- POST
- service Discovery uses mdns/bonjour
- feature flags are in a SRV record
- TODO: how do I set up an mdns responder
- [mdns_sd](https://docs.rs/mdns-sd/latest/mdns_sd/)
- seems like the actual transfers themselves use http over a different port
```
= wlp0s20f3 IPv6 4431B2384B11@Akristip-l-PF4BWXDJ AirTunes Remote Audio local
hostname = [akristip-l-PF4BWXDJ.local]
address = [fd71:e5f3:3440:f95e:dbf9:f904:c567:1ab9]
port = [5000]
txt = ["pw=false" "txtvers=1" "ch=2" "cn=0,1" "ek=1" "et=0,1" "sv=false" "da=true" "sr=44100" "ss=16" "md=0,1,2" "vn=65537" "tp=TCP,UDP" "vs=105.1" "am=ShairportSync" "fv=4.3.4" "sf=0x4"]
= lo IPv4 4431B2384B11@Akristip-l-PF4BWXDJ AirTunes Remote Audio local
hostname = [akristip-l-PF4BWXDJ.local]
address = [127.0.0.1]
port = [5000]
txt = ["pw=false" "txtvers=1" "ch=2" "cn=0,1" "ek=1" "et=0,1" "sv=false" "da=true" "sr=44100" "ss=16" "md=0,1,2" "vn=65537" "tp=TCP,UDP" "vs=105.1" "am=ShairportSync" "fv=4.3.4" "sf=0x4"]
= wlp0s20f3 IPv4 4431B2384B11@Akristip-l-PF4BWXDJ AirTunes Remote Audio local
hostname = [akristip-l-PF4BWXDJ.local]
address = [192.168.1.212]
port = [5000]
txt = ["pw=false" "txtvers=1" "ch=2" "cn=0,1" "ek=1" "et=0,1" "sv=false" "da=true" "sr=44100" "ss=16" "md=0,1,2" "vn=65537" "tp=TCP,UDP" "vs=105.1" "am=ShairportSync" "fv=4.3.4" "sf=0x4"]
= virbr0 IPv4 4431B2384B11@Akristip-l-PF4BWXDJ AirTunes Remote Audio local
hostname = [akristip-l-PF4BWXDJ.local]
address = [192.168.122.1]
port = [5000]
txt = ["pw=false" "txtvers=1" "ch=2" "cn=0,1" "ek=1" "et=0,1" "sv=false" "da=true" "sr=44100" "ss=16" "md=0,1,2" "vn=65537" "tp=TCP,UDP" "vs=105.1" "am=ShairportSync" "fv=4.3.4" "sf=0x4"]
= docker0 IPv4 4431B2384B11@Akristip-l-PF4BWXDJ AirTunes Remote Audio local
hostname = [akristip-l-PF4BWXDJ.local]
address = [172.17.0.1]
port = [5000]
txt = ["pw=false" "txtvers=1" "ch=2" "cn=0,1" "ek=1" "et=0,1" "sv=false" "da=true" "sr=44100" "ss=16" "md=0,1,2" "vn=65537" "tp=TCP,UDP" "vs=105.1" "am=ShairportSync" "fv=4.3.4" "sf=0x4"]
^CGot SIGINT, quitting.
```
```json
["pw=false",
"txtvers=1",
"ch=2",
"cn=0,1", "ek=1" "et=0,1" "sv=false" "da=true" "sr=44100" "ss=16" "md=0,1,2" "vn=65537" "tp=TCP,UDP" "vs=105.1" "am=ShairportSync" "fv=4.3.4" "sf=0x4"]
```

View file

@ -0,0 +1,44 @@
---
title: Modern Unix Tools
subtitle: someone suggested I name this "Modern Modern Unix Tools"
---
- bat
- `tail -f | bat --paging=never -l log`
- gdu
- neovim
- fd
- lazygit
- lsd
- nix
- okay I'm sure people are gonna roast me for this one but, as someone who uses Alma 8 and Ubuntu LTS at work, so using nix-env as a package manager is a lifesaver
- zoxide
- yazi
- xonsh / nushell
- viddy
- uv
- thefuck
- zellij
- ouch
- sheldon
- ruff
- ripgrep
- ugrep
- meld
- uutils hashing
- uutils cp/mv
- difft
- just
- jj
- ~~mirafetch~~ hyfetch
- hyperfine
- gum
- fzf
- age
- tokei
- glow
- duf
- nala
- cliphist
- chezmoi
- btdu

View file

@ -0,0 +1,7 @@
---
title: Some notes on the PKPass format
date: 2025-02-16
---
https://file-extensions.com/docs/pkpasss
https://developer.apple.com/documentation/walletpasses

View file

@ -0,0 +1,128 @@
---
title: PostMarketOS for iPad Air 2 (iPad-5,3)
---
## Existing Work:
https://github.com/SoMainline/linux-apple-resources/blob/master/HOWTO.md
[PongoOS](https://github.com/checkra1n/PongoOS/tree/master):Seems to be a minimal boot environment for checkra1n boards
https://github.com/konradybcio/linux-apple: Kernel fork for iOS devices?
## PongoOS build errors
```c
src/kernel/mm.c:378:14: error: variable 'vm_index_start' set but not used [-Werror,-Wunused-but-set-variable]
378 | uint32_t vm_index_start = 0;
| ^
src/kernel/mm.c:938:10: error: variable 'is_tt1' set but not used [-Werror,-Wunused-but-set-variable]
938 | bool is_tt1 = false;
| ^
2 errors generated.
src/kernel/task.c:294:5: error: call to undeclared function 'va_start'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
294 | va_start(va, reason);
| ^
src/kernel/task.c:296:5: error: call to undeclared function 'va_end'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
296 | va_end(va);
| ^
src/kernel/task.c:300:5: error: call to undeclared function 'va_start'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
300 | va_start(va, reason);
| ^
src/kernel/task.c:302:5: error: call to undeclared function 'va_end'; ISO C99 and later do not support implicit function declarations [-Wimplicit-function-declaration]
302 | va_end(va);
| ^
4 errors generated.
src/drivers/sep/sep.c:913:6: error: a function declaration without a prototype is deprecated in all versions of C and is treated as a zero-parameter prototype in C23, conflicting with a subsequent definition [-Werror,-Wdeprecated-non-prototype]
913 | void sep_help();
| ^
src/drivers/sep/sep.c:1145:6: note: conflicting prototype is here
1145 | void sep_help(const char* cmd, char* args) {
| ^
1 error generated.
make: *** [Makefile:99: build/Pongo] Error 1
```
Code fixes:
```diff
diff --git i/src/drivers/sep/sep.c w/src/drivers/sep/sep.c
index 10d0a98..cc074b6 100644
--- i/src/drivers/sep/sep.c
+++ w/src/drivers/sep/sep.c
@@ -910,7 +910,8 @@ struct sep_command {
void (*cb)(const char* cmd, char* args);
};
-void sep_help();
+void sep_help(const char* cmd, char* args);
#define SEP_COMMAND(_name, _desc, _cb) {.name = _name, .desc = _desc, .cb = _cb}
void sep_pwned_peek(const char* cmd, char* args) {
if(!sep_is_pwned) {
diff --git i/src/kernel/mm.c w/src/kernel/mm.c
index 595ae64..108b885 100644
--- i/src/kernel/mm.c
+++ w/src/kernel/mm.c
@@ -375,13 +375,13 @@ err_t vm_allocate(struct vm_space* vmspace, uint64_t* addr, uint64_t size, vm_fl
uint32_t vm_scan_base = 0;
uint64_t vm_scan_size = (VM_SPACE_SIZE / PAGE_SIZE);
uint32_t found_pages = 0;
- uint32_t vm_index_start = 0;
if (flags & VM_FLAGS_FIXED) {
uint64_t vm_offset = *addr - vmspace->vm_space_base;
if (vm_offset > vmspace->vm_space_end) vm_scan_size = 0;
else {
- vm_index_start = vm_offset / PAGE_SIZE;
vm_scan_size = ((size + PAGE_MASK) & ~PAGE_MASK) / PAGE_SIZE;
}
} else {
@@ -935,20 +935,21 @@ void ttbpage_free_walk(uint64_t base, bool is_tt1) {
}
bool tte_walk_get(struct vm_space* vmspace, uint64_t va, uint64_t** tte_out) {
uint64_t bits = 64ULL;
- bool is_tt1 = false;
uint64_t* ttb = NULL;
if (va & 0x7000000000000000) {
bits -= t1sz;
va -= (0xffffffffffffffff - ((1ULL << (65 - t1sz)) - 1));
va &= (1ULL << bits) - 1;
- is_tt1 = true;
ttb = phystokv(vmspace->ttbr1);
} else {
bits -= t0sz;
va &= (1ULL << bits) - 1;
- is_tt1 = false;
ttb = phystokv(vmspace->ttbr0);
}
uint32_t levels = ((bits - (tt_bits + 3ULL)) / tt_bits);
union tte tte;
while (levels) {
diff --git i/src/kernel/task.c w/src/kernel/task.c
index 0e6fa22..b957e16 100644
--- i/src/kernel/task.c
+++ w/src/kernel/task.c
@@ -26,6 +26,7 @@
*/
#include <errno.h>
#include <stdlib.h>
+#include <stdarg.h>
#include <pongo.h>
extern void task_load(struct task* to_task);
```
## PongoOS linker errors:
```
ld: could not process llvm bitcode object file, because /usr/bin/../lib/llvm/libLTO.so could not be loaded file '/tmp/dtree-76a2ef.o' for architecture arm64
clang: error: linker command failed with exit code 1 (use -v to see invocation)
```
~~`ln -s ../llvm-18/lib/libLTO.so libLTO.so`~~
nevermind we don't need to build PongoOS
~~turns out shit's broken af on iOS 15 so project ends here~~
from Siguza:
- [https://github.com/asdfugil/PongoOS](https://github.com/asdfugil/PongoOS "https://github.com/asdfugil/PongoOS") <- Build that
- [https://checkra.in/1337](https://checkra.in/1337 "https://checkra.in/1337") <- Use this special ver of checkrain
- [https://github.com/HoolockLinux/m1n1](https://github.com/HoolockLinux/m1n1 "https://github.com/HoolockLinux/m1n1") <- Chainload thath

View file

@ -0,0 +1,22 @@
---
title: Extending the Comparative Military Ranking System to fit Space Forces
date: 2025-10-08
---
| Army | Navy | Air Force | Space Force |
| ------------------ | -------------------- | ------------------------- | --------------------------- |
| Marshal | Admiral of the Fleet | Marshall of the Air Force | Marshall of the Space Force |
| General | Admiral | Air Chief Marshal | Star Admiral |
| Lieutenant General | Vice Admiral | Air Marshal | Star Marshal |
| Major General | Rear Admiral | Air Vice-Marshal | Star Vice-Marshal |
| Brigadier | Commodore | Air Commodore | Star Commodore |
| Colonel | Captain | Group Captain | Captain |
| Lieutenant Colonel | Commander | Wing Commander | Guardian Commander |
| Major | Lieutenant Commander | Squadron Leader | Guardian Leader |
| Lieutenant | Lieutenant | Flight Lieutenant | Lieutenant |
| Junior Lieutenant | Ensign | Pilot Officer | Guardian Officer |
| Warrant Officer | Warrant Officer | Warrant Officer | Warrant Officer |
| Sergeant | Petty Officer | Sergeant | Sergeant |
| Specialist | Able Seaman | Air Specialist | Guardian Specialist |
| Private | Seaman | Airman | Guardian |

View file

@ -0,0 +1,20 @@
---
title: Notes on building Redox OS
summary: From my attempts to try getting this bugger working on armv6
date: 2025-05-08
---
# Redox OS
## 32-bit arm ports?
- currently fails at trying to get relibc-install.tar.gz from https://static.redox-os.org/toolchain/arm-unknown-redox/
- makes sense, it doesn't exist
- can't build relibc for arm
- seems to depend on gcc, ld, ar, nm, and objcopy to exist for `arm-unkown-gcc`, also ld.so(?)
- looks like we need to port this? https://gitlab.redox-os.org/redox-os/gcc
- need to get a toolchain to target `arm-unknown-redox`
- https://gitlab.redox-os.org/redox-os/rust
- seems like `mk/prefix.mk` might have information?
-

View file

@ -0,0 +1,74 @@
---
draft: true
---
# An amalgamation of shit from tiktok before the banhammer hits
## Art
- Do anime lineart with a hard edge and soften in post
## Music
- Look into prog drums
- [VS Cynthia Breakdown](https://www.tiktok.com/@iamthebloodtyrant/video/7453556790337277226)
- [Fight Against an Armed Boss](https://www.tiktok.com/@iamthebloodtyrant/video/7440573997340937518)
- [Chinese brainrot movie clips](https://www.tiktok.com/@pianosoin/video/7440491022359989536)
- [BW Gym Leader](https://www.tiktok.com/@parakeetdsi/video/7402611828343229703)
- [VS Red](https://www.tiktok.com/@parakeetdsi/video/7417834269889940737)
- [BW Low Health](https://www.tiktok.com/t/ZTYEq29QF/)
- [BW Route 10](https://www.vxtiktok.com/t/ZTYoRUdGx/)
- [BW surf](https://www.vxtiktok.com/t/ZTYoRCfvF/)
- [Jubilife City](https://www.vxtiktok.com/t/ZTYoR4DQo/)
- [Cyrus Battle](https://www.tiktok.com/t/ZTYoRhsrP/)
- [Accumula Town](https://www.tiktok.com/t/ZTYoRDjCS/)
- https://www.tiktok.com/t/ZT21spx4B/
- [dppt drums](https://www.tiktok.com/t/ZT2eKGTMn/)
- [giant chasm](https://www.tiktok.com/t/ZT2eKqSnG/)
- [vs Iris ](https://www.tiktok.com/t/ZT2eERv22/)
- [route 209](https://www.tiktok.com/t/ZT2eEFSbw/)
- [giratina][https://www.tiktok.com/t/ZT2eKEAdt/]
- [lake trio](https://www.tiktok.com/t/ZT2eE6Pk8/)
- [dialga palkia](https://www.tiktok.com/t/ZT2eENDto/)
## Food
- [The Hat Man](https://www.tiktok.com/@maarkvark/video/7455468427742825759)
- Little bit of lemon juice
- midori
- bit of tequila
- grapefruit juice
- ultra fantasy ruby red monster
- [Indian food of some sort](https://www.tiktok.com/@mydelhi/video/7431614619237551392)
## ETC
### Hikes?
- Whitewater Falls NC
- Eno River
### Stuff to buy
- Luigi Mangione Bag (Peak Design something or other)
## Fashion
- Layering for winter
- Leggings under Jeans
- Long sleeve shirt
- cardigan/sweater/jacket
- Dental Trays + 16% carbamide peroxide
## Trans
- Nasally <=> High Voice
- Need to look into **fixing vocal fold mass**
- less volume, more airflow
- fleece lined tights
- Need to fix size/resonance before reducing weight
## Tech
- `media.mediasource.enabled = false` in firefox settings to make it buffer the whole video
- may break livestreams

View file

@ -0,0 +1,27 @@
---
title: vim
date: 2025-01-21
---
- Sort selected lines: `:sort`
- Open man page: `:man [command]` or `\K`
- Open URL: `gx`
- Move between splits: `ctrl+w [direction]`
- [vim-commentary](https://github.com/tpope/vim-commentary): `gc [motion]` to comment out
- Case switching:
- `gU` to uppercase
- `gu` to lowercase -`g~` to toggle
- Substitute:
- `/g` **global** - sub all in line
- `:%s/` - substitute in all lines
- `:5,12s/` substitute from lines 5 to 12
- `:.,+2s/` substitute this line (`.`) and the next 2
- `:g/^foo/s/bar/baz/g` substitute all instances of bar with baz on lines beginning with foo
- `/c` - ask for confirmation
- Windows
- `:sp [filename]` horizontal split, optionally open file
- `vsp` vertical split
- `ctrl+w w` move between windows
- `ctrl+w =` resize windows to be equal
- `ctrl+w q` close window
- `ctrl+w <direction>` move window

View file

@ -0,0 +1,27 @@
---
title: Yet Unnamed Revolution Investigation
date: 2025-05-03
---
# Yet Unnamed Revolution Investigation
## DOL
- More compatible with Nintendo tooling
- I assume it has something to do withu
## ELF
- more flexible than DOL
- can be converted to/from DOL
## KalistiOS
- seems to be an SDK for Dreamcast
- supported PS2 and GBA at one point but those are unmaintained
- supported x86 at one point but wasn't made public?
- looks like yu-rvl is gonna be doing stuff with that
## libOGC
- bad
- seems like it's used by most/all existing Wii homebrew
## NAND Channel
- Forwarders?
# BlocksDS
- seems to be an NDS SDK we're shipping alongside other Yu utils?

View file

@ -0,0 +1,217 @@
---
title: Links and Socials!
---
<table class="about-me">
<tr>
<td><img src="https://argentumcation.com/links/images/mira.jpg" /></td>
</tr>
<tr>
<td class="width-min">
<h1>ArgentumCation</h1>
</td>
</tr>
<tr>
<td>She/Her</td>
</tr>
</table>
<br />
<span class="socials-text">I don't know who you are or how you found this, but while you're here, feel free to add me
everywhere</span>
<div class="social-container">
<table class="socials">
<tr>
<th colspan="3">Social Media</th>
</tr>
<tr>
<td class="social-icon"><i class="fa-brands fa-twitter"></i></td>
<td class="social-name">Xitter</td>
<td class="social-link">
<a href="https://x.com/ArgentumCation">@ArgentumCation</a>
</td>
</tr>
<tr>
<td class="social-icon"><i class="fa-brands fa-mastodon"></i></td>
<td class="social-name">Mastodon</td>
<td class="social-link">
<a href="https://social.treehouse.systems/@argentumcation">@ArgentumCation@treehouse.systems</a>
</td>
</tr>
<tr>
<td class="social-icon"><i class="fa-brands fa-bluesky"></i></td>
<td class="social-name">Bluesky</td>
<td class="social-link">
<a href="https://bsky.app/profile/bsky.argentumcation.zip">@bsky.argentumcation.zip</a>
</td>
</tr>
<tr>
<td class="social-icon"><i class="fa-brands fa-bluesky"></i></td>
<td class="social-name">Bluesky (Mastodon Bridge)</td>
<td class="social-link">
<a href="https://bsky.app/profile/fedi.argentumcation.zip">@fedi.argentumcation.zip</a>
</td>
</tr>
<tr>
<td class="social-icon"><i class="fa-brands fa-tumblr"></i></td>
<td class="social-name">Tumblr</td>
<td class="social-link">
<a href="https://argentumcation.tumblr.com/">argentumcation</a>
</td>
</tr>
</table>
<table class="socials">
<tr>
<th colspan="3">Content</th>
</tr>
<!--Blog-->
<tr>
<td class="social-icon"><i class="fa-solid fa-blog"></i></td>
<td class="social-name">Blog</td>
<td class="social-link">
<a href="https://argentumcation.com/">ArgentumCation</a>
</td>
</tr>
<!--Youtube-->
<tr>
<td class="social-icon"><i class="fa-brands fa-youtube"></i></td>
<td class="social-name">YouTube</td>
<td class="social-link">
<a href="https://www.youtube.com/channel/@argentumcation">ArgentumCation</a>
</td>
</tr>
<!--Twitch-->
<tr>
<td class="social-icon"><i class="fa-brands fa-twitch"></i></td>
<td class="social-name">Twitch</td>
<td class="social-link">
<a href="https://www.twitch.tv/argentumcation">ArgentumCation</a>
</td>
</tr>
<!--Soundcloud-->
<tr>
<td class="social-icon"><i class="fa-brands fa-soundcloud"></i></td>
<td class="social-name">Soundcloud</td>
<td class="social-link">
<a href="https://soundcloud.com/argentumcation">ArgentumCation</a>
</td>
</tr>
<!--Bandcamp-->
<tr>
<td class="social-icon"><i class="fa-brands fa-bandcamp"></i></td>
<td class="social-name">Bandcamp</td>
<td class="social-link">
<a href="https://argentumcation.bandcamp.com/">ArgentumCation</a>
</td>
</tr>
</table>
<table class="socials">
<tr>
<th colspan="3">Messaging</th>
</tr>
<tr>
<td class="social-icon"><i class="fa-brands fa-discord"></i></td>
<td class="social-name">Discord</td>
<td class="social-link">
<a href="https://discord.com/users/215902078747410433">argentumcation</a>
</td>
</tr>
<tr>
<td class="social-icon"><i class="fa-solid fa-envelope"></i></td>
<td class="social-name">Email</td>
<td class="social-link">
<a href="mailto:argentumcation(at)argentumcation.com">argentumcation(at)argentumcation.com</a>
</td>
</tr>
</table>
<table class="socials">
<tr>
<th colspan="3">Code</th>
</tr>
<!--Github-->
<tr>
<td class="social-icon"><i class="fa-brands fa-github"></i></td>
<td class="social-name">GitHub</td>
<td class="social-link">
<a href="https://github.com/ArgentumCation">ArgentumCation</a>
</td>
</tr>
<!--Forgejo-->
<tr>
<td class="social-icon"><i class="fa-brands fa-git-alt"></i></td>
<td class="social-name">Forgejo</td>
<td class="social-link">
<a href="https://git.argentumcation.com/mira">mira</a>
</td>
</tr>
</table>
<table class="socials">
<tr>
<th colspan="3">Misc</th>
</tr>
<!--Steam-->
<tr>
<td class="social-icon"><i class="fa-brands fa-steam"></i></td>
<td class="social-name">Steam</td>
<td class="social-link">
<a href="https://steamcommunity.com/id/argentumcation">ArgentumCation</a>
</td>
</tr>
<!--MyAnimeList-->
<tr>
<td class="social-icon"><i class="fa-solid fa-question"></i></td>
<td class="social-name">MyAnimeList</td>
<td class="social-link">
<a href="https://myanimelist.net/profile/ArgentumCation">ArgentumCation</a>
</td>
</tr>
<!--Itch.io-->
<tr>
<td class="social-icon"><i class="fa-brands fa-itch-io"></i></td>
<td class="social-name">Itch.io</td>
<td class="social-link">
<a href="https://argentumcation.itch.io/">ArgentumCation</a>
</td>
</tr>
<!--PGP Key-->
<tr>
<td class="social-icon"><i class="fa-solid fa-key"></i></td>
<td class="social-name">PGP Key</td>
<td class="social-link">
<a
href="http://keyserver.ubuntu.com/pks/lookup?op=get&search=0xdd8583a510deb949714ed847430c50ca90f98bbe">0xdd8583a510deb949714ed847430c50ca90f98bbe</a>
</td>
</tr>
</table>
<table class="socials">
<tr>
<th colspan="3">Support the Mira!</th>
</tr>
<!--Ko-fi-->
<tr>
<td class="social-icon"><i class="fa-solid fa-mug-hot"></i></td>
<td class="social-name">Ko-fi</td>
<td class="social-link">
<a href="https://ko-fi.com/argentumcation">ArgentumCation</a>
</td>
</tr>
<!--BTC-->
<tr>
<td class="social-icon"><i class="fa-brands fa-btc"></i></td>
<td class="social-name">Bitcoin</td>
<td class="social-link">
<a href="bitcoin:1NzncEg3C2Q72vbArCMU4wN2yPTnx5GU2h">1NzncEg3C2Q72vbArCMU4wN2yPTnx5GU2h</a>
</td>
</tr>
<!--Ethereum-->
<tr>
<td class="social-icon"><i class="fa-brands fa-ethereum"></i></td>
<td class="social-name">Ethereum</td>
<td class="social-link">
<a href="ethereum:0xAdb87d93BAFda19ef168891d76c944879E06a7bd">0xAdb87d93BAFda19ef168891d76c944879E06a7bd</a>
</td>
</tr>
</table>
</div>

View file

@ -0,0 +1,36 @@
---
author: ArgentumCation
draft: true
pubDate: "1970-01-01"
slug: cluster
title: Cluster(fuck)
---
| Hostname | IPv4 | Hardware | Function | OS | Arch | Cores | Ram | USB power? | Power |
| -------------- | ---- | -------------- | --------------- | -------------- | ------------------------ | ----- | ---- | ---------- | ------- |
| | -- | Meraki MR44 | | | | | | | 15/30W? |
| | 248 | Meraki MX68W | | | | | | | 19-87W |
| | | TODO | Switch | | | | | | |
| | | TODO | Switch | | | | | | |
| Amylin | 65 | Nest Pro | WAP | | | | | | |
| Auxin | 153 | | NAS | Nix | x86_64 | 8 | 48 | | |
| Cortisol | 119 | Framework 13 | Personal laptop | Arch | x86_64 | 16 | 32 | X | |
| Epinephrine | | | Desktop | Arch + Windows | x86_64 | TODO | TODO | | |
| Ethylene | 213 | Pi Zero W | | Raspi | arm | 1 | 0.5 | X | 1W |
| Florigen | 108 | Pixel 9 Pro XL | Phone | Android | aarch64 | | | X | |
| Galanin | 129 | Thinkpad x270 | | Nix | x86_64 | 4 | 16 | X | 45/65W |
| Gastrin | 187 | HP x360 G3 EE | Kitchen tablet | Nix | x86_64 | 2 | 4 | X | 45W |
| Histamine | 27 | iPad Air 2 | Tablet | iOS | aarch64 | | | \* | |
| Kinetin | | Milk V Duo | | Buildroot? | RV64<br>(or aarch64)<br> | TODO | 0.25 | X | 5W |
| Leptin | 117 | iMac | Darwin builds | mac | aarch64 | 8 | 8 | | |
| Melatonin | | Erista | Switch | Horizon | aarch64 | | | X | |
| Mellinoë | 226 | | Work laptop | | x86_64 | | | X | |
| Norepinephrine | 179 | | Phone | Android | aarch64 | | | X | |
| Orexin | 224 | Inspiron 7577 | | Nix | x86_64 | 8 | 16 | \* | 130W |
| Pectin | 79 | Ender 3 V3 | 3D printer | Klipper | | | | | |
| Relaxin | 182 | Pi B+ | | Raspi | arm | 1 | 0.5 | X | 2W |
| Rhodopsin | | | TV | | | | | | |
| Ribosome/mRNA | 64 | -- | | -- | -- | -- | -- | -- | -- |
| Strigolactone | 214 | Pi Pico W | power button | ESP32Home | | | | | |
| Vasopressin | 1 | Pi 4 | Router | OpenWRT | aarch64 | 4 | 8 | X | 6W |
| Zeatin | | Milk V Duo S | | Buildroot? | aarch64<br>(or RV64) | TODO | 0.5 | X | 5W |

View file

@ -0,0 +1,16 @@
---
draft: true
---
| Hostname | Hardware | Width | Height | Front Ports | Side Ports | Back Ports |
| ----------- | -------- | ------- | ------- | ---------------------------- | ------------------- | -------------- |
| -- | -- | 254mm | 44.45mm | | | |
| | Switches | -- | 1U | 16x 󰈀 | | 2x Barrel Jack |
| Auxin | 󰇅 | -- | 4U | -- | -- | ?? |
| Ethylene | 0W | 65mm | 5mm | - xμ󰕓<br>- m󰡁 | 󰟜 | |
| Relaxin | B+ | 56mm | 17mm | - 󰈀<br>- 4󰕓 | - 󰡁<br>- μ󰕓 | 󰟜 |
| Vasopressin | 4 | 56mm | 17mm | - 󰈀<br>- 4󰕓 | - 2μ󰡁<br>- 󰕓C | 󰟜 |
| Galanin | x270 | 208.5mm | 21mm | - 󰈀<br>- 1󰕓 | - 󰕓C<br>- 󰡁<br>- 1󰕓 | |
| Zeatin |  Duo S | 43mm | 17mm? | - 󰈀<br>- 1󰕓 | | - 󰕓C<br>- 󰟜 |
| Kinetin |  Duo S | 21mm | 2mm? | | | - 󰕓C |
| Leptin | 󰀶 | 197mm | 36mm | - 2󰕓C<br>- 2󰕓A<br>- 󰡁<br>- 󰈀 | | |

View file

@ -0,0 +1,12 @@
---
draft: true
---
- Needs to get
- Pronouns
- Program
- College
- Department
- Stretch goal
- receive DMs with verification pic
- probably would just OCR for NC State University

View file

@ -0,0 +1,88 @@
---
draft: true
---
# you're telling me a Ham Fisted this Metaphor?
- hamstudy.org
- FRN: 0036253789
- callsign format
- standard 2x3
- KA4\*\*\*
- vanity 1x3
K4\*\*\*
- potential callsigns?
- KM1RA\*
- K4RIM
- KM4IRA
- KA4RIM
- W4RIM
- N4RIM
- N4YAN
- N4YAA
- W4HYY
- N4NII
- K4PPA
- W4STE
- K4FKA
- N4BLA
- W4RPS
- W4RNS
- W4RDS
- W4RES
# Section 1
# T0
- Bonding ground rods is a good idea so that you can parallelize grounding
- allowable RF density scales inversely to duty cycle
# T1
- ARS can only transmit music if it's from a space station
- you can never intentionally transmit music
- if a non-licensed person is talking to a foreign station, the US needs to have an agreement with that country
- For stuff above HF, max power is 1500W
# T2
- CQ is a call to any station (`@anyone`)
- `CQ CQ CQ <callsign>` on Lower HF bands
- `CQ <callsign>` on VHF/UHF/Repeater
- QSY is change frequency
- +/- 5MHz is a common freq offset for repeaters in 70cm band
# T4
- Electronic Keyer helps with morse code
- Tuning an FM receiver off frequency causes distortion
# T3
- UHF Signals are not propagated by ionosphere
- Only way to identify amateur bands is wavelength
- Sporadic E is weird refraction of signals through layer E of ionosphere
# T6
- Single pole means one set of contacts
- Single Throw means one choice per set of contacts
# T7
- Make sure circuit is off when using ohmmeter
# T8
- DMR (Digital Mobile Radio) uses TDM to put two signals on same repeater
- CW is morse code, needs very little bandwidth
# T9
- A 5/8 wavelength antenna has more gain than a 1/4 wavelength
- bigger fraction means lower angle and higher gain
- lower angle always better

View file

@ -0,0 +1,43 @@
---
author: ArgentumCation
date: "2023-04-14"
summary: A talk I gave on using BTRFS to my University Linux Usergroup
title: 'Lightning Talks: BTRFS'
---
## Crash Course to Filesystems
- your OS needs a way to yeet files somewhere
- NTFS - the windows one
- HFS - the apple one
## BTRFS vs ZFS and LVM
- %%TODO: talk about PV, LV, VG%%
- Please don't use LVM in this day and age
- ZFS is a lot more mature than BTRFS and is probably the safer option, but the main caveats are that it can use hella ram space and doesn't have support for using disks of different sizes together
- On the other hand BTRFS is kinda dogshit if you want to do Raid 5/6, and doesn't let you do tiered storage (e.g. no SSD cache or ramdisk cache)
## Migrating your existing system
- Lucky you, EXT4 and NTFS can be converted to BTRFS in-place
- (Whether or not you should trust converting NTFS to BTRFS is another story)
- ### EXT4
- Grab a live USB and boot into it if this is a partition you can't unmount while booted (eg `/`, `/home`) - make a goddamn backup cause fucking with partitions is just asking for accidental data loss
- okay now time to clean your filesystem
- `# e2fsck -fvy /dev/sdx`
- you'll also want to clear up some space before attempting this
- `# btrfs-convert -p -L --uuid copy -O compress /dev/sdx` to do the actual conversion - if you're low on space add `-n` - if you don't have an FS label on this partition, you can add a label after `-L` - if something went wrong do `# btrfs-convert -r /dev/sdx` - Now let's mount it with `# mount /dev/sdx /mnt/<mount point>` - for example if this is your root partition, mount it to `/mnt` - if it worked, run `# btrfs subvolume delete /mnt/<mount point>/ext2_saved` to yeet reversal data and save some space - Now let's move everything into subvolumes to make backups and stuff easier - cd over to where you mounted and run - `# btrfs subvol create @<subvol name>` - if you have `/home` on the same partition as root make a `@home` subvolume too. - so for a root partition do `@`, - `# mv * @<subvol name>` - you want to do this in a bottom up way, ie move `/home/*` to `/@home` before you move `/` to `@` -
---
> [!todo] TODO
>
> - btrbk
> - in place conversion
> - subvol layout
> - dual Linux boot
> - dual boot with windows
> - automated package manager snapshots
> - Swapfiles
> - zfs comparison

View file

@ -0,0 +1,5 @@
---
draft: true
---
- Okay so like the existence of Unicode is fucking based, and we have the Private Use Area (PUA) for things that the

View file

@ -0,0 +1,87 @@
---
title: Dysfunctional Programming
date: 2025-11-24
modified: 2025-11-24
draft: true
summary: Group Theory Adjacent Nonsense for people who slept through high school (me)
---
*Group Theory Adjacent Nonsense for people who slept through high school (me)*
> A Cringe set is Just a Co-Based set
>
> \- Unknown
So anyway, what the FUCK is a Monad
- A monoid in the category of endofunctors
- a burrito
- a co-comonad
Do any of these mean anything? No, so lets start at the beginning
# Numbers
- In the beginning, there was the empty set
- and then Zermelo and Fraenkel said "Let there be a power set of the empty set"
- ...which is a line of exploration that will get us nowhere productive for the scope of this work, and is probably something I'll talk about in the future.
# Magmas
- The easiest Algebraic Structure to explain is The **Magma**
- **Definition**: A magma is a set \(M\) with an operation \(\cdot\) that sends \(a,b\in M \to a\cdot b \in M\)
- the tl;dr is, you've got a set of stuff, and you can shove any two of those together to make a third thing, as long as it's still in the set, we call this property **closure**
- you're probably used to \(\cdot\) meaning multiplication, but that's a fake word that doesn't mean anything
- Aside: '\(\cdot\)' is hard to read on its own, hereafter it will be referred to as multiplication or as <strike>bottom surgery</strike> 'the operation')
- The main example of this is the Free Magma, which is basically just a binary tree
- In this case, 'multiplying' two binary trees just means concatenating them
- Why is this called the Free Magma? I honestly have no clue, Free means *something* here but I haven't figured out what yet. This will not be the last time it comes up.
# Monoids
- The next step we'll on the Algebraic Structure Skill Tree is the Semigroup, but that's less important to focus on here so I'll fold it into the Monoid Section
- When you add Associativity to a Magma, you get a **Semigroup**
- Associativity just means that \(a\cdot(b\cdot c) = (a\cdot b) \cdot c\)
- A more concrete example of this is natural number addition, \(2+(3+4) = (2+3)+4\)
- The proof of this is trivial and left as an exercise to the reader
- When you take a Semigroup and add an **Identity** to it, you get a **Monoid**
- An identity is just something that you can combine with something and get that same something back out
- The easiest way to think of this is that we need something that acts like '1' when you 'multiply' by it
- If we go back to the example of adding numbers together, '0' acts as the identity since \(0+x = x\)
- Yes, this means that the '1' element of \((\mathbb{N},+)\) is '0'
- No, I'm not sorry for coming up with that absolutely dumb ass example
- The Free Monoid is strings with concatenation as the operation
- Told you 'Free' would come up again
- the Identity element here is '', or the empty string
- This is closed since adding two strings together always results in a string
- This is also associative because Trust Me Bro
- Another example of a Monoid is RGBA colors
- The identity here is `rgba(0,0,0,0)` since adding clear to any color doesn't change it
- Colors are closed since you can add two of them and get a color back*
- *Actually I'm sure there's some sort of floating-point nonsense that makes this not true but IEEE 754 can go suck a log
- RGBA Colors are associative because I said so
- Absolutely unrelated, but I'm pretty sure OKLab isn't closed under the set of displayable colors, which feels cursed but is probably reasonable tbh
# Categories
- The Magma -> Monoid skill tree (and the several parts of it that I left out), are a scuffed refresher on Group Theory
- Up next is Category Theory, which they did not cover in high school; As such I will be spewing a significant amount of hot air out of my ass.
# Functors
> A category is a collection of "objects" that are linked by "arrows"
>
> \- [Wikipedia - Category](https://en.wikipedia.org/wiki/Category_(mathematics))
- ...FUCK, I was going to say that, unfortunately Wikipedia's definition is pretty spot on here.
- Okay but seriously
> In mathematics, abstract nonsense is a nonderogatory term used mainly to describe category theory and homological algebra
>
> \- Paraphrased from [Wikipedia - Abstract nonsense](https://en.wikipedia.org/wiki/Abstract_nonsense)
- Okay forget finding a way to explain it to an audience of (<small>uhhh whatever my audience is, I kinda try to write these at a level high school me could follow along with and not get bored, but I don't actually know what kind of masochist is reading this</small>), I need to figure out how to explain this to me first
- I'm back from Wikipedia, and I've returned neither smarter nor wiser, as such we proceed in our endeavors with the rallying cry: "Fuck it, we ball"
# Endofunctors
# Monads
- Examples include: `Future<T>`, `List<T>`, `Option<T>`, `Result<T,E>` also logging
- TODO: find someone who can explain how/why logging and file i/o are monadic
----
# Questions Mira hasn't answered yet and should really get around to before publishing this
- Does free just mean the operation is concatenation?
- https://en.wikipedia.org/wiki/Free_object
- it's supposed to be the 'most generic'
- How does using monads deal with side effects, eg Logging, File IO
- Do they encapsulate state somehow? how does that work exactly?
- what exactly does `Co-` entail

View file

@ -0,0 +1,426 @@
---
author: ArgentumCation
date: "2023-09-25"
slug: gpg
tags:
- encryption
- gpg
title: Intro to GPG
---
## What is GPG
Paraphrasing from the Arch Wiki, GPG is basically an implementation of PGP (Pretty Good Privacy)/ RFC 4880. You can use it to sign stuff, encrypt stuff, and authenticate yourself (eg over SSH or S/MIME).
## Using GPG for SSH
1. Generate Master Key
- This is the key you'll use to create subkeys. As such you'll want to keep this safe somewhere
- ```sh
$ gpg --full-generate-key --expert
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Please select what kind of key you want:
(1) RSA and RSA
(2) DSA and Elgamal
(3) DSA (sign only)
(4) RSA (sign only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(9) ECC (sign and encrypt) *default*
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(13) Existing key
(14) Existing key from card
Your selection? 11
```
- We want to pick ECC, since that's the more secure algorithm of these
- Next, we want to disable signing, since we'll only use this key to make more keys (i.e. we'll be certifying other keys)
- ```sh
Possible actions for this ECC key: Sign Certify Authenticate
Current allowed actions: Sign Certify
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? S
Possible actions for this ECC key: Sign Certify Authenticate
Current allowed actions: Certify
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? Q
```
- ```
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Your selection?
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tue Sep 24 21:26:26 2024 UTC
Is this correct? (y/N) y
```
- Here we pick an elliptic curve, I just went with the default since I have no opinions about these
- As for expiry date, I just put it at 1 year. You can change this later if you want
- ```
GnuPG needs to construct a user ID to identify your key.
Real name: Mira Velturu
Email address: mira@xn--2dkua.xn--tckwe
Comment: GPG Demo
You selected this USER-ID:
"Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>"
Change (N)ame, (C)omment, (E)mail or (O)kay/(Q)uit? O
```
- The last step is linking your data to the key, and entering a password
- After this, you'll see something like:
- ```
gpg: revocation certificate stored as '/home/mira/.local/share/gnupg/openpgp-revocs.d/6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9.rev'
public and secret key created and signed.
pub ed25519 2023-09-25 [C] [expires: 2024-09-24]
6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9
uid Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>
```
- The revocation cert lets you mark this key as invalid in case it gets leaked or something similar, keep this safe
- Double check to make sure the output contains `[C]` and no other letters between the braces
2. Alright now time to add subkeys so we can Sign/Authenticate/Encrypt stuff
- First we'll add a subkey for signing and authentication
- ```sh
$ gpg --expert --edit-key 6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec ed25519/58C90C69DF7F1AF9
created: 2023-09-25 expires: 2024-09-24 usage: C
trust: ultimate validity: ultimate
[ultimate] (1). Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>
```
- that long string you see is from the command where we made the key
- if you lost it, you can find it with `gpg --list-keys`
- Now we add a subkey, the process is pretty similar to how we made the master key
- ```
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection? 11
Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Sign
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? A
Possible actions for this ECC key: Sign Authenticate
Current allowed actions: Sign Authenticate
(S) Toggle the sign capability
(A) Toggle the authenticate capability
(Q) Finished
Your selection? Q
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Your selection?
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tue Sep 24 21:55:51 2024 UTC
Is this correct? (y/N) y
Really create? (y/N) y
gpg> save
```
- The main difference here is that we have both the Sign and Authenticate capabilities
- Your output will look something like:
- ```
sec ed25519/58C90C69DF7F1AF9
created: 2023-09-25 expires: 2024-09-24 usage: C
trust: ultimate validity: ultimate
ssb ed25519/2A7D7227C6F75FF1
created: 2023-09-25 expires: 2024-09-24 usage: SA
[ultimate] (1). Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>
```
- We'll need to do this process one more time to create an encryption subkey
- ```sh
$ gpg --expert --edit-key 6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9  36s686ms
gpg (GnuPG) 2.4.3; Copyright (C) 2023 g10 Code GmbH
This is free software: you are free to change and redistribute it.
There is NO WARRANTY, to the extent permitted by law.
Secret key is available.
sec ed25519/58C90C69DF7F1AF9
created: 2023-09-25 expires: 2024-09-24 usage: C
trust: ultimate validity: ultimate
ssb ed25519/2A7D7227C6F75FF1
created: 2023-09-25 expires: 2024-09-24 usage: SA
[ultimate] (1). Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>
```
- ```
gpg> addkey
Please select what kind of key you want:
(3) DSA (sign only)
(4) RSA (sign only)
(5) Elgamal (encrypt only)
(6) RSA (encrypt only)
(7) DSA (set your own capabilities)
(8) RSA (set your own capabilities)
(10) ECC (sign only)
(11) ECC (set your own capabilities)
(12) ECC (encrypt only)
(13) Existing key
(14) Existing key from card
Your selection? 12
Please select which elliptic curve you want:
(1) Curve 25519 *default*
(2) Curve 448
(3) NIST P-256
(4) NIST P-384
(5) NIST P-521
(6) Brainpool P-256
(7) Brainpool P-384
(8) Brainpool P-512
(9) secp256k1
Your selection?
Please specify how long the key should be valid.
0 = key does not expire
<n> = key expires in n days
<n>w = key expires in n weeks
<n>m = key expires in n months
<n>y = key expires in n years
Key is valid for? (0) 1y
Key expires at Tue Sep 24 22:03:43 2024 UTC
Is this correct? (y/N) y
Really create? (y/N) y
We need to generate a lot of random bytes. It is a good idea to perform
some other action (type on the keyboard, move the mouse, utilize the
disks) during the prime generation; this gives the random number
generator a better chance to gain enough entropy.
sec ed25519/58C90C69DF7F1AF9
created: 2023-09-25 expires: 2024-09-24 usage: C
trust: ultimate validity: ultimate
ssb ed25519/2A7D7227C6F75FF1
created: 2023-09-25 expires: 2024-09-24 usage: SA
ssb cv25519/2AD22394690453C2
created: 2023-09-25 expires: 2024-09-24 usage: E
[ultimate] (1). Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>
gpg> save
```
3. Okay now you have a key, lets make it work with SSH now
- ```sh
$ echo enable-ssh-support >> ~/.local/share/gnupg/gpg-agent.conf
```
- Now you're gonna need to set `SSH_AUTH SOCK` so that we use `gpg-agent` instead of `ssh-agent` for handling SSH credentials (don't worry this won't mess with your existing SSH credentials)
- Add the following to your `.bashprofile` or `.zshrc`
- ```sh
unset SSH_AGENT_PID
if [ "${gnupg_SSH_AUTH_SOCK_by:-0}" -ne $$ ]; then
export SSH_AUTH_SOCK="$(gpgconf --list-dirs agent-ssh-socket)"
fi
export GPG_TTY=$(tty)
gpg-connect-agent updatestartuptty /bye >/dev/null
```
- To use your keys for SSH Auth we'll need to add it to the sshcontrol file
- ```sh
$ gpg --list-keys --with-keygrip
/home/mira/.local/share/gnupg/pubring.kbx
-----------------------------------------
pub ed25519 2023-09-25 [C] [expires: 2024-09-24]
6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9
Keygrip = 929E520FB577F34E064E670A6500B21D4835B226
uid [ultimate] Mira Velturu (GPG Demo) <mira@xn--2dkua.xn--tckwe>
sub ed25519 2023-09-25 [SA] [expires: 2024-09-24]
Keygrip = 25F5E8427F0F9338A00F98225D125C09EAEBFF24
sub cv25519 2023-09-25 [E] [expires: 2024-09-24]
Keygrip = ED48EF4A2FDD7F03F779EC58B06B1AB0F4B75652
```
- `echo 25F5E8427F0F9338A00F98225D125C09EAEBFF24 >> ~/.local/share/gnupg/sshcontrol`
- run `ssh-add -l` to verify
- I couldn't actually get this part working but trust me bro :tm:
- ```sh
$ gpg --export-ssh-key 6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9
ssh-ed25519 AAAAC3NzaC1lZDI1NTE5AAAAIGWaV6YjtxALsgpvSoBtyW1nFaTTifOQKQmmj9bQsrtJ openpgp:0xC6F75FF1
```
- this'll spit out your public SSH Key for the given Key ID
4. Back up your keys and yeet the master key
- ```sh
$ gpg -a --export-secret-keys > master-secret-key.asc
$ gpg -a --export-secret-subkeys > sub-secret-keys.asc
$ gpg --delete-secret-key 6AEDC0D9AD76A6DD613C884958C90C69DF7F1AF9
$ gpg --import sub-secret-keys.gpg
```
- put these two files somewhere safe, like physical media
## Encryption
### Asymmetric
- Okay this one's pretty simple:
- ```sh
$ gpg --recipient user-ids --encrypt doc
```
- this will encrypt `doc` using your private key and the public keys of your recipients
- ```sh
$ gpg --output doc --decrypt doc.gpg
```
- this will decrypt `doc.gpg` if you have a matching private key
### Symmetric
- Even easier, no keys required
- ```sh
$ gpg -c doc
```
- this will encrypt and decrypt `doc` using a pre-shared key
### Signing
- Don't @ me I know this isn't actually encryption, but being able to provide signatures is important since it'll show a) the file comes from you, and b) the file hasn't been tampered with or corrupted
- ```sh
$ gpg --output doc.sig --sign doc
```
- this'll attach the signature to your file and output a compressed version
- I don't really recommend this since `doc.sig` will be a binary blob
- if you want to not compress this and leave the contents of `doc` readable in `doc.sig` use `--clearsign` instead of `--sign`
- ```sh
$ gpg --output doc.sig --detach-sig doc
```
- This will put just the signature into `doc.sig` which you can send to someone alongside `doc`
- As for verifying signatures, just do
- ```sh
$ gpg --verify doc.sig
```
- If this is a detached signature, make sure `doc` is in the same folder
---
## ETC
- By convention, encrypted files end in `.gpg` if they are binary data, or `.asc` if stored with ASCII Armor (which is basically just base64)
- `$ gpg --list-keys`: list pubkeys in your keyring
- `$ gpg --list-secret-keys`: list private keys in your keyring
- `$ gpg --export --armor --output public-key.asc [email or key ID]`: output your pubkey
- `$ gpg --import public-key.asc`: import a pubkey
- `$ gpg --gen-revoke --armor --output revcert.asc [email or key ID]`: output your revocation key
- `$ gpg --keyserver keyserver.ubuntu.com --send-keys [key ID]`: to send your public key to the ubuntu keyserver
- this seems to be the most popular one, keybase.io also exists among others
-
---
## Troubleshooting
- if you run into issues with it not prompting for a password or see `no pinentry`
- try adding `--pinentry=loopback` as a flag for gpg
- for a permanent fix, look into adding a config option in `gpg-agent.conf`
- honestly this should really be a `TODO` cause pinentry is its own mess
---
## References
- Adapted from https://gist.github.com/mcattarinussi/834fc4b641ff4572018d0c665e5a94d3
- https://wiki.archlinux.org/index.php/GnuPG

View file

@ -0,0 +1,145 @@
---
draft: false
summary: You know what, fuck you _rotates your interest rates 90°_
title: Hypercomplex Interest
date: 2024-07-20
---
You know what, fuck you _rotates your interest rates 90°_
>[!NOTE] This web version is still kind of a mess but the [PDF version](https://argentumcation.com/hypercomplex.pdf) is a bit more complete
-----
# Compound Interest
Y'all remember this from like 4th grade right, I barely do so here's a refresh
$$ z = Pe^{rt} $$
- $P$ is your principal, or how much money you initially put in or took out
- $r$ is the interest rate, you want this to be low if you're borrowing and high if you're lending
- $t$ is time, unless you have a TARDIS, this one is pretty out of your control
- $z$ is how much money you owe/are owed, I know this isn't the standard variable name but bear with me
Now let's make it spicy
---
# Complex Interest
Who says you need to have a real number for your interest rate? The Fed moves interest rates up and down all the time, when will those cowards start moving it left and right.
But first, what does it mean to move money to the left? \[Vsauce Sting]
Let's keep things simple for now and just rotate it around 0 like it's a circle
![The quantity $2 rotated 45 degrees about the origin, yielding a complex amount of money](Pasted%20image%2020240926154326.png)
We can represent this as a complex number in the form $z=Pe^{i\theta}$, where $\theta$ is some angle.
Hold on a second this looks kinda like the the interest rate formula from earlier. Let's add in time as a factor to get: $z=Pe^{i\theta t}$.
Okay so we can see that this is basically just compound interest with an interest rate of $\theta$.
What does this even mean, can I use this to get out of student loans? Do I owe MOHELA imaginary money?
Well I left out an important detail, $Pe^{i\theta}=P\cos(t\theta)+iP\sin(t\theta)$
The proof is trivial and would be left as an exercise to the reader but unfortunately I need to use it later on so here's why this works:
> [!TODO] Explain Euler's Identity here
So let's say I owe 1,000 USD at a 5% interest rate (I wish lmao), that would look like:
> [!TODO] Todo
That makes sense, but now let's look at what happens if we do $5i\%$
![A graph of compound interest at 5% vs 5i% interest rates](Pasted%20image%2020240926123001.png)
Well the real part ends up being
$$\Re(z)=P\cos(\frac\pi 2rt)$$
And the imaginary part ends up being
$$\Im(z)=P\sin(\frac\pi 2rt)$$
So if I wait about 30 years after my initial loan, I can owe none money with left bread, if I wait 60 years, MOHELA needs to double my money for free.
Honestly I think the stock market is a better investment strategy. But that seems a bit too based either way, so no wonder I can't get my loans refinanced like this
Hm.
_Morpheus voice_ what if I told you there's more than one way to rotate a cow?
> [!TIP] Okay listen closely because this next part is how I got my partner to fall for me
# Split-Complex Interest
Normally when you rotate something you move it in a circle, which is cool and all, but what if you can rotate it in the opposite of a circle?
![The quantity $2 hyperbolically rotated about the origin by 45 degrees, yielding a split-complex value](Pasted%20image%2020240926154245.png)
Introducing: the Hyperbola
![The unit circle (red), alongside the unit hyperbola(green)](Pasted%20image%2020240926154035.png)
So with the unit circle we had an equation like $x^2+y^2=1$, well there's a unit Hyperbola too and the equation for that is $x^2-y^2=1$.
There's actually a lot more stuff that circles have that have a hyperbolic equivalent.
Remember $\sin$ and $\cos$? There's also a $\sinh$ and $\cosh$, don't ask me to explain these because we didn't cover them at all in high school.
Here's the big one that we care about though, we know multiplying something by $i$ rotates it around a circle, there's actually a $j$ that rotates something around a hyperbola.
But what exactly is this mysterious $j$?. It's shrimple as really, $j=\sqrt{1}$.
> [!QUOTE] Isn't that just 1?
No. don't think about it too hard
> [!QUOTE] So what does $e^{\theta j}$ break down into, if anything?
I wouldn't be asking this rhetorical if there wasn't a semi-interesting answer
It's actually $Pe^{j\theta t} = P\cosh(t\theta)+jP\sinh(t\theta)$
# Dual Interest rates
Okay this one isn't as interesting but I want to include it for completeness,
We have $i=\sqrt{-1},\ j=\sqrt{1}$, now get ready for $\varepsilon=\sqrt{0}$. I guess was taken when they invented this one?
> [!Todo] todo
while we're on the topic of dual numbers, lets try shoving $x+\varepsilon$ into some functions for shits and giggles:
$$(x+\varepsilon)^2=x^2+2x\varepsilon+\varepsilon^2=2x\varepsilon$$
> [!quote] Okay that was a waste of time, was that supposed to be interesting?
Yes. I'm getting there
$$\sin(x+\varepsilon)=(x+\varepsilon)-\frac{(x+\varepsilon)^3}{3!}+\frac{(x+\varepsilon)^5}{5!}\ldots$$
Okay now lets expand that out
$$=(x+\varepsilon)-\frac{x^3+3x^2\varepsilon+3x\varepsilon^2+\varepsilon^3}{3!}+\frac{x^5+5x^4\varepsilon+10x^3\epsilon^2+10x^2\varepsilon^3+5x\varepsilon^4+\varepsilon^5}{5!}\ldots$$
of course $\varepsilon$ to powers higher than 1 just ends up being zero so we can simplify this monstrosity down to
$$=x+\varepsilon-\frac{x^3+3x^2\varepsilon}{3!}+\frac{x^5+5x^4\varepsilon}{5!}$$
...except this still doesn't mean too much, lets try factoring $\varepsilon$ out
$$(x-\frac{x^3}{3!}+\frac{x^5}{5!}+\ldots)+\varepsilon(1-\frac{x^2}{2!}+\frac{x^4}{4!})$$
$$=\sin(x)+-\cos(x)\varepsilon$$
> [!QUOTE] Hold on, what the shit? we the 'imaginary' part is the derivative?
Yeah actually. If you remember back to 8th grade,
$$f'(x)=\frac{d}{dx}f(x)=\lim_{h\to0}\frac{f(x+h)-f(x)}{h}$$
We can kinda replace $h\to 0$ here with $\varepsilon$ since it's basically an infinitely tiny number that's not zero or negative, which gives us
$$f'(x)=\frac{f(x+\varepsilon)-f(x)}{\varepsilon}$$
> [!note] Dividing by $\varepsilon$ is sus as fuck, but just bear with me here
$$\varepsilon f'(x)=f(x+\varepsilon)-f(x)$$
$$f(x+\varepsilon)=f(x)=\varepsilon f'(x)$$
There you go, typesetting this was a bitch.
# Errata
## Matrix Representations
Fun fact, you can also represent $i,j,\varepsilon$ as matrices too
Its already kinda standard to use $\begin{bmatrix}1&0\\0&1\end{bmatrix}$ to cast real numbers into 2D matrices, but there's two zeros in there doing nothing, maybe we can yoink those for real estate.
Introducing:
$$i=\begin{bmatrix}0&1\\-1&0\end{bmatrix},\ j=\begin{bmatrix}0&1\\1&0\end{bmatrix},\ \varepsilon=\begin{bmatrix}0&1\\0&0\end{bmatrix}$$
These versions actually obey the same multiplication rules as our original derivations of the hypercomplex numbers. Now we can turn something like $6+3j$ into $\begin{bmatrix}6&3\\3&6\end{bmatrix}$
## Colors
As somewhat of a convention, I use red, green, and blue in this post to differentiate between graphs relating to complex numbers, split-complex numbers, and dual numbers respectively
## Honey, I broke the concept of division!
Yeah... division doesn't really work right when you bring $j$ and $\varepsilon$ into the mix since you can multiply non-zero stuff and get zero out
$$\frac{1}{1+j}\cdot\frac{1}{1-j}=\frac{1}{1-j^2}=\frac{1}{1-1}=\frac10$$
$$\frac 1\varepsilon \cdot \frac 1\varepsilon=\frac 1{\varepsilon^2}=\frac 10$$

Binary file not shown.

After

Width:  |  Height:  |  Size: 71 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 46 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 58 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 82 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 59 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 47 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 1.3 MiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 69 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 5.4 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 120 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 16 KiB

View file

@ -0,0 +1,303 @@
---
title: Foss and Non-FOSS Licenses that may be worth looking into
draft: false
date: 2025-10-05
---
>[!NOTE] This web version is still kind of a mess but the [PDF version](https://argentumcation.com/licenses.pdf) is a bit more complete
# What's a License
- Copyright law is a bitch
- Posting your stuff online is a bitch
- Basically, licensing is you telling other people what they can and can't do with your stuff
- By default, your stuff is under All Rights Reserved, which means you own it and nobody is allowed to share it or modify it or whatever
- in practice, that's probably not gonna stop anyone until you get lawyers involved
- Restrictive licenses typically mean that they force people downstream to protect certain freedoms (like being able to distribute your stuff)
- Conversely, permissive licenses give downstream people more control over what they do with your crap (like making their own private version and selling it or some shit)
- Big companies generally will only let you use stuff that's under permissive licenses
- Royalties are basically a subscription fee to use copyrighted works
# FOSS Licenses
- https://choosealicense.com/ is a good resource
- https://interoperable-europe.ec.europa.eu/collection/eupl/solution/licensing-assistant/find-and-compare-software-licenses is a more thorough option
- https://spdx.org/licenses/ is gonna be the most thorough source
## FOSS Freedoms
As outlined by Stallman himself, defines what's open source or not
![](Pasted%20image%2020250917211537.png)
0. The freedom to run the program as you wish, for whatever purpose.
- I should be able to do whatever the fuck I want with the program
1. The freedom to study the program's “source code,” and change it, so the program does your computing as you wish. Programs are written by programmers in a programming language—like English combined with algebra—and that form of the program is the “source code.” Anyone who knows programming, and has the program in source code form, can read the source code, understand its functioning, and change it too. When all you get is the executable form, a series of numbers that are efficient for the computer to run but extremely hard for a human being to understand, understanding and changing the program in that form are forbiddingly hard.
- Your code is shit, and you are shit, allow me to fix your shit for my own sanity
2. The freedom to make and distribute exact copies when you wish. (It is not an obligation; doing this is your choice. If the program is free, that doesn't mean someone has an obligation to offer you a copy, or that you have an obligation to offer him a copy. Distributing a program to users without freedom mistreats them; however, choosing not to distribute the program—using it privately—does not mistreat anyone.)
- I get to give your program to whoever the fuck I want, but with the same license
3. The freedom to make and distribute copies of your modified versions, when you wish.
- Once I have modified your shit, I should be able to give it away if I want
---
- All of the ones in this section require
- Commercial use: you gotta be able to sell this shit
- Distribution: woe, my software be upon ye
- Modification: woe, they made horny fanfic of my software
- Private Use: idc what you do with my software behind closed doors
----
## GPL: The GNU Pubic License
These come straight from Richard Stallman's sweat glands
- [x] [GPLv2](https://www.gnu.org/licenses/old-licenses/gpl-2.0.en.html#SEC1)
- Like the original Copyleft license at this point
- To plagiarize Wikipedia: Copyright forbids changing stuff and giving it to others, Copyleft forbids forbids changing stuff and giving it to others
- What happened to GPLv1? I don't know and I don't care, I'm gregnant, hungry and procrastinated writing this talk so you don't get journalistic excellence
- Here's the gist of it
- No Warranty: If you fuck up, it's not my problem
- No Liability: I'm not liable for whatever crimes against humanity you do with this
- Disclose Source: Put your code somewhere where people can see it*
- there's no definition of what this actually means so like if you distribute the source code over telegraph that's probably allowed
- License notice: When you distribute this program, you gotta keep a copy of this license handy
- Same license: If you modify this program, you gotta keep this license
- State changes: If you modify this program and distribute it, you gotta say what you changed
- If GPLv2 is so good, why is there no GPLv3
---
- [x] [GPLv3](https://www.gnu.org/licenses/gpl-3.0.html#license-text)
- I'm glad you fucking asked
- Back in ye olde days of like 2007 (jesus christ were some of you even born back then?) there was this company named TiVo, that shipped boxes with DRM to prevent users from running modified software
- In an absolutely based move, GNU was like fuck this and made GPLv3
- The tl;dr of the patch notes are
- Users have to be able to run modified versions of GPLv3 software on hardware
- Bans DRM
- If you put patented code into a GPLv3 codebase, you automatically allow contributors to use your patent
- Makes it easier to interop wth other licenses
- ![](Pasted%20image%2020250918100952.png)
- ie you can combine GPLv2+ and GPLv3, but not GPLv2
------
- [x] [AGPLv3](https://www.gnu.org/licenses/agpl-3.0.en.html)
- The A stands for Affero, which was the name of the company that made this license
- Basically the exact same as GPLv3 except if the software runs over a network, that counts as distributing
- as such, you need to offer up the source code
- notable examples include grafana and mastodon
- this is probably the most restrictive open source license
----
- [x] [LGPLv3](https://www.gnu.org/licenses/lgpl-3.0.en.html)
- The L does not in fact stand for taking the L, it stands for Lesser
- Basically if you have a proprietary program you can still link against an LGPL library (ie `*.so` or `*.dll`)
- if you modify an LGPL library, you still need to release the source code
## BSD
- These are relatively permissive licenses, originally used for BSD itself
- Unlike with GPL, the number after BSD indicates the number of clauses, as opposed to the version number
- [x] [BSD-4](https://spdx.org/licenses/BSD-4-Clause.html)
- This is the original license, but not super common, choosealicense.com has two dead projects and some random java library as examples
- the actual license is pretty short but here's the summary
- Redistributions must include the copyright notice
- You can't use the names of contributors/copyright holders to promote derivatives
- All advertisements that mention the software or features must say "This product includes software developed by \[project]"
- people had an issue with this clause, which led to the creation of
- [x] [BSD-3](https://opensource.org/license/bsd-3-clause)
- This is the default BSD license
- It's the same one as BSD-4 removes the pesky requirement to cite the people you stole code from in your ads
- [x] [BSD-2 (Simplified)](https://opensource.org/license/bsd-2-clause)
- Apparently not being able to slap Hexley's face on derivative software is a deal breaker for some people
- I've been informed that Hexley is the Darwin mascot, not the BSD one
- Foreshadowing is a literary technique in which
- This led to the creation of BSD-2, which only requires you to include the copyright notice when redistribute the code/program and that's literally it
- This is nearly the exact same thing as the ISC license if you see that anywhere
- [x] [BSD-2-Clause-Patent]()
- Same as above except gives you the patent grant, which means contributors and users get to use any patents involved in making this
- [x] [BSD-1]()
- So apparently this exists? same as BSD-2 except you only need include the license with source code
- [x] [BSD-0](https://opensource.org/license/0bsd)
- Okay so apparently INCLUDING THE FUCKING LICENSE was too much for some fuckers, so BSD-0 was created
## CC
- Creative Commons licenses are a group of licenses that are intended sit between All Rights Reserved and Public Domain, these ones are considered open source, the non open sources
- While most of the other licenses in this talk are primarily focused on software, CC licenses are used for basically everything,
- This talk itself is CC-BY-NC-SA 4.0, and the images I stole from wikipedia are probbaly under some other CC license
- The Stallman pic at the beginning of this talk is CC-BY-SA 4.0, if you can find a way to make money off that shit, be my guest
- [x] [CC-BY-4.0](https://creativecommons.org/licenses/by/4.0/)
- Do whatever the fuck you want, just credit me
- [x] [CC-BY-SA 4.0]
- Same as above but you gotta use the same license on derivatives
- This is the most common CC license
- [x] [CC0](https://creativecommons.org/publicdomain/zero/1.0/)
- Do whatever the fuck you want, period
- it's public domain
- this license only exists because some places don't have a concept of you putting your work into the public domain
## The Permissive Twins
- [x] [Apache](https://www.apache.org/licenses/LICENSE-2.0)
- If there's a NOTICE file in the original work, you gotta keep it in the derivatives
- this don't need to contain any legal stuff, you can put whatever the fuck you want in there, like the bee movie script
- any unmodified parts of the codebase need to remain under the Apache license
- if you modify it, anything goes
- any contributions to an apache licensed codebase are under the same license unless otherwise stated
- also does the whole patent grant thing, so you can use any patents that are already in the codebase
- oh yeah, you also need to state any changes you make
- you can combine this stuff with GPLv3 as long as the result is GPLv3
- It's not compatible with GPLv2 unless you add:
- [LLVM exception](https://spdx.org/licenses/LLVM-exception.html)
- this basically just lets you link against anything with this exception included
- If you're gonna use a permissive license, FSF would rather it be this one
- [x] [MIT](https://opensource.org/license/mit)
- The other big permissive license
- The most popular license on GitHub
- Basically if you redistribute the software or any big chunks of it, include the license
- past that just do whatever dude
- there's also the MIT-0 variant which doesn't even require including the license
- does not include a patent grant, unlike Apache, so I guess you can get sued for using patented stuff in/from an MIT license codebase
## Other
- [x] [EUPL 1.2](https://interoperable-europe.ec.europa.eu/sites/default/files/custom-page/attachment/2020-03/EUPL-1.2%20EN.txt)
- The most popular license on GyattHub
- Mr. Worldwide, the software license
- available in 23 languages
- compatible with GPL/AGPL/MPL/LGPL/APL/JPL/Both IPLs/VPL/BNPL/WTFPL and what have you
- Similar to AGPL, counts network use as distribution, and requires you to distribute source for it
- Similar to LGPL, you can link against an EUPL library regardless of what your software license is
- Another unique thing about this license is that you can't charge royalties for anything under this license
- [x] [MPL](https://www.mozilla.org/en-US/MPL/)
- Used for Firefox and Thunderbird, written by CEO of Mozilla herself
- also used in Cemu, LibreOffice, and Syncthing
- lets you use MPL code in proprietary products as long as you keep the code separate and MPL stuff stays open source
- Other than that it's basically your standard copyleft license and is compatible with GPL
- [x] [WTFPL](https://www.wtfpl.net/about/)
- You just DO WHAT THE FUCK YOU WANT TO.
- [x] [Unlicense]
- Another license in the "do whatever the fuck you want, it's public domain" category
# Source-Available / Non-FSF Approved Licenses that may be worth looking into
Somewhat distilled from [FSF's List](https://www.gnu.org/licenses/license-list.en.html)
- [x] [Aladdin Free Public License (AFPL)]
- Derived from GPL
- must include source code
- may not be sold, including fees related to distributing
- [x] [Anti-996 License](https://github.com/kattgu7/Anti-996-License)
- So back in the old <ruby><rp>(</rp><rt>zhōng</rt><rp>)</rp></ruby> of <ruby><rp>(</rp><rt>guó</rt><rp>)</rp></ruby>, there was this thing called the 996 system, in which you work from 9am to 9pm 6 days a week
- This fucking sucks so they made a license to stop it
- It's basically the MIT License except you gotta comply with 'Core International Labor Standards', whatever that means
- [x] [Anti-Capitalist Software License](https://anticapitalist.software/)
- You gotta include a copy of the license text
- If you're an individual, educational institution, co-operative, or non-profit, you can use this software
- If the user is an organization with owners, the workers are all owners with equal equity and votes
- If the user is an organization, they can't work with law enforcement or the military
- [x] Artistic license
- Not that important except GNU calls it "Too clever for its own good" which I thought was funny
- I can't even find a link for this
- [x] [BSD-3-Clause-No-Nuclear-Warranty]
- My sanity dwindles on this accursed night as I write about a Non-FOSS BSD license
- This is literally just BSD-3 but you can't use it in nuclear facilities
- It's like BSD-3 except when you violate this license, George W Bush himself will appear behind you and rectally administer Stuxnet with no regard for the Geneva Suggestions
- [x] [Business Source License (BUSL/BSL)](https://mariadb.com/bsl/)`
- From the makers of MariaDB
- Can't make money off of this stuff without permission
- If you want to make money off of the work, get a commercial license
- 4 years after publication, or whenever the author says, the work converts to a GPLv2 compatible license
- [x] [Code Project Open License (CPOL)](http://www.codeproject.com/info/cpol10.aspx)
- Can use source or binaries in your own work
- can do bugfixes
- remixes keep this license, and state changes
- can't publish your derivative without permission from author
- can't distribute without permission, author keeps copyright of the work
- you can't take credit for the work
- can't use the author's name to adveritse
- can't sell the work
- you can distribute in aggregate for money
- can't use the work for "illegal, immoral or improper purposes"
- [x] [Commons Clause](https://commonsclause.com/)
- Its not actually a license on it's own
- just add it onto your main license
- basically says there's no way for anyone to make money off of this
- [x] [Functional Source License](https://fsl.software/)
- Converts to Apache or MIT after 2 years
- can't use the code to make a competing product
- can't use the code for commercial purposes
- [x] [The Hippocratic License](https://firstdonoharm.dev/)
- This one is pretty modular actually
- no charge, no royalty, can remix/redistribute etc, has patent grant
- Here's the spicy part:
- Default requirements:
- Don't murder people
- Don't slavery
- Don't child labors
- No Cruel and Unusual Punishment
- No racism/sexism/etc
- Right to a fair trial?
- No search and seizure without a warrant or random arrests?
- No invasions of home or privacy, or communications
- No eminent domain
- No Trail of Tearsing people
- No unionbusting
- No hurting the environment
- equal pay for equal work
- reasonable working hours and periodic paid holidays
- Verify your supply chain
- Optional requirements
- Don't be a fossil fuel company
- No hurting the environment (again?)
- No mineral or fossil fuel mining
- Don't be on the BDS list
- Don't be the Taliban
- Don't be the Myanmar government
- Don't do business in/with the Xinjiang Uygur Autonomous Region of China?
- Don't have beef with Customs and Border Protection for Forced Labor
- Don't do mass surveilance
- Don't be a military
- Don't be law enforcement
- Don't be a media entity that promotes violence
- Don't unionbusting (again?)
- [x] [Hacktivismo Enhanced-Source License Agreement (HESSLA)](https://cultdeadcow.com/hacktivismo/hessla.html)
- Even the author has to follow the license rules
- wtf happens if the author violates the license?
- source code is always available from author
- can remix/distribute
- can charge money to perform/display/transmit the work
- can offer warranty for a fee
- no royalties
- Don't commit human rights violations with this
- Don't help other people commit human rights violations
- [x] [The JSON License](https://www.json.org/license.html)
- basically just the regular boilerplate
- The body of this license fits in one line "The Software shall be used for Good, not Evil."
- IBM asked for an exemption from that
- it was granted
- [x] [Peer-Production License](https://wiki.p2pfoundation.net/Peer_Production_License#LICENSE)
- Intended more for art and theatre than software
- You use/share/modify the work noncommercially
- Co-ops can use the work commercially
- Derivatives must be under a compatible license
- Keep the license on hand
- [x] [Server Side Public License]("https://www.mongodb.com/licensing/server-side-public-license")
- Clarified version of AGPL used by MongoDB
- If software is offered as a service, the entire stack source must be available
- third party forks should be able to interact with the original work
- Considered "discriminatory" to people who use proprietary software in their stack, since every part of the stack needs to be open sourced
- [x] [The Hexley License](http://www.hexley.com/license.html)
- WHY THE FUCK DOES APPLE HAVE A FUCKING LICENSE FOR ITS FURSONA
- WHY DOES APPLE HAVE A FURSONA
- WHY THE FUCK dO I HAVE The LICENSE FOR A NON-FOSS FUCKIGN FURSONA IN MY PRESENTATION
- You need to include the copyright statement somewhere
- If you want to mass produce merch, you need to request permission from the copyright holders
- derivatives must be related to original work
- derivatives should also should not "dilute the quality" of the work
- IT'S ONE AM AND THEY HIT THE SECOND FUCKING BRAINCELL
- I AM HAVING A DTROKE APPLE NAS TEO FURSONAE
- [x] [SIL Open Font License](https://openfontlicense.org/documents/OFL.md)
- I thought this was FOSS until I wrote this section actually
- This is actually a license for fonts specifically
- I actually had to look at this yesterday night to see if I could license a shitpost under GPL
- I still have no idea because I can't fucking find out the copyright for emoji kitchen stuff, but I'm tempted to PR this into GNU netcat
- nevermind it's on SVN
- You can't sell the font or modified versions or any part of the font by itself
- You can bundle the font with whatever you want as long as you attach the license
- Derivatives have to use a different name unless they get permission
- Don't use the copyright holders name to promote your derivative without permission (like BSD-4)
- The entire font and derivatives must be under this license, does not apply to documents using this font
## CC
- [x] [CC-BY-NC-SA](https://creativecommons.org/licenses/by-nc-sa/4.0/)
- Do whatever the fuck you want just credit me
- Don't sell my shit
- Don't put more restrictions on my shit
- If you use my shit to make more shit, you gotta keep my license
- Second most common non-FOSS CC license
- [x] [CC-BY-ND](https://creativecommons.org/licenses/by-nd/4.0/)
- Share it with whoever the fuck you want, just credit me
- If you fuck with my shit you can't share it
- Don't put more restrictions on my shit
- By far the least common CC license, FOSS or otherwise
- [x] [CC-BY-NC-ND](https://creativecommons.org/licenses/by-nc-nd/4.0/)
- Basically the last two combined
- Don't remix my shit, don't make money off my shit'
- This is the most common non-FOSS CC license, and the 2nd most common CC license in general

View file

@ -0,0 +1,45 @@
---
title: Modern Unix Tools
draft: true
subtitle: someone suggested I name this "Modern Modern Unix Tools"
---
- bat
- `tail -f | bat --paging=never -l log`
- gdu
- neovim
- fd
- lazygit
- lsd
- nix
- okay I'm sure people are gonna roast me for this one but, as someone who uses Alma 8 and Ubuntu LTS at work, so using nix-env as a package manager is a lifesaver
- zoxide
- yazi
- xonsh / nushell
- viddy
- uv
- thefuck
- zellij
- ouch
- sheldon
- ruff
- ripgrep
- ugrep
- meld
- uutils hashing
- uutils cp/mv
- difft
- just
- jj
- ~~mirafetch~~ hyfetch
- hyperfine
- gum
- fzf
- age
- tokei
- glow
- duf
- nala
- cliphist
- chezmoi
- btdu

View file

@ -0,0 +1,146 @@
---
pubDate: "2024-07-01"
summary: The definitive watch order for the Monogatari Series (unfortunately)
title: Monogatari Series Watch Order
---
<script type="module">
import mermaid from 'https://cdn.jsdelivr.net/npm/mermaid@11/dist/mermaid.esm.min.mjs';
</script>
```mermaid
---
title: Monogatari Watch Order
---
flowchart TB
katana["Katanagatari"] --> S1_1
subgraph S1_1["Season 1: Part 1"]
Bakemonogatari -->
Kizumonogatari
end
S1_1 --> ore["Ore Monogatari!!"] --> S1_2
subgraph S1_2["Season 1: Part 2"]
Nisemonogatari -->
kuro["Nekomonogatari (Black)"]
end
S1_2 --> S2_1
subgraph S2_1["Season 2: Part 1"]
shiro["Nekomonogatari (White)"] -->
Kabukimonogatari
end
S2_1 -->
Hanamonogatari --> S2_2
subgraph S2_2["Season 2: Part 2"]
Otorimonogatari -->
Onimonogatari -->
Koimonogatari
end
S2_2 --> S3 --> off --> monster
subgraph S3["Final Season"]
Tsukimonogatari -->
Koyomimonogatari -->
Owarimonogatari -->
zoku["Zoku Owarimonogatari"]
end
subgraph off["Off Season"]
Orokamonogatari -->
Wazamonogatari -->
Nademonogatari -->
Musubimonogatari
end
subgraph monster["Monster Season"]
Shinobumonogatari -->
Yoimonogatari -->
Amarimonogatari -->
Ougimonogatari -->
Shinomonogatari
end
silmarillion["The Silmarillion"]
silmarillion --> lotr
subgraph lotr["The Lord of the Rings"]
fellowship["The Fellowship of the Ring"] -->
towers["The Two Towers"] -->
return["The Return of the King"]
end
notebook["The Notebook"] --> lw
subgraph tkam["To Kill a Mockingbird"]
tkam_1["To Kill a Mockingbird"] -->
gsam["Go Set a Watchman"]
tkam_1 --> x["To Pimp A Butterfly"]
end
beedle["The Tales of Beedle the Bard"]
subgraph HP["Harry Potter"]
hp1(["Philosopher's Stone"]) -->
hp2(["Chamber of Secrets"]) -->
hp3(["Prisoner of Azkaban"]) -->
hp4(["Goblet of Fire"]) -->
hp5(["Order of the Phoenix"]) -->
hp6(["Half-Blood Prince"]) -->
hp7(["Deathly Hallows"]) -->
hp8(["Cursed Child"])
end
beedle --> HP --> hm --> silmarillion
attc["A Tale of Two Cities"]
garf(["Garfield"]) -->
attk(["A Tale of Two Kitties"])
attc --> attk -->
Otoyomegatari -->
handmaid["The Handmaid's Tale"]
canturbury["The Canturbury Tales"] -->
nights_0["1001 Arabian Nights"] -->
nights_1(["NiGHTS Journey of Dreams"]) -->
nights_2["NiGHTS Journey of Dreams"] --> kirby -->
Maus
subgraph kirby["Kirby Series"]
dl(["Kirby's Dream Land"]) -->
adv["Kirby's Adventure"]
end
kirby --> decameron
decameron["The Decameron"] -->
cs["Cave Story"] -->
Genjimonogatari -->
wss["West Side Story"] -->
yearling["The Yearling"]
subgraph musket["The d'Artagnan Romances"]
ttm["The Three Musketeers"] -->
tya["Twenty Years After"] -->
tvb["The Vicomte of Bragelonne"]
end
subgraph lw["Little Women"]
lw_1["Little Women"] -->
lw_2["Little Men"] -->
lw_3(["Jo's Boys"])
end
musket --> Heikemonogatari --> beedle
bb["Black Beauty"]
joseph["Joseph: King of Dreams"] -->
pkmn["Pokémon the Movie: The Power of Us"] -->
Metamorphoses
tramp["Lady and the Tramp"]
subgraph narnia["The Chronicles of Narnia"]
n1["The Magician's Nephew"] -->
n2["The Lion, the Witch and the Wardrobe"] -->
n3["The Horse and His Boy"] -->
n4["Prince Caspian"] -->
n5["The Voyage of the Dawn Treader"] -->
n6["The Silver Chair"] -->
n7["The Last Battle"]
end
subgraph hm["Harvest Moon"]
hm1["Harvest Moon"] -->
hm2["Harvest Moon 2"] -->
hmb["Harvest Moon: Back to Nature"] -->
hm3["Harvest Moon 3"]
end
Hyakumonogatari
ember["The City of Ember"] --> joseph
neverending["The Neverending Story"] --> narnia -->
rcr["River City Ransom"] --> bb --> ember
lotr --> Hanamonogatari
attk --> canturbury
lw --> neverending
Maus --> Hyakumonogatari --> tkam --> silmarillion
Metamorphoses --> beedle
tramp --> garf
handmaid --> musket
```

View file

@ -0,0 +1,45 @@
---
draft: true
---
# Non-FSF-Approved Software Licenses
- [Aladdin Free Public License](https://spdx.org/licenses/Aladdin.html)
- Can't charge for distribution
- Makes it harder to ship Aladdin software with commercial software
- [Anti-996 License](https://raw.githubusercontent.com/kattgu7/Anti-996-License/master/LICENSE)
- Modified from MIT License
- Requires users to comply with International Labour Organization standards and local labor laws
- [Anti-Capitalist Software License](https://anticapitalist.software/)
- Does not require releasing source
- Allows for commercial use
- [Artistic License 1]()
- [Code Project Open License, v1.02]()
- [Commons Clause]()
- [CNRI Digital Object Repository License Agreement]()
- [The Hippocratic License 1.1]()
- [GPL for Computer Programs of the Public Administration]()
- [Hacktivismo Enhanced-Source Software License Agreement]()
- [Jahia Community Source License]()
- [The JSON License]()
- [License of Lha]()
- [Microsoft's Shared Source CLI, C#, and Jscript License]()
- [NASA Open Source Agreement]()
- [Open Public License]()
- [Peer-Production License]()
- [Personal Public License v3a]()
- [Reciprocal Public License]()
- [Simple Machines License]()
- [Sun Community Source License]()
- [Sun Solaris Source Code]()
- [Server Side Public License]("https://www.mongodb.com/licensing/server-side-public-license")
- Clarified version of AGPL used by MongoDB
- If software is offered as a service, the service stack source must be available
- [Sybase Open Watcom Public License v1]()
- [SystemC “Open Source” License, v3]()
- [Truecrypt license 3]()
- [University of Utah Research Foundation Public License]()
- [YaST License]()
- [Open Content License, v1](https://web.archive.org/web/19981206111937/http://www.opencontent.org/opl.shtml)
- [CC-BY-NC](https://creativecommons.org/licenses/by-nc-nd/4.0/)
- [CC-BY-ND](https://creativecommons.org/licenses/by-nc-nd/4.0/)

View file

@ -0,0 +1,66 @@
---
draft: true
title: What the fuck is a number?
---
# What the fuck is a number?
Okay so like this _should_ be an easy enough question to answer, but of course it isn't cause when is anything ever simple on this godforsaken plane of existence.
## Naturals
Let's start with the caveman shit, **Natural Numbers ($\mathbb{N}$)** (god I really hope latex renders here). This is the stuff every 3 year old knows, $1,2,3,\ldots$. Seems basic enough because it is.
Just fucking kidding is $0$ a natural number? who knows, I sure as shit don't.
Also, like what exactly _is_ $0$ or $1$?
> I mean if we want to use the Zermelo-Fraenkel definition, $0 = \{\}, 1 = \{0\}, 2 = \{0,1\}, \dots$ ad absurdum
## Ordinals
Okay so baby steps, now that we have some semblance of a place to start, we can move onto the **ordinals**. The ordinals are basically numbers used for putting things in order. How are they different from the naturals?
Short answer: they aren't
Long answer: ...for finite numbers
## Cardinals
### Aleph and Beth
## Zero
## Integers
## Rationals
## Algebraics?
## Reals
## Complex Numbers
### Vectors
### Matrices
## 2D Hypercomplex
## Quaternions
## Octonions and Sedenions
## RGB
### Color Charge
## Surreal Numbers
## Algebraic Structures
## p-adics
# Conclusion
> Q: What the fuck is a number?
> A: A miserable pile of math

View file

@ -0,0 +1,39 @@
---
draft: true
---
- 87G8P632+H8X2Q262
- 87000000+
- P632+
> [!NOTE] foo
> bar
> [!TLDR] foo
> bar
> [!tip] foo
> bar
> [!done] foo
> bar
> [!faq] foo
> bar
> [!WARNING] foo
> bar
> [!fail] foo
> bar
> [!bug] foo
> bar
> [!example] foo
> bar
> [!quote] foo
> bar
> blockquote

View file

@ -0,0 +1,20 @@
---
author: ArgentumCation
pubDate: "2023-03-19"
slug: post-1
title: Generating an SSH Resident Key
---
import { Accordion, AccordionItem } from "accessible-astro-components";
## Here's how to create a resident SSH Key using a security key
```bash
ssh-keygen -t ed25519-sk -Oresident
```
## If that one doesn't work,
```bash
ssh-keygen -t ed25519-sk -Oresident -Oapplication=ssh:key
```

View file

@ -0,0 +1,149 @@
---
author: ArgentumCation
layout: ../../layouts/Layout.astro
pubDate: "2023-04-03"
slug: traefik-setup
title: Getting up and running with Traefik
---
- Okay so you've got a server now and need a reverse proxy
- Traefik is pretty decent at that, it'll set up your HTTPS certs and auto generate routes from your docker images
- only problem is its an absolute bitch to set up
- Here's a stripped down `docker-compose.yml` to give you an idea of how I have it set up
- The end result should be a lighttpd server running on `blog.argentumcation.com`
<!--more-->
```yaml
# Just setting some default values for my containers
x-service_defaults: &service_defaults
env_file: .env
restart: unless-stopped
extra_hosts:
- host.docker.internal:host-gateway
services:
traefik:
<<: *service_defaults
container_name: traefik
env_file:
- .env
# Cloudflare API token to add new paths
- $ENV_DIR/traefik.secrets.env
hostname: traefik
image: traefik:latest
labels:
- traefik.http.services.traefik-docker.loadbalancer.server.port=8080
# For the management interface
- "8080:8080"
# To let traefik receive incoming HTTP traffic
- "80:80"
# To let traefik receive incoming HTTPS traffic
- "443:443"
volumes:
# This lets traefik see your docker services
- $DOCKER_SOCK:/var/run/docker.sock:ro
# Traefik Configs
- $CONF_DIR/traefik/traefik.yml:/traefik.yml
- $CONF_DIR/traefik/traefik_dynamic.yml:/etc/traefik/traefik_dynamic.yml
# Let's Encrypt folder (for storing HTTPS cert related stuff)
- $CONF_DIR/letsencrypt:/letsencrypt
# Example container we're proxying with traefik
lighttpd:
<<: *service_defaults
container_name: public_lighttpd
image: sebp/lighttpd
labels:
# This is the hostname that traefik will proxy to this container
- traefik.http.routers.lighttpd-docker.rule=Host(`blog.$PUBLIC`)
# This is the port the container is listening on, often traefik can detect this
# automatically, but we'll just be explicit here
- traefik.http.services.lighttpd-docker.loadbalancer.server.port=80
```
- `traefik.secrets.env` contains my cloudflare API key so that Traefik can automatically add DNS routes
- For reference, here's my `.env` file
```sh
# GENERAL
PUBLIC=argentumcation.com
TZ=America/New_York
#for container specific env vars
ENV_DIR=./env
CONF_DIR=./config
DOCKER_DIR=/home/mira/docker
DOCKER_SOCK=/var/run/docker.sock
# So my containers run as a non-root user
UID=1000
GID=1000
PUID=1000
PGID=1000
USER_UID=1000
USER_GID=1000
```
- And of course, the actual traefik configuration files:
- `traefik.yml`:
```yaml
accessLog:
filePath: ./traefik-access.log
api:
dashboard: true
debug: true
insecure: true
certificatesResolvers:
letsencrypt:
acme:
dnschallenge:
provider: cloudflare #look, I know, don't judge me
email: [redacted]
storage: /letsencrypt/acme.json
entryPoints:
web:
address: ":80"
forwardedHeaders:
insecure: true
http:
middlewares:
- https_redirect@file
websecure:
address: ":443"
forwardedHeaders:
insecure: true
http:
tls:
certresolver: letsencrypt
domains:
- main: argentumcation.com
sans:
- "*.argentumcation.com"
log:
level: INFO
providers:
docker:
# Routes will be set to [container-name].argentumcation.com by default
defaultRule: Host(`{{ index .Labels "com.docker.compose.service" }}.argentumcation.com`)
endpoint: unix:///var/run/docker.sock
exposedByDefault: true # exposes auto-discovered containers by default, not secure but I'm lazy
network: docker_default
watch: true
file:
directory: /etc/traefik/
watch: true
```
- `traefik-dynamic.yml`
```yaml
http:
middlewares: #This should redirect incoming http connections to https
https_redirect:
redirectscheme:
scheme: https
permanent: true
```

View file

@ -0,0 +1,23 @@
# Created by https://www.toptal.com/developers/gitignore/api/hugo
# Edit at https://www.toptal.com/developers/gitignore?templates=hugo
### Hugo ###
# Generated files by hugo
/public/
/resources/_gen/
/assets/jsconfig.json
hugo_stats.json
# Executable may be added to repository
hugo.exe
hugo.darwin
hugo.linux
# Temporary lock file while building
/.hugo_build.lock
# End of https://www.toptal.com/developers/gitignore/api/hugo
content/.obsidian
content/.trash
static/the-monospace-web/*.jpg
**.sync-conflict*

0
content/art/jojoblade.png Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 397 KiB

After

Width:  |  Height:  |  Size: 397 KiB

0
content/art/twinleaf_pbr.png Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 1.8 MiB

After

Width:  |  Height:  |  Size: 1.8 MiB

0
content/lab-notes/iPod Shuffle 3rd Gen attempts.md Normal file → Executable file
View file

View file

Before

Width:  |  Height:  |  Size: 164 KiB

After

Width:  |  Height:  |  Size: 164 KiB

View file

Before

Width:  |  Height:  |  Size: 110 KiB

After

Width:  |  Height:  |  Size: 110 KiB

116
content/posts/ham.md Normal file
View file

@ -0,0 +1,116 @@
---
draft: true
---
# You're telling me a Ham Fisted this Metaphor?
----
# Amateur Extra
# Rules and Shit (E1)
- **PRB-1** is an FCC document that basically says that localities can't fuck with ham radio equipment (within reason)
- your HOA can't legally do anything about your massive fucking Antenna but they're damn well gonna try
## TV (E2B)
- Cable TV uses the same frequency range as the Amateur 70cm band, so you can fit Fast-Scan TV into the same channels
- what the fuck does this mean (**E2B08**)
- Transmitting on Channel 2 (VHF TV) is illegal for amateurs
- **Upper Sideband (USB)** modulation with a sound card is only used for SSTV
- **NTSC** runs at 525i, 483 of which are visible, the rest is for vsync and other meta stuff
- so basically 480i with extra metadata
## Modes and Procedures (E2D)
- MSK144 is designed for Meteor Scatter
- Contact can be made on VHF up to 1300mi using Meteor Scatter
- APRS (Automatic Packet Reporting System) sends packet data, ie locations/text/weather
- WSPR (Weak Signal Propagation Reporter) is for testing propagation
- Hellschreiber is for some sort of Fax Machine?
## Propagation (E3)
- **Trans-equatorial propagation** can be afternoon or evening
- Afternoon
- 4000-5000 miles
- limited to 60MHz
- High signal strength, but moderate distortion due to multipath bs
- Evening
- Peaks at 7PM-11PM
- Up to 220MHz, sometimes even 432MHz
- quenched(tf does that mean?) by moderate to severe geomagnetic disturbances
- depends on high solar activity
- **Sporadic-E Propagation**
- ~~is what happenes to my endocrine system when I'm on a family trip~~
- is when signals sometimes bounces off the E layer, which gives you less range
- usually the bouncing happens higher (in the F layer), which gives you more range
Happens around solstices, especially summer
## Measuring Stuff (E4A,B)
- **Frequency Counters** depend on the accuracy of the **Time Base**
- aka a **Reference Frequency**
- **Standing Wave Ratio**
- checks for impedance mismatch
- measures ratio of peak to trough in a standing wave(?)
- how do you get a standing wave here?
- can be measured by an **Antenna Analyzer**, **Directional Wattmeter**, or **Vector Network Analyzer**
# Receiving Stuff (E4,C,D,E)
- **Intermodulation** happens when you have two signals with different frequencies passing through a "nonlinear system" (what?), which I guess causes constructive? destructive? interference
- everything is at least a little nonlinear (again what the *fuck* does that mean)
- seems like the base frequencies and all their harmonics join in on the interference, I think it's like some sort of clusterfuck of a beat frequency?
- ![Here's the graph of 270 and 275MHz signals getting intermodulated](Pasted%20image%2020260104133540.png)
- okay so plugging $f\left(k,x\right)=\sin\left(2.7\cdot kx\right)+\sin\left(2.75\cdot kx\right), f\left(1,x\right)+f\left(2,x\right)+f\left(3,x\right)+f\left(4,x\right)+f\left(5,x\right)+f\left(6,x\right)+f\left(7,x\right)$ into desmos looks nothing like this graph so
## Circuit City (E5,6,7)
- Microwave freqs need short connections to reduce phase shift
- what?
- Emitter Follower/Common Collector Amplifier
- has the RX and TX signals in phase
- Has a gain close to 1 (doesn't amplify voltage, but boosts current?)
- ....I'm not actually sure how this works and I'm too sleep to look it up
- **Op-amp**
- Voltage amplifier
- in theory, infinite input impedance, 0 output impedance
- **Parasitic Inductance** is a thing that fucks with Capacitors
- physically bigger capacitors have more of this, tends to cause issues for RF
- Two types of Semiconductors
- N-Type is negative since it has extra electrons
- P-Type is positive since it doesn't have enough electrons
## Digital Signals (E8)
- **Audio Freq Shift Keying (AFSK)** sends beep boops into a transmitter which sends them as AM/FM/SSB/what have you
- if the beep boops are too loud going into the transmitter, shit goes wrong with the Carrier Frequency (Overmodulation)
- This does AoE damage to the band and pisses off everyone whose signal you just interfered with
- tl;dr It's like talking in a room, if you're too loud you'll piss off everyone in the room next to it (okay the metaphor is dogshit but)
- you also need to turn off Automatic Level Control/reduce gain to prevent distortion
- 8-Bit ADC can quantize signal down to 8 bits
- I honestly don't know what you expected
## Antennas (E9)
- Two $\frac14\lambda$ vertical antennas can be used for directionality
- $\frac12\lambda$ apart in phase yields a figure-8 radiation pattern broadsidei to the axis
- if they're out of phase, it's the same pattern along the axis
- $\frac14\lambda$ apart in phase $90\degree$ out of phase is a cardioid
- 160m and 80m Antennas need directivity due to atmospheric noise
- At low HF frequencies, ligthning and other stuff generates RF interference that travels far (due to ionosphere refraction)
- tl;dr Antenna gain isn't gonna do shit to fix the SNR wrt atmospheric noise
- An **Isotropic Antenna** is the spherical cow of the radio world
- **Yagi Antennas**
- ![](Pasted%20image%2020260104130032.png)
- can use a Beta/Hairpin matching system to change the impedance
- involves using a loop (sometimes shaped like a hairpin) across the terminals of the antenna, which makes the coil act as an inductor
- This improves antenna performance by reducing reflections of RF energy back down the TX line
- **Pennant Antenna** is a single-turn terminated loop?
- tf does this look like
- Creates a cardioid radiation pattern
- **Folded Dipole Antenna**
- $\frac12\lambda$ with a wire in parallel connecting both ends
- how is this different than a pennant
- it's literally just a $1\lambda$ wire folded in half
- I can't find a copyright free pic but just imagine the schematic looks goofy
- **Gamma Matching** is when a you (impedance?) match a coax cable to an antenna by connecting the shielding to the center of the antenna and putting the coax conductor some fraction of the wavelength away
- if your impedance is less than 50ohms,this should do the trick?
- I'm gonna be honest I barely understand what impedance is, forget impedance matching
- anyway Yagi Antennas rarely have 50ohm impedance so like gamma matching is good for those
--------
# Technician
- nvm I passed this by grinding [hamstudy](https://hamstudy.org)
- nearly passed the General one too at the same time so uh
- callsign format
- standard 2x3
- `K\w\d\w\w\w`
- vanity 1x3
- `K\d\*\*\*`

Binary file not shown.

After

Width:  |  Height:  |  Size: 18 KiB

Binary file not shown.

After

Width:  |  Height:  |  Size: 712 KiB

0
content/shitposts/.gitattributes vendored Normal file → Executable file
View file

0
content/shitposts/140-2.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 45 KiB

After

Width:  |  Height:  |  Size: 45 KiB

0
content/shitposts/140-3.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 17 KiB

After

Width:  |  Height:  |  Size: 17 KiB

0
content/shitposts/OpenIKEA.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 30 KiB

After

Width:  |  Height:  |  Size: 30 KiB

0
content/shitposts/atashi_lezuda.png Normal file → Executable file
View file

0
content/shitposts/cat.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 12 KiB

After

Width:  |  Height:  |  Size: 12 KiB

0
content/shitposts/cisco_nerv.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 673 KiB

After

Width:  |  Height:  |  Size: 673 KiB

0
content/shitposts/civ_v_ssbu.png Normal file → Executable file
View file

0
content/shitposts/clannad_ssbu.png Normal file → Executable file
View file

0
content/shitposts/cloudbusters.png Normal file → Executable file
View file

0
content/shitposts/contract_baka.png Normal file → Executable file
View file

0
content/shitposts/craig_al_federighi.png Normal file → Executable file
View file

0
content/shitposts/crunchy.png Normal file → Executable file
View file

0
content/shitposts/cubanetes.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 13 KiB

After

Width:  |  Height:  |  Size: 13 KiB

0
content/shitposts/end-my-suffering.mp4 Normal file → Executable file
View file

0
content/shitposts/end_of_pipeline.png Normal file → Executable file
View file

0
content/shitposts/fortinet.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 6.7 KiB

After

Width:  |  Height:  |  Size: 6.7 KiB

0
content/shitposts/fortnite.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 3.8 KiB

After

Width:  |  Height:  |  Size: 3.8 KiB

0
content/shitposts/fux.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 6.2 KiB

After

Width:  |  Height:  |  Size: 6.2 KiB

0
content/shitposts/gordon_freeandopensourceman.png Normal file → Executable file
View file

0
content/shitposts/hilbert_curve.png Normal file → Executable file
View file

0
content/shitposts/ikeablade_chronicles.png Normal file → Executable file
View file

0
content/shitposts/james_stewart_ssbu.png Normal file → Executable file
View file

0
content/shitposts/kulupu_ne.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 513 KiB

After

Width:  |  Height:  |  Size: 513 KiB

0
content/shitposts/kulupu_ne_emosi.png Normal file → Executable file
View file

0
content/shitposts/kyubeynetes.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 321 KiB

After

Width:  |  Height:  |  Size: 321 KiB

0
content/shitposts/lgtm.stl Normal file → Executable file
View file

0
content/shitposts/megastarmiekles.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 23 KiB

After

Width:  |  Height:  |  Size: 23 KiB

0
content/shitposts/meshtastic_pillbox.svg Normal file → Executable file
View file

Before

Width:  |  Height:  |  Size: 1.4 MiB

After

Width:  |  Height:  |  Size: 1.4 MiB

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