Unnamed repository; edit this file 'description' to name the repository.
Log | Files | Refs | README | LICENSE

commit 403a303da03f2995c302531fe9a36648d4de29f1
Author: Jake Bauer <>
Date:   Thu,  9 Feb 2023 18:53:38 -0500

Convert garden to markdown; reset git history

A.gitignore | 6++++++
ALICENSE | 1+ | 5+++++
Aconfig.ini | 6++++++
Acontent/ | 326+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 34++++++++++++++++++++++++++++++++++
Acontent/blog/ | 88+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 272+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 166+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 531+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 81+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 172+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 504+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 230+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 144+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 77+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 24++++++++++++++++++++++++
Acontent/blog/ | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 113+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 93+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 48++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 0
Acontent/blog/ | 127+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 35+++++++++++++++++++++++++++++++++++
Acontent/blog/ | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 119+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/art/ | 27+++++++++++++++++++++++++++
Acontent/garden/arboretum/booknotes/ | 34++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/booknotes/ | 18++++++++++++++++++
Acontent/garden/arboretum/booknotes/ | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/booknotes/ | 39+++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/ | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 9+++++++++
Acontent/garden/arboretum/knowledge/ | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 7+++++++
Acontent/garden/arboretum/knowledge/ | 132+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 42++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 9+++++++++
Acontent/garden/arboretum/knowledge/ | 17+++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 45+++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 23+++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 29+++++++++++++++++++++++++++++
Acontent/garden/arboretum/knowledge/ | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/opinions/ | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/opinions/ | 42++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/opinions/ | 54++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/opinions/ | 43+++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/opinions/ | 43+++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/opinions/ | 45+++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/programming/ | 15+++++++++++++++
Acontent/garden/arboretum/programming/ | 15+++++++++++++++
Acontent/garden/arboretum/programming/ | 39+++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/programming/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/programming/ | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/programming/ | 13+++++++++++++
Acontent/garden/arboretum/programming/ | 9+++++++++
Acontent/garden/arboretum/programming/ | 7+++++++
Acontent/garden/arboretum/recipes/ | 41+++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 15+++++++++++++++
Acontent/garden/arboretum/recipes/ | 10++++++++++
Acontent/garden/arboretum/recipes/ | 32++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 40++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 40++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 28++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 39+++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 47+++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 47+++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 38++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 14++++++++++++++
Acontent/garden/arboretum/recipes/ | 18++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 6++++++
Acontent/garden/arboretum/recipes/ | 21+++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 22++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 14++++++++++++++
Acontent/garden/arboretum/recipes/ | 12++++++++++++
Acontent/garden/arboretum/recipes/ | 47+++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 23+++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 6++++++
Acontent/garden/arboretum/recipes/ | 30++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 47+++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 36++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 26++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 37+++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/ | 6++++++
Acontent/garden/arboretum/sysadmin/ | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 14++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 199+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 237+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 30++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 120+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/sysadmin/ | 110+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/tea/ | 24++++++++++++++++++++++++
Acontent/garden/arboretum/values-and-beliefs/ | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/writing/ | 6++++++
Acontent/garden/arboretum/writing/ | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/writing/ | 26++++++++++++++++++++++++++
Acontent/garden/arboretum/writing/ | 17+++++++++++++++++
Acontent/garden/compost/ | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/compost/ | 27+++++++++++++++++++++++++++
Acontent/garden/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/greenhouse/ | 232+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/greenhouse/ | 24++++++++++++++++++++++++
Acontent/garden/greenhouse/ | 47+++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/greenhouse/ | 9+++++++++
Acontent/garden/greenhouse/ | 32++++++++++++++++++++++++++++++++
Acontent/garden/greenhouse/ | 7+++++++
Acontent/garden/greenhouse/ | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 16++++++++++++++++
Acontent/garden/plots/ | 28++++++++++++++++++++++++++++
Acontent/garden/plots/ | 5+++++
Acontent/garden/plots/ | 8++++++++
Acontent/garden/plots/ | 72++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 10++++++++++
Acontent/garden/plots/ | 11+++++++++++
Acontent/garden/plots/ | 6++++++
Acontent/garden/plots/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 100+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 4++++
Acontent/garden/plots/ | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 17+++++++++++++++++
Acontent/garden/plots/ | 5+++++
Acontent/garden/plots/ | 21+++++++++++++++++++++
Acontent/garden/plots/ | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 14++++++++++++++
Acontent/garden/plots/ | 6++++++
Acontent/garden/plots/ | 11+++++++++++
Acontent/garden/plots/ | 153+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 12++++++++++++
Acontent/garden/plots/ | 3+++
Acontent/garden/plots/ | 8++++++++
Acontent/garden/plots/ | 45+++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/ | 6++++++
Acontent/garden/plots/ | 13+++++++++++++
Acontent/garden/plots/ | 13+++++++++++++
Acontent/garden/plots/ | 42++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/ | 45+++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 399+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 409+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 1663+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 208+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 98+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 36++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 92+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 118+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/favicon.png | 0
Astatic/img/88x31icon.png | 0
Astatic/img/banned-ips-now.png | 0
Astatic/img/banned-ips.png | 0
Astatic/img/brokerage-comparison-thumb.png | 0
Astatic/img/brokerage-comparison.png | 0
Astatic/img/claws-mail-actions.png | 0
Astatic/img/current-desktop.png | 0
Astatic/img/debian-with-btrfs/boot-mount.png | 0
Astatic/img/debian-with-btrfs/commands-before-boot-mount.png | 0
Astatic/img/debian-with-btrfs/df.png | 0
Astatic/img/debian-with-btrfs/partition-results.png | 0
Astatic/img/debian-with-btrfs/partition-screen.png | 0
Astatic/img/debian-with-btrfs/shell.png | 0
Astatic/img/debian-with-btrfs/target-fstab.png | 0
Astatic/img/desktop-thumb.png | 0
Astatic/img/desktop.png | 0
Astatic/img/diefen/cafeteria-store.jpg | 0
Astatic/img/diefen/comms-rack.jpg | 0
Astatic/img/diefen/comms-room.jpg | 0
Astatic/img/diefen/computers.jpg | 0
Astatic/img/diefen/conference-room.jpg | 0
Astatic/img/diefen/hard-disk-platter.jpg | 0
Astatic/img/diefen/mainframes.jpg | 0
Astatic/img/diefen/operating-theatre.jpg | 0
Astatic/img/diefen/oscilloscope.jpg | 0
Astatic/img/diefen/situation-room.jpg | 0
Astatic/img/diefen/tape-rack.jpg | 0
Astatic/img/diefen/thumbnails/cafeteria-store.jpg | 0
Astatic/img/diefen/thumbnails/comms-rack.jpg | 0
Astatic/img/diefen/thumbnails/comms-room.jpg | 0
Astatic/img/diefen/thumbnails/computers.jpg | 0
Astatic/img/diefen/thumbnails/conference-room.jpg | 0
Astatic/img/diefen/thumbnails/hard-disk-platter.jpg | 0
Astatic/img/diefen/thumbnails/mainframes.jpg | 0
Astatic/img/diefen/thumbnails/operating-theatre.jpg | 0
Astatic/img/diefen/thumbnails/oscilloscope.jpg | 0
Astatic/img/diefen/thumbnails/situation-room.jpg | 0
Astatic/img/diefen/thumbnails/tape-rack.jpg | 0
Astatic/img/diefen/thumbnails/vintage-computer.jpg | 0
Astatic/img/diefen/thumbnails/workshop.jpg | 0
Astatic/img/diefen/vintage-computer.jpg | 0
Astatic/img/diefen/workshop.jpg | 0
Astatic/img/double-desktop-email-thumb.png | 0
Astatic/img/double-desktop-email.png | 0
Astatic/img/fedora-tablet-desktop-thumb.png | 0
Astatic/img/fedora-tablet-desktop.png | 0
Astatic/img/flip-phone-open-thumb.png | 0
Astatic/img/flip-phone-open.png | 0
Astatic/img/floppy-thumb.jpg | 0
Astatic/img/floppy.jpg | 0
Astatic/img/hacker-quarterly-thumb.jpg | 0
Astatic/img/hacker-quarterly.jpg | 0
Astatic/img/home-directory.png | 0
Astatic/img/keyboard-side-thumb.jpg | 0
Astatic/img/keyboard-side.jpg | 0
Astatic/img/keyboard-top-thumb.jpg | 0
Astatic/img/keyboard-top.jpg | 0
Astatic/img/lwn-homepage-colours.png | 0
Astatic/img/lwn-we-colours.png | 0
Astatic/img/m1-cpubenchmark.png | 0
Astatic/img/misskey/admin-overview-thumb.png | 0
Astatic/img/misskey/admin-overview.png | 0
Astatic/img/misskey/database-thumb.png | 0
Astatic/img/misskey/database.png | 0
Astatic/img/misskey/drive-thumb.png | 0
Astatic/img/misskey/drive.png | 0
Astatic/img/misskey/federation-thumb.png | 0
Astatic/img/misskey/federation.png | 0
Astatic/img/misskey/mfm-thumb.png | 0
Astatic/img/misskey/mfm.png | 0
Astatic/img/misskey/threading-thumb.png | 0
Astatic/img/misskey/threading.png | 0
Astatic/img/misskey/widgets.png | 0
Astatic/img/more-banned-ips.png | 0
Astatic/img/mx-toolbox-results-thumb.png | 0
Astatic/img/mx-toolbox-results.png | 0
Astatic/img/neomutt-threading.png | 0
Astatic/img/neomutt-thumb.png | 0
Astatic/img/neomutt.png | 0
Astatic/img/office-365-spam-thumb.png | 0
Astatic/img/office-365-spam.png | 0
Astatic/img/openbsd-logo.png | 0
Astatic/img/openbsd-logo.svg | 2++
Astatic/img/paritybit-gopher-lynx-thumb.png | 0
Astatic/img/paritybit-gopher-lynx.png | 0
Astatic/img/recipes/granola-bars.jpg | 0
Astatic/img/slack-tracking.png | 0
Astatic/img/st-lynx-thumb.png | 0
Astatic/img/st-lynx.png | 0
Astatic/img/st-tc.png | 0
Astatic/img/st-vim.png | 0
Astatic/img/syncthing-dashboard-thumb.png | 0
Astatic/img/syncthing-dashboard.png | 0
Astatic/img/t420s/laptop-looking-good-thumb.jpg | 0
Astatic/img/t420s/laptop-looking-good.jpg | 0
Astatic/img/t420s/new-sticker-thumb.jpg | 0
Astatic/img/t420s/new-sticker.jpg | 0
Astatic/img/t420s/t420s-close-thumb.jpg | 0
Astatic/img/t420s/t420s-close.jpg | 0
Astatic/img/t420s/t420s-thinklight-thumb.jpg | 0
Astatic/img/t420s/t420s-thinklight.jpg | 0
Astatic/img/t420s/t420s-trackpad-thumb.jpg | 0
Astatic/img/t420s/t420s-trackpad.jpg | 0
Astatic/img/t420s/t420s-wide-thumb.jpg | 0
Astatic/img/t420s/t420s-wide.jpg | 0
Astatic/img/urxvt-lynx-thumb.png | 0
Astatic/img/urxvt-lynx.png | 0
Astatic/img/urxvt-tc.png | 0
Astatic/img/urxvt-vim.png | 0
Astatic/img/vim-airline.gif | 0
Astatic/img/vim-airline.mp4 | 0
Astatic/img/vim-no-airline.gif | 0
Astatic/img/vim-no-airline.mp4 | 0
Astatic/robots.txt | 2++
Astatic/style.css | 139+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/subscriptions.opml | 139+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Atemplates/footer.html | 23+++++++++++++++++++++++
Atemplates/header.html | 24++++++++++++++++++++++++
314 files changed, 15427 insertions(+), 0 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -0,0 +1,6 @@ +# Ignore generated output files +static/**.html +static/*/ +static/feed.xml +# Don't ignore images +!static/img diff --git a/LICENSE b/LICENSE @@ -0,0 +1 @@ +This work is licensed under the Creative Commons Attribution 4.0 International License. To view a copy of this license, visit or send a letter to Creative Commons, PO Box 1866, Mountain View, CA 94042, USA. diff --git a/ b/ @@ -0,0 +1,5 @@ +# + +Content corresponding to [the website]( + +This site is built using [sbs]( diff --git a/config.ini b/config.ini @@ -0,0 +1,6 @@ +siteURL = +siteName = +languageCode = en-ca +blogDir = blog/ +buildOptions = -Thtml --html-no-skiphtml --html-no-escapehtml +pushcmd = rsync -rv --delete static/* cerberus:/var/www/ && ssh cerberus "./update-sites" diff --git a/content/ b/content/ @@ -0,0 +1,326 @@ +Title: A Critique of Free Software +Author: Anonymous +Date: 2021-08-05 +Summary: Free Software fundamentally misses the point. It fails on a practical, ideological, economic, and political level. Let's examine precisely how (in a slightly different order for the purposes of presentation). + +# [%title] + +**Written By:** [%author] | **Posted:** [%date] + +<p class="note">This essay was not authored by me. It is licensed under the <a +href="">CC0 +license</a> (i.e. it is effectively in the public domain).</p> + +Free Software fundamentally misses the point. +It fails on a practical, ideological, economic, and political level. +Let's examine precisely how (in a slightly different order for the purposes of presentation). + +## Ideological +Ideologically, Free Software is a bit of a jumbled mess. +Let's begin by reading the following two documents, one after the other: +[Should Be Free]( followed by the [GNU Manifesto]( + +In the first, Stallman declares his goal to be the prosperity and freedom of the public in general. +These are, of course, loaded terms, so we must read the rest of the document to understand what he means. + +First, he goes over the two owner arguments - emotional attachment (which is willingly signed off) and economic gain, an effective threat to stop making software. +He speaks out against giving software an owner that controls its development (something he considers to exclusively happen in the case of proprietary software). +He also gives an example of a road paid by toll booths at every corner, and complains that it is an obstruction to smooth driving - pointing out that a toll booth does not merely help raise funds. +He names three problems from such obstructions applied to software: fewer users, user inability to fix programs, and the inability of developers to build upon the existing work. +Furthermore, he talks about wider societal effects (see the section on damaging social cohesion), and mentions that the mechanism via which sharing is restricted isn't relevant. +We end the paper with two quotes of import: "We thus have a paradox: the developer of useful software is entitled to the support of the users, but any attempt to turn this moral obligation into a requirement destroys the basis for the obligation. A developer can either deserve a reward or demand it, but not both." and "I make the assumption in this paper that a user of software is no less important than an author, or even an author's employer. In other words, their interests and needs have equal weight, when we decide which course of action is best." + +Keeping this in mind, let us move on to the GNU Manifesto. +We must compare and contrast the actions taken to the ideology as it is presented. + +First, the software project (GNU itself) is introduced. +He explains his personal motivations for sharing GNU (the Golden Rule), as a method of solidarity. +However, as the follow-up, there is a proclamation that GNU is not in the public domain, and that modifications are going to be restricted (insofar as it comes to the rules of making further modifications). +As the ultimate goal, we have these quotes: "Users will no longer be at the mercy of one programmer or company which owns the sources and is in sole position to make changes." and "Finally, the overhead of considering who owns the system software and what one is or is not entitled to do with it will be lifted." +The rest of the document speaks to common counter-arguments. Of these, the following quotes are of interest to us: + +* GNU will remove operating system software from the realm of competition. +* “Control over the use of one's ideas” really constitutes control over other people's lives; and it is usually used to make their lives more difficult. + +How are these two documents separate? +One must look into the methods spoken of in the second document. +How exactly are the variants becoming un-free enforced? +What does this have to do with the former document (after all, as he himself mentions, it's about creating a copy, it does not remove the original). +Let us deconstruct both documents. + +The fundamental basis for the GNU worldview is the original emotional argument leveled against owners - emotional attachment to one's own work. +As he says: "I want to make sure that all versions of GNU remain free." - i.e he wishes to control other people's lives (as mentioned in the second document), on the basis of personal attachment to GNU - "I made it, I get to make sure all copies are as I want them to be." +In this way, the very core of the GNU philosophy is based upon the same premises as those of proprietary software - i.e on IP. +While GNU is happy to condemn copyright and similar laws, it consistently does so while pointing out uses of it by the bad guys - proprietary developers. +Meanwhile, the GPL fundamentally relies on copyright law in order to enforce itself - so long as the good people use it in the correct way, it becomes good. +Consequently, we must view the dislike of IP law by Free Software to be a sham - something reinforced in ideological discussion by them. + +Proponents of Free Software will regularly talk about the "stealing" of projects (there are many examples, for instance, consider [this article]( - the author never says the word "steal", but the reaction of the community (such as this magazine, but also commenters) is unambiguous; I encourage you to look around and talk to people about these subjects and see what is said, how, and why). +While this has further issues and implications in practical terms, this is the section on ideology. +What does it mean to "steal" a project, within these discussions? +It means making a non-free version of a given project. How can one steal by copying and modifying? +If we do not believe in property rights for software (as per the second document), then there is simply no one to steal from. +The only fundamental thing becoming proprietary are the modifications made by the new author, as the original variant remains intact. +This internal framing reveals a worldview within which the author *does* have moral rights over their creations (this is unsurprising, given such internal justification is necessary for the GPL to not be resisted). +This exact framework is similarly present in the existing documents, as mentioned above, though in less overt terms. + +We must then ask the question - does this make people's lives more or less difficult? +After all, if we purport that the GNU worldview includes acceptance of IP, so long as it is used by "the good guys", perhaps the argument would be that the GNU use is fundamentally positive. + +Thankfully, there are plenty of samples of how this use is unhelpful, even in the documents themselves. +Now that we are restricting uses, this must be done within the existing legal framework. +The GPL is a lengthy document, that is understood neither by lawyers (who do not comprehend programming to a sufficient degree to know what it intends to mean) nor by programmers (who do not know the myriad of special meanings in court). +When it comes to regular people - those that GNU is supposed to be serving - they haven't even a chance. +What happened to "Finally, the overhead of considering who owns the system software and what one is or is not entitled to do with it will be lifted."? +Now, *all people but the few lawyers that know programming* fall into this category. + +If you doubt this and believe yourself to be someone that understands the GPL and its variants fully, answer these questions: + +* To enforce the GPL, should you sue for breach of copyright or contract? +* If I modify an AGPL program (e.g to remove a quine), and then share it with a service provider, who runs the software without modification, do they have to share the sources? +* What is a quine, and why is it important to the AGPL? + +Many more can be said on this topic, but it's about time to move on. +If you would like some more reading consider this [post]( (and others!) by an actual lawyer *and* programmer, as well as this [thread]( by a free software developer. + +Now that the same negative side-effects arise out of the GPL's use of copyright for restriction of modifications (something that is on its own not ideologically coherent) as they do of proprietary software, when it comes to the users, we must then ask: do the users of GPL deserve this? +The answer, similarly, is found in the documents. +"We thus have a paradox: the developer of useful software is entitled to the support of the users, but any attempt to turn this moral obligation into a requirement destroys the basis for the obligation. A developer can either deserve a reward or demand it, but not both." +Now that we've determined that the GPL causes an obstruction (albeit of a lesser degree than proprietary software), it is not deserved. +If it is not deserved, the prior paradox kicks in. +In order to justify this, GNU (and the FSF) has two possible paths. +They could either make the argument that their approach is better in some other regard. +Alternatively, they could double down on ideological aspects of it as-is (e.g accusing people making free software (simply not under the GPL) of being evil). +They take the latter approach, since they are similarly failing in the other spheres. +For an example, see what an [FSF Board member]( does in terms of [contributions]( (I encourage you to look at the other contributions by him in the GNU software repositories as well). + +In short, for internal consistency, GNU and the FSF fundamentally operate primarily on *ideological coherence* (i.e being a true believer), moreso than any single other attribute. +A sort of purity war, where only the upmost is acceptable. +Is it any surprise that, ideologically, Free Software has been bleeding out? + +## Economic and Political +As we have read previously, one of the goals of Free Software is to *eliminate* competition. +GNU was to do this for operating systems, for instance. +This largely has not happened. + +For all of their qualms about "GNU+Linux", Linux represents a small part of the desktop userbase, while on the servers, it's largely unused (even if installed), instead simply running an existing service. +Even when within the desktop userbase, plenty of desktops do not utilize GNU as their userland provider. +Even within the group that does, most of the actual work is no longer done using the userland, but rather in browsers and similar. +Meanwhile, more people use MacOS (a known-niche set of systems!), including prolific figures of operating system development from the past (e.g most people from Bell Labs, such as [Rob Pike]( +All GNU has done is create an implementation of an old idea, leaving it to suffer from, mostly, lack of use (something we know they care about from the documents we read previously). + +The FSF has been slowly descending into irrelevance, as it continually loses donation funds. +They will eventually need to follow in the footsteps of FSFE (start litigating anyone and everyone they can think of, to make just enough money for the next case), or reinvent themselves. +So far, they've been making (rather damaging) videos, trying to capture the young student demographic. +Unfortunately, this too, has not had very much success. +Due to the complete disregard for practical concerns in favor of ideological bookthumping (something they ultimately have to do due to existing ideological deficiencies, as we mentioned), they have to rely on people either not thinking the problem through (something that will usually have people default to the status quo anyway), or be indoctrinated (leading to rather inappropriate conduct - which is then normalized as a form of reward). + +This, though, is more than about the FSF - what about other Free Software projects? +Those using the GPL and similar? +The reality is simple - they are owned by corporations. + +Free software development has become a story of feast or famine. +You either sell board member seats to corporations, or you barely coast off of user donations (which happen very rarely). +The former, of course, means the corporations exert huge amounts of control. +So, for the purposes of demonstration, here are some corporation controlled GPL (or other [Free Software]( projects, as well as the consequences thereof: + +* [Linux]( + Linux is a huge project, such that very few competent programmers can even try to comprehend it properly, let alone users. + Users are therefore dependent upon the Linux maintainers (get used to this trend). + However, the maintainers are often pressured by the companies they work for (the linux foundation doesn't pay them!), the foundation decides who gets paid, and the maintainers often crack as a result of the combination of both factors (and others, though even the first two may not always apply). + See these two [recent]( [examples]( if you want some. +* [MySQL]( + MySQL is one of the most widely used database systems. + However, did you know it's owned by Oracle? + Oracle uses this to gain an economic advantage over other owners - as they are the copyright holders, they can release a proprietary variant of MySQL, and make money off of it while forks (such as MariaDB) cannot. + They also use this to keep several new releases unavailable to the public, staggering their release dates. + This is an issue Stallman [recognizes]( + So long as there is a copyright holder, the copyright holder(s) can be bought. +* Chromium: + Chromium is released under a BSD license (a Free Software license according to GNU), which Google has "stolen" and turned into Google Chrome (a proprietary product). + Yet, chromium remains available. Neither of these things is the issue with chromium, however. + Using the Free Software approach (as the BSD license of chromium is GPL-compatible, and parts are licensed LGPL), chromium has all but eliminated competition in the browser market. + This has resulted in Google basically having full control over web standards - far more damaging than there existing a variation of chromium with closed sources. +* [Qt]( + Qt is a fairly popular UI toolkit in the unixlike world, available under the terms of the GPL3. + Did you know though, that it's owned by the Qt company? + Since they're the copyright holders, same as with MySQL, they also offer a commercial license to Qt. + They use this position to constantly hurt the Free Software community, despite using "the correct license". + For instance, they [required a Qt account to download the sources, even for the open source version](, [made the offline installer commercial-only](, and [made updates to the LTS releases only available to their commercial customers]( + Even though the KDE Foundation talked about [potentially maintaining a fork of Qt](, nothing ever came of it. + I wonder [why that might be]( + +The examples simply keep going on and on. +Look up any large well-known GPLd project you know about. +Then look at where their money comes from. +Think about the consequences of this to the project. + +When a project is "stolen", the original may continue to serve its users. +When a project is taken over, the original now serves new masters, who have different priorities to mere users. + +There is, however, an open question here - why do corporations do this? +This is certainly a lot of money to put into Free Software (and other) projects. +This actually comes down to a question of economics. +Consider a company that wishes to offer service Foo, with some specific features. +They have the following options: + +* They use an existing Free Software project that fits the bill. + This is of zero cost to them, and allows for profit. + If they can, they will do this. +* There is no Free Software project that fits the bill, but there's one that's close. + They modify it to add the features they want. + They then maintain it internally as Free Software. + This is the variation that the GPL professes as the one that will happen. + On the contrary though, it never does, because it is *uneconomical* to the corporation. + Now they have to deal with distributing the source code, maintaining the changes, making sure to merge upstream patches, and so on. + This means that not only do they have to pay up-front for the development, they *also* have to pay over time later. +* Ditto, but instead, they contribute this to the existing project. + For the corporation, this is a bit nicer than the previous option. + After all, now the maintainership falls upon someone else, someone unpaid - they get to extract far more free labor over time this way. + Even if they begin as maintainers for the feature, if they eventually want to divert money elsewhere, the maintainers can officially leave - it's not like the project will just start removing the feature. + This does still have some drawbacks though - they have to get the project to accept the patch to begin with. + For major changes, this is very difficult, and generally means they have to hire high quality developers, as well as negotiate with each project they wish to do this for. +* Ditto, but instead, they request the project do it for them. + They may either pay for it, or just request it in general. + If they can get this done - it's great! + Now you're in the first case scenario, with just a mild price of admission. +* Pay to have yes-men sit on the project's board. + While a relatively high price, it's not *that* high compared to paying dozens of high quality developers. + It also gives you lots of control over the project, not just for this feature, but for future features as well. +* They take over the project in its entirety, making a fully-fledged fork. + This happens fairly rarely, and mostly with tech giants (such as amazon doing it to elasticsearch and mongodb). + This can also be brand new development (as with chromium). + The reason to do this is to have full control (even beyond the previous point!) over the project and its ecosystem. + Look at what Google has done with web standards using chromium's supremacy - they are no longer "developing and selling a project", they are trading money for influence and power. +* Ditto, but they just hire all of the current developers. + Examples include LLVM, Audacity, and several others. + This has similar advantages, but is much easier to orchestrate overall. + Also, under some conditions, this means that they gain control over some markets and can even potentially start using the MySQL effect. + +As you can see, of all these options companies have, the one that GNU would have you do is the one that will happen *most rarely*. +Even "good" companies (like MongoDB was considered prior to the SSPL) don't keep it up, for the simple reason that other (usually bigger) corporations exist to gobble them up. + +In short, sure, much of the world now runs on "approved" licenses. +However, they have fundamentally failed at addressing the significant and legitimate concerns of the Free Software world. +Instead, this situation grows even worse still, as you will see in the practical section. +Free Software has essentially become a puppet, dancing on strings to the tune of those who know it's not just about the license. + +## Practical +How does Free Software turn out in practice? +The purported (practical) goals of Free Software are, from what we can gather above: + +* Make users be important, and not dependent upon external entities. +* Make corporations and other normally-proprietary entities share their useful contributions for the users. +* Make life easier for developers and users. + +How well does it achieve all of these? + +It thoroughly fails on caring about users. +Basically any user that has participated in an issue board of a software project knows what the process looks like. +You report the bug, it sits there for months, sometimes years, only to be closed for inactivity. +If anyone complains, they'll be told to learn to code and fix the problem themselves - something that may not be feasible to most users under current socioeconomic conditions (nor paying someone to do it). +In fact, if you're used to looking through issue boards (regardless of who you are), sufficient experience might make you notice something interesting: they are extraordinarily similar to corporate "support forums" and similar instances. +There's often someone that has no idea what you're talking about, but assumes there is nothing actually wrong. +Action is rarely taken to address any actual issues. +The opinions of users are discarded in favor of louder voices in the community (based on social capital, which is granted differently between Free Software and corporations, but fundamentally works similarly under the hood). + +This is hardly surprising. +Free Software does not *actually* gain very much from userbase. +No one is saying emacs is worth nothing because only a few people use it. +There is fundamentally no incentive for the maintainers of any Free Software project to care about their users. +Let alone users that, for example, need extensive accessibility options - something Free Software is notoriously bad at. +So they don't. +Free Software is ultimately, in practical terms, a movement for developer comfort, first and foremost. + +Alright, so let's think about developers - are their lives any easier? +Let's consider a theoretical scenario. +A developer sees a project and dislikes some aspects of it. +They use the rights granted to them by the GPL (or other Free Software license) and make a fork. +They publish all of their modifications under the same license. +This should be kosher, right? + +Unfortunately, this has happened several times, and we get to see how the community reacts. +The reactions are negative, almost universally so. +[Gitea]( was called a [hostile fork]( by SourceHut developer Drew Devault. +The [GNU Assembly]( was called a [mutiny]( (by Leah, a personal friend of Stallman) and a [coup]( (this is a preview of the, at the time of writing, yet to launch site +A fork of RuboCop in the face of the summer protests of 2020 resulted in this incredible quote: ["I was quite disappointed by the hasty creation of two RuboCop forks, without discussing any specifics with our team."]( - apparently one must first negotiate with the forkee before making a fork, even though the project had already decided on not accepting the suggestions the forks implemented. +However, when one *does* submit a patch to such a project (as in the previous example), they become a [persona non grata]( + +None of this, however, is surprising: the actual goal of the GPL (codified as "eliminating competition") can be surmised better as a grab for *central* control and authority. +This is plainly obvious in, for example, the [Signal]( project, whose maintainer explains that they are against third party clients because they don't have [absolute control over them]( +Ultimately, it's not adherence to the license or to the stated goals of Free Software that count, in these cases, but ideological unity with the group (whether it be the FSF, the specific project, or other). + +It's also not just about the license (at least, not directly). +Because GPL projects end up trying to be more central (see everything above), and therefore have to cover all use-cases, the code quickly becomes a jumbled mess. +Consider, for example, the GNU version of the POSIX yes utility, which has been modified over time to be "ever-faster", even though this is of no use in the context of what it's for. +The only material consequence of this was that it is now more difficult to modify. +So it is with many other projects, to the point that forking major GPL projects is unfeasible - there's no major Linux fork, not because no one wants one, but because even people whose job it is to work on it struggle to keep the basic architecture of that behemeoth in their minds. + +In short: +When you want a project changed, you are told to go make a fork. +When you make a fork, you are vilified for taking away from the power of the copyright holder. +Even if you do make a fork, the sheer quality (or, rather, lack thereof) of the sources, on average, will make it difficult to do anything useful with it to begin with. +Developers as a whole are not the true beneficiaries of the GPL way - copyright holders are. + +Regardless though, at least any entity that doesn't need to worry about this will *have* to give back to the central community, right? +Well, that depends. +In practice, GPL litigations end in one of three ways: + +* The code never makes it back, the service is simply [shut down]( +* The developer burns out and leaves Free Software for good, like [Glenn McGrath]( (also note the presence of Landley in this piece - he's the one being interviewed). +* Code is surrendered, but [nothing actually useful]( comes out of the effort. + +In the busybox case, there wasn't even a court precedent set, because it was settled out of court, so that the SFCL (the non-profit corporation that handled the litigation) would get more money that way! +And of course, even when code sharing does happen (it's usually voluntary, see the section on economics as to why corporations do this), it isn't always to [the benefit]( of the project. + +To summarize: the GPL fails on all of its material, practical promises. +Instead, it mostly serves copyright holders. +Though it does this [pretty well]( for those of them that realize they're in this position without being a corporation. + +## Now What? +While GNU philosophy and the GPL fail for a number of reasons, not all is lost. +It is possible to create good software, that helps people, while resisting foreign malign influence. +Let's start by addressing the most obvious issues. + +First off, we have to address the scaling question. +For every condition applied to one's use or modification of a project, users and developers become more disadvantaged. +Every user and developer must individually keep these in mind and figure out the exact ramifications. +Most of these are not lawyers. +Corporations have lawyers that will do this for them, only need to do it once, and can find loopholes. +Every condition of use placed upon a project puts corporations in an advantageous position relative to the people. +Consequently, as few conditions as possible within the societal framework one is operating within must be set. + +This is not simply a matter of license however, but also of resource availability. +While centralized systems help prevent duplicate work, duplicate work is hardly a concern for regular people. +How many projects are out there that essentially do the same thing, because their developers wanted it done their way? +In other words, optimizing for deduplication of work does nothing to help users or developers. +On the other hand, optimizing for ease of understanding and modification makes much more sense. +These desires are at odds. +Optimizing for ease of understanding and modification requires smaller, more succinct, often less performant code, meant for fewer use-cases. +Optimizing for deduplication means that all use-cases must be covered. +Covering all use-cases bloats the code, cannot definitionally be succinct and requires it to be more performant (and thus include cursed inner working incantations). + +This shows us a somewhat different picture. +It is an environment where people make projects for themselves and those close to them - those whose use-cases they truly **know**, rather than guess about. +They keep their code lean and without any strings attached, so that any component thereof (or even the whole thing) can be reused to make a similarly small-scoped project for a different group. +There is no goal of having everyone use the same central system, and therefore no point in pushing for its inclusion, or anything that can be reliably purchased, co-opted, or taken over. +By fully minimizing the cost of admission - not only in cognitive overhead of the meta-work (licensing), but also in the code itself, we maximally empower users and developers to do as they will, to the maximal possible extent. +While it is impossible to make programming fully trivial, by its very nature, we can make it as close as possible to a craft people can participate in recreationally. + +This does leave a question open. +What stops corporations from taking over and taking advantage of these systems? +There are a few factors. +First off, them simply using the product is no longer a concern. +Because each project concerns itself exclusively with the small group for whom it was developed, even a hypothetical scenario where the proprietary alternative gets mass market appeal has no effect on the project's target demographic. +It doesn't end there, though. +The needs of corporations are wildly different from those of regular people. +They want SSO, they want huge integrations, they want Enterprise Features. +Small projects, built for a few people, do not have this. +It is uneconomical to take such a small project and try to scale it up into a monstrosity (see the prior economic section). +Corporations might as well simply build brand new solutions from scratch than use such projects. +Finally, this is even resistant to a corporate buyout. +After all, over time, the amount of forks (which are not only to be accepted, but *encouraged*, **instead** of contributing to the "main" project) grows faster than corporations can (or want to) consume them. +The proprietarization of one fork does not affect its users (they already have a working system and can easily fork it), and does not affect any forks. + +Instead of seeking to make a blessed cathedral that all shall go to, and hoping that the blessing will protect it from invaders, we empower everyone to make a doghouse. +To turn programming into a craft like woodworking, where making your own chair or table, while not free, is feasible for the everyman. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,73 @@ +Title: A Brief Review of Fedora 32 +Author: Jake Bauer +Date: 2020-05-11 +Summary: A brief look at how Fedora 32 has been behaving on my tablet. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<figure> + <a href="/img/fedora-tablet-desktop.png"><img + src="/img/fedora-tablet-desktop-thumb.png" alt="A screenshot of my tablet's + desktop with htop open on the left and neofetch open on the right."/></a> +</figure> + +I have a tablet which I usually have docked at my desk for watching livestreams +or I bring it with me to read PDFs on the go (like D&D or software manuals). I +was using ElementaryOS for a few months and it worked well with the touch screen +but there was one issue that completely killed the experience for me: there was +no virtual keyboard on the lock screen which meant that if the tablet locked for +any reason, I had to plug in an external keyboard or restart it so that I could +log in again (I configured autologin). [This is a known +issue]( that was flagged +**three** years ago! ~~I'm not sure why it hasn't yet been fixed despite being a +huge usability/accessibility issue.~~ It has since been fixed. + +Anyways, enough with the ranting. I decided to install Fedora because of [the +recent release]( and because I +have never played with it before. It uses the GNOME desktop which, so far, seems +just as touch-screen-friendly as the Juno desktop on ElementaryOS. I normally +can't use GNOME on any system with which I need to be productive (tiling WMs for +the win), but for the case where only one or two applications are on the screen +at once, it works very well. Fedora, as a whole, also seems like a well-polished +system. The effort that has gone into making the boot splash feel seamless like +it is with Windows has paid off and I can't tell when I'm using a flatpak versus +a native application. + +So far, I have only two gripes with Fedora. The first is that I had to add the +RPMFusion repositories and install `ffmpeg` to get the codecs necessary to watch +Twitch streams. That in itself is not a problem, but there was no obvious, +newb-friendly way to do it and I had to look up the issue in order to even +figure out why I couldn't watch streams and what I had to do. + +The second is that the `dnf` package manager is *really* slow. When comparing it +to `apt` from Debian/Ubuntu/Elementary/etc., and `pkg` from FreeBSD, and even +`pacman` from Arch, `dnf` feels like it takes forever even to install just a +single package. For example, I installed `neofetch` to take the screenshot +featured at the top of this post and it took over a minute for it to present me +with an "Are you sure you want to install this?" prompt just for that single +package. On a more positive note, the way that `dnf` presents package +installation to the user is really nice. It highlights package names, and splits +the listing of what it's going to install into nice categories so you can +quickly see which packages are dependencies and which are suggestions and so on. + +_**Update**: I have since been informed that there is a really easy way to make +`dnf` faster. Just add the following to your `/etc/dnf/dnf.conf`:_ + +```ini +fastestmirror=true +deltarpm=true +``` + +_I've done this and it definitely makes it feel way faster; on par with the +other package managers as far as I can tell._ + +Overall, it has been a positive experience. I don't need to install packages +often and I've fixed the codec issue so the two problems I highlighted above are +really just non-issues now. The touch-screen experience has been great and it's +a solid Linux platform so I think I will be sticking with it for the time being. + +_This is my seventeenth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,97 @@ +Title: A Git Workflow With Claws Mail +Author: Jake Bauer +Date: 2021-10-26 +Summary: Detailing how I have set up claws mail to allow me to work with Git using the standard email workflow. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +When sending or receiving patches to or from git repositories, I prefer to use +`git send-email`. I find this workflow more efficient and less distracting than +jumping to a web interface to create a pull request. Plus, it's not dependent on +having an account wherever a repository is hosted. + +I used to use [aerc]( as my email client, but have since +switched to [Claws Mail]( as I find TUIs with +multiple windows, tabs, and panes to be awkward to use. However, aerc came with +some really nice features for software development which aren't available in +Claws Mail. Watch the video at the link for aerc above to see those features in +action. + +Sending emails with `git send-email` is easy and switching to Claws Mail +required no changes to my workflow because it does not interact with an email +client at all. On the other hand, patches sent to me do end up in my email +client so I needed a way to quickly and easily apply the patches I receive. +Luckily, it's fairly easy to do this with Claws Mail since it is quite +extensible. + +First, I needed to write a small script to parse the email and extract the +repository name from the subject line so the patch can be applied to the +correct repository. Then, the script `cd`s into the repository and uses `git am` +to apply the patch. Here is the script: + +``` +#!/bin/sh + +projectsDir="$HOME/Documents/projects" +patchFile="/tmp/patch" + +IFS='' +while read -r line; do + echo "$line" >> "$patchFile" + if echo -n "$line" | grep -q "^Subject:"; then + repo=$(echo "$line" | grep -o '\[PATCH .*\]' | cut -d' ' -f2 | tr -d ']') + fi +done + +echo "Applying patch to: $projectsDir/$repo" +cd "$projectsDir"/"$repo" && git am "$patchFile" +rm "$patchFile" +``` + +There are two variables of note: `projectsDir` and `patchFile`. `patchFile` is +simply a temporary file where the script keeps the contents of the email. +`projectsDir` is the directory in which the script will look to find your +repositories. If you keep your repositories in a different location (e.g. +`$HOME/Projects`) then you should edit this variable to point to that location. + +Another important note is that the script looks for the repository using the +text that follows the word "PATCH" in the subject. When sending emails with `git +send-email`, you should specify the project name after the "PATCH" text so the +person to which you are emailing the patch knows at a glance which repository +your patch is for. If this is done correctly, a subject line will look something +like: + +``` +Subject: [PATCH aerc] Fix whitespace in documentation +``` +The script is licensed under the Unlicense, by the way. + +After writing the script, I needed to add an Action in Claws Mail. This can be +done through the top menu by navigating to "Configuration > Actions..." and +creating an action to run a shell command. Prefixing the shell command with the +pipe `|` symbol will tell Claws Mail to pipe the contents of the body of the +email on which the action is invoked to the command. This is what my action +looks like: + +<figure> + <a href="/img/claws-mail-actions.png"><img src="/img/claws-mail-actions.png" alt="A screenshot of the Actions configuration menu with an action configured with the menu name 'Git Apply Patch' and the Command '|git-apply-patch'."/></a> +</figure> + +I also bound this action to a [custom keyboard +shortcut]( +so I can press a key combination which will apply the patch. After running a +shell command, Claws Mail helpfully opens up a window displaying the output of +the command so I can see whether or not the command failed and what went wrong. + +Here is an example of me applying a patch where you can first see a successfully +applied patch, followed by what it looks like when the patch fails to apply: + +<video src="/vid/claws-mail-git.webm" alt="A demonstration of applying a git +patch by invoking the action on a patch email in Claws Mail." controls>Your +browser does not support the video tag.</video> + +So there you have it: a clean and easy way to apply git patches using Claws +Mail. It's even faster than using aerc too, since I only have to type a single +keyboard shortcut instead of typing out whole commands. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,95 @@ +Title: A Month-and-a-Half of Self-Hosted Email +Author: Jake Bauer +Date: 2020-07-02 +Summary: There's been a lot of talk in my Internet neighbourhood lately about the state of email and whether it's broken or not. Here's why I think email is just fine as it is, from the perspective of someone self-hosting + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +There's been a lot of talk in my Internet neighbourhood lately about the state +of email and whether it's broken or not. I previously posted about how I think +[email is the best discussion +platform](/blog/self-hosted-mail-now-live) so you can +probably infer my position already. However, I wanted to add the perspective of +someone self-hosting email to the discussion since the two major points people +are talking about are spam and privacy. + +I went live with my self-hosted email server on 2020-05-19; almost a month and a +half ago. Since then, I've been using it daily for all of my email-based +communications through IMAP (there is no web interface). As I discussed in my +[blog posts about setting up +email](/blog/preparing-to-self-host-email), I am using +OpenBSD with OpenSMTPD, Dovecot, and Rspamd which is holding up well as a solid, +reliable software stack. + +I have had no issues sending email to any domain and I haven't had to do any +maintenance on the server except for needing to ssh in a couple of times to run +`doas sysupgrade` when a patch for the base system was released (I've signed up +to the OpenBSD mailing list which notifies me when these updates are released, +so it's a simple matter of logging on, running the update, and rebooting the +server which takes all of 5 minutes to do). In fact, I just ran `uptime` and the +server says it's been `up 27 days, 23:16`. Additionally, I have package updates +run as a daily cron job and I force TLS certificate renewal in a monthly cron +job. I get daily and monthly emails about the output of both of those commands +so I can quickly make sure that everything is running as it should. Maintenance +is a non-issue for me. + +Regarding spam, the number one complaint I hear across the Internet when +self-hosting email is that spam is unmanageable for someone self-hosting their +own email. I am someone who readily posts +[]( links on my site and in +a handful of blog posts, I have my Rspamd configuration set up to conservatively +junk emails instead of outright blocking them (unless they come from a dynamic +IP address, then they're outright blocked), and I haven't received *a single* +piece of spam email directed at me. The only actual spam that has landed in my +junk folder is the very occasional message that slipped past a mailing list's +filter (usually from a Linux mailing list). I can count on one hand the number +of those messages that I have received. + +I'm not sure what it is, but somehow after leaving a big mail provider (in my +case it was ProtonMail), I now receive less spam despite using the exact same +email address and publicly advertising my email. My experience matches that of +the creator of OpenSMTPD: + +> I take absolutely no precaution hiding my e-mail address,, +> and I sometimes get one or two spam e-mails per day in the junk folder. Not +> only is that not a daily nightmare, but it’s less than what I actually receive +> on my own Big Mailer Corps account [...] ([source for the quote]( + +As far as privacy is concerned, I don't have to worry about a company analyzing +my every inbound and outbound email to gather data on me because I am my own +provider. Many of my emails still grace Google's and Microsoft's servers with +their presence, but I recognize that any email not end-to-end encrypted is not +truly private (though they are still encrypted in transit with TLS). I'm not +going to be discussing intimate details or credit card information with someone +via email because I know the limitations of the medium. If I'm sending sensitive +data, I would encrypt my message with GPG or use a different medium such as +Matrix. + +Back in the early days of the Internet (back before it even _was_ "the +Internet"), [email was used as a collaboration +tool]( ([ +link]( and it still excels at that +purpose. Many people still [find email better to use for +collaboration](, +as do I. As much as it might seem natural to compare electronic mail to regular +snail mail, it really isn't a replacement for that, only a loose analogy. Sure, +email is a much faster way to send a letter-like message to someone and we get +newsletters and whatnot from corporations just like with snail mail (although +with an easier way to opt-out), but governments, banks, and other institutions +which deal with things such as financial information, licensing, insurance, and +highly sensitive personal information still use snail mail because of the legal +guarantees and the known security model of that system. + +I know the others talking about this weren't saying exactly this, but I do want +to make the point that just because email doesn't provide the same security +guarantees as snail mail, Matrix, or Signal, doesn't mean it's a broken system; +it just means that it's not built for use cases where those other technologies +excel. Email excels at being a collaboration tool, a way to quickly disseminate +information and announcements, and a way to get in contact with people with whom +you're not close friends. For those purposes, email is working just fine. + +_This is my fifty-eighth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,34 @@ +Title: A Quick Rant About Web Font Sizes +Author: Jake Bauer +Date: 2020-05-28 +Summary: A quick rant about font sizes on websites and what I did for my website. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Once I discovered how font sizes actually work in CSS, sites that lock the font +size by specifying it in some value of `px` annoy me to no end. I typically have +my browser's font size increased to 20px because I find the text crisper and way +easier to read. + +For that reason, I used the CSS `max()` property to set my website's font size +to `max(18px, 100%)` which essentially tells the browser to render the site at +`18px` or the font size that the user set in their browser settings if they set +it to something higher than 18px. + +I was recently thinking, though, that this rule is basically useless. I may as +well just set the font size to `100%` and let the user pick what font size they +want to see my site in because different users have different preferences and +different accessibility needs. Therefore, who am I to decide what size the text +should be on my website for other people? + +That's my short rant on website font sizes. Just use some reasonable percent +value (like `100%`) and scale the rest of your font sizes based off of that. If +choosing a specific font size is necessary to make text fit in some specific box +or shape, consider scaling that whole element or re-designing it because it +probably wasn't going to be accessible anyways. + +_This is my thirty-second post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,88 @@ +Title: Are TODO Applications a Waste of Time? +Author: Jake Bauer +Date: 2020-07-07 +Summary: A few days ago I saw a video talking about how TODO applications are a waste of time. I don't think TODO applications are the problem though, humans are. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +A few days ago, the following video by Derek Taylor popped up on my feed and got +me thinking about TODO applications: [Are TODO Applications Hindering Your +Productivity?]( ([ +link]( Some points that he mentioned +resonated with me, though I think he is slightly wrong in his conclusion. + +He basically said: TODO applications hinder your productivity because you spend +more time organizing your tasks instead of just doing them, they trick you into +thinking you're getting things done when, in reality, you're just giving +yourself little boosts of dopamine by checking off trivial things, and it sets +you up for failure since humans typically over-estimate how much can be done in +a day. On the whole, I agree with what he says, but I don't think TODO +applications are useless or hinder your productivity and there are ways, when +applied correctly, that they can be helpful. + +I have seen in other people and experienced myself the draw to get organized +before beginning a task and then spending more time coming up with or setting up +this "perfect" organization system that will prepare me to accomplish tasks +effectively than actually doing the task itself. However, this hypothetical +"perfect" system I was creating was really just a way to procrastinate on the +task at hand by making myself feel like I was being productive. In reality, if +I just wrote down a list of things to do and got working, the task would have +been done a lot sooner. + +I have also experienced the urge to write down every little thing I need to do +in a day and religiously check it off as, essentially, a way to feel productive. +This I have a less strong opinion about because it can be a big help on days +where motivation levels are low and distractions are high. I've found completing +small tasks and getting those boosts of dopamine to be a good way to kick-start +my brain into tackling the larger tasks of the day. It's like starting a car +engine on a cold day: turn the engine over a few times and eventually it'll +spring to life and become self-sustaining. The problem here arises when one +stops at just doing the small tasks, is "satisfied" by those tiny boosts of +dopamine, and doesn't do anything else from there. At that point, the TODO list +ceases to be useful and just becomes a source of anxiety and a way to put off +the bigger tasks. + +Overestimation is a big human problem. We frequently overestimate how much we +can accomplish in an hour, let alone a day. This frequently leads to situations +where we expect to get a lot done so we create a huge list of things to do and +then feel bad when we couldn't accomplish what we thought we could. This isn't a +problem with TODO lists; it's a trapping that one has to be aware of and avoid +when planning their days or getting organized. + +Essentially, TODO lists or TODO applications are not the problem here, it's +people using them as a procrastinative and as a way to feel productive instead +of actually doing the things that need to be done which is the problem. In +reality, a well-curated, disorganized, simple checklist can be as or more +effective than a well-organized, pretty TODO system that has had a lot of +thought and work put into it. TODO lists and applications aren't useless, they +just enable productivity anti-patterns and one has to be aware of those +anti-patterns to make effective use of TODO lists and applications. + +Don't let the illusion of productivity that TODO lists and applications invite +become a procrastinative outlet or a substitute for doing the actual tasks. + +_**Note**: Procrastinative isn't a real word. Except it is now cause I just made +it up:_ + +<div class="note"> +**Procrastinative**, n. or adj. /prəˈkrastənatɪv/ + +1 : (n.) A thing someone uses to procrastinate. + +* "Social media is a procrastinative." + +2 : (adj.) Used to describe an object which is frequently used to procrastinate. + +* "I have a procrastinative game collection." +* "This deck of cards is my procrastinative outlet." + +3 : (adj.) A feeling that describes one's desire to procrastinate. + +* "I'm feeling very procrastinative today." +</div> + +_This is my sixty-third post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,87 @@ +Title: China +Author: Jake Bauer +Date: 2019-11-23 +Summary: Although I too would prefer to keep politics and world affairs out of my blog as well, I am in complete agreement in that it would also betray my personal beliefs and principles to remain publicly silent about what is taking place in China and in Hong Kong right now. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I have just finished reading [Drew DeVault's most recent blog +post]( in which he writes about +China. + +Although I too would prefer to keep politics and world affairs out of my blog, I +am in complete agreement with him in that it would also betray my personal +beliefs and principles to remain publicly silent about what is taking place in +China and in Hong Kong right now. + +I strongly recommend that anyone who is reading this should read the blog post +linked above in its entirety. Every word is important. + +I have already been boycotting Chinese products and the companies that have +given in to China's ridiculous demands (e.g. Apple, Blizzard, Gap Inc., etc.) as +much as I possibly can and I have encouraged my friend groups to do so as well. +I have also written a letter to my member of Parliament (I encourage you to +write physical letters as they are at least slightly harder to ignore than an +email). + +I know it's not easy to boycott, especially if you are in the market for +electronics, but I believe that it is our moral imperative to do as much as we +possibly can to protest the actions of the Chinese government and to show our +support for the citizens of Hong Kong in their fight for the same freedoms and +democracy that we in the West take for granted. + +The excuse, "Boycotting/Writing to my representative/speaking up is useless, I +am just one person.", is an old and tired one that people use so they can put +the issues of the day at the back of their minds and keep living life as if +thousands of people fighting for their freedom aren't being slaughtered like +dogs. Don't be the kind of person who stands by and watches as this happens. + +If you're wondering, "What else can I do?", here are some links: + +[Band in China]( – A list of +what can be done to support Hong Kong. + +[Company +Blacklist]( +– A list of companies you should boycott for spinelessly complying with the +demands of China. + +[Company Whitelist]( +– A list of companies that have stood up to China. These are companies/people +you should support but some you should still keep a close eye on such as Epic +Games who are partially owned by the Chinese company Tencent. + +If you have already written to your representative, boycotted companies, and +spread the word about China's despicable actions then I sincerely thank you for +being a good person and standing up for what you believe in. I also encourage +you to take a look at some of the other protests that have been happening around +the world in places like Spain, Lebanon, and Bolivia. Some similar to Hong Kong, +others about things like climate change and income inequality. [Here is an +article by the BBC]( + +To close out this post, I want to share one of my favourite quotes/poems: + +<pre><code>First they came for the Communists +And I did not speak out +Because I was not a Communist + +Then they came for the Socialists +And I did not speak out +Because I was not a Socialist + +Then they came for the trade unionists +And I did not speak out +Because I was not a trade unionist + +Then they came for the Jews +And I did not speak out +Because I was not a Jew + +Then they came for me +And there was no one left +To speak out for me + +-- Martin Niemöller, 1946 +</code></pre> diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,272 @@ +Title: Choosing a Self-Hosted Git Service +Author: Jake Bauer +Date: 2020-05-26 +Summary: A brief comparison of some of the more popular software forges available for self-hosting. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +_**2022-09-27 Update**: Add Stagit._ + +_**2020-05-27 Update**: Add Gitolite._ + +_**2020-05-29 Update**: Add cgit._ + +_**2020-09-21 Update**: Add Pagure._ + +Git is by far the most popular version control system right now and there are so +many options for self-hosting your repositories it can be difficult to figure +out which one is the best for you. In this post, I'll go through many of the +more popular free and open source options with a brief opinion about each and +links to where you can find out more. I'll also explain what I chose for myself +and why. + +## GitLab + +* [Link to Gitlab]( +* **Programmed in**: Ruby, Go +* **Supports**: Git + +GitLab is one of the most popular git hosting services next to GitHub. They +operate with an [open-core]( +business model which means that core features of GitLab are open source, but +many other features are proprietary software. + +GitLab's UI is somewhat similar to GitHub's and it uses the same Pull Request +model for contributing to others' software projects where you "fork" a project +and then submit a pull request using the web UI. + +I will get straight to the point with this though. Don't use GitLab. It's a +bloated mess of a software forge that, yes, has a lot of features, but also has +a lot of problems. For example, [GitLab has memory +leaks]( which, instead of fixing, +they created a duct-tape solution which kills a memory-hungry process and +re-starts it. They also recommend 8GB of RAM as a minimum for the application to +run smoothly. EIGHT GIGABYTES! I'm running Gitea on a PineA64 SBC and the entire +system's RAM usage is at less than 0.5GB. GitLab is slow, bloated, and +definitely not a good candidate for someone looking to self-host a git service. + +## Gogs + +* [Link to Gogs]( +* **Programmed in**: Go +* **Supports**: Git + +Gogs is a GitHub-like software forge programmed in Go and designed to be fairly +easy to self-host. If you have some experience using GitHub, you'll very quickly +get used to the interface of Gogs as it's nearly identical. It also uses the +pull-request method of development and maintains a fairly clean-looking UI. + +Just like GitHub and GitLab, it's a bit heavy on the front-end JavaScript and +thus its accessibility and client-side performance suffers as a result. It does +provide the features one would want from a software forge such as CI/CD, Wikis, +and issue tracking. + +It's easy to host since it's a single, statically-compiled binary. One just +needs to install a backing database, set up some configuration, and run the +binary to have a fully-featured software forge up and running. It seems +appropriate for anywhere from single-user instances, to medium-sized groups and +teams. + +## Gitea + +* [Link to Gitea]( +* **Programmed in**: Go +* **Supports**: Git + +Gitea is a [fork of Gogs]( hence +it looks and feels much the same. The development model for Gitea is more open +than the one for Gogs and so it tends to receive bugfixes and improvements +faster than Gogs. It's also a better choice than Gogs if you're someone who +would like the ability to send patches upstream. + +In most respects, Gitea looks and functions the same as Gogs though Gitea does +have many more features. A detailed list of differences between the two can be +found on the [Gitea comparison page]( + +## SourceHut + +* [Link to SourceHut]( +* **Programmed in**: Go, Python +* **Supports**: Git, Mercurial + +SourceHut is a project created by [Drew DeVault]( and +released in [public alpha on +2018-11-15]( +through the hosted instance []( Since then, it has been +steadily growing its user base and feature set. It now includes comprehensive +CI/CD and Project Hubs. + +SourceHut is unique in that it's a fully-featured software forge which uses no +front-end JavaScript and supports esoteric operating systems such as Plan 9 in +its automated build framework. Unlike GitHub and many of its clones, SourceHut +does not use pull requests and instead uses mailing lists for everything from +bug reporting to sending in patches (though this can still be done through the +web UI). The advantage to this is that one does not need an account on a +SourceHut instance to contribute. Some might say that the disadvantage is that +this workflow is hard to figure out, but in reality it's just a different +development paradigm and doesn't take much effort to learn. See +[]( for a brief introduction. + +It's important to note that SourceHut is still in alpha and requires at least a +moderate level of experience to self-host. It also uses individual, modular +services to make up the entirety of the forge. For example, if you want access +to mailing lists for your instance, you must host a service. This +makes the entire system much more resilient in the case of bugs or system +failures, but can be challenging for a novice sysadmin or not worth the effort +if all you want is a software forge for publicly showing off and working on your +own repositories. SourceHut is definitely worth checking out if you want a +software forge for a group or team of people. + +## Phabricator + +* [Link to Phabricator]( +* **Programmed In**: PHP +* **Supports**: Git, Mercurial, Subversion + +I don't have as much experience with Phabricator as I do other services on this +list so my overview essentially comes from reading documentation and poking +around the hosted instance. + +Phabricator is a software forge built by [Phacility]( It +offers the same features as the above-mentioned software forges and is also +straightforward to install, perhaps requiring a level of skill in between +SourceHut and Gitea if the installation guide is anything to go by. + +Similar to SourceHut, this service may be more than you need if you're looking +for a simple way to show off your Git repositories. It is fully-featured and +competently developed though so, if you're looking for an alternative to GitLab +for a group or team of people, Phabricator is worth checking out. + +## Pagure + +* [Link to Pagure]( +* **Programmed In**: Python +* **Supports**: Git + +Pagure is similar to the other software forges mentioned above. It has all the +features expected from a contemporary software forge including wikis, issue +trackers, releases, and more. From the [Pagure home +page]( + +> With pagure you can host your project with its documentation, let your users +> report issues or request enhancements using the ticketing system and build +> your community of contributors by allowing them to fork your projects and +> contribute to it via the now-popular pull-request mechanism. + +One advantage I can see for Pagure over many of the other options is that both +project and user discovery seem to be easier than with other software forges. +There are dedicated pages listing repositories, users, and groups with a search +bar allowing for the quick and easy discovery of different things on a specific +instance. + +It also offers several methods for installation: Docker, Vagrant, and a manual +installation. The manual installation process is very straightforward and clear +from the instructions given. + +## Gitolite + +* [Link to Gitolite]( +* **Programmed In**: Perl +* **Supports**: Git + +Gitolite is different from any other Git service in this post; it isn't a full +software forge and doesn't have a web interface. Instead, it simply provides a +way to host many git repositories with virtual users and fine-grained access +control. <q>Gitolite is an access control layer on top of git.</q> + +Notable current or past users of Gitolite include the Fedora Project, the KDE +project, Gentoo Linux, and + +This may be what you want if all you're looking for is a way to host multiple +git repositories on a central server where each repository can have mutliple +developers. To learn more about what Gitolite does and its supported features, +see the [Gitolite overview]( + +## Gitweb + +* [Link to Gitweb Documentation]( +* **Programmed In**: Perl +* **Supports**: Git + +Gitweb is the default web interface for Git repositories. It's essentially a way +to view the contents of a repository and its git-related data (commits, +branches, blames, etc) using a web interface. It's not a software forge like the +others in this article, but if all you want is a UI to view information about +git repositories, then this is a valid choice. + +## cgit + +* [Link to cgit]( +* **Programmed In**: C +* **Supports**: Git + +cgit is a simple web interface for Git repositories. Like Gitolite or Gitweb, +cgit is not a software forge and only includes functionality for viewing Git +repositories, commit diffs, and the like. It's basically the same as Gitweb, but +noticeably faster when viewing large repositories and with support for caching +the generated pages. It may also look better than Gitweb, depending on your +sensibilities. + +## Stagit + +* [Link to Stagit]( +* **Programmed In**: C +* **Supports**: Git + +Stagit is not really a "service" per se. Stagit generates static web pages based +on git repositories which can then be served by any web server. It's very easy +to script, customize, and deploy since the stagit program itself is only used +for generating pages, not serving content or handling connections. Stagit can be +run as a cron job or using a post-receive hook so that pages get updated +whenever a push is made to a git repository. It's also the lightest +option out of all of the entries in this post, since it doesn't do any +dynamic content generation and the static pages it generates are very +lightweight. + +## My Choices + +<p class="note">I have since changed what I use to cgit. I outline why in a more +recent blog post: <a +href="/blog/switching-to-cgit">Switching to cgit</a></p> + +<p class="note">Actually, I'm now using stagit.</p> + +When looking for a self-hosted git service, I was looking for a service that +fulfilled the following criteria: + +* **Philosophy**: Simple software, open development +* **User Interface**: Snappy, clean +* **Resource Usage**: Low, should run on an SBC +* **Back-end Language**: Anything but JavaScript (because of npm) +* **Ease of Administration**: The easier, the better + +At [](, I currently host a Gitea +instance. Although I would have loved to host my own SourceHut instance, I feel +it's not designed for my use case. I basically just use Gitea to mirror my +repositories which are also hosted on SourceHut and to allow a small group of +friends to collaborate with me in smaller, private projects. I could probably +get away with Gitweb, but Gitea also gives me a playground to experiment with +CI/CD and other technologies I may encounter in my career. Gitea was also really +easy to set up, customize, and maintain. I use a script, +[gitea-updater](, created by a +friend of mine to easily update it too. + +As far as hosted services, I use SourceHut's instance because it's +lightweight, straightforward, and I like its email-driven development model. I +used to use GitHub and GitLab, but SourceHut performs way better and experiences +downtime far less often than the big providers such as GitHub and GitLab. + +There are also quite a few more, albeit less popular, free and open source +software forges available, many listed in [this comparison by Apache +Allura]( +Additionally, check out []( for a comparison +of the performance of some of the biggest hosted software forges. + +Let me know if I've failed to mention anything important here or if I've missed +a software forge you'd like to see mentioned. + +_This is my thirtieth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,62 @@ +Title: Choosing An Investment Brokerage +Author: Jake Bauer +Date: 2020-08-12 +Summary: Now that my time at university is coming to an end, I'm starting to look forward into the future at what kind of saving and investing I will need to do to achieve my life goals. My first step is to find a brokerage which meets my needs as a Canadian investor. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<p class="note">None of this is intended to be financial or investment +advice.</p> + +Now that my time at university is coming to an end, I'm starting to look forward +into the future at what kind of saving and investing I will need to do to +achieve my life goals. My first step is to find a brokerage which meets my needs +as a Canadian investor. There are so many options to choose from and so many +criteria to consider that I did the only sensible thing a Computer Scientist +could do: I made a spreadsheet. + +<figure> + <a href="/img/brokerage-comparison.png"><img src="/img/brokerage-comparison-thumb.png"/></a> + <figcaption>Working on the Spreadsheet using NextCloud</figcaption> +</figure> + +[Download the spreadsheet +here](// (if you notice any +incorrect or missing information, please contact me). + +I made the spreadsheet in collaboration with my friend who is also in the same +position as I am. We did a ton of research ([Charlee Wayne's YouTube +channel]( was incredibly helpful for this) +and compiled a list of all the options we could find which at least offered +trading of Stocks and ETFs. This led us to a list of 5 independent brokerage +firms and 6 banks. + +We then set out to evaluate each one from the perspective of student/recent +graduate investors who would be putting money into a TFSA (Tax Free Savings +Account) and, in the near future, an RRSP (Registered Retirement Savings Plan). +We evaluated the brokerages mostly on their fee structures, what they allow us +to trade, and what their youth discounts looked like. Secondarily, we evaluated +the brokerages on the comprehensiveness of their trading platforms such as +whether or not there was an easily accessible stock screener, indicators on +charts, and so on. + +For a few of the categories, information might be missing (indicated by a '?') +because we couldn't readily find the information on the websites of the +respective brokerages and we couldn't open a practice account so that we could +evaluate their platforms without creating a real account. Most of this +information isn't all that important though, so I'm not too bothered. + +After doing all this research, I still haven't yet made my mind up with regards +to which brokerage I will choose, but I have at least narrowed down my choices +to Questrade, Virtual Brokers, and National Bank and I know that I have at least +thoroughly considered all of the options. + +If you're a Canadian thinking of investing or are already investing, let me know +about your experiences by contacting me through email or the Fediverse; I'd love +to hear about other people's experiences! + +_This is my ninety-second post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,68 @@ +Title: Colours for Gitea Issues +Author: Jake Bauer +Date: 2020-07-11 +Summary: When I used to use Gitea, I created a colourscheme for classifying issues. Even though I'm not using it anymore, I figured others may get some use out of it. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I don't use Gitea anymore, but when I did I created a colourscheme for +classifying issues. This page used to exist on my Wiki, but since both that and +Gitea are no longer being used, I figured others using Gitea may get use out of +this scheme. + +<table> <thead> +<tr> <th>Colour</th> <th>Colour Code</th> <th>Label</th> <th>Description</th> </tr> +</thead> <tbody> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>Linux</td> <td>"This applies to Linux"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>Windows</td> <td>"This applies to Windows"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>MacOS</td> <td>"This applies to MacOS"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>FreeBSD</td> <td>"This applies to FreeBSD"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>OpenBSD</td> <td>"This applies to OpenBSD"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>Other OS</td> <td>"This applies to another OS"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>Front-end</td> <td>"This is a front-end feature"</td> </tr> +<tr> <td style="background-color:#bfd4f2"></td> <td>#bfd4f2</td> <td>Back-end</td> <td>"This is a back-end feature"</td> </tr> +<tr> <td style="background-color:#ee0701"></td> <td>#ee0701</td> <td>Bug</td> <td>"Something is not working"</td> </tr> +<tr> <td style="background-color:#ee0701"></td> <td>#ee0701</td> <td>Security</td> <td>"A security-related bug"</td> </tr> +<tr> <td style="background-color:#fef2c0"></td> <td>#fef2c0</td> <td>Mindless</td> <td>"A mindless task (e.g. organization, admin work)"</td> </tr> +<tr> <td style="background-color:#207de5"></td> <td>#207de5</td> <td>Enhancement</td> <td>"An enhancement to an existing feature"</td> </tr> +<tr> <td style="background-color:#128a0c"></td> <td>#128a0c</td> <td>Feature</td> <td>"A new feature"</td> </tr> +<tr> <td style="background-color:#84b6eb"></td> <td>#84b6eb</td> <td>Help Wanted</td> <td>"The person assigned has requested help"</td> </tr> +<tr> <td style="background-color:#d4c5f9"></td> <td>#d4c5f9</td> <td>Feedback</td> <td>"Feedback is requested on this issue"</td> </tr> +<tr> <td style="background-color:#fbca04"></td> <td>#fbca04</td> <td>Pending</td> <td>"Progress is pending external factors or issues"</td> </tr> +<tr> <td style="background-color:#cc317c"></td> <td>#cc317c</td> <td>Question</td> <td>"A question is being asked"</td> </tr> +<tr> <td style="background-color:#cccccc"></td> <td>#cccccc</td> <td>Duplicate</td> <td>"This is a duplicate"</td> </tr> +<tr> <td style="background-color:#cccccc"></td> <td>#cccccc</td> <td>Invalid</td> <td>"This is invalid in some way"</td> </tr> +<tr> <td style="background-color:#cccccc"></td> <td>#cccccc</td> <td>Wontfix</td> <td>"This won't be fixed"</td> </tr> +</tbody> </table> + +Here is the above table in the Gitea labels template format (the content below +goes into a file in `custom/options/label/`: + +``` +#bfd4f2 Linux ; This applies to Linux +#bfd4f2 Windows ; This applies to Windows +#bfd4f2 MacOS ; This applies to MacOS +#bfd4f2 FreeBSD ; This applies to FreeBSD +#bfd4f2 OpenBSD ; This applies to OpenBSD +#bfd4f2 OtherOS ; This applies to another OS +#bfd4f2 Front-end ; This is a front-end feature +#bfd4f2 Back-end ; This is a back-end feature +#ee0701 Bug ; Something is not working +#ee0701 Security ; A security-related bug +#fef2c0 Mindless ; A mindless task (e.g. organization, admin work) +#207de5 Enhancement ; An enhancement to an existing feature +#128a0c Feature ; A new feature +#84b6eb Help Wanted ; The person assigned has requested help +#d4c5f9 Feedback ; Feedback is requested on this issue +#fbca04 Pending ; Progress pending external factors or issues +#cc317c Question ; A question is being asked +#cccccc Duplicate ; This is a duplicate +#cccccc Invalid ; This is invalid in some way +#cccccc Wontfix ; This won't be fixed +``` + +_This is my sixty-sixth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,166 @@ +Title: Installing Debian 10 Buster with Encrypted LVM and btrfs Subvolumes +Author: Jake Bauer +Date: 2020-07-14 +Summary: How to set up a Debian 10 Buster system with btrfs using subvolumes on your root filesystem during the installation process. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +## Introduction + +Debian currently supports formatting partitions with btrfs, but doesn't support +creating subvolumes from within the installer. Below I will detail the process +of getting subvolumes on your root file system with optional LVM encryption, +should you desire. Once you're familiar with this procedure, you will find that +it is actually a lot easier than it seemed at first! + +This procedure has been adapted from this video found on YouTube: <a +href="">Debian 9 | Installation mit +Btrfs Subvolumes (Debian Wochen)</a> by YouTube user "". This video is +in German but you don't need to understand the language to follow the steps on +screen. This tutorial aims to expand on the content of the video by approaching +it from the perspective of wanting encrypted partitions and it also provides an +English-language reference to the content of the video. + +## Procedure + +After downloading a Debian installation image and putting it on a CD/DVD/USB, +boot it and choose `Advanced options > Expert install` (or `Graphical expert +install` if you want). + +Run through the installation as normal until you reach the section on +partitioning: + +<figure> + <a href="/img/debian-with-btrfs/partition-screen.png"><img + src="/img/debian-with-btrfs/partition-screen.png" alt="The Debian installer + disk partitioning menu"/></a> +</figure> + +On this screen, if you want an encrypted root file system then you probably want +to choose the option `Guided - use entire disk and set up encrypted LVM`. If you +are working with a disk that already has an operating system on it which you +wish to keep or if you have more complicated partitioning needs, you will have +to choose `Manual` and create the partitions necessary for your configuration. + +Once you have run through the setup of the partitions you should now see a +screen similar to the one below: + +<figure> + <a href="/img/debian-with-btrfs/partition-results.png"><img + src="/img/debian-with-btrfs/partition-results.png" alt="The screen showing + the overview of the currently configured partitions and mount points."/></a> +</figure> + +Select your root file system (the one with the `/` as the mount point), change +the `Use as:` field to `btrfs journaling file system` and select `Done setting +up the partition`. After this, select `Finish partitioning and write changes to +disk`, following the prompts until you arrive back in the installation menu. +This will apply the chosen partitioning scheme. + +After this and before continuing with the installation, type `Ctrl`+`Alt`+`F2` +to be put into a shell. Press `Enter` to activate this shell and follow the +following procedure to set up subvolumes: + +<figure> + <a href="/img/debian-with-btrfs/shell.png"><img + src="/img/debian-with-btrfs/shell.png" alt="The busybox terminal on + tty2."/></a> +</figure> + +Use the `df` command to view what the current mounted partitions are. In my case +there is `/dev/mapper/debianbtrfs--vg-root` mounted to `/target` and `/dev/vda1` +mounted to `/target/boot`. `/target` is the place where the Debian system files +will be installed. We need to change and set some things up so that it becomes a +btrfs subvolume. + +<figure> + <a href="/img/debian-with-btrfs/df.png"><img + src="/img/debian-with-btrfs/df.png" alt="The output of the df + command."/></a> +</figure> + +The first step is to unmount both `/target/boot` and then `/target` using the +`umount` command. + +Then, mount the btrfs root volume (i.e. the volume that used to be mounted to +`/target` hereby referred to as `BTRFS_VOLUME`) to `/mnt` and then `cd /mnt`. + +Create the desired subvolumes with `btrfs subvolume create SUBVOLUME_NAME`. I +have created `@`, `@home`, and `@snapshots`. + +Following this, mount the root subvolume to `/target` like so: `mount -o +noatime,compress=lzo,space_cache,subvol=@ BTRFS_VOLUME /target`. + +<p class="note">There are quite a few compression algorithms available for use +with btrfs now; learn more on [the btrfs +wiki]( I personally use +zstd.</p> + +Now we want to `mkdir -p /target/etc` and copy `/mnt/etc/fstab` (and +`/mnt/etc/crypttab` if you are using encrypted LVM volumes) into `/target/etc`. +Once this is done we can `rm -r /mnt/boot /mnt/etc /mnt/media` otherwise these +directories will remain in the final installation (which isn't a big deal but +this is done just for the sake of cleanliness). When this is done, unmount +`/mnt`. + +The next step is to make the necessary subdirectories in `/target` for your +subvolumes. I did: `mkdir -p /target/home /target/.snapshots`. Now, mount the +rest of the subvolumes the same way as before like we did for the root +subvolume. Also, mount the boot partition (which in my case resides on +`/dev/vda1` to `/target/boot/efi` (or just `/target/boot` for a legacy BIOS +system). The following screenshots show the exact commands that I ran: + +<figure> + <a href="/img/debian-with-btrfs/commands-before-boot-mount.png"><img + src="/img/debian-with-btrfs/commands-before-boot-mount.png" alt="All of the + commands run as described above (minus mounting boot)."/></a> +</figure> + +<figure> + <a href="/img/debian-with-btrfs/boot-mount.png"><img + src="/img/debian-with-btrfs/boot-mount.png" alt="The commands run to mount + the boot partition."/></a> +</figure> + +Now, edit `/target/etc/fstab` (you must use `nano` as unfortunately there is no +version of `vi` in this busybox configuration) and add the relevant +entries to mount your subvolumes on boot. These should look the same as the +entry that already exists but you will have to change the options from `default` +to the ones that we used above when mounting our subvolumes and you will have to +change the mount points. For example, the line for mounting the root filesystem +will go from: + +``` +/dev/mapper/debianbtrfs--vg-root / btrfs defaults 0 0 +``` + +to: + +``` +/dev/mapper/debianbtrfs--vg-root / btrfs noatime,compress=lzo,space_cache,subvol=@ 0 0 +``` + +Where the other lines will look similar: + +<figure> + <a href="/img/debian-with-btrfs/target-fstab.png"><img + src="/img/debian-with-btrfs/target-fstab.png" alt="The contents of the + /target/etc/fstab file after modification."/></a> +</figure> + +Once this is all done and you have saved your changes, you may exit out of this +terminal (`Ctrl`+`D`) and return to the installation (`Ctrl`+`Alt`+`F1`). +Proceed with the installation as normal and, when you boot, you should have a +btrfs filesystem working with subvolumes! + +If you get stuck somewhere, try asking in the many helpful areas of the Internet +such as the <a href="">Debian User Forums</a>, the +`#debian` IRC channel on the Freenode network, or the `debian-user` mailing +list. See this resource for <a href="">more +information on getting help with Debian.</a> + +_This is my seventy-first post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,62 @@ +Title: Decommissioning My Rackmount Server +Author: Jake Bauer +Date: 2020-04-11 +Summary: I love self-hosting stuff because of the control it gives me over my own data. However, I had a rackmount server that was way too loud, power-hungry, and hot. I decided to get rid of it for some serious improvements. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I love self-hosting stuff. It allows me to exercise system administration skills +and allows me to be in control of my data. I try to do this as cheaply as +possible which includes keeping my power usage down. Not only is power +efficiency light on my wallet, more importantly it's better for the environment. +Power-efficient things also typically need less cooling which leads to lower +noise output from those machines. + +My Dell R415 rackmount server was basically the antithesis of all of those +values. It was hot, loud, and sucked down 200W when _idle_. All for a meagre 8 +threads and 16GB of RAM. + +Although I got this server for a really good price ($95 USD, shipping included), +the reason that I got it for such a low price was because the hardware isn't +particularly high-end. It came with 16GB of RAM which is more than enough for my +needs but the problem is that it has two AMD Opteron 4130 CPUs which run at +2.26GHz and have 4 cores each with _no simultaneous multithreading_. + +One morning, I decided to run some benchmarks on my server versus one of my +spare laptops which couldn't function as a laptop anymore due to missing the +screen. I used the program `stress` to run some CPU, RAM, and I/O benchmarks and +to my surprise, my spare laptop with its i5-2450M (2 cores and 4 threads) beat +my server by about 33% in both CPU and RAM benchmarks although it was +unsurprisingly slower I/O-wise. + +I had previously been using this laptop as a server to collect mail from my +virtual machines and it had been running as long as the R415 so I knew it could +reliably function as a server even though I would lose things like hard disk +redundancy. + +I decided I was fed up with the noise and heat from the R415 and decided to +switch over that same afternoon. + +I first installed Proxmox on the laptop, added both machines to a cluster, used +the migrate feature built in to Proxmox to move all of the VMs to the laptop, +and finally powered down and removed the R415 from the cluster. Silence at last. + +Once I finished moving around hardware (I am using a [Lack +Rack](, I powered everything back on +again and noticed that this new configuration was only drawing 65W on average +and that's for my _entire_ homelab. Where my entire homelab used to draw about +240W, it now draws 27% of what it used to and it's almost completely silent +while doing it. + +The laptop sits at around 15% CPU and 45% RAM utilization with all of my +virtualized services running and I haven't experienced any slowness in using +them. Although I don't have redundant hard drives with this laptop, I do still +back up all of my VMs and configurations which means I'd have probably only a +few hours downtime if the hard drive fails. It's something I can live with in +exchange for what the laptop offers. + +You can get more detailed information about the specs of my lab machines over on +the page [about what I use](/uses). +Suffice to say, I'm now very happy with what I have. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,79 @@ +Title: The Difficulty of Educating People About Online Privacy +Author: Jake Bauer +Date: 2019-12-20 +Summary: I've recently been reflecting on the difficulty that I've had in conversations with people about online privacy where it is frustratingly difficult to get them to care about who has their data and how it is being misused. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<em>Update: I just finished listening to the latest Jupiter Extras podcast +entitled [Brunch with Brent: Jason Spisak Part +2]( +in which they touch on this topic a bit. It's definitely worth a listen.</em> + +I've recently been reflecting on the difficulty that I've had in conversations +with people about online privacy where it is frustratingly difficult to get them +to care about who has their data and how it is being misused. + +I have given it some thought and come upon three major sticking points in my +conversations with others about online privacy (which also apply to any kind of +debate in general): + +## Stubbornness + +When someone is really set in their ways, it is exceedingly difficult to get +them to consider changing their behaviour. For some people, even mentioning that +something they are doing (or not doing) is perhaps wrong or detrimental to them +is equivalent to insulting their favourite childhood television programme. + +There are also usually many logical fallacies and other psychological effects +that people fall into which contributes to this. For example, if someone has +purchased a $100 smart home lady cylinder, they may try to defend themselves +against the feeling of buyer's remorse if you are telling them that this big +purchase may have been a bad choice. + +Usually, if you persist enough in subtle ways, you can erode someone's +stubbornness by exposing them to things like news articles and practical +examples of data breaches and privacy violations but you obviously don't want to +be a gnat in their ear constantly pestering them about this. + +## Ignorance + +To the chagrin of myself and many of my colleagues, most of the general public +are not familiar with even the most basic workings of the devices which we use +every day. Most people don't know what a hash is nor would they be familiar with +the many ways that attackers can steal their personal information. + +Even those who are relatively tech-savvy, as in those who are able to build +their own computers and install their own operating system, are not necessarily +knowledgeable about online privacy. + +This makes it really difficult because the points that you are making sound +really obvious to you but to others it sounds like you're either speaking +gibberish or being overly paranoid. If you have to give someone a complicated +and technical crash course on the topic of which you are trying to convince them +before you can even begin to convince them, you have most likely already failed +to convince them. + +## Apathy + +This is probably the worst of all three. When you are very passionate about a +subject and want to educate others so that they can better protect themselves or +be more aware of their data, the worst thing is that they will simply not care. +In my experience, there is nothing you can do about this. The only way to get +someone to care and take action is to watch them fail to the point where they +recognize that they can't not care anymore. Even that isn't guaranteed as some +people, no matter how much they get hurt by something, will just carry on. + +There really isn't all that much that we can do besides present our arguments, +politely attempt to present evidence, and let the news headlines do the rest of +the convincing for us. Sometimes getting the other person to explain their +position in detail can be an effective tactic in making them realise that their +reasoning is flawed but, even then, in the end it seems many people will always +choose convenience over all else despite the overwhelming evidence that their +choices could cause them significant harm. + +I'd be interested to know what, if any, strategies you have for discussing +online privacy with others. Let me know by [sending me an +email]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,62 @@ +Title: Diving Deeper Into the Small Internet +Author: Jake Bauer +Date: 2020-05-13 +Summary: Discovering Gopher, Gemini, and Finger. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Yesterday I posted about making my website available over the <a +href="">Gopher protocol</a>. +After I posted that, I was alerted to another up-and-coming protocol called +[Gemini]( which +promises to be somewhere in between the complexity of Gopher and the Web while +leaning more towards the Gopher side. + +In the morning, I awoke to some new activity in the Fediverse and on HackerNews +about a [Gemini browser called +Castor]( through which I learned +about the [finger protocol]( I +spent probably about an hour or two reading about the two protocols and +exploring Gemini-space. My morning was a rabbit hole of discovery. + +I really like the idea of Gemini. It aims to combine the simplicity of Gopher +with a few of the conveniences of the Web. For example, it supports inline links +and requires connections be encrypted using TLS unlike Gopher which doesn't +support inline links and is transmitted over plain text. If Gemini's popularity +keeps growing, I can see it becoming the de-facto standard for the small +internet's alternative to the web where Gopher would exist for compatibility +with older devices and browsers. + +To host a Gemini server, I found the +[GeGoBi]( server which says that it +understands Gophernicus-style gophermap files and is able to serve them over the +Gemini protocol. Therefore, all I had to do was download the server, run it, and +it now serves my Gopher files over Gemini so I don't have to maintain two +versions of the files for now. + +I am thinking that, once I've finished re-writing the program which compiles my +Web pages, I will write a program to translate those pages into Gemini pages and +then into Gopher pages so that I can support all three protocols without needing +to painstakingly convert each page manually. I've never written something like +this though, so I imagine it's going to take me a while to figure out. I've also +thought about contributing this functionality to [pandoc]( +but I'll wait until I've solved the problem first, then figure out how to +integrate it into pandoc without having to figure out pandoc, Haskell, and how +to solve the problem all at the same time. + +Regarding the finger protocol, I'm not sure if I'll be able to implement that on +my server. I currently run everything behind NAT and the Wikipedia page on the +finger protocol mentions that it does not work through NAT. It looks like it +would be a great alternative to a Now page and a Contact page for the small +internet but I'm not sure if I'll be able to get it working with my setup. + +All of these technologies are very exciting. The text-only interfaces of things +like Gemini/Gopher, IRC, finger, and e-mail feel really efficient not only in +relation to resource usage, but also in how they feel to interact with. I highly +recommend checking them out for your websites. + +_This is my nineteenth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,57 @@ +Title: Ethical Investing +Author: Jake Bauer +Date: 2020-08-13 +Summary: The next step after choosing an investment platform is choosing where I put my money and there's a big aspect to investing that I need to consider: ethics. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<p class="note">None of this is intended to be financial or investment +advice.</p> + +The next step after [choosing an investment +brokerage](/blog/choosing-an-investment-brokerage) or +bank is choosing where to put my money. Not only do I have to consider my +acceptable level of risk, I have to then consider how I'll split my investment +portfolio among things like ETFs, Stocks, GICs, and so on. However, aside from +all of that, there's a big aspect to investing which I want to address today: +ethics. + +The financial industry is chock-full of unethical people and unethical systems +but it seems that you have to engage with it at least a little bit to do things +such as save for a house or for retirement. However, just like with every other +aspect of my life, I try to reduce my negative impact on the world as much as I +reasonably can. When it comes to investments, this means investing in ethical +sectors, ethical companies, and ethical funds as much as I possibly can. + +Of course, when you're trading stocks on the stock market, you won't actually be +giving an unethical company your money directly (unless you're buying stocks +from an IPO or something). You are, however, contributing to an increase in the +company's value and participating in the buying and selling of parts of an +unethical company. If you're holding on to these stocks, you own a part of an +unethical company. + +For example, there are many large, stable, high-dividend-yield companies in the +Oil and Gas sector such as Enbridge (TSX:ENB)—a company which is contributing to +the [wanton destruction of the +environment]( +Companies such as Tesla (NASDAQ:TSLA) or Equifax Inc. (NYSE:EFX) can be really +profitable, but are also ultimately unethical companies (for different reasons). + +Since I have ethical issues with those companies, I will not knowingly invest in +them. Instead, my money would be better spent investing in something else such +as a renewable energy company like Innergex Renewable Energy (TSX:INE) who [are +one of the largest renewable energy companies in +Canada]( + +As is typical when considering ethics, it makes the job of selecting investment +products more difficult because a lot more research is required and there will +be many companies that your ethics will prevent you from investing in. +Ultimately though, in my opinion it's incredibly important to consider ethics +when deciding who to give my money to, just like I do when choosing what +software I use. + +_This is my ninety-third post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,46 @@ +Title: Flip Phone Challenge Complete +Author: Jake Bauer +Date: 2020-12-10 +Summary: Last week I challenged myself to use a flip phone for one week straight. I was not allowed to use my Android smartphone at all. Here's my experience. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Last week [I challenged myself to use a flip +phone]( for one week straight. +It turns out that it really wasn't too hard to get rid of my Android phone and +start exclusively using the flip phone. I've decided I'm going to keep using +this flip phone as long as I can. + +The experience has been great. Calling and texting is incredibly simple. I start +pressing numbers on the keypad and the phone does the thing. I don't have to +unlock my phone, tap on an app, then tap on the little keypad button, then +suffer the 500ms delay between pressing a number and having it show up on the +screen. It's the little annoyances which add up with modern technology that +makes using relatively limited devices such as a flip phone feel just that much +better. + +I don't use my phone at all outside of calling and texting now. I've totally +freed myself from the burden of being always connected and (nearly) always +available. When I turn off my computer that's it; I am disconnected from +everything but people who need to urgently call or text me. I also no longer +wake up and check on everything while lying in bed for 20 minutes. I get up, get +ready, then head to my computer. The same goes for falling asleep: when I'm in +bed to sleep, I sleep. I don't lie there for 20-30 minutes browsing things. + +By the time I got to the end of the week, I had only used up ~1/2 of the phone's +charge. Part of it is indeed that I don't use it nearly as much as I did my +Android phone, but it's nice to not have to charge my phone everyday or worry +about it running out of battery by the end of the day. + +The only drawback I can see to using this flip phone instead of a smartphone is +that I won't be able to listen to music or podcasts on the go when we all start +having to commute again. It's unfortunate, but I could always either get a +portable music player or maybe bust out my cassette-based Walkman again. +(Recording a podcast onto a cassette, then playing it on my commute... now +that's an idea.) + +To sum it all up: I really honestly do not miss my Android phone. It was more a +source of annoyance and distraction than a utility in my daily life. I feel more +free and much happier using a phone that simply can't do much but be a phone. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,59 @@ +Title: One Week Flip Phone Challenge +Author: Jake Bauer +Date: 2020-11-30 +Summary: Frustration with my smartphone has led me to throw it aside in favour of using a good old flip phone again. I've challenged myself to use one for at least one week to see what the experience is like in 2020. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Recent frustration with my smartphone has led me to throw it aside (quite +literally, I threw it onto my bed in frustration one day) in favour of using a +good old flip phone again. I've challenged myself to use one for at least one +week to see what the experience is like in 2020. + +I normally carry with me an ASUS Zenfone II Laser Android smartphone running +LineageOS 15.1. It has served me well over the past 5 years and its battery +still lasts me a whole day... mostly. The things I normally do on my phone are: +call, text, use a Web browser, use the Element, Conversations, and Husky +applications, and check the weather if I'm bored. I sometimes listen to +podcasts with it but I've stopped in recent months. I also have the OsmAnd~ map +application, but GPS stopped working on my phone some time ago and I rarely, if +ever, open it. I don't even take pictures on my phone anymore thanks to some +weird fogging that's happened to the camera lens. + +For this challenge, I've chosen a Doro PhoneEasy 612. Pretty much entirely +because it's what I had on hand. There's nothing special about it, it's a +standard flip phone with a 12 key dial pad, some extra buttons, a 2 megapixel +camera, a 2.5mm headphone jack (not 3.5mm), and it charges via Micro-USB like my +existing Android phone. On the inside, it has a 3.7V, 800mAh (2.96Wh) battery, a +mini-SIM card slot (though I was able to position my micro-SIM card just right +to get it to work), and a microSD card slot. + +<figure> + <a href="/img/flip-phone-open.png"><img src="/img/flip-phone-open-thumb.png" + alt="An image of the Doro PhoneEasy 612 lying open on my desk with the + screen on the home page."/></a> +</figure> + +After inserting my SIM card and powering on the phone, it asked me to go through +a setup wizard so that I could set the date and time, ringtones, volume, and so +on. After a couple of minutes, I was on the home screen with the world at my +fingertips. By the way, this phone powers on in under three seconds (!!!) +compared to the minute-and-a-half my Android phone takes. + +This phone comes with a phonebook (which conveniently contained all of my +contacts because I saved my contacts to my SIM card instead of my Android +phone), messaging application, call log viewer, camera application, image +viewer, alarm, organizer/calendar, calculator, FM radio (which only works if you +plug in headphones), In Case of Emergency application (something that stores +useful information about you in case of emergency), games (Tetris and something +called Boxman), and a settings application. All-in-all very bare-bones but it +does everything I think I need. + +So, let's see how this goes. One week using just a flip phone. I've even gone so +far as to completely power off my Android phone and put it in a filing cabinet +so I won't even use it to browse memes in bed. I predict that this won't be too +difficult because we're all stuck inside due to the pandemic, but it will still +be interesting to see what it's like, especially since I do compulsively use my +phone before going to sleep and right after waking up. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,531 @@ +Title: Free Software is an Abject Failure +Author: Jake Bauer +Date: 2021-11-08 +Summary: Free Software is an abject failure. It may sound like a good concept on its face—especially with the kind of language often used to describe the movement and its opponents—but, when put under scrutiny, the institutions and practices that make up the Free Software movement fundamentally fail at their stated goals and harm the software ecosystem as a result. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<p class="note">I want to preface this by saying that I used to be a staunch +software freedom evangelist. I used to license all my works GPLv3-or-later and +CC-BY-SA wherever I could and I used to believe quite strongly in the words of +Richard Stallman. I have since started to think more about the real effects of +the Free Software movement and have changed the way I write and license my +software as a result. I implore you to genuinely consider what I have written in +this post and to approach it with an open mind. Your knee-jerk reaction may be +to reject what I am saying as anti-freedom or pro-corporation but that is not +the case. In this post, I use the term "Free Software" to explicitly +differentiate it from "Open Source" software (which is what the FSF and Co. +also do). I believe FOSS as a concept is still very important, however I simply +no longer believe in the Free Software movement.</p> + +Free Software is an abject failure. It may sound like a good concept on its +face—especially with the kind of language often used to describe the movement +and its opponents—but, when put under scrutiny, the institutions and practices +that make up the Free Software movement fundamentally fail at their stated +goals. Free Software is an ideological mess, Free Software hampers +collaboration, Free Software is legally ineffective, Free Software makes the +lives of developers harder, and Free Software fundamentally gets in the way of a +thriving software ecosystem. + +## The Failure of the Free Software Ideology + +[Why Software Should Be Free]( by Richard Stallman +presents an argument against having owners of software and explains the harm +done by obstructing software development through proprietary licensing. He +posits that software with obstructions results in fewer users, the inability for +users to fix programs, and the inability of developers to build upon prior +knowledge or work. He also states that the justifications one uses for keeping +ownership of the software (which he equates with keeping the software +proprietary) are emotional (i.e. "This software is mine, and I wish to control +it") and economical (i.e. "I wish to become wealthy by programming."). He shuns +these excuses and spends the rest of the document refuting those excuses and +explaining why the existence of proprietary software is bad and why the +alternative—software not having owners—is better. + +However, in nearly every Free Software project which exists today, there is a +clear "owner" of the software—someone who is the copyright holder, benevolent +dictator for life, or simply _de facto_ leader of the project and through whom +all contributions must flow. Whether we're talking about large projects too +large to fork and maintain by anybody but large, well-funded groups such as the +Linux kernel (in which Linus still has complete veto power by the way), Qt (in +which the company controls the development of the software and simply allows +older versions to be used under a free license), or Android (where Google +maintains pretty solid control), or smaller projects which have simple leaders. +As long as there is a copyright statement, there are one or more owners to be +aware of. + +Additionally, the [GNU Manifesto](, aside from calling +the Open Source movement an "amoral approach", goes on to say that GNU "is not +in the public domain" and will have restrictions placed on further modifications +(in the form of disallowing proprietary modifications), with the justification +given by Stallman being: "I want to make sure that all versions of GNU remain +free." With that, Stallman falls upon the same behaviour that he previously +shunned in _Why Software Should Be Free_. He uses his emotional attachment to +the software, something he said was an excuse to defend why software has an +owner, to justify his want to control how others can distribute and modify his +code. He is effectively saying "this is _my_ creation, and I wish to control +what others can do with it" as well as clearly assigning an owner to the +software. + +_Update 2021-12-13_: I was recently made aware of an article in which Richard +Stallman advocates against positive change to copyright laws because of how it +would hurt Free Software. Instead of making software free of copyright after 5 +years, he advocates for maintaining copyright control because it would hurt the +control that Free Software licenses would have over the distribution of software +later on. It's not enough that the software would still fulfill the four pillars +of free software after the 5 years is up, control _must_ be maintained over how +other people can distribute and use the software in their products in case they +ever decide to fork it and make something proprietary from it. Not only does he +not trust that people would use only the Free version (as if we need to be +protected by Free Software licenses lest we use some proprietary software), he +is, in essence, advocating for maintaining ownership over software even though +the change to copyright legislation would be positive for society overall. The +article is called: <a href="">How the +Swedish Pirate Party Platform Backfires on Free Software</a>. + +If software is not in the public domain, then, by definition, it has to have at +least one other owner. If Stallman can dictate how others can use his +software—even if it is more freely than most proprietary software—then it +clearly has an owner. + +Simply put, Stallman and others in the Free Software community use the exact +same excuses criticized in _Why Software Should Be Free_ as justification for +their actions. GNU, the GPL, and seemingly the entirety of Free Software as it +stands today are all based on the same premises as proprietary software. They +use existing copyright systems in what they deem the "right" way while +simultaneously criticizing the way others use them as wrong. + +To be frank, the Free Software movement comes off as both a "cult of +personality"—worshipping Richard Stallman and his teachings, as well as a "cult +of ideology"—shunning those who disagree with the manifestos and the "way of +life" that the movement espouses to an extreme degree. As long as you, as a +developer, do everything within the framework of the GPL and the culture of Free +Software, you are ethical and good. As soon as you wish to do something outside +of this domain—even by using a more open, permissive license—you are +considered unethical. + +In an article where [Linus Torvalds criticizes the +GPLv3](, +Torvalds even says: + +> "I think the GPLv3 is expressly designed to not allow [the meeting between +> open source and free software people]. Exactly because the FSF considers us +> open source people 'heretics.'" + +## The Failure of the GPL + +One of the stated goals written in the GNU Manifesto is: + +> "Finally, the overhead of considering who owns the system software and what +> one is or is not entitled to do with it will be lifted." + +One look at the GPL will tell you that they have utterly failed at this. The +GPL, especially with version 3, has become so complicated that only a programmer +with relatively advanced legal knowledge and ability to read _and properly +understand_ "legalese" will be able to decipher it to know what they are able +and unable to do with it. There exist websites which explain the license in +plain English, but even those say their explanations are no substitute for +reading the license. This is because of the very specific meaning that many of +the words in the license take on when put in the context of our modern legal +system. So, while you may be able to read the GPL and _think_ that you +understand it, unless you are well-educated in "legalese", you probably don't +fully understand the true meaning and effect that the words of the license would +_actually_ have in court. + +The ramifications of the GPL are still not even fully understood by lawyers +themselves. Many large companies will shy away from the GPL simply because they +don't want to take the risk of using GPL-licensed code improperly and being +forced to reveal their proprietary software. While I don't agree with +proprietary software as a concept, the fact that even lawyers—who are supposed +to be expertly trained in the kind of language used in the license—are uneasy +about its terms further reinforces just how unapproachable it is to the everyday +software developer. GNU and the GPL have done nothing to remove the overhead of +considering who owns software and how it can be used. + +Since the development of the GPL is reactionary—that is to say, its development +and growth over time was in response to discovered workarounds—there is now even +more overhead by way of the extra complication of the "-or-later/only" clauses. +This is a license which has multiple versions which are **not** backwards +compatible. A project licensed under the GPLv2-only cannot integrate +GPLv3-or-later code without being re-licensed as GPLv3. The Linux kernel is an +excellent example of this. + +Linus Torvalds even [came out strongly against the +GPLv3]( +and the process by which the FSF created the license. Many others in the +industry also saw this as an extreme and unnecessary move by the FSF to wield +the ultimate power over the GPLv3; all because a manufacturer put Linux in their +products and blocked users from running their own modified software on that +hardware which, by the way, had absolutely nothing to do with the Linux kernel +itself since the bootloader is the software that would stop users from running +some other software. This led to people thinking that this was basically just an +excuse to expand the scope and powers of the GPL over what could be seen as +something completely out of the scope of the GPL-licensed software. The move by +the FSF, the actions of Stallman, and the "tivoization" rhetoric are even +[heavily criticized by Software Freedom Conservancy member Bradley M. +Kuhn]( + +Putting aside the political manoeuvrings of the FSF, the mere existence of an +"-or-later" clause is a ridiculous thing to attach to a license. Anybody who +licenses their project under a GPLv3-or-later license puts a lot of trust in the +stewards of the GPL that the next version of the GPL will align with their +values and goals; a GPLv3-or-later project will be able to be licensed under a +GPLv4 license whatever the clauses of that GPLv4 license. This is a lot of stock +to put into a group of people like the FSF who were so dogmatic and exclusionary +in their development of the GPLv3. + +The reality of the GPL is that there is still a lot of overhead in considering +who owns the software and how it can be used. Not only in whether or not a +developer should choose version 2 or version 3 of the license depending on their +goals, but also for developers and users alike who try to understand the +language of the license to determine what they can do with the software and, if +they are integrating some GPL-licensed code into their own product, who actually +owns and has copyright over that software. + +Those who wish to integrate GPL-licensed code into their otherwise +non-GPL-licensed projects are faced with the decision to relicense their code +under the GPL, remake the functionality of the library under a more open +license, or otherwise abandon those efforts altogether. While the GPL may +"prevent" corporations or people from taking GPL-licensed code and integrating +it into a proprietary product, it also prevents literally any other +non-GPL-licensed project from using GPL-licensed code, even other FOSS projects. + +Even so, it's not like the GPL actually prevents corporations from stealing +GPL-licensed code and integrating it into projects. While there are plenty of +corporations who freely comply with the GPL, there are plenty more, such as +VMWare, who don't comply and yet [don't face +consequences]( +Even if a lawsuit is successful, it is usually at the cost of [members of the +FOSS community who burn out]( or are left disenchanted +by the whole process. Being GPL-licensed also doesn't prevent a project from +being bought and therefore having all control handed over to a corporation. This +was most recently seen in the [acquisition of Audacity by Muse +Group]( +in which Muse Group bought the rights to the Audacity code and project. (Note +that if this software actually didn't have owners, this could not happen.) Users +have since forked the project, but this doesn't necessarily stop something like +this from happening in the future, and certainly doesn't stop it from happening +to other projects. + +_Update 2022-10-23_: It [just happened to Gitea](! + +The GPL-family of licenses attempt to solve a societal problem by restricting +the distribution of software in a manner not unlike the so-called [Ethical +Software]( +movement. The GPL acts effectively as a proprietary license that allows you to +do the things it deems ethical, so long as you abide by the terms of the license + with regards to the distribution and re-licensing restrictions. As long + as you are in this "club", everything is fine and dandy and you can make + your changes and push them to your favourite projects. As soon as you + leave this club and want to pull code from a GPL-licensed project into + your MIT-licensed project, well, sorry, too bad for you. + +While the GPL may not cause as much of an obstruction or be as unethical as +proprietary software, it is frankly not that much better. It causes distress and +conflict in the software community, is difficult for non-lawyers to fully +understand, and harms developers of non-GPL-licensed FOSS software. It is, for +example, the reason why the BSDs cannot take improvements made in the Linux +kernel and directly integrate them into their own kernels and [it is the reason +why ZFS cannot be integrated into the Linux +kernel](, +but can be shipped with FreeBSD. + +For all this talk of Free Software being the ethical option and the GPL being +the ultimate defender of user and developer rights, it completely goes against +the ethical principles laid out in _Why Software Should Be Free_. So much for "free as in freedom". + +## The Failure of the Free Software Culture + +The GNU Manifesto speaks a lot about how: + +> "Users will no longer be at the mercy of one programmer or company which owns +> the sources and is in sole position to make changes." + +But a cursory look at the current landscape of Free Software will tell you that +this is simply not the case _at all_. + +Users are absolutely at the mercy of the maintainers of software projects to +integrate their changes in the current landscape of software development, +especially with software projects as complicated as a many of the popular GUI +toolkits, kernels, or desktop environments. In fact, the reality is that Free +Software project issue boards and forums are not much better than corporate +support forums. Often when one opens an issue in a large software project it can +take months or even years for those issues to be worked out. It's also not +uncommon for those issues to simply go unsolved for many years. A great example +of this is the ['Add an "icon view with thumbnails" mode' GNOME +issue]( +which was opened in 2004 (it's almost old enough to vote!) and is still not +actually fixed despite many users expressing how useful it would be to have this +feature. + +Users simply cannot maintain such complex software on their own and, if they +have limited programming ability, cannot be expected to fork a project, make +their fix, test their fix, act on feedback from the maintainers (if they're +lucky enough to get their patch or pull request noticed), and so on. The current +software development ecosystem makes this impossible, regardless of the license +of the project. Software is not yet simple enough for that and GNU and Free +Software did nothing to solve this. In fact, it can be argued that they made +this worse by contributing to the creation of a culture of "elitists" who expect +all the users of their software to have the ability to read code and very +technical discussions or documentation in order to understand and fix problems. + +If an experienced user does come along and is dis-satisfied with their corporate +support forum-like experience, they might be inclined to fork the project. +However another very common sight in the Free Software community is to see +accusations towards groups or companies who fork projects of making "hostile +forks" or committing "theft" of Free Software. For example, Members of the Free +Software community [shunned and criticized the group of developers who forked +Gogs to make +Gitea]( +when they forked a Free Software project to extend it for their own needs +because of an unresponsive maintainer. They even still kept the project under +the _same_ license (an "unethical" Open Source license, no less). + +*Update 2022-09-13*: I recently learned of the XFree86 fiasco in which another, +similar incident occurred where one of the original developers of the X window +system felt that the current state of things was untenable and that the project +needed to be forked and replaced. He was [summarily shunned and kicked from the +project]( +for his actions. While XF86 was not under a Free Software license, instead being +under the MIT/X11 license, this is still an example of how forking is viewed by +many groups who wish to maintain control over their particular software. + +If software is not supposed to have an owner, as _Why Software Should Be Free_ +advocates, what exactly is being stolen? Why do they, as the creator of some +piece of software, care if some company or even another FOSS developer takes it +and uses it in their product or makes proprietary modifications with it? _Why +Software Should Be Free_ specifically outs this need to control what happens +with one's software as one of the main justifications for proprietary licensing +and something to be avoided, yet it is seen everywhere in the Free Software +culture. In fact, an article entitled _[Don't fear the fork: How DVCS aids open +source +development]( +perfectly exemplifies how the Free Software culture views forks (of course, it's +written from the perspective of "unethical" Open Source movement). + +The goal of Free Software as laid out by _Why Software Should Be Free_ was to +create a world in which there were no owners of software and in which +distribution was not restricted. Yet, despite this, the way the GPL family of +licenses puts restrictions on the distribution of GPL-licensed software combined +with the culture of Free Software actively _encourage_ both of those things and +actively _discourage_ forking software and modifying it to suit your own needs. +From the point of view of _Why Software Should Be Free_, the GPL combined with +this culture is, in reality, hardly much better than the world of proprietary +software we had before. + +The degree of openness which exists in the current software landscape can be, to +a large degree, attributed to the Open Source movement. It happened in spite of +the Free Software movement, not because of it. + +## The Failure of Free Software to Remain Relevant + +Free Software and the surrounding culture and institutions are often viewed as a +farce outside of the dedicated Free Software ~~cult~~ community. The FSF has +been slowly descending into irrelevancy for the past two decades as they +struggle to do anything meaningful with their time and resources; instead opting +to make a lot of unproductive noise. Take, as recent examples, how they [mailed +a hard drive to Microsoft telling them to put the Windows 7 source code on +it](, +or how they [accuse Apple of "censoring free +software"]( +—despite the fact that Apple isn't actually censoring anything and plenty of +Free Software projects such as [Telegram]( +are [on the App +Store](—and also +criticizing them for not supporting their specific chosen free media codecs—once +again, ignoring the plenty of other free media codecs which are otherwise +perfectly supported. + +To expand on that last point about Free Software projects on the App Store, the +[Apple App Store +EULA]( +contains restrictions that the GPL doesn't allow (see section 10 of the GPLv3 +and section 6 of the GPLv2). It says: + +> Except as provided in the Usage Rules, you may not distribute or make the +> Licensed Application available over a network where it could be used by +> multiple devices at the same time. You may not transfer, redistribute or +> sublicense the Licensed Application [...] You may not copy (except as +> permitted by this license and the Usage Rules), reverse-engineer, disassemble, +> attempt to derive the source code of, modify, or create derivative works of +> the Licensed Application, any updates, or any part thereof... + +Note that this only applies to the application you purchased in the App store, +as bundled by the App Store. It doesn't prevent you from going to GitHub and +modifying the software there, only modifying the software you got from the Apple +App Store. Sure, this isn't a good thing and it can be easily argued that this +is unethical because you don't ever own the apps you purchase, yet it is hardly +"censoring free software" given that, as the owner of a Free Software project, +you can freely submit GPL-licensed software to the App Store and Apple assumes +you have the rights to provide them with a non-GPL-licensed build. If you don't +have that ability because you don't own exclusive rights to the software and +it's not feasible for you to get the permission of every contributor with their +name attached to the project, well, that's not Apple's problem. The FSF words +their article like Apple is attacking them when, in reality, Apple doesn't care +what license you've chosen, only that you grant them the ability to distribute +your app under the terms of their EULA. The wording in that blog post is yet +another example of why the FSF are seen as a farce. They should know better. + +This reputation of preferring ideological book-thumping over meaningful action +is nothing new. Most who are familiar with Linux are likely familiar with +Richard Stallman's ["GNU+Linux" +rant]( +in which he squabbles and nitpicks over the relevancy of GNU to the Linux name. +Ignoring that the only significant contributions to the Linux system GNU can +claim is the compiler, the coreutils, and the C library. While these used to be +relatively significant in the early 90s, most Linux systems today run far more +non-GNU software than GNU software. + +In fact, even those base GNU components are quickly fading into irrelevancy as +projects like Clang/LLVM, rewrites of coreutils to be faster and cleaner (e.g. +Busybox or various Rust projects), and other libc's such as muslc are gaining +more and more traction each passing day. GNU is simply failing to make any +meaningful and actual progress, and is grasping at straws in an attempt to +remain relevant. Not only have other projects such as OpenBSD long since +abandoned things like modern GCC due to later versions becoming unmaintainable, +buggy behemoths, GNU themselves haven't even released their HURD kernel in any +meaningful capacity despite promising to create such a thing since _before Linux +existed_. + +Speaking of fading into irrelevancy, many of the Free Software institutions such +as the Software Freedom Conservancy and Free Software Foundation Europe have +either been reliant on GPL violation lawsuits as one of their primary means to +exist, or have been relatively ineffective at carrying out their mandates with +regards to litigation. It has gotten so bad that [the SFC have tried to bring +lawsuits on behalf of the users of GPL +software](; something which has little basis in +actual copyright law, but is the only option they have left when companies +either skillfully hide their GPL violations or the owners of GPL software are +unwilling to enforce their license against large opponents. A cursory glance on +the SFC's website reveals a lot of information about this Vizio lawsuit, but not +much information about previous lawsuits or successes. No wonder these +institutions also tend to only go after small opponents from which they can +continue to justify their existence. Even very public [violations such as those +committed by +OnePlus]( +have still gone unanswered for. If such violations are clearly allowed to +continue with such ineffective enforcement, what use even is the GPL in reality? + +Regarding the quality of GNU software, outside of the Free Software community, +GNU code has a reputation for being resource-hungry, buggy, bloated, or annoying +and frustrating to work with, as many who have had the pleasure of using +alternative libc's, compilers, utilities, or programs will attest. GNU creations +have a reputation for being needlessly complex—solving problems which don't +really exist in the first place if you write good software (or +documentation)—and having obtuse source code. The GNU Info system and the code +found in many of the coreutils are good examples of this. + +Finally, we can talk about how the conduct of Richard Stallman himself reflects +on the whole Free Software movement. The Free Software movement went through its +own little "constitutional crisis" over the question of whether or not to keep +him on as the face of Free Software after he made some comments on an MIT +mailing list about a sensitive topic. I won't go into specifics about that +situation here, since it has been covered to death in other media outlets and +can be easily searched for (search "stallman mit mailing list"), but, suffice to +say, Stallman acted in a completely unprofessional and inept manner. In fact, +that is far from the only example of him behaving in such a way. + +In 2007, Stallman sent [a message to the OpenBSD-misc mailing +list]( entitled _"Real +men don't attack straw men"_ in which he accuses the OpenBSD folk of making +straw-man arguments about himself, and then using those arguments to attack his +credibility. If you read through this mailing list thread, you don't have to go +far to realize that Stallman has absolutely no clue what he's talking about. He +bases his opinion of OpenBSD on "what I have heard" and presumes that the +OpenBSD folk care whether or not he recommends their system. He proceeds to have +everything he said get taken apart by the replies which point out all the +inconsistencies in his own arguments and stances. + +After seeing just how ineffective this culture is at advocating for and +enforcing its principles in a meaningful way, as well as seeing the conduct of +one of its top-most members, how could anyone view this as a movement to be +appreciated, let alone joined and celebrated? + +## Where Do We Go From Here? + +I think, by now, it is accurate to say that Free Software is an abject failure. + +It has failed at its stated goals through both the licenses and the culture it +has created and has instead perpetuated the paradigm of software ownership and +the use of unethical and flawed copyright legislation. It has done very little +to prevent corporate takeover of projects, improve the software development +landscape, or make the lives of developers or users easier. It has done nothing +that more ethical, permissive software licenses and the culture of collaboration +born out of projects such as BSD Unix didn't already do, except to create a +toxic subculture of Free Software cult worshippers. + +One cannot solve the copyright, ownership, or restricted distribution problems +of software through playing into the exact same flawed systems that allow such +problems to exist in the first place. These are problems which must be solved on +a societal level, not on the level of individual software projects through an +obtuse license. Free Software, as it stands today, has the very real effect of +restricting innovation, sharing, and collaboration between developers. + +None of this is to say that proprietary licenses are okay or even that the Open +Source movement is the alternative. In fact, the Open Source Initiative is not +all that much better than the Free Software Foundation, it just has a mostly +different set of problems which are out of scope for this essay. + +For the most part, I agree with _Why Software Should Be Free_. Stallman has +perfectly valid and good ideas in that essay, yet he misses the mark with their +implementation. I mainly agree with Stallman's points that software should not +have owners and that restricting software distribution is unethical. I believe +that software shouldn't have owners and nobody should get to control how their +software is used, studied, distributed, or hacked upon. + +The only licenses which _truly_ meet all these criteria and would be considered +ethical under that framework are public domain-equivalent licenses. Licensing +your code under [the Unlicense](, the [0BSD +License](, or the [CC0 +License]( means +that you do not place _any_ restrictions on the software whatsoever. People +don't even have to mention your name or your project when they use your code +because you are no longer the owner of that software. + +If you do at least wish to have your name attached to the code (something that I +personally want if I care about the software I'm writing), commonly used +permissive licenses are the best option. Licenses such as the [MIT +License]( or the [ISC +License]( (my preferred license) impose +no further restrictions other than maintaining a copyright and permission notice +for that code if used in other projects. People are free to do whatever they +want with your code, so long as they keep your name on parts that you wrote. + +Not only do these options provide far more _real freedom_ to developers, they +remove the overhead of having to think about who owns the software. In the case +of software in the public domain, you don't have to worry at all because there +is no owner. In the case of permissively-licensed software, it's a simple matter +of copy-pasting the necessary notice(s) wherever that code is used. These +licenses are also simple, easy to understand, and the culture surrounding them +is such that you don't have to worry about a mob coming after you for forking a +project and morphing it into something that serves your needs, nor do you have +to worry about being sued for an accidental violation of a license that even +lawyers aren't confident about getting right. + +You'll notice that those licenses, however, do not address the issue of +corporations controlling software development and distribution, people using +software in ways you may deem bad or harmful, or the existence of megasoftware. +This is because those are problems that cannot be solved or even effectively +addressed by software licensing. These are societal problems that must be +tackled on a societal level. Attempting to do otherwise simply harms and +imposes more restrictions on small teams, independent developers, and hobbyists +who don't have the resources to ignore your restrictions or buy your development +team. + +In reality, by licensing your project under the GPL and participating in Free +Software culture, instead of limiting the harms that corporations inflict, you +end up limiting the good that the rest of us can do. Free Software has failed. + +<p class="note">If this post intrigued you and made you want to learn more, +consider checking out <a +href="">The +problems with the GPL</a> and <a href="/a-critique-of-free-software">A Critique +of Free Software</a> (both of which inspired this post), as well as <a +href="">On FOSSBros</a>, <a +href="">drones run linux: the free software movement isn't enough</a>, and <a href="">GoTime Podcast: Who owns our code? Part 2</a>.</p> + +<p class="note">You may also be interested in reading the <a +href="">discussion on</a>.</p> diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,74 @@ +Title: How I Keep My Home Directory Clean +Author: Jake Bauer +Date: 2020-06-28 +Summary: I am one of those people who likes to keep files organized and directories clean. Here's how I keep my home directory as free of cruft as possible. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<p class="note">Note: I have stopped caring about keeping my home directory +clean. While it might be nice to do an <code>ls -a</code> and see hardly +anything, it just wasn't worth the continual effort to wrangle programs into +behaving. Not to mention, many programs I use are old enough that they predate +the XDG specification and therefore don't comply anyways.</p> + +_**Update**: The name of the tool mentioned later in the post is +[rehome]( Also added a screenshot showing the +current state of my home directory._ + +I am one of those people who likes to keep files organized and directories +clean. Unfortunately, it seems many software developers don't care about this +and like to dump their program's configuration and state information into my +home directory, rather than putting it in the proper XDG specified directories. I've +gone through quite a bit of effort, mainly using the [Arch Wiki's page on the +XDG Base Directory +specification](, to +clean up my home directory from a lot of the cruft programs like to leave lying +around. + +<figure> + <a href="/img/home-directory.png"><img src="/img/home-directory.png"/></a> + <figcaption>The current state of my home directory. Only 12 items.</figcaption> +</figure> + +Most programs, if they don't already recognize the `XDG_CONFIG_HOME` environment +variable, have their own environment variables that they look at to find the +location of configuration data. Some examples from my `.profile` are: + +```bash +export XAUTHORITY="$XDG_CONFIG_HOME/X11/Xauthority" +export XINITRC="$XDG_CONFIG_HOME/X11/xinitrc" +``` + +Which get rid of the `.xinitrc` and `.Xauthority` files which would normally sit +in the home directory. + +Some programs, however, don't have environment variables but can still be told +where to find configuration information using a command line switch. For +example, in my `.bashrc` I have the aliases: + +```bash +alias tmux='tmux -f "$XDG_CONFIG_HOME"/tmux/tmux.conf' +alias wget='wget --hsts-file="$XDG_CACHE_HOME/wget-hsts"' +``` + +Which tell `tmux` to find its configuration in a directory in the `XDG_CONFIG_HOME` +directory, and `wget` to store its history in the `XDG_CACHE_HOME` directory. + +Unfortunately, even with changes in `.profile` and aliases in `.bashrc`, there +are still programs which are hardcoded to put files in the home directory. +Programs like Firefox, SSH, and Vim (although NeoVim respects XDG), are so old +and well-established that the developers are reluctant to change anything for +fear of breaking things that expect the files to be there. + +I have heard of a program designed to trick other programs into thinking the +home is actually in the XDG directories so that they are, in a way, forced to +respect the specification. However, I'm alright with a few programs here and +there in my home directory as long as it doesn't get needlessly cluttered. If +you're developing a brand new application there's no excuse; please respect the +XDG base directory specification! + +_This is my fifty-seventh post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,81 @@ +Title: Managing Dotfiles Using a Git Bare Repository +Author: Jake Bauer +Date: 2020-06-13 +Summary: I've recently overhauled a lot of the software I use which means I have a whole new set of configuration files for most of that software. I figured it would be a good time to change the way I manage these configuration files too. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I've recently overhauled a lot of the software I use which means I have a whole +new set of configuration files for most of that software. I figured it would be +a good time to change the way I manage these configuration files too. I've +started fresh with a [new repository for my +dotfiles]( and retired [my old +repository]( + +I used to manage my dotfiles by manually copying files to and from the git +repository folder or with symlinks but found this far too cumbersome to manage. +I recently read about [managing dotfiles with a bare +repository]( and switched to +doing it that way. + +This is what's required to set it up: + +```sh +git init --bare $HOME/docs/proj/dotfiles +alias config='git --git-dir=$HOME/docs/proj/dotfiles --work-tree=$HOME' +config config --local status.showUntrackedFiles no +``` + +And this is what needs to be done on a new machine to deploy my dotfiles: + +```sh +git clone --bare $HOME/docs/proj/dotfiles +rm ~/.bashrc ~/.profile +alias config='git --git-dir=$HOME/docs/proj/dotfiles --work-tree=$HOME' +config checkout +config config --local status.showUntrackedFiles no +config update-index --skip-worktree LICENSE .gitignore +rm LICENSE .gitignore +``` + +I opted for this method over using another application like +[chezmoi]( or [GNU +Stow]( because I didn't want _Yet Another Bit +of Software_ to manage what could be done by just using git. I also didn't want +to make my entire home folder a git repository because I've heard that it can +cause problems when you have nested repositories that aren't part of the same +project, of which I have many. + +You'll notice a `.gitignore`, ``, and `LICENSE` file in that +repository. Normally, that would mean I'd have to have those files in my home +directory but, by using the `--skip-worktree` feature, I can write, add, commit, +and then delete those files without git caring. For example, I would write the +`` file, then do: + +```sh +$ config add +$ config commit -m "Add README" +$ rm +$ config update-index --skip-worktree +``` + +If I need to update any of those files, I can do something like: + +```sh +$ config update-index --no-skip-worktree +$ config checkout -- +``` + +then edit, add, commit, delete, and re-ignore that file. + +Now, all of my configuration files are in my home directory and there is no +copying involved. If I update something on one machine and push those changes, I +can easily apply those changes to another machine. Deploying dotfiles to a +brand new system is a little more of an involved process, but it can be easily +scripted and it doesn't happen that often anyways. + +_This is my forty-fourth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,81 @@ +Title: Adding Search to This Blog +Author: Jake Bauer +Date: 2020-07-06 +Summary: I received a few good suggestions in response to my recent blog post about setting up search for my blog. In this post, I check out the proposed improvements and detail which one I chose and why. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +A few days ago I posted online about the really simple solution I came up with +for searching on my blog. Since then, I've had a few good replies about ways I +could make it better. One suggestion in particular fit with the themes and goals +of this website so I went ahead and implemented it to improve the search +experience. + +## Evaluating Other Suggestions + +First, let's talk about some of the other suggestions made. There was the +suggestion from Amolith of []( that I use a +tiny, JavaScript-less, static search engine called [Tiny +Search]( and the suggestion from Kev Quirk +of []( who mentioned that DuckDuckGo provides [an +embeddable search bar]( in the form of an +iframe. Both were great suggestions, but let's look at why I think they wouldn't +work for my site. + +Tiny Search is a really clever and interesting project, but it achieves its +functionality through WebAssembly. WebAssembly is a new web technology created +to allow web-native apps to run far faster and far more efficiently than if they +were written in JavaScript. Unfortunately, this means that basically only the +three big browser engines support it: Gecko (Firefox), Blink (Chrome and its +derivatives), and WebKit (Safari and its derivatives). That means anybody +browsing my site with an alternative browser such as Lynx or w3m won't be able +to make use of it. I could provide a fallback, but the other reason why I didn't +choose it is because it advertises itself as being between "50kB-100kB gzipped" +which is very large when put in context with the average size of one of my pages +being 10-20kB for an entire page, or ~6-7kB for just the HTML. + +I played around with Kev's suggestion of the DuckDuckGo iframe and it worked +quite well and was very easy to generate and add to my page. However, it had the +same issues as Tiny Search where it would balloon the size of the blog page by +up to 3x its original size, and it would make 3 third-party requests to load in +the necessary assets. Also, iframes are not supported by Lynx or w3m but it was +trivial to add a fallback for those browsers. The main issues that I had with +this method were the third party requests and large size of the loaded assets. + +To summarize, I didn't go with the above two suggestions because of the use of +unsupported technology in browsers which I target and because of the size of the +assets which would be required to make them functional. Both are trivial in the +context of many contemporary sites, but I like to keep my site as slim as +possible and I like to maintain compatibility with alternative browsers. + +## The Solution I Chose + +However, [Oscar Benedito]( suggested something which +caught my eye and which I didn't even know was possible: a form that makes a +request to DuckDuckGo. This solution uses technology that has been supported in +every web browser for decades and adds a mere 300 bytes to the size of the page +since it's just a plain HTML form. This is what I have which now powers my +site's search: + +```html +<form action="" method="get"> + <input name="sites" type="hidden" value=""> + <input aria-label="Search this blog." name="q" type="text" + placeholder="Search This Blog"> + <button aria-label="Submit search query.">&#128270;</button> +</form> +``` + +That's it! Instead of a link to a DuckDuckGo search where users would have to +type their search query in after clicking it, users can now type their query +into this form and they will be sent to a DuckDuckGo page with the results. This +still improves the UX while keeping the page small and using features supported +in browsers like Lynx and w3m. + +<p class="note">Since writing this post, I've switched to using <a href="">Lieu</a> as the search engine. HTML examples are on the linked page.</p> + +_This is my sixty-second post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,172 @@ +Title: Blog +Summary: Welcome to my blog. This is where I put my more polished essays, thoughts, and writings out into the world. + +# [%title] + +This is my blog, the fruit stand of my [digital garden](/garden/); the place +where I put my more polished essays, thoughts, and writings out into the world. +Most of what I have written and published is listed below though I have removed +posts I think are low quality or lack any valuable insight (fruit that has gone +bad, as it were). Please note that older posts—even those that are less than a +year old—may not match my current views or practices. + +<a href="/feed.xml" aria-label="RSS Feed" title="RSS Feed" target="_blank"> + <svg class="icon" width="20" height="auto" viewbox="0 0 410 410" fill-rule="evenodd" clip-rule="evenodd"><path d="M0 0a410 410 0 0 1 410 410h-80A332 332 0 0 0 0 79V0z"/><path d="M0 139a271 271 0 0 1 271 271h-80A191 191 0 0 0 0 218v-79z"/><path d="M50 300c36 1 56 20 60 56-4 33-22 51-55 54-25-1-42-13-52-35-8-29 0-52 26-68 7-4 14-6 21-7z"/></svg> + RSS Feed +</a> +<form method="GET" action=""> + <!-- replace the value with the domain of your own site --> + <input type="hidden" value="" name="site"> + <input aria-label="Search" id="site-search" name="q" placeholder="Search"> + <button type="submit">Search</button> +</form> + +[Free Software is an Abject Failure](/blog/free-software-is-an-abject-failure)<br> +<span class="date">November 8, 2021</span> + +[A Git Workflow With Claws Mail](/blog/a-git-workflow-with-claws-mail)<br> +<span class="date">October 26, 2021</span> + +[Laptops Suck (or Why I Might Get a New MacBook Air)](/blog/laptops-suck-why-i-might-get-a-macbook-air)<br> +<span class="date">August 18, 2021</span> + +[Mastodon Is Dead, Long Live Misskey 🍮](/blog/mastodon-is-dead-long-live-misskey)<br> +<span class="date">August 5, 2021</span> + +[Migrating from nginx to OpenBSD's httpd and relayd](/blog/migrating-from-nginx-to-openbsd-httpd-and-relayd)<br> +<span class="date">February 17, 2021</span> + +[Flip Phone Challenge Complete](/blog/flip-phone-challenge-complete)<br> +<span class="date">December 10, 2020</span> + +[One Week Flip Phone Challenge](/blog/flip-phone-challenge)<br> +<span class="date">November 30, 2020</span> + +[Why IRC is Still Good in $CURRENT_YEAR](/blog/why-irc-is-still-good)<br> +<span class="date">August 30, 2020</span> + +[The Hacker Quarterly Magazine](/blog/the-hacker-quarterly-magazine)<br> +<span class="date">August 14, 2020</span> + +[Ethical Investing](/blog/ethical-investing)<br> +<span class="date">August 13, 2020</span> + +[Choosing An Investment Brokerage](/blog/choosing-an-investment-brokerage)<br> +<span class="date">August 12, 2020</span> + +[My Journey With Computers](/blog/my-journey-with-computers)<br> +<span class="date">August 03, 2020</span> + +[The Vortex ViBE Mechanical Keyboard](/blog/vortex-vibe-keyboard)<br> +<span class="date">August 02, 2020</span> + +[My Git Server Was DDoSed](/blog/my-git-server-was-ddosed)<br> +<span class="date">July 29, 2020</span> + +[Why I Hate The Term "Modern"](/blog/why-i-hate-the-term-modern)<br> +<span class="date">July 16, 2020</span> + +[Installing Debian 10 Buster with Encrypted LVM and btrfs Subvolumes](/blog/debian-with-btrfs)<br> +<span class="date">July 14, 2020</span> + +[Using the "rm" Command with Trash](/blog/using-rm-with-trash)<br> +<span class="date">July 13, 2020</span> + +[Colours for Gitea Issues](/blog/colours-for-gitea-issues)<br> +<span class="date">July 11, 2020</span> + +[My TODO Solution](/blog/my-todo-solution)<br> +<span class="date">July 08, 2020</span> + +[Are TODO Applications a Waste of Time?](/blog/are-todo-applications-a-waste-of-time)<br> +<span class="date">July 07, 2020</span> + +[Adding Search to This Blog](/blog/improving-blog-searching)<br> +<span class="date">July 06, 2020</span> + +[Switching to cgit](/blog/switching-to-cgit)<br> +<span class="date">July 05, 2020</span> + +[A Month-and-a-Half of Self-Hosted Email](/blog/a-month-and-a-half-of-self-hosted-email)<br> +<span class="date">July 02, 2020</span> + +[How I Keep My Home Directory Clean](/blog/how-i-keep-my-home-directory-clean)<br> +<span class="date">June 28, 2020</span> + +[Use Syncthing to Sync Things](/blog/use-syncthing-to-sync-things)<br> +<span class="date">June 26, 2020</span> + +[Why dwm's Window Swallowing Patch Can't Swallow tmux](/blog/why-dwm-swallowing-cant-swallow-tmux)<br> +<span class="date">June 26, 2020</span> + +[My LWN Theme](/blog/my-lwn-theme)<br> +<span class="date">June 22, 2020</span> + +[My New T420s](/blog/my-new-t420s)<br> +<span class="date">June 15, 2020</span> + +[Managing Dotfiles Using a Git Bare Repository](/blog/how-i-manage-my-dotfiles)<br> +<span class="date">June 13, 2020</span> + +[Why Email is the Best Discussion Platform](/blog/why-email-is-the-best-discussion-platform)<br> +<span class="date">June 07, 2020</span> + +[Toggling Between Indentation Styles in Vim](/blog/toggling-between-indentation-styles-in-vim)<br> +<span class="date">June 02, 2020</span> + +[A Quick Rant About Web Font Sizes](/blog/a-quick-rant-about-web-font-sizes)<br> +<span class="date">May 28, 2020</span> + +[Choosing a Self-Hosted Git Service](/blog/choosing-a-self-hosted-git-service)<br> +<span class="date">May 26, 2020</span> + +[Paying for Software](/blog/paying-for-software)<br> +<span class="date">May 25, 2020</span> + +[Two of the Most Valuable Lessons I've Learned](/blog/two-of-the-most-valuable-lessons-ive-learned)<br> +<span class="date">May 23, 2020</span> + +[Self-Hosting Email](/blog/self-hosting-email)<br> +<span class="date">May 16, 2020</span> + +[Diving Deeper Into the Small Internet](/blog/diving-deeper-into-the-small-internet)<br> +<span class="date">May 13, 2020</span> + +[Setting Up A Gopher Site](/blog/setting-up-a-gopher-site)<br> +<span class="date">May 12, 2020</span> + +[A Brief Review of Fedora 32](/blog/a-brief-review-of-fedora-32)<br> +<span class="date">May 11, 2020</span> + +[The Joys of Old Tech](/blog/the-joys-of-old-tech)<br> +<span class="date">May 07, 2020</span> + +[Refining My NeoMutt Configuration](/blog/refining-my-neomutt-config)<br> +<span class="date">May 05, 2020</span> + +[The Diefenbunker Museum](/blog/the-diefenbunker-museum)<br> +<span class="date">May 03, 2020</span> + +[The Disappearance of <em>One</em>](/blog/the-disappearance-of-one)<br> +<span class="date">May 02, 2020</span> + +[Why I Blog and #100DaysToOffload](/blog/why-i-blog)<br> +<span class="date">April 25, 2020</span> + +[Decommissioning My Rackmount Server](/blog/decommissioning-my-rackmount-server)<br> +<span class="date">April 11, 2020</span> + +[Making My Own Vim Statusline](/blog/making-my-own-vim-statusline)<br> +<span class="date">February 24, 2020</span> + +[Switching from urxvt to st](/blog/urxvt-to-st)<br> +<span class="date">February 14, 2020</span> + +[The Difficulty of Educating People About Online Privacy](/blog/difficulty-of-privacy-education)<br> +<span class="date">December 20, 2019</span> + +[China](/blog/china)<br> +<span class="date">November 23, 2019</span> + +[Why I Switched Back to Firefox from Qutebrowser](/blog/qutebrowser-to-firefox)<br> +<span class="date">June 20, 2019</span> diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,245 @@ +Title: Laptops Suck (or Why I Might Get a New MacBook Air) +Author: Jake Bauer +Date: 2021-08-18 +Summary: PC Laptops are trash and I'm considering getting a MacBook. Here's why. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<p class="note">TL;DR: Watch this <a +href="">video by Wolfgang's +Channel</a>. It covers just about everything I talk about in this post, +including the negative aspects of the M1 MacBook Air, minus the personal +context and rant about modern laptops.</p> + +If you've been a part of the computing industry in almost any aspect for a +while, you'll no doubt know about the trend of laptops becoming worse as time +goes on. What used to be upgradable components became soldered, removable +batteries became internalized and eventually glued in, and build quality +decreased year over year. Nowadays, one seems to have two choices in the PC +laptop market: buy a cheap, creaky mess of plastic with low-performance +internals, or buy a possibly well-built yet overpriced laptop that may perform +well, but does so at the cost of noise and usually battery life. + +Frankly, the only ones offering a viable alternative to this mess is Apple. + +Yep, you heard me right. + +Apple used to be just as bad as the rest: you used to get an overheating, +_horrendously_ overpriced (a fully-specced 16" MacBook Pro would run you $4,000 +USD!) laptop with a terrible keyboard, but with their M1 chip this has changed +completely. You can now get a laptop that not only has outstanding build +quality, all-day battery life, an excellent screen, a great keyboard, and +**desktop-level** performance, but at **half the price** of comparable PC +laptops while also being **fanless**. + +If that hasn't yet convinced you, keep reading. + +## Price to Performance + +I think we can all agree that Macs had pretty terrible price to performance +when they used Intel processors. Given that a 2020 base model MacBook Air was +$999 USD yet had a CPU that fared not much better than my current Lenovo +Thinkpad T420s in benchmarks and overheated so fast you couldn't even get +remotely close to its full performance... yeah, that was pretty bad. However, +this has completely changed with the M1. Now we have a $999 laptop with +performance comparable to many Ryzen desktop systems that sips power and, yes +will heat up if you're doing heavy tasks, but won't take massive hits to +performance just because it can't handle the heat. + +<figure> + <a href="/img/m1-cpubenchmark.png"><img src="/img/m1-cpubenchmark.png" + alt="Benchmark comparison of the M1 chip next to several Ryzen desktop + chips on"/></a> + <caption><a href="">Source of this comparison.</a></caption> +</figure> + +In the image above, the M1 is compared to the Ryzen 5 1600 (the same CPU I have +in my desktop computer from 2017), and the Ryzen 5 3600X, Ryzen 5 5600X, and +Ryzen 9 5950X. This benchmark clocks the M1 chip at being overall faster than +the Ryzen 5 1600, and even still beating the Ryzen 9 5950X in single-core +computations (though, of course, the 32 threads in the 5950X means it's much +better at multi-threaded stuff than the M1 with its 8). That means this mobile +CPU which can fit in a fanless system and draws a meagre 15.1 Watts is more +powerful than a 65 Watt TDP desktop CPU from 2017 and 2018 as well as +competitive in single-core tasks with even recent Ryzen CPUs. + +Further videos on the internet comparing performance such as [this video from +LTT]( and [this video from +Wolfgang's Channel]( shows that, +while the M1 trades blows with its AMD and Intel counterparts in some cases, it +drastically outperforms almost all of the competition. For most of what I will +be doing with the PC, the M1 Air absolutely blows my existing computers out of +the water in terms of performance for less than the amount of money I spent on +my desktop system in 2017 and in a—I can't stress this enough—**fanless +laptop**. + +## Build Quality and Keyboard + +Macs tend to have excellent physical build quality. There is little to no flex +of the chassis when typing on the keyboard, the screen doesn't wobble when you +adjust it or while you're typing, and you can hold the laptop by a corner +without creaking plastic noises. Since they switched to their Magic Keyboard™®© +from their utter disaster the Butterfly Keyboard™®©, their keyboards also feel +very nice to type on again and won't spontaneously break from normal usage. + +According to a friend of mine who switched from a Thinkpad X1 Carbon Gen. 6 to +an M1 MacBook Air, the keyboard is miles better than not only that, but also +Cherry MX switches. According to the aforementioned video from Wolfgang's +Channel, the keyboard is not as good as his Thinkpad X1 Carbon's. So, while it +does seem to be a matter of personal preference, if this keyboard is anything +like their early 2010s MacBook keyboards (a keyboard I have actually used) then +it will feel, to me, even better than even my T420s keyboard. + +## Fanless Operation + +I know I keep going on about how the Air is fanless, but that's actually +something I would really like to have in a laptop. My current T420s is hot and +loud and it really shows it. Just sitting on the desktop, at idle, the CPU is +at about 45°C with the fan audible. When I'm browsing the web, it easily spikes +to 60% or 80% utilization, and it's not uncommon for the CPU to hit 85°C and +the fan to be going full-speed if I'm flipping back and forth between tabs or +on any particularly heavy tabs (yes, I've cleaned out and re-pasted this +computer... twice). This is such a problem that my laptop will overheat if I +have it on my lap without wearing long pants (i.e. the bottom of the laptop is +touching my legs) for an extended period of time and the amount of heat put +out by this machine has even bothered people who sit next to me as I use my +computer. Modern laptops might be better, but they're still annoyingly noisy +when doing anything intensive. + +Having a fanless laptop will certainly be a luxury. When using my laptop on the +couch or in bed, I won't have to worry about whether or not the fans can +breathe, I won't have to worry about the fan noise of my laptop or the blast of +heat shooting out the side annoying anybody near me, and I won't have to worry +about cleaning out the computer every two to three years just to keep it +running well. + +## The Screen + +Since Apple released their Retina™®© displays, they have been known for making +stunningly good displays. They continue this trend with the M1 MacBooks by +putting a 2560x1600 (that's a 16:10 display ratio, much nicer than 16:9 for +productivity), in a 13.3" screen for a wonderfully crisp 227 PPI. Not only will +this be way better than my current 1600x900 display in a 14" screen, it will +also be far better than the 1920x1080 displays one could normally get on +competing laptops (without spending out a lot more money). + +A good screen with sharp text is something I've wanted for a long time since +using 4K 27" displays at work and since I read [this blog post by Nikita on about better monitors]( It makes a +huge difference, especially for those who work primarily with text (me) in +terms of comfort and clarity. + +## Battery Life + +One thing that Apple has pretty much always been good at is jamming massive +batteries into their laptops. If I had to guess based on pictures of internals, +more than 50% of the internal space of a MacBook is taken up by batteries. This +gives them battery lifetimes often much greater than competing laptops of +similar performance. In the case of the M1, this is dialed up to the maximum +because they combined their regular massive battery capacity with a chip that +sips power. One can easily go a full day using their M1 MacBook without needing +to charge their laptop. This is a huge upgrade from my Thinkpad which gets +about 1 hour of battery life on a replacement battery purchased just one year +ago (turns out that having a CPU that gets hit with regular near-100% +utilization is not great for battery life). + +## MacOS + +I know a lot of Linux and Windows users look at MacOS and think: "How could +anybody use _that_!?" I know, I used to be one of them. At work when I got a +Mac (a 2013 Mac Pro, to be precise) I was just endlessly frustrated at how +MacOS felt. In reality, I just had a closed mind and wanted to hate it, so I +did. Of course, a completely different operating system and desktop environment +requires some effort to learn and get used to; exactly what we tell people +switching over from Windows to Linux. + +In reality, MacOS is a competent *nix system. It's based on Darwin BSD, has zsh +as a default shell—with others also installed, has its own package manager +[homebrew](, and has a perfectly competent terminal emulator. +In reality, I can do everything I would want to do on my computer on MacOS +without having to go through the hoops required on Windows. + +Not to mention, my printer+scanner will actually work without endless fiddling +or needing to reboot into Windows. + +## But It's Apple!!! + +Yeah, I know. Apple is not a good company. They are consistently against [right +to repair](, +lock down the upgradablilty and repairability of their products, and the +majority of the operating system is proprietary (though, it's worth noting that +they're still far better than Microsoft when it comes to [their open source +efforts](, having made and released WebKit, CUPS, +Bonjour, and more). + +But this isn't much different than most of the PC manufacturers. With many +modern laptops you are quite limited in terms of what you can upgrade. For +most, you can upgrade the SSD and the RAM and that's about it. Many parts for +discontinued laptops are also hard to come by or expensive, unless they were +insanely popular. + +It's also worth noting that, in the case of the M1, you can't upgrade the RAM +because it is a system-on-chip (SoC) design similar to how the Pinebook and +most ARM-based computers are built. However, that's not really an issue since +MacOS handles low memory conditions very well and I personally have no need for +more than 16GB of RAM. I haven't needed more than 16GB of RAM for half a decade +and I don't see that changing anytime soon given that I routinely use less than +4GB on my workstations. + +## Alternative Options + +So, if I'm looking for a high quality, performant laptop for a good price then +what are my other options in today's market? + +If I really want a fanless design I could either get a Chromebook or a +Microsoft Surface. The Chromebooks universally suffer from terrible build +quality or awful performance and the Surface laptops might be quite good +(relatively speaking), but then I'm stuck with a product locked down by +Microsoft and I much prefer MacOS to Windows. Surface computers also suffer +from exactly the same repairability issues as Apple computers. + +If I want something that does perform well and is well-built then I suppose I +could go with a Dell XPS. They are "the MacBooks of the PCs" in terms of their +build quality after all. But they're also over twice the price as the M1 Air +with worse performance and they can get very loud when doing intensive tasks +like compiling software. If you're thinking: "Why not get a Thinkpad," it's +because modern Thinkpads have terrible build quality and are also monumentally +more expensive than these new MacBooks for the performance you get. They suffer +from the same problems as the XPS but aren't even well-built. + +Finally, in terms of a decent laptop that is repairable and upgradable, there +is the new Framework laptop. While this does seem quite promising, it's hot (it +has an Intel processor) and doesn't offer anywhere near the price to +performance of these new MacBooks (once again, it has an Intel processor), +though they are at least a strong competitor. The build quality, while decent, +is also [still lacking compared to +Apple]( + +## Summary + +All in all, the pros of an M1 MacBook Air far outweigh the cons. Let's go over them: + +* **Fanless** - It's silent and no need to worry about airflow or cleaning +* **Excellent** build quality - Not a plastic piece of e-waste (looking at you, Clevo chassis-resellers) +* **Great battery life** - Easily all-day battery life, even when using it intensively +* **Good keyboard** - Something that I'll actually enjoy typing on when I'm away from home +* **Outstanding Performance** - Competitive with Ryzen 7 2700s in multi-core, and the latest Ryzen processors in single-core performance +* **No T2 Chip** - The M1 computers no longer have the annoying T2 chip, so other OSes could conceivably be installed in the future +* **Unbeatable Price** - Competing laptops are twice the price or more, for worse performance, build quality, noise, or a combination of those +* **No Touchbar** - I don't like the touchbar, so I'm glad the Air doesn't have it +* **Thin as heck** - It's a laptop as powerful as a desktop, thinner than the screen on my T420s + +And what about the cons: + +* **Apple** - They're a bad company, and it doesn't make me feel good to buy something from them +* **Non-replaceable SSD** - The SSD could wear out and you can't easily replace them which would render the computer useless, but this probably won't matter in the lifetime of the device, since one would have to write terabytes of data to their SSD each day to even come close to wearing it out in a couple of years. + +I've never owned a Mac (or any Apple product, for that matter). I currently own +a T420s because I like the aesthetics and keyboards of old Thinkpads but, +honestly, it's just not cutting it anymore. A decade old computer is finally +starting to show its age and it's time for an upgrade. When nearly every other +option on the market (including recent second-hand laptops) aside from the M1 +Macs kinda suck, well, I'm going to choose the best option for the money I have +and right now that looks like it's the M1 MacBook Air. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,102 @@ +Title: Making My Own Vim Statusline +Author: Jake Bauer +Date: 2020-02-24 +Summary: After using a plugin to see what was taking the most time for my vim configuration to start, I decided to ditch airline and write my own statusline. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I was playing around with a plugin that I came across while browsing +[r/vim]( called +[vim-startuptime]( It's a vim +plugin by Daniel Steinberg ([dstein64]( on GitHub) +which measures the amount of time each component of your vim configuration takes +to load when you launch vim. This way, you can get an idea of what is taking the +most time and causing your previously-lightning-quick text editor to take what +feels like an eternity to become ready. + +I took 5 measurements, back to back, opening my vimrc and I noticed that my vim +configuration was taking roughly 132.35ms on average to finish loading (with a +standard deviation of 2.69ms). Although that sounds fast, it was definitely +noticeable as it was just past the [100ms commonly accepted +limit]( for +a user interface to feel like it was responding instantaneously. Below is a +video showing a very clear and noticable delay when launching vim: + +<figure> + <video controls> + <source src="/img/vim-airline.mp4" type="video/mp4"> + Your browser does not support the video tag, try the download links below. + </video> +</figure> + +* [Download the mp4 video (310K)](/img/vim-airline.mp4) +* [Download a GIF (4.7M)](/img/vim-airline.gif) + +Although vim-startuptime showed me a graph of each component's execution time, +the statistics shown didn't reveal a specific component that could be causing +the startuptime to be this long. In fact, it appeared that it was the cumulative +effect of loading each of my plugins and parsing my vimrc which was causing the +overall startuptime to be noticeably long. So, I decided to figure out if this +was the case by experimenting. I removed all of my plugins (but kept my vimrc +the same) and, as expected, my startuptime dropped to the 20ms range. +One-by-one, I added my plugins back in. To my surprise, I noticed a huge jump in +startuptime when I added vim-airline back in. Vim-airline was the plugin that I +was using to display an aesthetically pleasing statusbar and buffer bar at the +bottom and top of my vim windows respectively and it was causing my startuptime +to effectively double! No other plugin had that drastic of an effect. + +I decided, then, that I was going to replace vim-airline with my own custom +statusline. + +I used a blog post by Irrellia (whose website seems to have since disappeared) +to get me started and found that it was actually really easy to make a +good-looking and functional statusline. About 100 lines of vimscript later and I +had a customized statusline that fulfilled my needs and looked really good (in +my humble opinion). I also put my custom statusline into a plugin folder in my +`.vim/bundle/` directory so that it would be automatically loaded by Pathogen as +if it was a regular plugin. + +I will fully admit that I pretty much copied the colour scheme used in the +tutorial verbatim because I really liked the way it looked. Little did I know, +this would start a whole week of tinkering with my setup. + +Something that I missed from vim-airline was that top line which displayed a +list of open buffers and highlighted the currently active buffer. I thought +about doing it myself but the implementation looked a little too complicated for +my mediocre vimscript skills. Instead, I replaced that specific functionality +with another really lightweight plugin called +[vim-buftabline]( + +Once I was finished tinkering, I tested my new custom statusline (with the +vim-buftabline plugin too) using the same method which I used to test my +previous configuration and found that the average startup time had dropped to a +mere 66.85ms (with a standard deviation of 1.79ms)! That's a roughly 2 times +improvement in speed; it felt instantaneous again! Here, have a look at the +video below: + +<figure> + <video controls> + <source src="/img/vim-no-airline.mp4" type="video/mp4"> + Your browser does not support the video tag, try the download links below. + </video> +</figure> + +* [Download the mp4 video (321K)](/img/vim-no-airline.mp4) +* [Download a GIF (5.0M)](/img/vim-no-airline.gif) + +I've put my statusline in its own git repository which you can find [on +sourcehut]( or [on my self-hosted git +server]( I've decided to call it +vim-fastline. I don't plan to do anything even remotely comparable to +vim-airline with it but I want to make it available in case others want to hack +on it. + +Not only was it fun and educational to program my own statusline, it had +significant performance benefits, and it now sort of feels like my vim +configuration is much more personal and not just a collection of plugins. It +feels like it's _"my configuration_" if that makes sense. I encourage you to +give it a try even if you're happy with your current configuration. + +Happy hacking! diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,504 @@ +Title: Mastodon Is Dead, Long Live Misskey 🍮 +Author: Jake Bauer +Date: 2021-08-05 +Summary: Okay, so, Mastodon isn't _actually_ dead, but some recent happenings and a long-standing trend of the lead developer ignoring features beneficial to smaller instances have led many to start looking at other options, be it forks of Mastodon, or other software entirely. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<p class="note">This article is pretty old and the landscape of Fedi has changed +a bit. There is now a fork of Pleroma called <a +href="">Akkoma</a> and forks of Misskey +called <a href="">FoundKey</a> and <a +href="">CalcKey</a> which all seek +to solve various technical and social shortcomings with their respective +projects. The server I am on right now uses <a +href="">Hometown</a>, a fork of +Mastodon.</p> + +Okay, so, Mastodon isn't _actually_ dead, but some recent happenings and a +long-standing trend of the lead developer ignoring features beneficial to +smaller instances have led many to start looking at other options, be it forks +of Mastodon, or other software entirely. Recently, I and many others have taken +a look at [Misskey](, an alternative +Fediverse software that also uses ActivityPub and can communicate with both +Pleroma and Mastodon instances. + +## What's Going On With Mastodon (and Pleroma) + +Recently, Eugen, the lead developer of Mastodon (also known as Gargron) +released an [official Mastodon iOS +app]( which lacks basic features which +many users deem important, especially for smaller communities. As of the time +of writing, the app seems to intentionally be missing the ability to view the +Local timeline (the timeline consisting of posts only from users of the +instance you are on), and the Federated timeline (posts from all other +instances which have federated with the one you are on). +[[Source](] + +This, plus the tendency for Gargron to deny useful patches such as [Local-only +posting]( and [configurable +character limits](, has led to +forks, such as [glitch-soc](, and the usage +of other software, such as [Pleroma]( + +For the time being, things seems to still be... okay. Mastodon is well-funded +and nothing has yet changed for the desktop site or the software as a whole, +but this could change at any moment depending on where Gargron wishes to take +his software. This isn't _necessarily_ a bad thing depending on his goals for +the software, but for those of us who want the Fediverse to be made up of a +bunch of smaller, more community-focused instances as opposed to a set of large +Twitter-like structures, the future doesn't look hopeful. + +Furthermore, Pleroma's development funding has recently been cut, stagnating +development and disappointing many users who were looking forward to exciting +new features such as groups. There are... other issues with Pleroma, but I will +not talk about them here. + +## Okay, So What Even Is Misskey? + +To summarize, Misskey is another bit of Fediverse software, similar to Mastodon +and Pleroma, but with far more features, and a far nicer and more +polished-feeling UI. It is currently developed by one person, +[syuilo]( and is supported by a small amount of +corporate funding, combined with some [Patreon]( +contributions. + +At a glance, here are some of the features it has: + +* Clips - basically public bookmarks +* Drive - view all media you've uploaded to the server, re-use images without + having to re-upload them, and more +* Multiple UI modes built in to the front-end +* Federated chat +* MFM - Misskey-Flavoured Markdown, taking post markup to a whole new level +* Excellent admin panel features +* Custom timelines, channels, and groups +* Excellent UI customization + +You may have heard of some trouble with Syuilo facing burnout and funding being +cut. This is not untrue, but since Syuilo announced this, they have received +some more funding, and have re-structured the way they develop the project. The +project is far from dead, and with the recent boost in popularity, it could see +development pick up again—hopefully in a healthier way this time. + +## How Is It From an Admin Perspective? + +Having administrated Mastodon, Pleroma, and now Misskey for single-user +instances, I can confidently say that Mastodon is the heaviest and Pleroma and +Misskey are much lighter. Misskey is heavier than Pleroma, but not by terribly +much; both are far lighter than Mastodon. There are also murmurings +that Misskey scales better than Pleroma (which already scaled far better than +Mastodon), though more insight is probably needed from the admins experienced +with Pleroma. + +### Resource Usage + +As far as my own servers: at this moment, the Pleroma server (Debian Buster) is +using 685MB of RAM with a load average of `0.01 0.04 0.07` whereas the Misskey +server (Debian Bullseye) is using 848MB of RAM with a load average of `0.35 0.18 +0.15`. Both are running on Vultr VPS instances. + +Misskey tends to have more big bursts of CPU usage, so, in my experience, it is +helpful to have more than one CPU core for your Misskey server. You also need +to configure swap or have a minimum of 2GB of RAM to compile Misskey because it +is a Nodejs project. You can probably get away with a $10/mo VPS from Vultr, +DigitalOcean, or Linode for servers with a handful of people, but you will +probably want to opt for the $20/mo VPSes for between 15 and 50 people. For +example, @razzlom\ runs a Misskey instance with 50 users +(approximately 10 active users) without ElasticSearch and they report that this +uses 50-60% of 8GB of RAM and 1-10% of 4 AMD EPYC cores. + +### Admin Features + +From what I and others have seen so far, the admin features of Misskey are +amazing and the admin UI is much better than any other Fediverse software so +far. + +For example, you can see the size of various database tables, the server logs, +the server resource usage, ALL media that has been uploaded to your server, and +more from within the UI. Take a look: + +<figure> + <a href="/img/misskey/admin-overview.png"><img src="/img/misskey/admin-overview-thumb.png"></a> + <figcaption>The Admin Overview - Showing an overview of server resource usage and activity</figcaption> +</figure> + +<figure> + <a href="/img/misskey/federation.png"><img src="/img/misskey/federation-thumb.png"></a> + <figcaption>The Federation Panel - Showing stats about which servers might be down</figcaption> +</figure> + +<figure> + <a href="/img/misskey/database.png"><img src="/img/misskey/database-thumb.png" alt="The Admin Overview"/></a> + <figcaption>The Database Panel - Showing stats about various table sizes</figcaption> +</figure> + +Some other excellent features which are either missing from Mastodon, Pleroma, +or both are: + +* server-wide announcements, +* customizable post character limits (no more 1/X Mastodon threads!!), +* the ability to promote a post instance-wide, +* the ability to present advertisements to your users (assuming they are willing to accept that) which can help with funding your instance, +* the ability to easily monitor the job queue of the server, +* and the search does actually work well enough even without having ElasticSearch installed, and without needing to enable Postgres RUM indices like in Pleroma. + +## How Is It From a User Perspective? + +In short, it's unlike any other Fediverse software that currently exists. It is +packed full of useful features and, even though some stuff can definitely be +improved, it is exciting to see just what Fedi can be. + +### Timelines + +With Misskey, you have the same sorts of timelines you expect from other +Fediverse software. The table below summarizes which posts each timeline +displays (note that "Home" post visibility is equivalent to "Unlisted" in other +Fediverse software): + +<table> <thead> +<tr> + <th colspan="2">Source</th> + <th colspan="4">Timeline</th> +</tr> +<tr> + <th>User</th> + <th>Post Visibility</th> + <th>Home</th> + <th>Local</th> + <th>Social</th> + <th>Global</th> +</tr> +</thead> <tbody> +<tr> + <td rowspan="3">Local (Following)</td> + <td>Public</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> +</tr> +<tr> + <td>Home</td> + <td>X</td> + <td>&nbsp;</td> + <td>X</td> + <td>&nbsp;</td> +</tr> +<tr> + <td>Followers-only</td> + <td>X</td> + <td>X</td> + <td>X</td> + <td>X</td> +</tr> +<tr> + <td rowspan="3">Remote (Following)</td> + <td>Public</td> + <td>X</td> + <td>&nbsp;</td> + <td>X</td> + <td>X</td> +</tr> +<tr> + <td>Home</td> + <td>X</td> + <td>&nbsp;</td> + <td>X</td> + <td>&nbsp;</td> +</tr> +<tr> + <td>Followers-only</td> + <td>X</td> + <td>&nbsp;</td> + <td>X</td> + <td>X</td> +</tr> +<tr> + <td rowspan="3">Local (Not Following)</td> + <td>Public</td> + <td>&nbsp;</td> + <td>X</td> + <td>X</td> + <td>X</td> +</tr> +<tr> + <td>Home</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> +</tr> +<tr> + <td>Followers-only</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> +</tr> +<tr> + <td rowspan="3">Remote (Not Following)</td> + <td>Public</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>X</td> +</tr> +<tr> + <td>Home</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> +</tr> +<tr> + <td>Followers-only</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> + <td>&nbsp;</td> +</tr> +</tbody> </table> + +This behaviour is, in practice, slightly different than Mastodon, and quite +different from Pleroma. + +### Health + +Overall, Misskey seems to encourage more genuine social interaction compared to +other Fediverse software and traditional social media. For example, there are +no favourites on Misskey. You may see the "Favourite" option in the menu +underneath a post, but this is simply a bookmark function. It is truly saving a +post that you really like as opposed to behaving, in practice, as a +meaningless "Like" button or read-receipt. + +Instead, Misskey features emoji reactions to posts as the main way (aside from +boosting) of interacting with posts. You can react to a post with a regular +Unicode emoji (which other Fediverse software that supports this can see) or +with custom emoji (which only Misskey users can see). This generally results in +much more thought put into how you wish to react to a post, with "Favourites" +from users of other software simply showing up as the thumbs up emoji. + +Furthermore, the style of timeline that Misskey and Mastodon have tend to +encourage more healthy interaction and consumption than Pleroma's. Even though +all social media is unhealthy to the degree that many of us use it, Pleroma's +timeline encouraged doomscrolling and negative interaction in a way that +neither Mastodon's nor Misskey's do because it shows you absolutely everything +that people you follow post which tends to drag you into threads that you +really don't involve you or need to involve you. I can personally attest to +this, since I have been hosting and using Pleroma for over a year now. + +### Groups, Channels, Pages, Clips, Galleries, and Antennas—Oh My + +This Misskey's bread and butter in my eyes and what makes it stand out so +strongly from the other ActivityPub-based software. There is a lot of fun to +have with these features, though not all of them are federated just yet. + +Groups are (currently) local-only collections of users to which you can send +messages. Think of it like a group chat in applications like Telegram, Matrix, +or channels like in IRC. + +Channels are local-only posting groups to which you can post notes to only the +specific people who are subscribed to that channel. + +Pages are static pages on which you can put almost anything you want, including +writing AiScript (a Misskey-specific scripting language) to add functionality +to the page. Think of it a bit like GitHub Pages or something similar. You can +then link these pages, and others can view them on your instance. [Here is an +example of a page]( + +Clips are like bookmarks but they can be organized and made public. Think of +them a bit like Twitch or YouTube livestream clips, though text-focused +instead. + +Galleries are collections of public photos that others can see when they look +at your gallery on your instance. The galleries themselves are not yet +federated, so you do have to go to the person's instance to see their gallery, +but it provides an Instagram-like look at the media they've publicly uploaded +and chosen to make available. + +Antennas are possibly one of the coolest features. They are effectively custom +timelines. You can make an antenna that just shows posts from specific users +and notifies you when they post something new, you can make an antenna that +collects posts containing or excluding certain key words, or you can make an +antenna that collects only posts with files attached. If you want to emulate +Pleroma's timeline behaviour, you can even make an antenna consisting of "Notes +from following users" with "Show replies" checked. + +### Your Drive + +Your drive is possibly one of _the_ single most useful features on Misskey. You +are allocated a (configurable by the server admins) amount of storage space you +can use for files uploaded to your drive and you can store whatever you'd like +in there. If you want to upload a bunch of memes to have them easily on hand +whenever you want to react to someone or if you want to simply re-share a file +you shared before without having to re-upload it to the server or dig through +your old posts, you can do that easily with the drive. + +<figure> + <a href="/img/misskey/drive.png"><img src="/img/misskey/drive-thumb.png"/></a> + <figcaption>My Drive with an emoji folder and several other images.</figcaption> +</figure> + +### Apps + +App support is a little limited at the moment. Since Misskey is not compatible +with the Mastodon API, one can't use apps like Tusky or Tootle with it. There +are, however, a few apps available. Namely +[SocialHub]( for iOS and +[Milktea]( for Android. + +One can also use Misskey in the browser, and it provides a reasonably snappy +experience, but will most likely use more data than a dedicated app. + +### Other Various User Features + +Some other excellent user-facing features which are either missing from +Mastodon, Pleroma, or both are: + +* an excellent threading model (similar to Reddit) where it's much easier to follow the flow of a conversation, + +<figure> + <a href="/img/misskey/threading.png"><img src="/img/misskey/threading-thumb.png" alt="A threaded conversation in Misskey."/></a> +</figure> + +* MFM (Misskey-Flavoured Markdown) which is like markdown on steroids and even supports LaTeX formatting, + +<figure> + <a href="/img/misskey/mfm.png"><img src="/img/misskey/mfm-thumb.png" alt="A post with MFM showing off LaTeX."/></a> +</figure> + +* the ability to have custom CSS for your client, such as in the example below which makes it so that post parents are shown on hover only, + +``` +.tabs ~ * div[tabindex="-1"] { + overflow: visible; + contain: none; +} + +.tabs ~ * div[tabindex="-1"] .reply-to { + position: absolute; + left: 2%; + bottom: calc(100% - 1em); + max-width: 85%; + box-sizing: border-box; + background: var(--panelHighlight); + z-index: 1000; + padding: 20px 24px; + box-shadow: 0 .5em 2em rgba(0, 0, 0, .5); + opacity: 0; + visibility: hidden; + transition: opacity .2s, visibility 0s ease .2s; +} + +.tabs ~ * div[tabindex="-1"]:hover .reply-to { + opacity: 1; + visibility: visible; + transition: opacity .2s ease .5s, visibility 0s ease .5s; +} +``` + +* working and federating pinned posts (which Pleroma lacks), +* good handling of posts that have been deleted (no more accidentally posting a reply to a deleted post, or needing to refresh to have that post disappear from your timeline!), +* automatically marking media as sensitive when you add a CW to your post (something every other bit of software except PleromaFE does, despite multiple requests to at least have the ability to do that), +* the option to auto-approve follow requests from people you follow, +* multiple different UI layouts built into the software, +* a relatively performant UI (as long as animations and blur are disabled), +* and an extremely customizable UI, with widgets! + +<figure> + <a href="/img/misskey/widgets.png"><img src="/img/misskey/widgets.png" alt="My sidebar with some widgets."/></a> +</figure> + + +## The Rough Parts + +### On The Admin Side + +Of course, not everything is without its caveats. For those used to Pleroma's +MRF system, Misskey doesn't have anything like that. Admins can defederate from +a domain and can silence and suspend individual users, but there are no options +for a user to silence a whole instance themselves or for an admin to only strip +media from an instance, for example. + +On one hand, this does limit what moderators can do for their instance, but, on +the other hand, if an instance really is causing enough trouble to bother your +users and their moderators aren't responding, just blocking them is probably +what you'll want in the end given that, more often than not, those kinds of +instances just keep causing more and more trouble. It also keeps your options +clear and simple. + +One of the other downsides to administrating a Misskey instance at the moment +is the lack of bulk emoji import support. Although it's trivially easy to add, +tag, and categorize emoji—even from remote instances—it is currently impossible +to import a large amount at once. What you will probably want to do instead is +go to your Drive, create some folders to organize your emoji, upload them all +from your PC into the folders (you can upload more than one at a time), and then +go to the Custom Emoji settings, choose import from Drive, and click on all of +the emoji you wish to import. + +This isn't such a big deal if you only have maybe a couple hundred emoji at the +most, but is more tedious than it could be. The same goes for categorizing and +tagging those emoji. + +Finally, there is currently an issue where Misskey has trouble federating with +profiles that have bios which are too long. This mostly affects people using +Pleroma, since Mastodon caps bios at 500 characters and Pleroma sends a user's +bio to the remote server as (a lot of) HTML so it's hard to tell when your bio +is too long. Luckily, there is a simple patch you can easily apply to your +instance which solves this problem by truncating fields which are too long for +Misskey. An official fix is in the works, but for now it's very easy to drop +this in the `misskey` folder, `git apply` it, and re-build. You can [download +the patch +here]( + +### On The User Side + +Currently, there are a few things which could be improved. For one, there is no +option to limit streaming of new posts when you are scrolled to the top of your +timeline. Unlike in Pleroma, where you can choose to have posts stream in as +long as you are scrolled up or click a button when you are ready to see new +posts, in Misskey this is not an option which can be frustrating as posts move +down as you were reading them. + +Another minor issue is that Antennas don't show your own posts, unlike the +other timelines. Although this isn't a huge deal, many people like to see their +posts as part of the conversation so it's a bit weird to type a response and +not see it appear in the custom timelines. + +Also, mutes can be a little bit leaky. If you have a user muted, you can still +see conversations involving them since it seems to only check post authors and +doesn't include mentions. A boost of a reply to a post of a user you have muted +can also make it through the filter. + +Finally, there are a few minor other UI issues such as notification dots +getting stuck on (though you can hide them with custom CSS or mark all +notifications read in the settings), some modals not being dismissable with the +Esc shortcut key, and there is no option to play gifs or other media only when +you hover over them. + +Overall, these issues haven't bothered me much and I consider them pretty minor +compared to the benefits of Misskey, though your experience might differ. + +## In Conclusion + +Although there are things yet unfinished with Misskey (as there is for all the +other Fediverse software), it is already miles ahead of the rest of the +Fediverse software I've tried. Yes, there are some rough edges and there might +be UI elements or UX aspects that some don't like or prefer, but at least for +me, and for many others who have tried it over the past couple days, Misskey +really seems like the future of the Fediverse; other software feels like it's +stuck in an old paradigm, trying to copy too much what Twitter or 4chan are. + +Plus, since the seemingly overnight switch of so many users (at least in my +circle) to Misskey, there has been a lot of work to figure out features, +document things more thoroughly, and provide things like the aforementioned +patch which fixes federation for people with long bios. Many of the issues I +have with Misskey are minor and can be readily fixed. + +If you check out Misskey and like it, please consider [donating to +Syuilo]( to keep development going. The future +is bright for Misskey. + diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,230 @@ +Title: Migrating from nginx to OpenBSD's httpd and relayd +Author: Jake Bauer +Date: 2021-02-17 +Summary: Detailing how I migrated my Debian 10 server running nginx to OpenBSD with httpd and relayd. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<center><figure> + <a href="/img/openbsd-logo.png"><img src="/img/openbsd-logo.png" alt="The OpenBSD logo."/></a> + <figcaption>This logo is subject to the license at: <a href=""></a></figcaption> +</figure></center> + +<p class="note">The configuration specified in this blog post is out of date. +Please refer to <a +href="/garden/arboretum/knowledge/sysadmin/openbsd-server-details.html">OpenBSD +Server Details</a> for my updated configuration.</p> + +Having set up my mail server on OpenBSD, I've been very satisfied with the +cohesiveness of the operating system; it has been a breeze to administrate. +Since certbot just stopped working randomly on my previous server running Debian +10 and nginx, I took it as an opportunity to try out OpenBSD for hosting my +website and reverse proxy. OpenBSD includes two daemons written by the OpenBSD +developers—httpd and relayd—for just those purposes. They also provide +acme-client as an alternative to certbot. All of this was done on OpenBSD 6.8. + +Below is my httpd configuration. This contains configurations for renewing the +TLS certificate as well as serving both [](/) and +[](// with redirects as needed. If I wanted to, +I could also split these into separate config files and use the `include` +directive. + +``` +types { + include "/usr/share/misc/mime.types" +} + +# For certificate renewal +server "" { + listen on * port 80 + location "/.well-known/acme-challenge/*" { + root "/acme" + request strip 2 + } + location * { + block return 302 "$REQUEST_URI" + } +} +server "" { + listen on * port 8080 + location * { + block return 302 "$REQUEST_URI" + } +} + +# WWW.PARITYBIT.CA +server "" { + listen on * port 8080 + root "/" + location "/" { + request rewrite "/html/home.html" + } + location match "/.*%.html" { + request rewrite "/html/$REQUEST_URI" + } + location match "/([^%.]+)$" { + request rewrite "/html/%1.html" + } +} + +server "" { + listen on * port 80 + location * { + block return 302 "$REQUEST_URI" + } +} + +# FTP.PARITYBIT.CA +server "" { + listen on * port 8080 + root "/" + directory auto index +} + +server "" { + listen on * port 80 + location * { + block return 302 "$REQUEST_URI" + } +} +``` + +In the above configuration, there are two `location match` directives in the +[]( server. The first matches any +request for a path ending in `.html` and rewrites the request to serve the +webpages from the `html` subdirectory as opposed to trying to find them in the +root folder of the website. + +The second matches any request which doesn't have a file extension and appends +`.html` to the requested resource path. This allows me to replicate nginx's +`try_files` command where one can tell it to search for files which look like +`$DOCUMENT_URI.html` and it means that users don't have to type out the `.html` +extension when visiting a page on my site. + +Below is my relayd configuration. I run multiple services from one IP so I need +to reverse proxy incoming connections to various services on my network. As with +nginx's reverse proxying, relayd can handle the TLS connections to each of my +services. I could also reverse proxy the connections to port 80 and redirect +them using relayd, but I felt it was simpler to just let the webserver handle +those directly. + +The reverse proxy for Gemini at the bottom of the configuration is just for +accessing it within my network because of my internal DNS configuration. + +``` +ext_addr = +table <pleroma> { } +table <git> { } +table <matrix> { } +table <www> { } +table <gemini> { } + +# TLS proxy all home services +http protocol "httpsproxy" { + tcp {nodelay, sack, backlog 128} + + tls keypair "" + + return error + + match header set "X-Client-IP" \ + value "$REMOTE_ADDR:$REMOTE_PORT" + match header set "X-Forwarded-For" \ + value "$REMOTE_ADDR" + match header set "X-Forwarded-By" \ + value "$SERVER_ADDR:$SERVER_PORT" + + match response header remove "Server" + match response header set "X-Frame-Options" \ + value "SAMEORIGIN" + match response header set "X-XSS-Protection" \ + value "1; mode=block" + match response header set "X-Content-Type-Options" \ + value "nosniff" + match response header set "Referrer-Policy" \ + value "strict-origin" + match response header set "Content-Security-Policy" \ + value "default-src 'none'; \ + base-uri 'self'; \ form-action 'self'; \ + img-src 'self' data: https:; \ + media-src 'self' https:; \ + style-src 'self' 'unsafe-inline'; \ + font-src 'self'; \ + script-src 'self' 'unsafe-inline'; \ + connect-src 'self' wss://; \ + upgrade-insecure-requests;" + match response header set "Strict-Transport-Security" \ + value "max-age=31536000; includeSubDomains" + match response header set "Permissions-Policy" \ + value "accelerometer=(none), camera=(none), \ + geolocation=(none), gyroscope=(none), \ + magnetometer=(none), microphone=(none), \ + payment=(none), usb=(none), \ + ambient-light-sensor=(none), autoplay=(none)" + + pass request quick header "Host" value "" \ + forward to <git> + pass request quick header "Host" value "" \ + forward to <matrix> + pass request quick header "Host" value "" \ + forward to <pleroma> + pass request quick header "Host" value "" \ + forward to <www> + pass request quick header "Host" value "" \ + forward to <www> + pass request quick header "Host" value "" \ + forward to <www> + block +} + +relay "reverseproxy" { + listen on $ext_addr port 443 tls + protocol httpsproxy + forward to <git> port 80 check http "/" code 200 + forward to <matrix> port 8008 check http "/" code 302 + forward to <pleroma> port 8080 check http "/" code 400 + forward to <www> port 8080 check http "/" code 302 +} + +#For Matrix +http protocol "matrix" { + tcp {nodelay, sack, backlog 128} + + tls keypair "" + + return error + + match header set "X-Client-IP" \ + value "$REMOTE_ADDR:$REMOTE_PORT" + match header set "X-Forwarded-For" \ + value "$REMOTE_ADDR" + match header set "X-Forwarded-By" \ + value "$SERVER_ADDR:$SERVER_PORT" + + pass +} + +relay "matrixrevprox" { + listen on $ext_addr port 8448 tls + protocol matrix + forward to <matrix> port 8008 check tcp +} + +relay gemini { + listen on $ext_addr port 1965 + forward to <gemini> port 1965 check tcp +} +``` + +There is a lot of extra configuration for the HTTP services for setting things +like Content Security Policy and other security headers (what a mess the Web has +become...). I used the [Pleroma installation guide for +OpenBSD]( as a +reference for the CSPs needed for that service. + +As usual, the tools provided by the OpenBSD developers are a breeze to configure +and administrate. Plus the comprehensive, accurate, and complete documentation +provided with the system means that I don't have to scour the internet for help +only to find outdated tutorials or complicated documentation. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,144 @@ +Title: My Git Server Was DDoSed +Author: Jake Bauer +Date: 2020-07-29 +Summary: I noticed some strange behaviour on my git server and it turns out someone was DDoSing it. Here's what I had to do to get it back up and running again. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +On the evening of the 27th of July, 2020 (two days ago), I noticed some odd +behaviour with my git server. UptimeRobot, the service which provides, kept sending me emails every dozen or so minutes telling me +that my git server was down and then up again. This happened a number of times +but I just chalked it up to a misbehaving server or heavier-than-normal traffic. + +It wasn't until the notifications became so numerous and noticing that turning +the machine off and on again wasn't working that I figured something wasn't +right. I shut down the server for the night to prevent it from being +continuously overwhelmed (and thereby me receiving a hundred emails overnight) +and went to sleep with the idea of fixing it in the morning. + +When I woke up, the first thing I tried was turning the server back on and +waiting to see if it went down again. Maybe whatever was going on fixed it self +in the ~13 hours that the server was offline. Unfortunately, within 10 minutes +the server was down again. + +My next step in diagnosing the problem was to check the server logs. Normally, I +have both the `access.log` and `error.log` turned off on my servers because I +don't need the content of those logs under normal circumstances. I proceeded to +turn on logging again just for [](// and +watched them with `tail -f` to try to get an idea of what was going on. + +I noticed a flood of various sketchy looking user agents constantly hitting +various URLs in a pattern that was clearly indicative of bots. These bots were +looking at what seemed like every single diff of every single file of every +single commit and this was bringing my poor PineA64+ down to its knees trying to +keep up with syntax highlighting all the code and generating all the `.tar.gz`, +`.tar.bz2` and `.zip` files for every single snapshot. Luckily, it was just the +webserver that kept going down; git access through SSH was unaffected. + +These are the kinds of user agents I noticed: + +``` +"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; The World)" + +"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; TencentTraveler 4.0)" + +"Mozilla/5.0 (compatible; MSIE 9.0; Windows NT 6.1; Trident/5.0" + +"Opera/9.80 (Macintosh; Intel Mac OS X 10.6.8; U; en) Presto/2.8.131 Version/11.11" + +"Mozilla/4.0 (compatible; MSIE 7.0; Windows NT 5.1; Maxthon 2.0)" +``` + +My first thought upon seeing this traffic was that they were just some +overzealous bots. I changed my `robots.txt` file to deny scraping all but the +index page of my git server and I changed the robots setting in `cgitrc` to +`robots=none` to prevent the site from being indexed. + +Unfortunately, that didn't help one bit. When a bot ignores robots directives, +it's more than likely a malicious bot (or, at the very least, one made by an +incompetent programmer). My next action was to set up Fail2Ban to catch these +malicious actors and ban them for a number of hours from accessing my server. So +I set up an `nginx-badbots` filter (by copying the `apache-badbots` filter and +adding the malicious user agents to the `badbots-custom` variable), I set the +ban time to 2 days, the retry count to 2 times, and the action to add a drop +rule to my `nftables` firewall. + +In the first few minutes, there were about 10 or so IPs added to the list. I let +this keep going for an hour all the while monitoring it and watching my git +server continue to come back online only to be knocked down again. After about +15 minutes, I got the idea to run a GeoIP lookup on the addresses which were +banned and this is what I saw: + +<figure> + <a href="/img/banned-ips.png"><img src="/img/banned-ips.png" alt="A + screenshot of the GeoIP lookup output showing 235 IPs from China and 1 IP + from Germany."/></a> +</figure> + +Clearly, either there was someone using a botnet with a lot of infected Chinese +computers or someone in China was DDoSing my server using whatever IPs they +controlled. I let it get this bad before deciding I had to take much more +drastic measures: + +<figure> + <a href="/img/more-banned-ips.png"><img src="/img/more-banned-ips.png" + alt="A screenshot of another GeoIP lookup showing 1 IP from Canada, 876 IPs + from China, and 1 IP from Germany."/></a> +</figure> + +At this rate, Fail2Ban was not working and, after an hour of adding hundreds of +IPs to the blocklist, my server was still going down. It was suggested to me by +someone on the Fediverse (I was ranting about this whole thing over there) that +I might be able to stop the attack by pre-emptively banning all Chinese IPs. I +left that as a last resort because it's an extreme measure that has the very +real implication of locking out good people from viewing my sites. It's not like +everyone in China is a malicious actor and there may even be people over there +who find my stuff useful. + +Though, unfortunately, the attack was showing no signs of slowing down and I had +to take this action just to get my server back up and running again. I found a +list of IPv4 address ranges for China and added all of those IPs to my firewall +(it was an extra ~2200 rules). The server pretty much instantly came back +online and the list of IPs banned by Fail2Ban stopped growing. Since then, my +git server has stayed up without any further issues. + +It doesn't seem to be over though. It would appear the script kiddies caught on +to my blanket IP ban and have been hitting the server again from various +countries. I just checked as of writing this blog post, and this is now the +output of Fail2Ban + GeoIP lookup: + +<figure> + <a href="/img/banned-ips-now.png"><img src="/img/banned-ips-now.png" alt="A + screenshot of another GeoIP lookup showing 876 Chinese IPs, 464 IP addresses + not found, 170 Russian IPs, 155 American IPs, 85 Australian IPs, 76 British + IPs, 64 Turkish IPs, 62 Canadian IPs, 59 Indian IPs, 59 German IPs, 31 + Brazilian IPs, and so on for nearly every developed country in the + world."/></a> +</figure> + +Clearly the attack is still going on but, thanks to Fail2Ban, it's no longer +significant enough to keep bringing down my Git server. I also don't notice any +lag out of the ordinary when using it myself which is a good sign. + +What perplexes me about this DDoS is that this person or group, whoever they +are, is only attacking [](// and none +of my other services. My website, Pleroma, and Matrix all seem to be behaving +just fine and there's no extraneous bandwidth usage from any of them. My git +server is also just a web server for people to look at and clone my +repositories; there are no accounts to take over or databases to hack. Is this +some automated attack designed to scrape all my code in an attempt to find +credentials? Who knows... + +I'll give it a few more days and see if I can unblock China from accessing my +web services because I'd rather not block an entire country from my stuff just +because of one malicious actor. Unfortunately, if the attack continues to the +point of bringing down my git server again, I'll have to leave the block in +place (though I may try rate-limiting IPs that Fail2Ban catches instead of +outright blocking them). + +_This is my eighty-second post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,117 @@ +Title: My Journey With Computers +Author: Jake Bauer +Date: 2020-08-03 +Summary: I've only really been into computers for about three years despite using them my entire life. This is the story of how I went from a complete computer n00b to where I am today. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Nearly two weeks ago (wow, time flies), I wrote a blog post about [two truths +and a lie](/blog/two-truths-and-a-lie) where I presented three things about me +and you would have to guess which one was a lie. There were a few people on the +thread about the post who were surprised I've only been into computers for about +three years. That, along with [DistroTube's latest +video](, and [a recent post by Mike +Stone]( is why I'm writing +this post. + +My journey begins before I can really clearly remember. I've always had +computers and the Internet around me but I never really got into them or +bothered to learn about them for most of my life; I really just played games and +browsed the Internet. I distinctly remember the early days of Youtube, Facebook, +Limewire, and so on. RuneScape, Club Penguin and flash games were also a big +part of my childhood. + +As time went on, I only learned what I needed to in order to fix whatever +problems came up on my Windows 7 laptops (if you're curious I've only ever used +Windows XP, then 7, then 10). I learned the basics of looking things up trying +to find solutions to whichever problems I encountered, I learned to use +Malwarebytes and/or the built-in Windows Defender instead of whatever other +garbage there is, I ran CCleaner for a while, and pretty much just got by with +whatever I needed to by looking things up. + +By late high-school I had learned what Linux was and played around with it a +bit. I installed things like Ubuntu, Linux Mint, and some other variants of +Ubuntu but never used it daily as I had no reason to. After all, they didn't +support my video games. I only knew to go to the command line to use `sudo +apt-get` not even knowing what those commands did, just that I had to use them +to update my computer and install new software. I didn't know what a shell was +or who Richard Stallman or Linus Torvalds are, only that Linux was free (as in +free of cost) and that's what I found interesting at the time. + +In my last year of high school, I signed up for Codecademy to learn how to +program in Python. Not because I needed to, but because I heard it was a good +language for beginners and I wanted to try my hand at this whole programming +thing. I remember going through it but getting quite bored with it and not +really seeing the point. I didn't have anything I wanted to program and soon +lost interest, especially since it didn't do anything to explain programming +concepts to me; it just threw what felt like syntax problems at me. To this day +(even after giving it another shot later in life) I think Codecademy is somewhat +similar to trying to use Duolingo to learn a language: one might learn the +different words used in the language, but it can't teach one how to use it +properly. + +I finished High School and went to university... but not for Computer Science! +In fact, I first went to get a Bachelor of Science in Chemistry. In my first +year I took some computer science electives because I still had that curiosity +to learn Python. I learned and used Python in the first semester and Java in the +second. Still, I was using Windows to do everything. I programmed Python in +Sublime text and Java in IntelliJ IDEA. The flame was ignited; even though I +really enjoyed chemistry (I still do), I knew working with computers is what I +wanted to do. I switched my program to a Bachelor of Computer Science and +entered second year as a full-fledged Comp. Sci. undergrad. + +In that year alone I learned C, more Java, JavaScript, C++, about data +structures and algorithms, and, the most important thing of all, Vim. It was +actually the professor who taught the class on C who encouraged everyone to use +Linux and Vim for their assignments; something I chose to do since I already +knew how to install Linux and due to my desire to learn more. Looking back, this +was me at the top of the rabbit hole, looking around in confusion as I slowly +walked towards the edge without knowing. + +That winter [I built my own PC]( during the +Black Friday sales around American Thanksgiving. That was the first time I built +a PC and the first time I had a relatively powerful gaming PC. I installed both +Ubuntu Linux and Windows 10 on it (using a Windows 10 Pro key provided by my +university) because I was still quite heavily into gaming, though I now did all +my programming on Linux. + +It was the summer of 2018 where I feel my knowledge really exploded and hasn't +stopped since. That summer I got an internship doing software development. It +was the first time I used Git seriously, the first time I took the time to +really customize the heck out of Vim, and the first time I encountered +*shudders* other people's code. Curiosity kept driving me and when I had +downtime at that job I spent it reading various StackExchange forums, I learned +all about FOSS licensing, what the FSF, EFF, SFC, OSI, and LF were, who Linus +Torvalds, Richard Stallman, Eric S. Raymond and folks are, and so much more. + +Things have kept growing since then. I switched from Ubuntu to Debian and used +XFCE for a long time. Then I discovered tiling window managers from Linux +youtubers such as [Derek Taylor]( and [Luke +Smith]( and started +using bspwm. When I moved into an apartment on my own, I started self-hosting +the services you find me on today. I've tried various distributions like Arch +Linux, Gentoo, and OpenSUSE in addition to the Ubuntu derivatives, Linux Mint, +and Debian which I was already familiar with. I've also tried non-Linuxes like +FreeBSD, OpenBSD, and Plan9. I've learned more about the history of computing +than my naïve younger self ever knew existed. I've programmed in Scheme and +Prolog. I was even tempted by Emacs at one point (scary, I know). + +All that being said, I'm really only a little more than three years into this +field and I am continuing to learn new stuff every day. It was only relatively +recently when I began doing things like writing POSIX shell scripts instead of +Bash-specific ones wherever I can, thinking about the impact of the software I +write, and even properly using keys like `w`, `e`, and `b` in Vim. I went from +not even having a good reason to use Linux to now running Debian Sid, using dwm +and a bunch of other Suckless software, [writing my own Vim +statusline](/blog/making-my-own-vim-statusline), +[self-hosting my own email +server](/blog/self-hosting-email), [participating in my +first CTF](/blog/my-first-ctf) and more. + +I am deep down the rabbit hole now... + +_This is my eighty-fourth post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,77 @@ +Title: My LWN Theme +Author: Jake Bauer +Date: 2020-06-22 +Summary: A recent blog post by about how he set up his LWN theme made me want to review my settings which I set up over a year ago. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +A [recent blog post by Amolith]( about how he +set up his LWN theme made me want to review my settings and tweak them to fit a +colour scheme I now like (this website's theme) compared to what I set up over a +year ago. I spent some time switching all of the colours over to something that +would mimic this site, since I like this colour scheme, and I figured I'd post +about it too in case people are looking for more theme ideas: + +## Display Preferences + +| Option | Value | +|-----------------------------------------------|-----------| +| Page background colour | `#25252a` | +| Left column background | `#36363a` | +| Middle column background | `#36363a` | +| Headline background | `#36363a` | +| Form/byline background | `#36363a` | +| Sidebar background | `#36363a` | +| Text colour | `#cccccc` | +| Link colour | `#83b3d8` | +| Visited link colour | `#a696cc` | +| Quoted text (in email) colour | `#dc00dc` | +| Old (seen) comment background colour | `#111111` | +| Navigation box on printable page | Checked | +| Minimum width of main text column (em) | `40` | +| Maximum width of main text column (em) | `50` | +| Display old parent in unread comments screen | Unchecked | + +## New page engine preferences + +|Option | Value | +|---------------------------------------------|----------------------| +| Use the new page engine | Checked | +| Left column color | `#36363a` | +| Maximum width for handset presentation (em) | `48` | +| Fixed navigation menu on small screens | Checked | +| Font family to use | `browser-determined` | + +## Quoted text preferences + +| Option | Value | +|------------------------|-----------| +| Quoted text style | `italic` | +| Quoted text weight | `normal` | +| Quoted text colour | `#bb5555` | +| Quoted text background | `#25252a` | + +## Screenshots + +<figure> + <a href="/img/lwn-homepage-colours.png"><img + src="/img/lwn-homepage-colours.png"/></a> + <figcaption>The LWN homepage with my colourscheme.</figcaption> +</figure> + +<figure> + <a href="/img/lwn-we-colours.png"><img src="/img/lwn-we-colours.png"/></a> + <figcaption>An LWN Weekly Edition with my colourscheme.</figcaption> +</figure> + +## Conclusion + +I really appreciate that LWN exposes stylesheet settings so that users can set +their own themes. Aside from being the highest quality Linux (and sometimes +general Open Source) news source, that's a good reason to subscribe to them. + +_This is my fifty-second post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,121 @@ +Title: My New T420s +Author: Jake Bauer +Date: 2020-06-15 +Summary: Two days ago I picked up a Thinkpad T420s laptop from a local seller for $150 CAD after spontaneously deciding to look through Kijiji. Here are my thoughts about it. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Two days ago I picked up a Thinkpad T420s laptop from a local seller for $150 +CAD[1] after spontaneously deciding to look through Kijiji (the Canadian version +of Craigslist or Gumtree). In the package were two 65W power adapters, the +laptop, and an ultrabay SATA adapter which I can swap out the optical drive for +allowing me to add an extra SSD. I think this was a fantastic deal and I'm glad +I looked when I did. + +The laptop is in really good condition overall. It came cleaned with minimal +wear and tear aside from the trackpad and the trackpoint nub. The battery is +definitely on its last legs reading 50% health and only netting between one and +two hours using it for light tasks, but it still works and it's not like I'm +going anywhere any time soon. + +Here are the specifications it came with: + +* Thinkpad T420s +* Intel Core i5-2520M +* 1600x900 TN Screen +* 4GB DDR3 +* 128GB Crucial SSD +* Ports: + * 1 DisplayPort + * 1 VGA + * 1 Multi card reader + * 2 USB 2.0 Ports (with 1 always-on charge port) + * 1 USB 3.0 Port + * Gigabit ethernet + * 3.5mm Audio jack +* Weight: 1.771kg or 3.904lbs + +I upgraded the RAM to 8GB immediately using parts I had laying around and took +off the worn out trackpad sticker (that textured surface is actually just a +sticker!). I also replaced the trackpoint nub with the one from my T440s since +the trackpoint on my T440s stopped working (don't get me started, I've been +having a number of issues with it recently. + +The screen is definitely nowhere near as good as the 1080p IPS display I have on +my T440s, but it's still a matte screen, the resolution is not bad and I can +live with the viewing angles. It's an alright screen overall. + +The keyboard, on the other hand, is amazing. It's the classic keyboard used on +Thinkpads before the switch to chiclet style keys starting with the models after +this one. It's an absolute pleasure to type on though definitely louder than the +keyboard on my T440s. + +The other distinguishing feature of this and older models of Thinkpads is the +Thinklight. Instead of having a backlit keyboard, there's a light at the top of +the screen which shines down on the keyboard. I think it's a much better +solution since it illuminates the surrounding area a little bit more and it +feels less straining on the eyes. It's basically a tiny lamp. + +A bonus for the T420s over the regular T420 is that there is at least one USB +3.0 port. This comes in handy when I need to transfer large files or boot off of +a USB disk. I'm also glad that both the main SATA port and the ultrabay run at +SATA-III speeds so I can make full use of my SSDs. + +After getting situated with my new Thinkpad, I hopped on eBay and started +looking for replacement parts. I purchased a bag of new trackpoint nubs, a new +trackpad sticker, and a dock all for about $35 after tax and shipping. I'm +hesitatnt to buy a new battery because it's quite expensive and, since I already +have my T440s I don't know if I need this to be quite as portable. I think I +might do it anyways since I really enjoy using this machine. + +Overall, I am really happy with my purchase. I may actually end up using this +laptop more than my T440s because of the Thinklight and the really nice +keyboard. + +Here are a couple pictures of it: + +<figure> + <a href="/img/t420s/t420s-close.jpg"><img + src="/img/t420s/t420s-close-thumb.jpg"/></a> <figcaption>The T420s in all + its glory.</figcaption> +</figure> + +<figure> + <a href="/img/t420s/t420s-wide.jpg"><img + src="/img/t420s/t420s-wide-thumb.jpg"/></a> <figcaption>The T420s from a + different angle. Such a nice machine.</figcaption> +</figure> + +<figure> + <a href="/img/t420s/t420s-thinklight.jpg"><img + src="/img/t420s/t420s-thinklight-thumb.jpg"/></a> <figcaption>The thinklight + feature on the T420s. In my opinion, it's better than the backlit + keyboard.</figcaption> +</figure> + +<figure> + <a href="/img/t420s/t420s-trackpad.jpg"><img + src="/img/t420s/t420s-trackpad-thumb.jpg"/></a> <figcaption>The T420s' + trackpad with the sticker peeled off. It's totally usable this way but I + like the textured sticker better.</figcaption> +</figure> + +<figure> + <a href="/img/t420s/new-sticker.jpg"><img + src="/img/t420s/new-sticker-thumb.jpg"/></a> <figcaption>A brand new + trackpad sticker on the T420s.</figcaption> +</figure> + +<figure> + <a href="/img/t420s/laptop-looking-good.jpg"><img + src="/img/t420s/laptop-looking-good-thumb.jpg"/></a> <figcaption>Just the + laptop looking good.</figcaption> +</figure> + +[1] - $150 CAD is approximately $110 USD, $160 AUD, £88 GBP, €98 EUR, ¥11,811 JPY, 104 CHF, or ₽7,683 RUB as of the "posted" date on this post. + +_This is my forty-sixth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,72 @@ +Title: My TODO Solution +Author: Jake Bauer +Date: 2020-07-08 +Summary: Yesterday I posted about why I don't think TODO lists or applications are useless. In this post, I describe what I do to keep myself organized. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Yesterday I posted about [why I don't think TODO lists or applications are +useless](/blog/are-todo-applications-a-waste-of-time). +Today, I want to talk about my TODO solution or what I do to keep myself +organized. + +It all comes down to preferring simplicity over complexity. TODO applications or +web tools are very pretty and very easy to synchronize across devices, but they +suffer from the failing of being cumbersome and awkward to use. I find they get +in my way more than they help me usually because of some required format that I +have to structure my thoughts in, too many menus and clicks to do simple things, +or an interface that has more whitespace than the latest minimalist desk picture +on Pinterest. + +I prefer to make literal TODO lists in a physical journal or plain text file. In +fact, I typically do both and have multiple files at the same time. I have a +Leuchtturm1917 A5 DotGrid notebook with an <del>addiction</del> assortment of +fountain pens which I use to keep a physical TODO list and I have a 1970's +vintage vi which I use to finely craft my text files. + +By "literal TODO lists" I mean just that: a plain list of things to do and +appointments to keep with two different shapes of bullets depending on the type +of item in the list. The TODO lists in my physical task book follow this format: + +``` +Thursday, 1 January, 1970 +▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔▔ +○ Lunch with Brian and Ken @ 12:30 +□ Create UNIX time +■ Refill TTY with paper +□ Destroy undergrads in Spacewar! +``` + +An empty square `□` represents a task that is yet to be completed. A filled in +square `■` represents a task that has been completed. Similarly, an empty circle +`○` and a filled circle `●` represent appointments yet to be attended and +appointments which have passed respectively. My task book is just page after +page of days with tasks written like this. + +At the beginning of school semesters, I will dedicate four pages (one for each +month) to listing out the days of the month so that I can note assignment due +dates, midterms, and exams in a single place. If I don't complete a task written +down on one day, I'll just write down the same task (or what's left to do for +that task) on the next day. Sometimes I write a few days ahead if I want to make +sure to remember something that I need to do in the near future. + +Digital TODO lists (aka text files) are typically much shorter-lived. I find +keeping track of things in digital form clunky and awkward to use, so I prefer +to do as much on paper as possible. However, when programming, quickly listing +and organizing a list of features I need to complete or bugs to fix can be +preferable. Once again, this is a plain list with bullet points in a plain text +file. When something is completed, it just gets removed from the list. + +So, that's how I stay organized and manage to get things done. No apps, no +special formats, just pen and paper or, more rarely, a plain text file and a +text editor. I'm interested in hearing about how other people stay organized and +whether or not you use something like a TODO application or just pen and paper. +Let me know by [sending me a link to a response blog +post]( or by [mentioning me on +the Fediverse]( + +_This is my sixty-fourth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,84 @@ +Title: Paying for Software +Author: Jake Bauer +Date: 2020-05-25 +Summary: Discussing the sustainability of free and open source software given most don't like to pay for software. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Most of the world now runs on free software; that's free as in freedom, not +necessarily free as in beer. It seems though, that many people conflate the +two meanings and expect free and open source software to also come free of +charge. This is despite none of the widely accepted free and open source +software licenses including a non-commercial clause. In fact, the +[GPL]( (section 6) explicitly +includes language which would allow one to make money off of one's software +while still keeping it free and open source. + +It is also often brought up that Big Tech tends to use free and open source +software in their own products, which they then proceed to sell, and that this +is effectively commercial entities using the work of volunteers for their own +profit often without giving back code improvements or otherwise contributing to +the software. Some notable exceptions such as the Linux kernel exist, but it +seems that developers of a lot of software, such as +[OpenSSL]( +and +[GNUPG]( +(news article links), which are used by multi-billion-dollar companies and +critical to our digital infrastructure, typically have to wait until they're in +a funding crisis to get the money they desperately need to keep developing and +maintaining their software. + +This is an unsustainable model for many of the services and software on which we +rely. Many developers work in their free time for the sole reason that they +enjoy making software; most don't make enough off of donations to leave their +day jobs and develop free and open source software full-time. This is why +projects such as [ElementaryOS]( try to push their users +into paying for the operating system they download and why they are trying to +build an app store which encourages the exchange of money for software. + +I try to give back to developers (and artists, but perhaps that's a discussion +for a different blog post) as much as I possibly can. For example, I spend $2 +USD per month for [SourceHut](, I have a $3.50 USD per +month []( subscription, I donate ~~$3.50 CAD per month to +[Wikipedia]( and~~ $25 per year to the [Electronic +Frontier Foundation](, and, before I self-hosted my email, +I didn't hesitate to pay [ProtonMail]( for those +services either. Now that I am self-hosting, I plan to donate $20 CAD to [the +creator of OpenSMTPD]( which is a core part of that +infrastructure. + +<p class="note">I no longer donate to Wikipedia after seeing how much their +executives and board members make. It's no longer some grassroots foundation +running on a shoestring budget. Like with almost every other profitable +organization, there's too much money going to the top.</a></p> + +Depending on your financial situation, it may not be viable to donate or pay a +lot and that is totally okay. Being a student, I am very cautious with my money +and so I tend not to give vast amounts, but if everyone gave $2 per month (the +price of a cup of coffee at a café) or even a larger, one-time donation to the +free software projects they use the most, it would make a huge difference. My +personal bias is towards prioritizing donations to not-for-profits and +development teams which largely or entirely rely on dontations or the proceeds +from people paying for an otherwise free service. + +If you really can't afford to give anything, that's alright. Not everyone can. +Something else you could do is send an email to the developer(s) thanking them +for the work that they do. Speaking from personal experience, it's a huge +confidence boost when someone praises something you do and it can greatly help +morale. + +Essentially, the point is: don't be so quick to recoil at the thought of having +to pay for free and open source software. Making free and open source software +is a lot of work which many developers do out of the kindness of their hearts +and it's reasonable that they deserve compensation for their efforts. GitHub has +taken steps to improve the situation with their [sponsorship +program](, but I think that a fundamental culture +shift has to occur where people become more comfortable rewarding free and open +source developers for their time and effort for this model to become truly +sustainable. + +_This is my twenty-eighth post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,68 @@ +Title: Why I Switched Back to Firefox from Qutebrowser +Author: Jake Bauer +Date: 2019-06-20 +Summary: I've been using qutebrowser for about six months now but I found it really wasn't meeting my needs. In this post I explain the reasons why I switched back to using Firefox. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I've been using qutebrowser for about six months now as my primary browser after +switching to it from GNU/IceCat seeking a browsing experience with solid +vim-like controls. At first, I enjoyed the simplicity and shortcuts afforded by +qutebrowser but noticed more and more issues as time went on. Qutebrowser, while +very usable as a browser, falls short in some key areas that are important to +me. + +Privacy online is something that is very important to me and should be important +to everyone who uses the internet. It's one of the reasons I donate to the +<a href="">Electronic Frontier Foundation</a> and probably +the biggest reason I switched back to Firefox from qutebrowser. Although there +are limited things you can do in qutebrowser to block some trackers such as +changing your user agent string, it is still quite limited compared to Firefox. +You have to launch qutebrowser with a command line flag just to disable reading +from the HTML canvas and there isn't even an option to disable WebRTC. This is +in stark contrast to Firefox which—even ignoring the capabilities of extensions +such as <a href="">Privacy Badger</a> +and <a href="">uBlock Origin</a>—allows +you to enable privacy features like fingerprinting resistance and disable +potentially bad features like WebRTC from within the built-in configuration +window. + +Another big factor is that some sites which I would use would have elements that +wouldn't load or work properly in qutebrowser and I would have to switch over to +Firefox to use them. For example, I run a Proxmox virtualization host on my +server and any time I tried view my virtual machines using noVNC or Spice, the +screens would be black and it wouldn't work. Another issue happens when websites +update search suggestions live as you type. With the way some websites would do +this, I would get kicked out of insert mode in the middle of typing which would +usually result in the tab suddenly closing or me activating something I didn't +intend to activate since I was booted back to normal mode. This made for a very +frustrating browsing experience on those websites. This specific point isn't so +much a fault with qutebrowser and more a fault with some modern websites but, +alas, it made using Firefox feel that much smoother and better. + +I also found Firefox much easier to develop on compared to qutebrowser. It could +be because I'm just not used to the Chromium-family set of web development tools +but I find Firefox's set much more intuitive and the easy-to-use live stylesheet +editor makes it really easy for me to experiment with what my web pages look +like right in the browser. Plus I found the network-related tools easier to +understand and navigate in Firefox than in qutebrowser. + +Those are the big three reasons why I switched back to Firefox but I did have +some other very minor problems which, when put all together, pushed me over the +edge to switch. The first of which is that, since I use KeePassXC as my password +manager, the extension available for Firefox makes it much more convenient to +enter my credentials instead of having to copy-paste. The second is that Firefox +is using the Gecko web rendering engine which I feel better about using due to +Mozilla's commitment to a free and open web. The last minor reason for making me +switch is that Firefox has multiple extensions which enable vim-like controls. +Although these can't be as full-featured as a browser designed around those +controls, I have found the one I am using—<a +href="">Vim +Vixen</a>—to be good enough for my uses. + +Overall, qutebrowser still is a commendable browser and, if the reasons I listed +above don't really concern you that much, I would recommend checking it out. +Unfortunately it didn't fit well with what I wanted out of a browser and that's +why I switched from qutebrowser to Firefox. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,60 @@ +Title: Refining My NeoMutt Configuration +Author: Jake Bauer +Date: 2020-05-05 +Summary: Over the past few days I have been tinkering and tweaking with my NeoMutt configuration to make my experience just a little bit better. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<figure> + <a href="/img/neomutt.png"><img src="/img/neomutt-thumb.png"/></a> + <figcaption>Screenshot of NeoMutt on my system.</figcaption> +</figure> + +I use NeoMutt as my email client. It's fast, treats `text/plain` email as a +first-class citizen, and is terminal based so I can use it with vim keybindings. +The configuration, though, is really complex and there's a lot that can be +played with. Over the past few days, I've been tinkering and tweaking with it to +make my email experience on the command line just a little bit better. + +One thing that I found annoying were `text/html` emails which relied so much on +image content they had to be viewed in their HTML form. I used to save the body +of these emails and then open them up in Firefox, but just by adding + +```bash +text/html; $BROWSER %s; +``` + +to my `mailcap` file, I am able to open these bodies in Firefox from within +NeoMutt. + +Another thing I found cumbersome was the handling of contacts through an aliases +file. Instead, I opted to install and use `abook` which is a contact program, +used on the command line, designed for use with mutt. This should make storing +and referring to my contacts easier than it used to be. The options that I used +in my `neomuttrc` are: + +```bash +set query_command="abook --mutt-query '%s'" +macro index,pager a \ + "<pipe-message>abook --add-email-quiet<return>" \ + "Add this sender to abook" +bind editor <Tab> complete-query +``` + +Some other minor changes include: + +* Moving the colour configuration into its own file so that the main `neomuttrc` + file is less cluttered. +* Changing the date format to the ISO standard YYYY-MM-DD with time now in the + 24h clock. +* Cleaning up unused keybindings +* Moving my signature from my `~/docs` folder into `~/.config/neomutt` so that + it can be tracked with git. + +Don't hesitate to share suggestions or comments! + +_This is my eleventh post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,24 @@ +Title: sbs - A Simple Blogging System +Author: Jake Bauer +Date: 2022-02-14 +Summary: Blank +Draft: true + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +- old script handled uploading of files, image optimization and resizing, css + minification -> too much and too many external dependencies +- old script was very hacky, very messy, and very fragile +- old script didn't handle atom feed creation, needed second very ugly publish + script to handle that and it did append-only so I had to manually edit +- had config in the shell script, not friendly for others to use +- new script only depends on lowdown and a POSIX environment, lets user choose + to use whatever they want to get files on remote server, minify css, optimize + images, etc +- new script also handles atom feed creation allowing more flexible updates and + cleaner output +- new script uses sensible MultiMarkdown Metadata format unlike the hacky + markdown comment way I was doing before (can now use the metadata in the post + itself diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,84 @@ +Title: Self-Hosting Email +Author: Jake Bauer +Date: 2020-05-16 +Summary: My experience starting to self-host email using OpenBSD, OpenSMTPD, Dovecot, and Rspamd. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I just finished setting up self-hosted email and it was the easiest thing ever. + +As I discussed in my [previous blog post](/blog/preparing-to-self-host-email), I +set up a VPS with Vultr running OpenBSD. Following this [guide from one of the +developers of +OpenSMTPD]( +, I was able to get the server up and running in less than two hours while +understanding every step and every configuration option along the way. None of +it felt like the black magic that it was made out to be by many on the Internet. + +To test the setup, I created the email address `` and set up +Thunderbird. I tested sending and receiving emails and checked, using Wireshark, +that my mail was being correctly encrypted with the TLS certificates I +configured: + +<figure> + <a href="/img/double-desktop-email.png"><img + src="/img/double-desktop-email-thumb.png" alt="A screenshot of both of my + monitors with Neomutt, Thunderbird, Wireshark, SSH, and Firefox with Vultr + open while testing if email is working."/></a> +</figure> + +I also used []( to test that my mail server +and DNS records were correctly configured. This service was invaluable since I +can't test port 25 connectivity to the mail server from my residential +connection. + +<figure> + <a href="/img/mx-toolbox-results.png"><img + src="/img/mx-toolbox-results-thumb.png" alt="A screenshot of MX ToolBox + results with all green checkmarks."/></a> +</figure> + +As of yet, I haven't had much trouble getting my email delivered to the +addresses controlled by the Big Mail Corporations which was what I was most +worried about and which is an often-cited factor many use to advocate against +self-hosting email. So far, I've confirmed that both Gmail and ProtonMail +deliver my mail. Microsoft's Office 365 marked my IP as being spam—which is +understandable since it's a brand new mail server on a previously-unused +domain—but not only did they notify me that I was put on their spam list, they +offered a really easy way to remove my IP from the list: + +<figure> + <a href="/img/office-365-spam.png"><img src="/img/office-365-spam-thumb.png" + alt="A screenshot of the Office 365 Anti-Spam Delist Portal showing all + green checkmarks."/></a> +</figure> + +I didn't bother setting up virtual mail accounts because it will just be me +using this mail server. If there are additional addresses I need to add, I can +just add them to the `/etc/mail/aliases` file. If you want to set up your own +mail server and wish to use virtual mail accounts, [this tutorial from +Vultr]( +discusses that. + +Some more things that I have to look into doing are setting up a backup mail +server in the case that mine experiences downtime, and setting up Rspamd +training using Dovecot as suggested at the end of the guide which I followed. +This whole experiment has also given me the opportunity to experience +administration of an OpenBSD system, which I'm enjoying so far. The manpages +have been excellent and the system is laid out in a really straightforward way. +There are a few things that I need to learn and get used to such as `pf` instead +of `nftables` for packet filtering, `rcctl` instead of `systemctl` for managing +services, and other little things that are OpenBSD-specific. + +Now that I've done it, I can heartily recommend giving self-hosted email a shot. +It's nowhere near as difficult and scary as it's made out to be and it rewards +one with control over one's email data and infrastructure. I don't see how +hosting an email server will be any different than something like a Web server +or Matrix server in terms of workload given that all one has to do once it's set +up is standard system administration tasks. + +_This is my twenty-first post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,53 @@ +Title: Setting Up a Gopher Site +Author: Jake Bauer +Date: 2020-05-12 +Summary: Detailing the simple process of setting up a Gopher server and accessing Gopher sites over the Internet. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<figure> + <a href="/img/paritybit-gopher-lynx.png"><img + src="/img/paritybit-gopher-lynx-thumb.png" alt="A screenshot of the Lynx web + browser on the Gopher homepage."/></a> +</figure> + +<p class="note">I no longer run a Gopher site, but I'm leaving this post up +because I think it might be of some use to someone who is looking to do so.</p> + +Today I made my website available over the <a +href="">Gopher protocol</a>! You +can now access at [gopher://](gopher:// +with a Gopher-capable browser. To view Gopher sites (commonly referred to as +Gopher holes), I recommend using Lynx (Gopher is entirely text anyways) or a +browser extension from the [Overbite +Project]( + +It was very quick and easy to set up my Gopher hole. All I had to do was set up +a Gopher server and place files in the directory where it looks to serve them. + +For my Gopher server, I chose [Gophernicus]( +because it's actively maintained and has no dependencies. Many people on the +Internet choose to use [pygopherd]( but +that relies on Python 2 which was officially deprecated earlier this year. + +It was really easy to install Gophernicus thanks to the excellent documentation. +All I had to do was install `build-essential`, `debhelper`, and `libwrap0-dev` +(the last one is optional), and then run `make deb` followed by `sudo apt +install ../gophernicus_<version>.deb`. I edited the `/etc/default/gophernicus` +config file and added the `-nx -nt -nq -no -nl -nu` options (see the README for +what they do). + +At the moment, I just have a homepage set up which links to some of my recent +blog posts. I will need to find an easier way to convert an HTML/Markdown +document to Gopher-compatible syntax (if possible) so that I don't have to do a +bunch of conversion by hand. Ideally, I would like to mirror this website over +Gopher as much as possible. + +Gopher is refreshingly simple. If you're willing and able, give setting up a +Gopher hole a shot! + +_This is my eighteenth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,95 @@ +Title: Switching to cgit +Author: Jake Bauer +Date: 2020-07-05 +Summary: I got tired of gitea's slowness and I didn't use its features anyways so I took the time this past weekend to swtich over to cgit. I also made a few modifications along the way. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I've been using Gitea for almost six months as my self-hosted git server. In +that time it has served its purpose and done well, but it's fallen into the same +traps as other platforms like GitHub and GitLab. That is to say, Gitea feels +very slow to use and I don't have any need for the plethora of features it +offers. + +## What I Didn't Like About Gitea + +Regarding this first point. A typical page on Gitea took at least a second to +load, if not longer, and usually weighed between 2 and 3 megabytes. I didn't do +any rigorous testing of large diffs or anything like that, I just loaded up the +front page and my profile page. Compared to cgit, which takes milliseconds to +load and has page sizes comparable to my website (10-20 kilobytes), Gitea feels +agonizingly slow to use just like GitHub and GitLab. + +Regarding the features, Gitea comes with things like built-in repo wikis, CI/CD, +social features similar to GitHub, a system for multiple user accounts, and +more. I used none of these features; I basically just used Gitea to host my +repositories and I dislike the pull request development model anyways. + +## Setting up cgit + +When I did my [comparison of self-hosted git +services](/blog/choosing-a-self-hosted-git-service), +cgit caught my attention as being light but not as light as something like +Gitweb such that it still has some useful views and features. cgit isn't a +software forge, only allowing viewing repositories and downloading files, but it +has all I need out of a self-hosted git solution. + +Setting up cgit was fairly straightforward. I just followed the [Arch wiki +tutorial on setting up cgit]( to set +up nginx with fastcgi, python-pygments for syntax highlighting source code, and +I read the cgitrc(5) manpage to flesh out the rest of my `/etc/cgitrc` config +file. + +Switching over was really easy too. I just copied the repositories that already +existed on the server to a new location (I chose `/srv/git`) and then switched my +reverse proxy to point to the new git server's port instead of Gitea's port. +Following that, I just decommissioned Gitea by stopping the server and deleting +any trace of it off of my system. + +## Improving cgit + +One thing that I wanted to try doing to cgit was adding a dark theme that would +be activated by a CSS `@media` query. Unfortunately, I found the cgit CSS file +to be a huge mess of mixing colour names and hex codes with no use of CSS +variables so it would be an absolute pain to change things. No disrespect to the +developer though, I have a feeling that it's because the file has been growing +over time as features have been added and it doesn't get a lot of development +time. + +What I did to improve it was to go through the whole file, collect all the +colours that were being used, and consolidate and turn the colours into CSS +variables that could be re-used throughout the file. If you were following some +of my toots on Mastodon, I posted about how some 7 slightly different shades of +grey were being used which I pared down to 4. I also turned the font-size and +logo-width into CSS variables so they would be easier to change from the top of +the file. I have yet to design a good dark theme (this will take some time to +ensure it's completely accessible), but I feel like the CSS will be a lot easier +to work with now. + +I did also make some other improvements throughout the CSS. For example, I set +my base font-size to `100%` instead of the ridiculously tiny `10pt`, I added +underlining to all links in tables (because previously you had to hover over +them with your mouse to distinguish a link from just plain text), and I improved +some colours to ensure that there were no contrast issues. I also used the +`borland` theme in python-pygments because it had no contrast issues against the +white background unlike `default`. + +## Conclusion + +I'm still working on cleaning and organizing my project repositories, but I feel +the interface of cgit is a lot smoother and easier to work with than Gitea. All +of the development will be done through the command line and through email +patches which I prefer and I don't have to feel bad about hosting really +bloated, JavaScript-heavy webpages. + +I'm not quite sure if I'll be able to get a dark theme working, but I have made +all of my customizations and settings available in its own repository for others +to look at. Here is the [sourcehut +repository]( and here is [the repository +on my git server](// + +_This is my sixty-first post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,113 @@ +Title: The Diefenbunker Museum +Author: Jake Bauer +Date: 2020-05-03 +Summary: A few months ago, I visited the Diefenbunker museum located in Carp, Ottawa, Canada. It's a Cold War era bunker, abandoned in 1994, that has been undergoing restoration and conversion into a museum by a small... + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +A few months ago, I visited the [Diefenbunker +museum](,_Canada's_Cold_War_Museum) +located in Carp, Ottawa, Canada. It's a Cold War era bunker, abandoned in 1994, +that has been undergoing restoration and conversion into a museum by a small +group of staff and volunteers. It was originally designed to hold hundreds of +the country's top civil servants, military personnel, and politicians in the +event of an imminent nuclear attack on Canada so that the country could continue +functioning after nuclear devastation. + +So much cool history is preserved in this museum including old teletypewriters, +computing equipment, clothing, medical equipment, operating procedures, and +exhibits about Canada's involvement in the Cold War. I try to experience things +with my own eyes rather than through a camera lens so I didn't take many +photographs, but I did manage to take a few that showcase some of the really +interesting things to see: + +<figure> + <a href="/img/diefen/situation-room.jpg"><img + src="/img/diefen/thumbnails/situation-room.jpg"/></a> + <figcaption>The situation room where responses would be co-ordinated.</figcaption> +</figure> +<figure> + <a href="/img/diefen/vintage-computer.jpg"><img + src="/img/diefen/thumbnails/vintage-computer.jpg"/></a> + <figcaption>A vintage computer in the situation room.</figcaption> +</figure> +<figure> + <a href="/img/diefen/conference-room.jpg"><img + src="/img/diefen/thumbnails/conference-room.jpg"/></a> + <figcaption>The room where senior government officials would meet to run + the emergency government.</figcaption> +</figure> +<figure> + <a href="/img/diefen/operating-theatre.jpg"><img + src="/img/diefen/thumbnails/operating-theatre.jpg"/></a> + <figcaption>The operating theatre in the bunker's medical wing.</figcaption> +</figure> +<figure> + <a href="/img/diefen/cafeteria-store.jpg"><img + src="/img/diefen/thumbnails/cafeteria-store.jpg"/></a> + <figcaption>The store in the bunker's mess hall.</figcaption> +</figure> +<figure> + <a href="/img/diefen/comms-room.jpg"><img + src="/img/diefen/thumbnails/comms-room.jpg"/></a> + <figcaption>The communications room.</figcaption> +</figure> +<figure> + <a href="/img/diefen/comms-rack.jpg"><img + src="/img/diefen/thumbnails/comms-rack.jpg"/></a> + <figcaption>Several racks full of communications equipment.</figcaption> +</figure> +<figure> + <a href="/img/diefen/workshop.jpg"><img + src="/img/diefen/thumbnails/workshop.jpg"/></a> + <figcaption>A workshop.</figcaption> +</figure> +<figure> + <a href="/img/diefen/mainframes.jpg"><img + src="/img/diefen/thumbnails/mainframes.jpg"/></a> + <figcaption>A number of vintage computing equipment including minicomputers, + tape machines, and a mainframe just off to the right.</figcaption> +</figure> +<figure> + <a href="/img/diefen/computers.jpg"><img + src="/img/diefen/thumbnails/computers.jpg"/></a> + <figcaption>Lots of vintage computing equipment including what I presume are + a couple of minicomputers.</figcaption> +</figure> +<figure> + <a href="/img/diefen/oscilloscope.jpg"><img + src="/img/diefen/thumbnails/oscilloscope.jpg"/></a> + <figcaption>An old Tektronix Type 545B Oscilloscope, presumably used in + maintaining the computing equipment.</figcaption> +</figure> +<figure> + <a href="/img/diefen/tape-rack.jpg"><img + src="/img/diefen/thumbnails/tape-rack.jpg"/></a> + <figcaption>A set of old-tapes and a cabinet labelled "Admin Tape + Container"</figcaption> +</figure> +<figure> + <a href="/img/diefen/hard-disk-platter.jpg"><img + src="/img/diefen/thumbnails/hard-disk-platter.jpg"/></a> + <figcaption>A platter from a vintage hard disk and an old RAM + card.</figcaption> +</figure> + +The photographs here don't even cover 10% of what the museum has to offer. There +are other exhibits like the Bank of Canada gold bullion vault, the rooms +dedicated to the various departments of the Government of Canada, living +quarters, and more that I didn't capture. Many of the exhibits can also be +interacted with in one way or another. One can try typing on a typewriter or +teletypewriter, pick up and examine many of the old items, or read a book from +the time sitting on a shelf. + +I highly recommend that you visit this museum if you ever find yourself in +Ottawa. If you can, go on a guided tour first then explore the museum on your +own afterwards; one can easily spend an entire day exploring all the museum has +to offer. + +_This is my ninth post for the #100DaysToOffload challenge. You can learn more +about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,37 @@ +Title: The Disappearance of _One_ +Author: Jake Bauer +Date: 2020-05-02 +Summary: One is a word that used to be quite popular in formal speech but has since fallen to the wayside in favour of the less specific and more casual you. This is not a good change for English. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +_One_ is a word that used to be quite popular but has since fallen to the +wayside in favour of the less specific and more casual _you_. _One_ is a +gender-neutral, indefinite pronoun that is used to refer to the general concept +of _a person_. For example, one would say, "One goes down to the shop," instead +of, "You go down to the shop," when they mean, "In general, a person goes down to +the shop," as opposed to specifically, "_You_ go down to the shop." + +There is great value to be found in the use of this word. Without it, the lines +of meaning become blurred regarding whether an author is referring to you, the +reader, or just speaking generally. Usually, this can be easily inferred from +context, but I have seen misunderstandings caused by the use of the word _you_ +in the place of the word _one_ where someone thought another person was +commenting on their actions when, in reality, the other person was speaking +generally. These misunderstandings could be easily avoided by using _one_ +instead of the less-specific _you_. + +It's a shame that this word is falling out of general use and has become +relegated to more formal writing and speaking. As hopeless as it may be to fight +against the unrelenting force of language evolution, it's a valuable word that I +will try to keep using where appropriate because I don't want to see its meaning +lost. + +If you want to learn more about the usage of _one_, see <a +href="">Wikipedia: One_(pronoun)</a>. + +_This is my eighth post for the #100DaysToOffload challenge. You can learn more +about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,52 @@ +Title: The Hacker Quarterly Magazine +Author: Jake Bauer +Date: 2020-08-14 +Summary: My first issue of 2600's The Hacker Quarterly arrived in the mail recently. Here are my thoughts about it. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +A while back I asked others if they had any recommendations for physical +magazines that I could subscribe to with a focus on computing and technology +(though not your standard Wired magazine or anything like that). I was looking +for a magazine reminiscent of the kinds of magazines which were available in the +early days of computing; when these magazines were the only way for many to +discover new programs and computer hacking ideas. + +I was pointed to []( where I could buy a magazine +called _The Hacker Quarterly_. It's a magazine sent out 4 times a year and the +subscription cost for one year is $26.00 USD. That's honestly not that much +given the fact that it's a physical magazine and there's a lot of work that goes +into putting magazines like that together. So, I signed up for a one year +subscription as a trial and I got my first edition (this year's Spring edition) +in the mail yesterday. + +<figure> + <a href="/img/hacker-quarterly.jpg"><img src="/img/hacker-quarterly-thumb.jpg"/></a> + <figcaption>The front cover of the Spring 2020 edition.</figcaption> +</figure> + +The magazine was filled front to back with interesting articles and tidbits of +hacker culture. The main articles in this edition seemed to focus heavily around +social media and digital privacy which was expected given the front cover. There +was also a section containing responses from the 2600 folk to messages fans sent +in, a marketplace section, a meetups section, and more. + +One of the articles that stood out to me was an article entitled "Has Your +Password Been Pwned?" which discussed submitting your passwords to Troy Hunt's +[]( service to check if they've +been included in any breaches. In this article was a small shell script which +allows you to pass in a password, submit it to the service securely, and check +if your password had been pwned. How many physical publications do you see +nowadays with code written in them? + +This magazine is one of the few remaining physical hacker/computer magazines +from the days of old. There's something... humanizing about reading a physical +magazine over consuming everything through digital publications. It's definitely +worth checking out if you're into hacker culture (if you're reading this blog +post now, you'd probably be interested in it). + +_This is my ninety-fourth post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,93 @@ +Title: The Joys of Old Tech +Author: Jake Bauer +Date: 2020-05-07 +Summary: There's something magical about using old technology. Be it an old, grinding hard disk, a floppy disk with a maximum capacity of 1.44MB, or a CRT monitor with a maximum resolution of 1024x768. Unrivalled in their simplicity, unchallenged in their whirs and clunks, there is an unmistakable allure of the tech of days gone by. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<figure> + <a href="/img/floppy.jpg"><img src="/img/floppy-thumb.jpg" alt="A 3.5 inch + floppy disk, lying against a rock on a table. Text on the disk reads: + Grand&Toy IBM Formatted 2HD."/></a> +</figure> + +There's something magical about using old technology. Be it an old, grinding +hard disk, a floppy disk with a maximum capacity of 1.44MB, or a CRT monitor +with a maximum resolution of 1024x768. Unrivalled in their simplicity, +unchallenged in their whirs and clunks, there is an unmistakable allure of the +tech of days gone by. Just listen to [these sounds of an IBM PC +AT](, hard at work. + +Of course, it wasn't all sunshine and rainbows. Much of the tech from past +decades was actually confusing and difficult to use at times. Remember having to +manually set IRQs? What about needing to manually configure X, and having your +CRT emit some of its magic smoke in the process? Or, how about needing to +terminate your SCSI bus, lest you have weird errors? + +Nevertheless, the satisfying clunk of the power switch on the back of your +computer, the whine of your monitor turning on, and the sound of your floppy +drive initializing as you sit down, ready to get stuck in for the night +programming whatever latest hack you were working on, come together to create an +inexplicable feeling sorely missed in the age of instant boot-up times and +quiet, solid state storage. Perhaps it's just childhood nostalgia. + +Technology, in recent years, has become faster, easier to use, prettier, and +more affordable. These advancements, however, came at the cost of simplicity, +understanding the machine and protocols which one uses, and a deeper connection +and feeling of control over one's system. Given the way that technology has +evolved in the past 30 years, it's definitely easy to see why some would long +for "the good old days". + +I think the majority of people who work with computers can agree that, on the +whole, the advancements have been good for society. People have quicker and +easier access to information, it's easier to expose the wrong and celebrate the +right in society, and it has enabled whole new disciplines of science. The +problem is that this has come at the cost of the internet being controlled by +mega-corporations, protocols and specifications becoming bloated and hard to +understand, and many people becoming locked into ecosystems controlled by +whoever sold them their hardware or software; not to mention the myriad ways +technology is being used to oppress. + +The specifications defining everything one would need to know and understand for +developing a web browser [is 114 million +words]( and the +specifications for modern technologies such as +[UEFI]( +are orders of magnitude larger and more complex than those for a simple BIOS, +designed for basic hardware control and booting. Making new software for these +systems is incredibly difficult, if not impossible, and it usually requires +either months, if not years, of work, a dedicated team of engineers and millions +of dollars. + +Gone are the days when one could open up the 300 page manual which came in the +box with their microcomputer, turn to the page about making shapes appear on a +screen with BASIC, and program a productivity application in a single weekend. +Gone also, are the days of being able to fit a homework assignment on a floppy +disk, let alone an entire operating system. + +Despite all this doom and gloom, there is a small subset of programmers and +scientists creating software like the [Plan9 operating +system]( or [SourceHut]( designed to +bring simplicity and understandability back to the way we use our computers. +Many people still use such programs as the [Lynx web +browser]( and such protocols as +[IRC]( and <a +href="">Gopher</a> simply because +of how comfortable, calming, and simple they are compared to the alternatives. +In fact, Gopher has actually seen a <a +href="">increase in +usage</a> over the past few years. + +There is so much value in the simple, the plain, and the understandable that has +been lost in the rush to make systems more capable, larger, faster, and smarter. +Despite its own set of drawbacks, old technology is such a joy to use because it +has been kept unspoiled by the complexities of modern computing. One can only +hope that the industry as a whole will realize the harm that complicated systems +inevitably bring and return to making software and hardware which is capable +still, yet simple and understandable. + +_This is my twelfth post for the #100DaysToOffload challenge. You can learn more +about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,75 @@ +Title: Toggling Between Indentation Styles in Vim +Author: Jake Bauer +Date: 2020-06-02 +Summary: I've encountered both spaces and tabs used for indentation in my programming career so I wrote a custom VimScript function to toggle between indenting with tabs and spaces. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Indentation style, much like which editor is superior, is a topic that is +constantly bickered about on the Internet to no end. Usually programmers are +either on the side of indenting with spaces (and typically with 4 spaces), or +indenting with tabs. Relatively few are in the camp of indenting with both +spaces and tabs, though this is still common in certain programming circles. + +I typically use 4 spaces of indentation because that's what I learned to use +from using Python as my first language. It wasn't until a couple years later +when I encountered Makefile's strict reliance on tab characters and the argument +of spaces versus tabs for indentation. I didn't see any really convincing +arguments to switch from using spaces, my peers were using spaces, and spaces +also helped me to line things up in languages like Scheme so I saw no real +reason to change. + +I have, however, recently encountered quite a few projects which use tabs and +have noticed many system configuration files using tabs instead of spaces for +indentation. When contributing to other projects, it's essential to match the +style of the pre-existing code and when editing those system configuration files +I wanted to be consistent with the existing style so I needed a quick way to +toggle between indentation styles. + +Since I use Vim, basically any possible indentation configuration is supported. +It's also easy to set up a keybind to toggle between indentation styles by +writing a function into my `vimrc`. I came up with the following VimScript to +switch between indentation styles: + +```vim +" Toggle between 4 spaces and pure tab indentation styles +func! ToggleIndentStyle() + if &expandtab == 1 + set noexpandtab + set softtabstop& + set shiftwidth& + echom "Switched to: Indent with tabs." + else + set expandtab + set softtabstop=4 + set shiftwidth=4 + echom "Switched to: Indent with 4 spaces." + endif +endfu +noremap <C-_> :call ToggleIndentStyle()<CR> +``` + +Indenting with tabs is the default in Vim, so all I need to do to switch to +indenting with tabs is to unset my settings for `softtabstop` and `shiftwidth` +as well as unset `expandtab` so that Vim won't expand my Tab keypresses into +space characters. To switch back to spaces, I revert to my normal settings. + +I chose the `Ctrl`+`_` keybinding because it was free and the underscore is +reminiscent of a "space" character so it would be easy to remember. + +Honestly, I do not strongly lean one way or the other in the indentation camp. +For some languages, such as Common Lisp, using spaces for indentation also +allows consistent alignment without mixing spaces and tabs. For other languages, +either spaces or tabs are required by the language's style guides like Python or +Go respectively. For most languages, though, it makes no difference. + +I have heard murmurings of tabs being better for accessibility, but I've never +seen this claim backed up with hard evidence (I have seen anecdotal evidence for +both sides). If you have compelling arguments for one style over another, I'd +like to hear them. + +_This is my thirty-sixth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,59 @@ +Title: Two of the Most Valuable Lessons I've Learned +Author: Jake Bauer +Date: 2020-05-23 +Summary: Inspired by Criag Maloney's recent book release, I discuss two of the most valuable lessons I've learned. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +This post is inspired by Craig Maloney's recently released book _[The Mediocre +Programmer]( I haven't yet read the book, +but I read [the +synopsis]( +and it got me thinking about these two lessons which I've learned since becoming +a massive computer nerd: + +1. Given enough dedication, time, and effort, one can learn, become skilled at, + and eventually master any skill they wish. + +2. Impostor syndrome can be a good thing; learn to recognize and embrace it. + +I feel that both of the above lessons go hand-in-hand; one realization naturally +leads to the other. The first lesson is something I struggled with early on +during my time as a university student and something I constantly have to keep +in mind whenever I encounter a new technology, programming language, or concept. +It's impossible for someone to be good at something with only a few hours of +study and practice yet this seems to be an expectation many of us have, myself +included. We shouldn't feel bad about our lack of skill with something new after +only being briefly exposed to it. + +Learning this lesson was one of the best things to happen to me because it made +me realize that, although something may seem overwhelming at first, if I break +it down into bits and take my time practicing and learning, I will be able to +learn and eventually get good at it. Many things stopped feeling overwhelming +after I learned this and if I encounter something new, I know it's all just a +matter of putting in the time and practise before I learn it. + +Regarding the second lesson, for those who don't know, [Impostor +syndrome]( is a syndrome in +which one feels like they are not really as knowledgeable or skilled as their +peers. It typically manifests itself as the feeling that they are faking their +credentials or level of skill and tricking others into thinking they are smarter +or better at something than they actually are. It's a common condition among +many in the tech industry where there is an unimaginable breadth of concepts, +skills, and technologies one is expected to learn. + +Although I won't say I have been afflicted by this syndrome to its fullest +extent, I have definitely experienced thoughts similar to those that are common +in someone with Impostor Syndrome. I have, however, come to realize that these +feelings can be used to positive effect with the realization that when I'm +feeling this way, it means that I've surrounded myself with people smarter and +more experienced than I, which I can take as an opportunity to learn and improve +my skills. I've turned the feelings of inadequacy and self-doubt into feeling +that, although I may be an amateur or completely inexperienced with something, I +can take this opportunity to better myself. + +_This is my twenty-seventh post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,95 @@ +Title: Switching from urxvt to st +Author: Jake Bauer +Date: 2020-02-14 +Summary: It's really important for me to have a terminal application that performs well, feels good to use, and has every feature that I need. Unfortunately, since I started using urxvt about a year ago now, I've slowly begun to notice things missing or not working quite right. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I spend most of my time working in the terminal. Whether it's email with +Neomutt, music with ncmpcpp, programming with Neovim, or administrating my +systems, I feel the most comfortable and in control when using the terminal. +That's why it's really important for me to have a terminal application that +performs well, feels good to use, and has every feature that I need without me +noticing that something isn't working or doesn't look quite right. + +Unfortunately, since I started using urxvt about a year ago now, I've slowly +begun to notice things missing or not working quite right. For example, despite +being called "rxvt-unicode-256color", urxvt doesn't really handle unicode +characters that well. Take a look at the example below: + +<figure> + <a href="/img/urxvt-vim.png"><img src="/img/urxvt-vim.png" alt="A screenshot of neovim + in urxvt showing the statusline with two boxes where unicode characters + should be."/></a> +</figure> + +This was really noticeable and, even though those unicode characters aren't +super important, it would still annoy me when I saw boxes where characters +should be. This was even worse when I was browsing the Internet using lynx in +urxvt (this page is the [W3 Schools HTML5 Symbols +Reference]( + +<figure> + <a href="/img/urxvt-lynx.png"><img src="/img/urxvt-lynx-thumb.png" alt="A screenshot + of lynx in urxvt on an HTML5 symbols reference page showing boxes where + unicode symbols should be."/></a> +</figure> + +Not to mention, urxvt doesn't have truecolour support which, while not super +important to me, is definitely a bonus in st's favour. The screenshot below +shows urxvt's output for [this truecolour test]( + +<figure> + <a href="/img/urxvt-tc.png"><img src="/img/urxvt-tc.png" alt="A screenshot of urxvt's + output when tested for truecolour support where there isn't a smooth colour + gradient and many characters don't look right."/></a> +</figure> + +I heard about st from other people on the Internet and from videos that I came +across on Youtube and it intrigued me because of Suckless' (the creators of st) +unique philosophy regarding software development. I also gave some other +terminals a try (kitty, konsole, xfce4-terminal) but either found them to need +far too many dependencies, have far too many unnecessary features, or take far +too long to load so I decided to give st a shot. + +Once I got done configuring it and patching it with the couple additions that I +wanted (a scrollback buffer and the ability to copy URLs so that I could open +them in my browser), I compiled it and started playing around with it. +Immediately I noticed that it felt just as fast as urxvt, it used less +RAM (something like 10-15M per window instead of 20-25M), and, when testing +side-by-side with urxvt, I would sometimes forget which terminal was which +because st looked and felt just like urxvt. It was essentially a drop-in +replacement even for the scripts that I have which launched applications using +urxvt. + +But, of course, I was really after better unicode and truecolour support. St +delivered perfectly despite only being told to use my regular font (fallback +fonts aren't supported in st without a patch). Have a look: + +<figure> + <a href="/img/st-vim.png"><img src="/img/st-vim.png" alt="A screenshot of neovim in st + showing the statusline with the correct characters displayed."/></a> +</figure> + +<figure> + <a href="/img/st-lynx.png"><img src="/img/st-lynx-thumb.png" alt="A screenshot of lynx + in st on an HTML5 symbols reference page showing the right unicode + symbols."/></a> +</figure> + +<figure> + <a href="/img/st-tc.png"><img src="/img/st-tc.png" alt="A screenshot of st's output + when tested for truecolour support where there is the expected smooth colour + gradient."/></a> +</figure> + +I am very happy with st and I don't at all mind the fact that I have to +re-compile it when I want to make changes or if a new version is released. It +feels like a personal build of the software tailored to my needs without +anything else that I don't need or don't want. + +If you want to try out st, follow this link to the [st +website]( You can view my build of st in [my dotfiles +repository]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,62 @@ +Title: Use Syncthing to Sync Things +Author: Jake Bauer +Date: 2020-06-26 +Summary: During this round of reinstalling the operating systems on all of my computers, I wanted a more convenient way to transfer and share files between them. I chose Syncthing and have been loving it. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +During this round of reinstalling the operating systems on all of my computers, +I wanted a more convenient way to transfer and share files between them. +Previously, I would transfer things like my KeepassXC databases using a USB +stick which was cumbersome. I also didn't want something like a NAS because I +don't want having a network connection to be a requirement to access my files. +That left me with the option of using some kind of synchronization application +where I'd have the files on every computer I own and they would be kept +constantly in sync with each other. + +I chose to use [Syncthing](, a program designed for the +sole purpose of synchronizing files and folders between computers. It's somewhat +comparable to Dropbox, just way, way better and not proprietary, commercial +garbage. All that is needed to get Syncthing to work is to install the client +application on two or more computers and to connect the computers by entering +their IDs into each other and telling them where the other computer can be +found. + +Let me re-iterate: No complicated server setup, no account creation, no +interaction with an external service; just install a client, run through some +simple configuration, and that's it. + +<figure> + <a href="/img/syncthing-dashboard.png"><img + src="/img/syncthing-dashboard-thumb.png"/></a> <figcaption>The Syncthing + dashboard on one of my computers.</figcaption> +</figure> + +I entered my desktop's ID into my laptop and vice-versa. I told both computers +to find each other at `https://<hostname>` (hooray for +internal DNS), and off they went synchronizing the ~13.5 GiB I wanted to share. +Now I have a copy of all of my important data including music, PDFs, +screenshots, Newsboat database, KeepassXC databases, and more on both computers. +As long as they're both on and awake at the same time, they'll keep in sync with +each other and I don't have to worry about manually syncing my files. + +If I wanted something analogous to Dropbox with its ability to synchronize using +the Internet, I could set up a server running the Syncthing client which +operates with access to the Internet that my computers would synchronize with. +As far as Syncthing is concerned, there's nothing special about this client; it +would just be another computer synchronizing files. Another option would be to +set up a relay server so the computers can find each other behind NAT setups and +such. The downside to the relay server is that it's definitely slower than the +direct connection by IP/FQDN. Besides, syncing over the LAN is good enough for +me. + +Syncthing is probably the most painless experience I've had synchronizing files +between my devices. As Nikita said in his [blog post about +Syncthing](, "It brings the joy of use and +makes you believe the collapse of civilization can be slowed down a bit." + +_This is my fifty-fifth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,48 @@ +Title: Using the "rm" Command with Trash +Author: Jake Bauer +Date: 2020-07-13 +Summary: A quick hack to get a Trash bin with the rm command. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Those who use regular file browsers like Nautilus, Dolphin, or Thunar are used +to having an item go into the Trash folder (or "Recycle Bin" for Windows folks) +when it is deleted. This allows them to restore that file in the case that they +accidentally deleted it. However, on the command line the `rm` command will +irreversibly delete a file from your system (short of using data recovery +techniques) and has no concept of a Trash folder. This is a simple hacky way +to make `rm` remove a file to the Trash folder first so that you can prevent +yourself from accidentally irreversibly deleting something really important. + +## POSIX, Bash and Bash-like, Fish, and Korn Shells + +```bash +alias rm='mv -t $XDG_DATA_HOME/Trash/' +alias rm!='\rm' +``` + +## C Shell (csh) and TENEX C Shell (tcsh) + +```bash +alias rm 'mv -t $XDG_DATA_HOME/Trash/' +alias rm! '\rm' +``` + +## Explanation + +The aliases above do the following: + +* Alias `rm` to `mv` where any files specified will be moved to the XDG standard + trash folder instead of being deleted. +* Alias `rm!` to the normal `rm` program + which effectively makes `rm!` a "permanently delete this" command. + +If you choose not to have `$XDG_DATA_HOME` defined, you can replace that bit +with whichever path you prefer such as `$HOME/.Trash`. The folder you choose +must already exist or else `mv` will be angry. + +_This is my seventieth post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,98 @@ +Title: The Vortex ViBE Mechanical Keyboard +Author: Jake Bauer +Date: 2020-08-02 +Summary: A showcase of the keyboard I use and why I chose this one in particular. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<figure> + <a href="/img/keyboard-side.jpg"><img + src="/img/keyboard-side-thumb.jpg"/></a> + <figcaption>The Vortex ViBE Mechanical Keyboard</figcaption> +</figure> + +I've been using the Vortex ViBE as my keyboard for at least six months and I +have to say it's one of the best mechanical keyboards I've used. It's very +unique in that it's a 60% form factor with a number pad tacked on the side. This +makes it roughly the same width as a tenkeyless keyboard but with a lot more +functionality. + +The ViBE is very well-made. The chassis is one solid slab of aluminium that +feels very weighty and solid. The switches are mounted on a plate flush with the +top of the bottom case which results in the keys floating above the board—a +style I prefer more than the keys being inset because it's easier to clean. + +It uses a detachable Micro-USB cable to connect to a computer and has no +bluetooth capabilities (I prefer wired over wireless). Although USB Type C has +become the connector everyone wants on everything, I don't really mind that this +uses Micro-USB since it's not like I unplug my keyboard very often nor does it +actually make much of a difference to me what connector is on the back of my +keyboard. Plus, in the end, USB-C is still relatively expensive to integrate +into products due to much of [the process still being +manual]( + +Its most interesting feature is that it combines the numpad and the nav cluster +into the same section of the keyboard. It was important for me to get a keyboard +with a number pad because of how often I used the pad on my old keyboard, but I +also didn't want to use a full-sized keyboard because of how large they are and +how awkward it feels to have to move my hand so far to reach the numpad, let +alone the mouse. I also didn't really want to have to use separate layers to get +keys like SysRq, PrtScn, the arrow keys, or Page Up and Page Down, so an even +smaller keyboard was a no-go. + +That brings me to the coolest feature of this keyboard: the numpad becomes the +nav cluster when NumLock is off. When you hit the button labelled Num, a green +light appears under the Caps-Lock key to tell you that the number cluster is +active and you can use the numpad as a numpad. When the light is off, that same +cluster of keys become the nav cluster in the exact same layout as a regular nav +cluster (the numpad keys 1 and 3 become dead keys in this case). This makes all +the keys of the keyboard, including Page Up/Down, Home/End, and PrtScn/SysRq, +accessible in a much smaller package. You also get used to hitting the Num key +whenever you want to type a number, then hitting it again to go back to nav mode +as opposed to always leaving NumLock on. + +<figure> + <a href="/img/keyboard-top.jpg"><img src="/img/keyboard-top-thumb.jpg"/></a> + <figcaption>The numpad on the right serves as a nav cluster in the exact + same layout as the regular nav cluster when NumLock is off.</figcaption> +</figure> + +You may also notice a lack of a tilde/backtick key. Those are accessed using the +Escape key where a backtick is Fn + Escape and tilde is Fn + Shift + Escape. +Once again, this is something you get used to over time and I've grown to +appreciate the escape key being a lot closer to the home row as it no longer +feels like a stretch to use it in Vim. + +Some other very interesting features of the keyboard are: + +* A built-in toggle to go between Qwerty, Dvorak, and Colemak keyboard layouts +* The keys are all the same height so they can be freely swapped around anywhere + on the keyboard to conform to any desired layout +* There are three programmable layers plus the default layer so it's possible to + program custom macros on different layers of the keyboard +* It comes with some extra keycaps: three extra colours of spacebar and two + extra colours of Num, Vertical Enter, Enter, and Esc keys (I chose the red + keys) +* It's available with a ton of different Cherry MX keyswitches. + +I got my keyboard with Cherry MX Black switches. I used to use Cherry MX +Blues and really liked the heavy weight and the clicky feeling but got tired of +the sound. I found Cherry MX Browns mushy (sorry, brown fans!), but MX Reds far +too light so I went with Blacks. I very much like the stiffness, quietness and +overall feeling of them. + +It's also not a very expensive keyboard. At roughly $140 USD (I got mine for +$120 USD because it was an open-box return from +[](, +it's competitive with offerings from big brand name companies such as Corsair, +Cooler Master, and Razer. + +I highly recommend it if you're looking for a compact keyboard but don't want to +give up the numpad or spend a ton extra to get a separate numpad. As far as I +know, this keyboard is unique in that respect and fills the niche well. + +_This is my eighty-third post for the #100DaysToOffload challenge. You can learn +more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ Binary files differ. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,127 @@ +Title: Why Email is the Best Discussion Platform +Author: Jake Bauer +Date: 2020-06-07 +Summary: In an age where everything seems to be going to the web and people are very vocally advocating for non-email-based workflows, I talk about why email is actually the best platform for free and open source projects. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Lots of very vocal people online advocate moving discussion platforms for free +and open source projects from email to other platforms such as Discourse or +Slack citing that these platforms are "more modern" or "easier to use". For the +most part, I understand where they're coming from. Email as a text-only medium +(ignoring attachments) might feel limiting to someone used to the multimedia, +JavaScript-filled landscape of most contemporary collaboration platforms. + +I get it. These platforms are perhaps more inviting because of a friendly UI, +inline image, link preview, and emoji support, and it all runs in the browser +which is where everything else is seemingly done nowadays. The problem is that +these features really aren't necessary and they rarely improve discussions which +could otherwise happen, and work just fine, over email. + +Historically, and still to this day, many free and open source software projects +(Debian, git, the Linux kernel, etc) use a combination of email and IRC for +their communications. Email is the asynchronous platform where decisions can be +announced, questions can be asked no matter who is online, and there can be an +open, infinite public record of discussions and questions which can be freely +searched by anybody by consulting the archives of that mailing list or the +various mailing list archiving sites. IRC is the synchronous, ephemeral platform +where developers and users can go to hash out quick discussions, get answers to +their support questions quickly, and generally hang out like one would in a +Slack or Mattermost channel. IRC is a topic for another day, so I'll just be +focusing on why email is better in this post. + +The biggest problem with contemporary platforms is that they're functionally a +regression from what already exists. Platforms such as Slack and Discord are +walled gardens requiring account creation, Discourse and Mattermost are better, +yet you still have to access them through a web browser and those who wish to +use their own clients are treated as second-class citizens. This is especially a +problem for disabled users who find text-based interfaces (of which there are +plenty for email) far easier to use. + +When using services such as Slack and others which use analytics, users have to +be conscious that they are effectively being monitored by that software all the +time. It's entirely possible for platforms like Discord and Slack to be sharing +the information they collect with third party companies who then go on to sell +it (if they don't already sell it themselves). + +<figure> + <a href="/img/slack-tracking.png"><img src="/img/slack-tracking.png"/></a> + <figcaption>The log output of uBlock Origin while sitting in a Slack + workspace showing XHR requests to a 'track' URL.</figcaption> +</figure> + +Not to mention the various other issues such as text-based content being far +better for accessibility than what the web can offer, most of the web-based +packages being very bloated where pages take seconds to load and megabytes of +bandwidth, and the fact that web browsers are very resource-hungry pieces of +software which can be difficult for those with fewer resources (e.g. people with +second-hand equipment in third world countries) to run. + +So, what does email bring to the table over contemporary options? Email is +federated, it allows one to use a variety of different clients, it can be used +both for patches and discussion, it's nowhere near as difficult to use as people +make it out to be, the asynchronous nature is actually beneficial, and it +eschews cruft and flash to leave you with nothing but plain text. + +The fact that email is federated allows anyone with an email address to +communicate with any public mailing list no matter who their provider is. For +example, there's no need to create a Debian account to post on a Debian mailing +list, anyone with a Gmail account can communicate with anyone using a ProtonMail +account, and so on. The barrier to entry is lower than with other platforms. +Federation also allows one to run their own email infrastructure if they wish +(and they should, in my opinion). + +With email, one can also choose whichever client they wish to use. If you work +in emacs you can choose mu4e. If you prefer Thunderbird then you can use that. +As long as your email client supports plain text email, you can use whichever +you like the most. This is important to many hackers who often heavily customize +the software they run to fit their workflow and their needs. Using email allows +for this freedom, but the wide variety of clients also means that you're not +forced to either. + +Another great thing about email is that it can be used for patches in addition +to discussion. [Sending patches via email]( is as +simple and straightforward as using something like Pull Requests. Just like with +Pull Requests, the discussion can be had in the same thread as a submitted patch +and patches can be applied to a repository all without needing to open a web +browser or use a different piece of software. + +Unfortunately, email has a reputation of being hard to use because of what I +think is an unwillingness to learn a new paradigm after having become used to +the way of doing things over the web. The reality of it is that email is not +difficult to use at all, it's just different and it takes just a little time and +effort to learn a different paradigm. Many thousands of people use it every day +contributing to projects like the Linux kernel without issue. + +Regarding things like bolding and italicizing, people make do just fine using +`/italics/`, `_underlines_`, or `*bolds*`. There's even `ALL CAPS` for when +you're really angry. In short, you'll have no issue getting your point across. +Some also say that email conversations are difficult to follow, but that's not +really true depending on your mail client; they're more like Reddit threads in +any decent email client which supports conversation threading. + +<figure> + <a href="/img/neomutt-threading.png"><img src="/img/neomutt-threading.png"/></a> + <figcaption>NeoMutt displaying a mailing list discussion with + threads.</figcaption> +</figure> + +The fact that email is asynchronous is actually far better for discussions than +you might think. Since there are no features showing that someone is online and +people don't expect immediate replies to emails, this gives one room to take the +time to draft a much more thoughtful response when compared to the instant +messaging structure of most other platforms. There's also a lot less pressure +to respond immediately and there are no anxiety-inducing typing indicators or +read markers. + +The final point that I want to make about email is that, just like IRC, there +are no frills; it's just regular old plain text. There are no embedded images, +flashy moving pictures, reactions or anything else like that. It lets you truly +focus on just what is important: the content of a message. The best part? Plain +text email still supports emoji because that's all just Unicode. + +_This is my thirty-seventh post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,35 @@ +Title: Why I Blog and #100DaysToOffload +Author: Jake Bauer +Date: 2020-04-25 +Summary: Today is my first day of #100DaysToOffload; a challenge started by Kev Quirk to encourage new and seasoned bloggers alike to start writing... + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Today is my first day of the #100DaysToOffload challenge; a challenge started by +[Kev Quirk](// to encourage new and seasoned bloggers alike to +start writing. Since it's currently _2020-04-25_ for me, this means I'll try to +post something new every day from today until _2020-08-03_. That's a lot of +blogging! + +Kev also recently made a blog post, inspired by a [blog post by Jan-Lukas +Else](//, [asking people why they +blog](// which I think is a great topic to kick +off this challenge. + +I blog because it's a way for me to share my thoughts. I could be promoting +something I've made, showcasing something I've found, sharing my thoughts on a +particular subject or technology, or discussing a topic which interests me. My +blog acts as my own free-form writing platform, a creative outlet allowing me to +shout my thoughts into the void for anybody who wants to listen, to practice my +writing in a less formal setting, or simply to share something from which I +think someone could derive value or find interesting. + +There is a great feeling of satisfaction that comes with posting and sharing a +new blog post. It's that feeling of creating something and releasing it into the +world for others to enjoy that keeps me coming back to writing new posts. It +feels good to share and even better when someone lets me know that something +I've written inspired or helped them. + +That's why I blog. diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,83 @@ +Title: Why I Hate The Term "Modern" +Author: Jake Bauer +Date: 2020-07-16 +Summary: I strongly despise the word 'modern' because of its use as a term to demean and as a way for people to refuse to consider something based solely off of mistaken notions of what modernity means. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I strongly despise the word "modern" because of its use as a term to demean and +refuse to consider something just because it wasn't created in the last handful +of years and even to market something as being good because it's new. The word +modern has somehow become associated with "something better" even though, in the +context of computing, that is rarely true. + +According to +[Merriam-Webster](, the word +"modern" is defined as: + +``` +1 a : of, relating to, or characteristic of the present or the immediate past : + contemporary + // the modern American family + b : of, relating to, or characteristic of a period extending from a relevant + remote past to the present time + // modern history + +2 : involving recent techniques, methods, or ideas : up-to-date + // modern methods of communication + +3 capitalized : of, relating to, or having the characteristics of the present or + most recent period of development of a language + //Modern English + +4 : of or relating to modernism : modernist + // Modern art has abandoned the representation of recognizable objects. +``` + +Really what I'm focusing on here is the second definition and its misuse as a +term to justify derision toward programming practices, languages, and software +solely based on the age or appearance of said practice, language or piece of +software. + +For example, I have encountered situations where others would look at the tools +that I am using, such as Neovim (which has its roots in the 1976 editor vi), or +command-line email clients such as NeoMutt (which has its roots in the 1995 mail +client Mutt) or aerc (which had its first release a little over a year ago) and +say things like "Why not use a modern editor like VS Code?" or "Why not use a +modern web interface for your email?". + +Naturally I'm happy to answer those questions, especially when asked by people +who are genuinely curious and not deriding, but I have so often seen tools, +practices, and software rejected for not being "modern" (whatever that actually +means), that my guard instantly goes up and I assume I'm about to be chastised +for using something uncommon. + +For a more specific, generally relatable example, there's the Git email +workflow. I have seen the argument made that using Git via email is not "modern" +and the GitHub way to contribute to projects is the "modern" way of doing things +as a way to put down this type of workflow. Just because something is recent, +newer, or shinier does not make it automatically better. In fact, in this +particular case I'd argue that the Git email workflow is far superior to the +pull request workflow for a multitude of reasons, as I have so often said in the +past. + +To stop myself from rambling on (many paragraphs have been deleted and +re-written), I will end by saying that it's not some ethereal notion of newness +that makes something good but the actual merits of a technique or piece of +software that makes it good. Just because something doesn't look pretty or +follow a common way of doing things perpetuated or created by Silicon Valley +companies doesn't make it automatically bad. "Modern" does not necessarily imply +"good". + +Text editors like Vim and Emacs, email clients like NeoMutt, Alpine, mu4e, or +aerc, development practices like the Git email workflow, and even web browsers +such as Lynx and w3m allow people to get work done in a way that is efficient +for them. Don't shun something based on first looks or some mistaken notion of +what constitutes modernity; evaluate things based upon their merit at least +after considering them or giving them a try. + +_This is my seventy-third post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,119 @@ +Title: Why IRC is Still Good in $CURRENT_YEAR +Author: Jake Bauer +Date: 2020-08-30 +Summary: IRC is often disparaged for being outdated but it is still a great and useful chat platform. Let me tell you why. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +<center><figure> <a href=""> <img +src=""/></a> <figcaption>XKCD Comic +#1782: Team Chat <a +href="">CC-BY-NC +2.5</a></figcaption> </figure></center> + + +Similar to how [I think e-mail is still the best discussion +platform](/blog/why-email-is-the-best-discussion-platform), +I think there is still a solid place for IRC in our lives. + +IRC (Internet Relay Chat) is a communications protocol [created in +1988](// and, yeah, it shows. IRC is 100% +plain text; no images, no videos, no stickers, no emoji reactions, just good ol' +plain text. It was also designed to transmit everything in plain text (i.e. +unencrypted) all across the Internets in a time when the use of these computer +networks was limited mostly to universities, governments, and large +corporations. This was a time when Hollywood-style [1337 +h4x0rs]( were +pretty much just kids using their modems to make long distance calls for free. + +Nowadays, IRC is probably not such a good platform for private personal chats, +but that doesn't mean it's not good for other things. + +Arguably the best "feature" of IRC is that it's still all in plain text. No +multimedia or fancy features such as emoji reactions, integrations, or stickers +keeps the bandwidth usage down and the focus on the content of what people are +saying, rather than on distracting memes and flashy things. It's the same reason +why people like lean websites, plain text email, plain text notes, and so on: +plain text is easy, portable, lean, and pure. You can even still [send files +using IRC]( + +One aspect of computing and software design that many developers nowadays seem +to forget is that [over half of the world's population does not have access to +fast +Internet]( +and many people, even in developed countries, are limited by bandwidth caps and +spotty satellite or mobile Internet access. For these people, IRC can be the +much better option compared to other collaboration platforms such as RocketChat, +Mattermost, Slack, or Matrix, even if they have to use an IRC bouncer or a +screen/tmux session on a remote server to not miss things if their connection is +that spotty. + +<p class="note">Did you know, <a +href="">IRC played a +critical role in getting networks back up</a> during the <a +href="">recent +CenturyLink outage</a>?</p> + +One of the biggest flaws I see people discuss when talking about IRC is that +chat history is not saved by the server. This means that, if you want a record +of the conversations which happen when you're not connected, you'd have to use +an IRC bouncer or screen/tmux session which will keep you connected when you +have to go offline. I can definitely see this being a limitation for a private +group chat if this is not something you're willing to do, but when it comes to +open source collaboration or support, this makes IRC great for hashing out +ideas, asking quick questions, and having conversations while hacking on things. +In these cases you don't really care what's happening when you're not there +because these are synchronous conversations which is perfect for the ephemeral +nature of IRC. + +Even though encryption is not mandated by IRC or enabled by default in many +cases, you can still enforce encrypted client-server or server-server +connections on your IRC server. This means that all messages in transit between +clients and your server would be encrypted (usually with TLS) and the only +weakness would be logs on the servers themselves or logs on client machines. If +you and your friends like the plain text medium, it's entirely possible to set +up an IRC server which mandates encryption and doesn't store logs long-term. If +you're in a group of people you can trust to be competent then it's entirely +possible to make IRC work this way and have a reasonable guarantee of privacy +and security. + +I suppose I should also mention the federating aspect of IRC since that's quite +a hot topic in the open source social platform world. IRC does federate in a +way, but it's not quite like the way Pleroma or Mastodon do. In the world of +IRC, IRC networks are made up of one or more IRC servers. If you connect to an +IRC server, you can view and interact with any channels or users on the same +network that server is a part of. The way IRC exists right now is due to several +network splits (netsplits) where many servers decided to split off of a big +network to form their own, separate network several times throughout IRC +history. This is similar to having a group of several Mastodon/Pleroma instances +which have decided to federate with nobody else except those also in the group +and is why we have the LiberaChat IRC network alongside the Undernet, EFnet, and +so on. Many of those splits occurred in the earlier years of IRC, and many of +the larger networks like LiberaChat are quite stable, having a coordinated team +of admins to make sure things keep running smoothly. + +The reason why this isn't really such a big issue when it comes to IRC though is +that IRC doesn't really have accounts in the same way other platforms do. It +typically takes the form of registering a nickname with a network's NickServ bot +to reserve it, but that's often only mandatory for speaking on the larger +networks as a spam countermeasure. Account registration is also so easy that you +can join however many IRC networks you want with little hassle; connect, set +your nick (often done automatically by your client), and a quick message to +NickServ will get you up and running on just about every network. + +IRC is still a really useful and good platform especially for software +minimalists and technical users who wish to have a relatively hassle-free +experience. IRC is great for open collaboration and quick support in free +software projects (far better than Slack or Discord) and it can be made to work +for private chats especially if you run your own IRC server. Yes, IRC is not +necessarily great for non-technical users or those who require extensive +guarantees of security; it might even be too much of a hassle for you, but this +doesn't mean it's dead, useless, or outdated. IRC is not only still useful, but +can still be the best tool for the job in the modern age, especially with the +coming improvements in the form of [IRCv3]( + +_This is my ninety-eighth post for the #100DaysToOffload challenge. You can +learn more about this challenge over at +[]( diff --git a/content/garden/arboretum/art/ b/content/garden/arboretum/art/ @@ -0,0 +1,27 @@ +# Art + +``` + _____ /| + .-'@ & #`'-. // + / % 8 \ // + | m () _ | // + \ 0 ( '-._/ // + jgs '-.____'. y +``` + +[← Back](../) + + +Various notes on art, colour, design, stuff like that. + +(None of the tables will look good on Gemini, sorry.) + +## Merveilles Colours + +<table> +<th>cyan #72dec2 +<th>cyan-light #9ffce3 +<tr height="25px"> +<td style="background-color: #72dec2"></td> +<td style="background-color: #9ffce3"></td> +</table> diff --git a/content/garden/arboretum/booknotes/ b/content/garden/arboretum/booknotes/ @@ -0,0 +1,34 @@ +# Book Wishlist + +[← Back](./) + + +A list of books I am considering acquiring. I do not necessarily aim to get every book on this list. + +* _Extraordinary Popular Delusions and the Madness of Crowds_ by Charles Mackay +* _The Wisdom of Crowds: Why the Many Are Smarter Than the Few and How Collective Wisdom Shapes Business, Economies, Societies and Nations_ by James Surowiecki +* _Introduction to Programming Languages_ by Arvind Kumar Bansal +* _Concrete Mathematics: A Foundation for Computer Science_ by Ronald Graham, Donald Knuth, Oren Patashnik +* _Proofs: A Long-Form Mathematics Textbook_ by Jay Cummings +* _How to Prove It: A Structured Approach_ by Daniel J. Velleman +* _Basic Mathematics_ by Serge Lang +* _Discrete Mathematics with Applications_ by Susanna Epp +* _Data Structures, Algorithms, and Software Principles in C_ by Tomas Standish +* _Discrete Mathematical Structures_ by Bernard Kolman, Robert Busby, Sharon Ross +* _The Little Schemer_ by Daniel P. Friedman +* _Don't teach coding until you've read this book_ by Stephen R Foster and Lindsey D Handley +* _The little book on coffeescript_ by Alex MacCaw +* _Programming Forth_ by Stephen Pelc +* _Thinking Forth_ by Leo Brodie +* _Modern Technical Writing: An Introduction to Software Documentation_ by Andrew Etter +* _Why's Poignnant Guide to Ruby_ by Why +* _Professor Frisby's Mostly Adequate Guide to Functional Programming_ by Brian Lonsdorf +* _Programming from the Ground Up_ by Johnathan Bartlett +* _Tools for Thought_ by Howard Rheingold +* _The Complete Bike Owner's Manual_ by D.K. Publishing +* _A Pattern Language: Towns, Buildings, Construction_ by Christopher Alexander, Sara Ishikawa, Murray Silverstein +* _The Timeless Way of Building_ by Christopher Alexander +* _Tools for Conviviality_ by Ivan Illich +* _1974 Reader's Digest Home Repair (Complete Do-It-Yourself Manual) +* _The Dawn of Everything: A New History of Humanity_ by David Graeber, David Wengrow +* _How Buildings Learn: What Happens After They're Built_ by Stewart Brand diff --git a/content/garden/arboretum/booknotes/ b/content/garden/arboretum/booknotes/ @@ -0,0 +1,18 @@ +# Book Notes: Disciplined Minds + +[← Back](./) + + +Book written on "stolen time". Time "stolen" from employer to pursue own visions. + +Jobs are often intellectually and creatively unfulfilling, and life is incomplete without doing something of your own. They can become a battle over personal identity. Many professionals become burned out because, after many decades of work, their salary is the only thing they have to show for it. + +Professionals also rarely have control over the political side of their work. "Does what I do even matter?" Many professionals want to make a difference in the world but feel powerless to do so. + +Business is increasingly about control and the bottom line. There is more management, scrutiny over the professional's work output, and more anxiety about job security as a result. + +Schools are designed to produce politically subordinate, obedient thinkers who do the work they're told to do without questioning the goals. They are designed to churn out cogs for the machine. + +Unquestioning people are at an advantage. People who stop and think or contemplate may lose some enthusiasm or slow down compared to their peers. That behaviour can also draw attention to deviant priorities. + +But this system that turns potentially independent thinkers into politically subordinate drones is bad for society. It bolsters the power of corporations and other hierarchical organizations, condemning democracy. When employees are there only to extend the employer's will, they become useful only to those hierarchies. This undermines the effort to build real democracy. Organization are also more likely to abuse clients because subordinate employees are not as effective at challenging their employer. diff --git a/content/garden/arboretum/booknotes/ b/content/garden/arboretum/booknotes/ @@ -0,0 +1,102 @@ +# Finished List + +[← Back](./) + + +[This is obviously not an exhaustive list of every book I've ever read, just since I started cataloguing.] + +[Ratings represent my personal feelings towards the book. They are not a reflection of how I feel about the author or necessarily the quality of the writing or plot unless otherwise specified. A * means I'm still reading the book so the rating is subject to change and a perfect score means I can't find anything obviously wrong with the book.] + +## 2023 + +### OpenBSD Mastery: Filesystems by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 90/100 + +An informative introduction to the topic of filesystems on OpenBSD, both networked and local. The book is informative and walks you through pretty much everything you'd need to know. It's also written in the typical humourous MWL style. + +I did feel that it was missing a bit though. For example, I was surprised that dump(8) and restore(8) were not covered in detail despite being frequently mentioned and being the included method of backing up a filesystem. Perhaps it will be covered in Absolute OpenBSD, 3rd edition. It would also have been nice to delve just a tiny bit into using fsdb(8) and crli(8) to debug/fix a filesystem. + +### A Little Tea Book: All the Essentials from Leaf to Cup by Sebastian Beckwith with Caroline Paul, Illustration by Wendy MacNaughton + +* **Status:** Finished +* **Rating:** 98/100 + +This is a cute, fun, and informative book that aims to educate one about tea while being enjoyable to read. It contains many pictures and adorable illustrations and is written in a friendly, non-judgemental tone unlike many other books about tea. I highly recommend this book as an introduction to the world of tea. My only gripe is that sometimes the flow of sentences is interrupted by a diagram or full-spread picture on the turn of a page, but this is really minor. + +### The Tea Enthusiast's Handbook by Mary Lou Heiss and Robert J. Heiss + +* **Status:** Finished +* **Rating:** 75/100 + +This book had a nice collection of information about various teas and a bit about how the teas are produced. Having some tasting and brewing notes alongside each picture of a given tea's leaves and brew was also quite nice. + +However, I didn't like how judgemental the authors were towards Western brewing styles and Western customs. It felt very much like they were putting Eastern tea traditions on a pedestal and putting down the Western traditions. (This is unfortunately quite common in tea enthusiast circles, where Middle Eastern, Eastern European, British, and other non-East Asian tea traditions and history are ignored or swept to the side). + +Also, the book exhibited a typical mildly pseudo-scientific vibe also often encountered in tea enthusiast circles. For example, on page 37: "One last caveat: water should be boiled only once. [...] reheating water that has come to a boil and cooled completely will create flat-tasting, lifeless water." This, to me, is absolute nonsense that I haven't seen anywhere else even in enthusiast tea spaces. The most I can find about this even through internet searches is people debunking the myth that twice-boiled water concentrates harmful metals. + +### Good Arguments - How Debate Teaches Us to Listen and Be Heard by Bo Seo + +* **Status:** Finished +* **Rating:** 95/100 + +This book was a bit more of an auto-biography than I was expecting, but it's very well-written and contains much food for thought regarding having good, high quality debates not only with strangers but also with friends and family. + +## 2022 + +### Building a Second Brain by Tiago Forte + +* **Status:** Finished +* **Rating:** 55/100 + +To be completely honest, this is a book that could have been a long blog post. The beginning has engaging personal anecdotes and important information and considerations when creating a personal knowledge management system, but the book devolves into talking about various other people's experiences (including celebrities) and how PKM systems worked for them. Only about a third of the book felt useful, with the rest feeling like filler. + +### Tarsnap Mastery by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 100/100 + +Short and sweet. A good overview of everything related to Tarsnap. It's nice to have this book next to me when I'm working with Tarsnap. + +### Relayd and Httpd Mastery by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 100/100 + +A good introduction to these bits of OpenBSD software, taking you through nearly everything you might want to do with them. + +### Absolute OpenBSD (2nd ed.) by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 100/100 when it came out, probably 60/100 now. + +This was okay, but certainly very out of date now (released in 2013). There are still useful sections, especially since OpenBSD is a relatively stable platform (compared to Linux which has one fundamental thing change every couple years), but there is still a lot that is noticeably out of date. Wait for a new copy. + +### Absolute FreeBSD (3rd ed.) by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 100/100 + +This was quite a good introduction to FreeBSD. Though, since this was released in 2018 it's also starting to get quite long in the tooth. The content is closer to what you'd experience in FreeBSD these days and is still very useful and helpful, but there are some things that are starting to show their age (such as ZFS becoming even more popular/common compared to GEOM). + +### Ed Mastery by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 101/100 + +The perfect book. 10/10. (It's honestly a really good resource on using the standard text editor.) + +### FreeBSD Mastery: Jails by Michael W. Lucas + +* **Status:** Finished +* **Rating:** 100/100 + +A great resource all about using Jails on FreeBSD (kind of like containers are for Linux, but not really). This was an invaluable resource when I was working on Jails-related infrastructure. + +### The Cathedral And The Bazaar by Eric S. Raymond + +* **Status:** Dropped +* **Rating:** 40/100 + +I stopped reading this book about ⅓rd of the way through. I found it too wordy, too self-congratulatory, and like there wasn't enough of substance. As I was reading the book I kept thinking: "when is he going to get to the meat of the topic already?" diff --git a/content/garden/arboretum/booknotes/ b/content/garden/arboretum/booknotes/ @@ -0,0 +1,39 @@ +# Booknotes + +``` + .--. _ + .---|__| .((\=. + .--|===|--|/ ,(, + | |===| |\ y + |%%| | | `.__,' + |%%| | | / \\\ + | | | |/| | \`----. + | | | ||\ \ |___.'_ + _| | |__||,\ \-+-._.' )_ + / | |===|--|\ \ \ / \ + / `--^---'--' `--`-'---^-' \ hjw + '================================` +``` + +[← Back](../) + + +A list of books I am considering acquiring: + +[Book Wishlist](book-wishlist.html) + + +A list of books I've read with brief notes about them: + +[Finished List](finished-list.html) + + +More detailed notes from the books I've read/am reading: + +[Disciplined Minds](disciplined-minds.html) + + +Links to books available online: + +[Handbook of Applied Cryptography by Alfred J. Menezes, Paul C. van Oorschot and Scott A. Vanstone]( + diff --git a/content/garden/arboretum/ b/content/garden/arboretum/ @@ -0,0 +1,69 @@ +# The Arboretum + +``` + ,@@@@@@@, + ,,,. ,@@@@@@/@@, .oo8888o. + ,&%%&%&&%,@@@@@/@@@@@@,8888\88/8o + ,%&\%&&%&&%,@@@\@@@/@@@88\88888/88' + %&&%&%&/%&&%@@\@@/ /@@@88888\88888' + %&&%/ %&%%&&@@\ V /@@' `88\8 `/88' + `&%\ ` /%&' |.| \ '|8' + |o| | | | | + |.| | | | | +jgs \\/ ._\//_/__/ ,\_//__\\/. \_//__/_ +``` + +[← Back](../) + + +The Arboretum is the place for long-lived concepts. Here you can find my opinions, values and beliefs, recipes, and other similar things. + +[🗒️ Booknotes](booknotes/) + + +Notes from the books I've read, links to freely available books, and a list of books I'm looking for. + +[🎨 Art](art/) + + +Various notes on art, colour, design, stuff like that. + +[📚 Knowledge](knowledge/) + + +General documents, notes, and other bits and pieces I find valuable. + +[💭 Opinions](opinions/) + + +Opinions on various, usually material things. + +[💾 Programming](programming/) + + +Notes replaced to computer programming. + +[🍜 Recipes](recipes/) + + +A catalog of recipes I found or created. + +[🖥️ System Administration](sysadmin/) + + +Notes, configurations, and other things related to computer system administration. + +[🍵 Tea](tea/) + + +Notes about the various teas I've tried and about tea in general. + +[⚖️ Values and Beliefs](values-and-beliefs/) + + +What I value and believe in. + +[✍️ Writing](writing/) + + +Notes about writing and my mini collection of fountain pens and inks. diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,9 @@ +# Amateur Radio + +[← Back](./) + + +## Canadian Study Guides + +[]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,64 @@ +# Bicycle Shops in Ottawa, Canada + +[← Back](./) + + +The Cyclery - 1115 Bank St, Ottawa, ON K1S 3X4 + +[]( + + +Phat Moose - 98 Hawthorne Ave, Ottawa, ON K1S 0B1 + +[]( + + +Cyco's - 25 Hawthorne Ave, Ottawa, ON K1S 0A9 + +[]( + + +Joe Mamma Cycles - 767 Bank St, Ottawa, ON K1S 3V3 + +[]( + + +Re-Cycles - 445 Catherine St Unit 1, Ottawa, ON K1R 5T7 + +[]( + + +Dave's Bike Dump - 407 Catherine St, Ottawa, ON K1R 5T6 + +[]( + + +Foster's - 305 Bank St, Ottawa, ON K2P 1X7 + +[]( + + +McCrank's - 1b McCormick St, Ottawa, ON K1Y 1M4 + +[]( + + +Retro Rides - 79 Sparks St, Ottawa, ON K1P 5A5 + +[]( + + +Tall Tree Cycles - 281 Sunnyside Ave Ottawa, ON K1S 0R4 + +[]( + + +Giant Ottawa - 1162 Bank St, Ottawa, ON K1S 3X8 + +[]( + + +Bicycle information online + +[]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,7 @@ +# Cool Gemini Capsules + +[← Back](./) + + +[gemini://](gemini:// + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,132 @@ +# Fedora 36 Spins - Resource Usage Comparison + +[← Back](./) + + +## Testing Methodology + +### System Specifications + +* Core 2 Duo P7550 (2C/2T) +* 8 GiB RAM (DDR3 1067 MT/s) +* 250 GB SATA SSD +* NVIDIA GeForce 9300M GPU (nouveau) +* 1280x800 Display +* AC Adapter Plugged In + +### Steps + +For each spin of Fedora 36 (including GNOME): + +* Download the ISO, flash to a USB, install to the system +* On first boot, finish any required setup (like user account creation) +* Install htop, enable AVG CPU meter +* Reboot +* Log in and let the system idle for 2 minutes +* Run htop in the terminal and collect RAM and CPU information +* Close htop and collect disk space information + +### Information Collection + +CPU, by grabbing the terminal window and moving it rapidly in circles and recording what the average CPU usage is. + +RAM, by reading from the htop display. + +Disk Space, by running df -h and recording the value for root. + +## Results + +### GNOME (Wayland) + +* CPU: 25% +* RAM: 930M +* Disk: 3.5G + +### KDE (X11) + +* CPU: 30% +* RAM: 1010M +* Disk: 3.9G + +### XFCE + +* CPU: 50% +* RAM: 600M +* Disk: 2.8G + +### Cinnamon + +* CPU: 40% +* RAM: 830M +* Disk: 3.6G + +### MATE Compiz + +* CPU: 50% +* RAM: 590M +* Disk: 3.5G + +### LXQt + +* CPU: 30% +* RAM: 480M +* Disk: 2.3G + +### LXDE + +* CPU: 20% +* RAM: 470M +* Disk: 2.3G + +### i3 + +* CPU: 45% +* RAM: 360M +* Disk: 2.3G + +## Comparison to Linux Mint Cinnamon + +I was running Linux Mint Cinnamon on this system before replacing it with Fedora, so I figured I'd record these stats: + +* CPU: 35% +* RAM: 660M + +## Conclusions + +Some very interesting conclusions here! + +First of all, it's important to note that disk usage is not necessary good or bad. Of course a desktop environment like KDE or GNOME will use a lot of disk because they have a lot of pre-installed programs. Whether the installation takes up 2GB or 4GB is not likely to make much of a difference unless you're installing Fedora onto a 16GB drive or something like that. + +Moving onto CPU usage, this was not a particularly scientific test, as I basically just jiggled the terminal window around a lot and recorded a rough average of the total CPU usage. It's not a typical way someone would use these environments, but it was still insightful and was able to show a clear difference in the drawing performance of different desktop environments. Note that the CPU result for i3 isn't really meaningful, since it's a tiling window manager and you're not typically dragging windows around; everything tends to stay still. Also note that the difference in CPU usage is quite exaggerated on such an under-powered system. You'd likely notice single-percentage differences on a more recent machine. Even modern Celerons and Atom processors are more powerful than this processor, and you can get single board computers with more computing power. + +RAM usage is probably the most accurate and meaningful statistic to come out of this. I left each system running for at least two minutes before recording the amount of RAM used, as an initial boot and login seemed to have some activity going on in the background (probably update checking and that sort of thing) which settled down after a bit. The numbers presented here are rounded to the nearest 10M. + +This is how each spin stacks up, where those at the top of the list used the least amount of resources (i.e. they performed the best): + +CPU: + +1. LXDE (20%) +2. GNOME (25%) +3. KDE (30%) +3. LXQt (30%) +4. Cinnamon (40%) +5. i3 (45%) +6. XFCE (50%) +6. Mate (50%) + +RAM: + +1. i3 (360M) +2. LXDE (470M) +3. LXQt (480M) +4. MATE (590M) +5. XFCE (600M) +6. Cinnamon (830M) +7. GNOME (930M) +8. KDE (1010M) + +I was extremely surprised at how this turned out for the two major DEs. Both GNOME and KDE have reputations of being heavy desktop environments, but both are among the lowest in CPU usage, though they have the worst RAM usage. Looking at the actual numbers, they are effectively the same as far as resource usage goes, with KDE being just a tiny bit heavier. + +Naturally, i3 comes in at the lowest RAM usage since there's not much going on in a simple window manager like that compared to a full desktop environment. As expected, "light" desktop environments used the least amount of RAM, with LXDE being the best performing floating window desktop environment. + +If you don't have very much RAM at all (4GB or less), you should consider running one of the lighter desktops. If you have 8GB or more, however, any desktop here is perfectly adequate for most uses. I have no problems running GNOME on this machine, where I tend to have a couple of browser tabs, a terminal window, and a chat application open. diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,42 @@ +# Knowledge + +```ASCII Art of an open book and an ink bottle with quill + __ + (`/\ + `=\/\ __...--~~~~~-._ _.-~~~~~--...__ + `=\/\ \ / \\ + `=\/ V \\ + //_\___--~~~~~~-._ | _.-~~~~~~--...__\\ + // ) (..----~~~~._\ | /_.~~~~----.....__\\ + ===( INK )==========\\|//==================== +__ejm\___/________dwb`---`_______________________ +``` + +[← Back](../) + + +A collection of instructional documents, notes, configurations, or other bits and pieces of documentation I find valuable. + +[Personal Productivity-Sans-Burnout Tips](productivity-tips.html) + +[Cool Gemini Capsules](cool-gemini-capsules.html) + +[Fedora 36 Spins - Resource Usage Comparison](fedora-36-spin-resource-comparison.html) + +[OpenBSD on the Desktop](openbsd-desktop.html) + +[Amateur Radio](amateur-radio.html) + + +## Philosophy + +[Obscurantism](obscurantism.html) + +[Permacomputing](permacomputing.html) + +[The Merveilles Sensibility](merveilles.html) + +[Some Thoughts On The Real World By One Who Glimpsed It And Fled](watterson.html) + +[Meditation](meditation.html) + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,9 @@ +# IRC + +[← Back](./) + + +A collection of notes about IRC + +[]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,17 @@ +# Meditation + +[← Back](./) + + +Meditation is about slowing down. About taking the time to feel your feelings and think through your emotions and actions. It is about being mindful of the universe and your place within it. + +> dum loquimur, fugerit invida ætas; carpe diem, quam minimum credula postero + +> while we are talking, time flies without favor; seize the day, not trusting the slightest in what is to come + +* Horace, Odes + +> I must not fear. Fear is the mind-killer. Fear is the little-death that brings total obliteration. I will face my fear. I will permit it to pass over me and through me. And when it has gone past I will turn the inner eye to see its path. Where the fear has gone there will be nothing. Only I will remain. + +* Frank Herbert, Dune + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,45 @@ +# The Merveilles Sensibility + +[← Back](./) + + +Mirrored from: + +[]( + + +(There are more resources there than just this text, so look at that too). + +## Solutioning for technological resilience +Technology-centric subcultures have splintered and transformed radically since the 1960’s when University-born radical researchers synthesized with the funding-rich military industrial complex, creating an unstable cocktail of new ideas. The consumer-computing boom of the 1980’s led to the techno-utopianism of the 1990’s, and ultimately the monkey’s-paw ironic wish fulfillment of the present day- a media landscape that seems to be both the realization and cruel distortion of utopian ideals of “free information”. The breathless venture-capital-powered silicon valley pursuit of untapped markets created a new path of class mobility– private sector software development. As more and more bright young people devoted themselves to this discipline, new technological subcultures were born out of dissatisfaction with the systems these tech workers found themselves serving under. These subcultures are not monolithic, but tribal. They manifest online and are colored by both the ideas of software development as a practice and the class consciousness and values of the various cultures these individuals came from. + +The Merveilles Sensibility (from the French word for “Marvels”) is an associated visual design aesthetic, worldview, and collection of production techniques loosely connected to the Merveilles online community. This community exists as an instance of Mastodon (an open source, decentralized and noncommercial microblogging platform reminiscent of Twitter) and as a webring of personal sites hosted over http or distributed via the DAT protocol. The community was founded by Devine Lu Linvega and Rekka Bellum, two artists and technologists who live a nomadic existence on a houseboat and have adapted their lives to these special requirements, producing games and software under the name Hundredrabbits. + +Merveilles is associated with, but distinct from sensibilities like ”Solarpunk”, “Cyberpunk” or “Junkpunk” in that it is practical rather than speculative. Merveilles is distinct from intersecting hacker culture in that it asserts that quality of life is tied to an aesthetic enjoyment of it, and in its decidedly leftist politics and ecological concerns. It carries strong, repeated motifs in fashion, industrial design, and user-interface design that are slick, minimalist, and concerned with values like cost, durability, maintenance, power consumption, and efficiency. + +The Merveilles sensibility carries notions of optimizing for productivity that seem to have osmosed from mainstream software development culture, but have been redirected in the Merveilles weltanshauung to be used for personal productivity- divorced from commerce, and an assertion that individuals should create their own personally tailored tools to serve their own objectives and values. Merveilles Software is open-sourced and often distributed for free or suggested donations. The sensibility eschews commercial platforms and services whenever possible, viewing them as unreliable and opaque. Computer hardware favors cheap, low power modular devices running open operating systems. There is a tendency towards salvaging older computer equipment and avoiding electronics waste, as well as preparing for a world where the electronics distribution chain breaks down (see the associated CollapseOS project). + +> Our future must involve repurposing and creating new things from what we already have [instead of 20th century “destroy it all and build something completely different” modernism](…) + +(Flynn) + +Hundredrabbits incorporates this idea by targeting hardware up to twenty years old in the software that they produce in order to, “encourage recyclism and discourage the consumption of fashionable electronics,” (Linvega and Bellum). Merveilles seems aligned with the ideals of Solarpunk while internally expecting the world of Cyberpunk, it is neither a utopian or dystopian vision, but a way of straddling both contingencies. + +> The energy required to power tools like Xcode and Photoshop keeps growing, and the large and incessant updates have often long stopped adding worthwhile improvements. While fashionable devices and protocols exacerbate planned obsolescence, bloated software increase energy usage and shorten the lifespan of computers resulting in more than 130'000 computers ending in the garbage annually. +> We have decided to focus on documenting, and archiving, means of reusing and repairing older devices and programs. All of our tools are designed to work offline first, operate with little-power on older devices and operating systems. Operating this way, we can keep creating content while off-grid, and when our power and connectivity is limited. + +(Linvega and Bellum) + +The Merveilles visual aesthetic restricts color palettes to black and white, vector or pixel art, with at most a single accent color (usually a sea-foam aqua). Industrial design is minimalist, geometric black-forged metals, natural wood. Cared-for antique tools are included among plain utility objects and ad hoc modular electronics. The sensibility connects to the past- it resurrects older hardware and software platforms and aesthetics and reconnects them to the present. Programming new art tools for vintage hardware and software is a common exercise. Livecoding is a defining art practice in the Merveilles sensibility, and exemplified in software projects like ORCA, Hydra and Supercollider- open programming platforms where code is written and altered while it continues to run, creating music and live visuals algorithmically. + +Creating art and software in a command-line environment informs much of the minimalistic Mervailles aesthetic- monospace terminal fonts are the rule in interfaces, which, while functionally complex, are kept as visually minimal and single-purpose as possible. Experiments with vector art can become ornate and baroque in contrast, and are informed by op-art and digital typography. + +> I periodically find myself thinking about operating systems, or more specifically the interaction design of OSes. In attempting to tackle the difficult UX challenges of that space, unrealizing that my failure to solve these issues might very well come from the simple fact that the purpose of operating systems is to enable multi-tasking, multi-tasking that I try to eradicate from my daily life, making these issues deeply unsolvable and my love for sharp tools and OSes irreconcilable. ” Sometimes I wonder if we shouldn't re-orient our focus onto things that can run on small low-power open-source single-purpose boards, but I also consider the impact of pushing for the purchase and production more electronics as problematic, perhaps creating software targeting old hardware might be what I'm looking for. Despite all this, I dream of a line of simple electronics, each one designed for a single purpose. Or even for things beyond the realm of electronics, like a kit bicycle with all its superfluousities removed. + +(Linvega) + +Two aspects of the Merveilles sensibility that interest me most are the livecoding art practice- essentially performative, improvisational programming for music and live motion graphics, and the cultural pushback against always-connected, power-hungry devices that are too sophisticated to repair. I’m also fascinated by the push towards decentralized networks and the ways that the sensibility runs counter to mainstream tech culture. It advocates self-improvement over self-enrichment. It places importance on community and focuses on making those communities resilient and independent of as many centralized services as possible, as opposed to the illusion of independence that can take the form of resource hoarding and distrust. I’m also interested in the strong push to create software as a sort of “personal information architecture” rather than necessarily as commercial products for wider use. While there are certainly many commercially available products that fit within the Merveilles aesthetic, the usage and maintenance of these sorts of items runs counter to mainstream consumer culture. Preoccupation with the “well-made object” is not a radically new notion in terms of design, but in a larger philosophy of optimizing lifestyles for less income and the creation of less waste, the preoccupation transcends a sense of luxury. + +As many of the adherents to this are skilled in software development methodologies, a large part of the Merveilles sensibility is the creation of personal, noncommercial software tools. Many visions of technological progress anticipate the existence of ubiquitous high-speed networks and plentiful, cheap power. I would suggest that for every localized instance of ‘techno-utopia’, a desert of extraction is created. For technically skilled bourgeoise who are forced to compete at high levels in STEM fields in order to live in these urban areas, some outliers will continue to become alienated and take the technical skills and methodologies they learn to power and data deserts, not to digitally gentrify them, but to adapt their own lives to those requirements. + +The Euro-Asian social influences of the Merveilles sensibility favor a focus on communities as a structure of resilience, with art and ethics as a common cultural bond. Rekka and Devine’s nomadic life on a houseboat is an excellent case study in what that might look like as communities increasingly exist online instead of in a single location. It’s a novel sign of our times that two people living a nomadic life in international waters can also be directly influential in a tight-knit social group that offers mutual aid and is generative enough to have wider cultural influence. diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,23 @@ +# Obscurantism + +[← Back](./) + + +Obscurantism/obscurationism is the practice of deliberately presenting information in an imprecise, abstruse (i.e. difficult to grasp) manner designed to limit further inquiry and understanding. Obscurantism is fundamentally anti-democratic, anti-intellectualism, and elitist. + +An obscurantist is any enemy of intellectual enlightenment and the diffusion of knowledge. + +> "The essential element in the black art of obscurantism is not that it wants to darken individual understanding, but that it wants to blacken our picture of the world, and darken our idea of existence." + +-- Friedrich Nietzsche + +Obscurantism is common in academia, where the few "learned" folks intentionally or unintentionally exclude those less well-versed in their fields by presenting information in a way that is unintelligible to others not also involved in that field (typically by using complex language and jargon). It is an example of an "enlightened few" wishing to exclude others from joining their ranks without undergoing some indoctrination or trial process. It is also potentially a contributor to the contemporary anti-science movement. + +It is also common in governments which seek to be opaque to the citizens which they are supposed to serve. It is a tactic used by rulers to keep the populace subdued and under their control. + +> In the 20th century, the American conservative political philosopher Leo Strauss, for whom philosophy and politics intertwined, and his neo-conservative adherents adopted the notion of government by the enlightened few as political strategy. He noted that intellectuals, dating from Plato, confronted the dilemma of either an informed populace "interfering" with government, or whether it were possible for good politicians to be truthful and still govern to maintain a stable society—hence the noble lie necessary in securing public acquiescence. + +> In the essay "Why I Am Not a Conservative" (1960), the economist Friedrich von Hayek said that political conservatism is ideologically unrealistic, because of the conservative person's inability to adapt to changing human realities and refusal to offer a positive political program that benefits everyone in a society. In that context, Hayek used the term obscurantism differently, to denote and describe the denial of the empirical truth of scientific theory, because of the disagreeable moral consequences that might arise from acceptance of fact. + +[]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,71 @@ +# OpenBSD on the Desktop + +[← Back](./) + + +Random things that I want to make note of. Usually small tutorial snippets + +## Multimedia + +This is a pain point with daily OpenBSD use. Audio device management is not as easy as it is with most other OSes, even if the audio system is way simpler. It can take a few commands to get things in order, and it's friendliest on laptops where you are less likely to have several peripherals plugged in. + +### Multiple audio devices + +Scan `dmesg` for `audioN` strings to figure out which audio device is mapped to which number. Then, to use, for example, audio1 when present but fall back to audio0 when not, use: + +``` +# rcctl set sndiod flags -f rsnd/0 -F rsnd/1 +# rcctl restart sndiod +``` + +Audio1 can be a USB DAC or other non-default audio interface. + +(Being able to tell sndiod which audio device to use without needing to change flags with rcctl and root privileges would be very nice. As would a small utility to list out audio interfaces by name. First thing might be hard depending on how sndiod works, but second could be a simple shell script.) + +### Use hotplugd to reload sndiod audio devices + +When you unplug an additional audio device, sndiod won't know about it unless you tell it to reload its configuration. + +``` +# cat > /etc/hotplug/attach +case $2 in +uaudio*) + pkill -HUP sndiod + ;; +esac +^D +# chmod +x /etc/hotplug/attach +# rcctl enable hotplugd +# rcctl start hotplugd +``` + +### Volume Management + +`sndioctl` is the program used to change audio device volume. It can be run as a non-privileged user: + +``` +$ sndioctl input.mute=1 +``` + +will mute the microphone, for example. + +``` +$ sndioctl output.level=+0.1 +``` + +will increase output volume by 10%, for example. + +### Environment Variables + +Passing the AUDIOPLAYDEVICE and AUDIORECDEVICE environment variables to a program will tell it to use the defined devices for playing or recording audio. This is useful if you have sndio set to play audio through one device, but your microphone is a different device. + +``` +$ AUDIOPLAYDEVICE=snd/1 AUDIORECDEVICE=snd/2 mumble +``` + +will tell this invocation of mumble to play audio through the audio1 device but record through audio2. + +## SSH and usepam + +[]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,98 @@ +# Permacomputing + +[← Back](./) + + +Permacomputing is an approach to computing inspired by permaculture, aiming to be more sustainable than our current consume-and-throw-away approach to building hardware and software systems. + +[]( + + +"Permaculture is an approach to land management and settlement design that adopts arrangements observed in flourishing natural ecosystems" + +[]( + + +It is related to Solarpunk which is a lifestyle movement and genre of art and fiction that envisions how the future might look if humanity adopted solutions that emphasised sustainability and human impact on the environment, in which humanity is re-integrated with nature, and where technology is used for human- and eco-centric purposes (as opposed to capital-centric). + +[]( + +[]( + + +Permacomputing aims to: + +* Create systems that minimize the use of non-renewable resources and strengthen human connection. +* Maximise the longevity of that which has already been produced, repair and salvage broken systems, and encourage cooperation in communities to avoid excessive consumption +* Keep things simple such that they can be reasonably understood by a single person (human-scale). Simple systems tend to have smaller hardware and energy requirements and are easier to maintain and manage. +* Build resilient software, hardware, and a vision/outlook that can withstand interruptions in resource flows, the collapse of the internet or power grid, and other disastrous scenarios. In essence: hope for the best, prepare for the worst. +* Design flexible systems that can be built upon, molded, and shaped. Support programmability and hacking instead of trying to imagine every possible use case. Allow users of your systems to mold it to their needs. +* Appreciate mature technologies, clear ideas, and well-understood principles when designing systems that are intended to last (i.e. systems that are not experimental or exploring new technologies). +* Build long-lasting systems upon stable platforms that are unlikely to significantly change in the future so that programs will continue to work for many decades to come, avoiding the phenomenon of software rot. +* Amplify awareness of the concrete world, how things work, and in what context things operate. Instead of shutting ourselves away in blind pursuits of knowledge and progress, explore the world that exists and create systems that amplify awareness of that world. +* Expose everything about the workings of a system. Things should be open, modifiable, and flexible, and nothing about the state of a system should be completely hidden from the user or programmer. +* Avoid pseudo-simplicity, where things are simple only in appearance. +* Design systems that adapt to changes in operating environments. Constant availability or operating performance should not be required. Software and hardware systems should not be obsoleted by changing needs and conditions. New software should be able to be written for old systems and old software should be able to be modified to respond to new needs. New hardware should be buildable from old components, and old components should continue to be integratable into new systems. +* Be present in the place and moment, but not ignorant of the past or future. Nothing is obsolete or irrelevant. +* Eschew the concepts of universality. Nothing is universal and there is no one correct way of doing things. +* Embrace uselessness and fun. Strict utilitarianism impoverishes and degrades the soul and spirit. +* Appreciate diversity, avoid monocultures, but recognize that standards are useful tools (e.g. UTF-8). There is a place for slow and fast, gradual and one-shot processes, and not everything should be examined from the same perspective. +* Cherish locality and avoid centralisation. Each community should have software and hardware systems that fit their needs and which they can adapt, maintain, and grow to serve themselves. + +Note that although Permacomputing heavily involves the ideas of simplicity, using what is stable, and generally goes against the current way we think of and treat computing, it does not advocate for going back in time, "living in the dark ages", or standing still and never improving what already exists. It advocates for a complete reframing of the way we think about computing to more carefully consider the effects, longevity, performance, maintainability, and sustainability of the systems we create. + +It combines the ideas of frugal computing (using computational resources only when necessary and as effectively as possible), salvage computing (making use of what has already been produced), and collapse computing (utilizing what can survive the collapse of industrial production or processes). + +## Some Permacomputing Technologies + +[The UXN Ecosystem]( + +[CollapseOS]( + + +Infrared ports and audio-cable-based data communication. They might be slow but they are simple and easy to hack on. (NOT Bluetooth. Anything but Bluetooth.) + +## Resources + +[Permacomputing 2020]( + +[Permacomputing Update 2021]( + +[XXIIVV Wiki on Permacomputing]( + +[Unplanned Obsolescence: Hardware and Software After Collapse]( + +[A pluriverse of local worlds: a review of Computing within Limits related terminology and practices]( + +[Regenerative Computing: De-limiting hope.]( + +[Abstraction, Indirection, and Sevareid's Law: Towards Benign Computing]( + +[Frugal Computing]( + +[Rustic Computing]( + +[The 100 Year Computer]( + +[Larry Wall's Quest for a 100-Year Programming Language]( + +[CivBoot]( + +[Simple Systems Manifesto]( + +[Maximalism and Virtualism]( + +[Design for Disassembly and Deconstruction]( + +[Collapse Informatics and Practice: Theory, Method, and Design]( + +[On Cosmotechnics For a Renewed Relation between Technology and Nature in the Anthropocene]( + +[Simple Made Easy - Rich Hickey]( + +[Re-evaluating technology]( + +[A New Old Idea]( + +[Tools For Thought by Howard Rheingold]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,29 @@ +# Personal Productivity-Sans-Burnout Tips + +[← Back](./) + + +End a session with clear next steps of what to do next: e.g. Know what needs to be implemented next in software, or know what comes next in a story or essay. Do not exert all energy at once. Stop when spirits are still high and the path ahead is clear. + +Control the scope of projects. Break things into smaller chunks and focus on those that will produce results quickly instead of worrying about the whole picture. + +Create habits around mundane parts of life to make room for creative thinking. + +Always have the ability to write down ideas and notes anywhere. + +Always have several problems or projects active for your subconscious to ponder. + +Apply new concepts/ideas/solutions to these whenever you encounter them. These can be material (e.g. How do I implement this feature?) or immaterial (e.g. How can we improve equality in society). + +Save information you come across that inspires, intrigues, or seems useful. + +Externalize checklists, mundane tasks, appointments and reminders to a more appropriate medium (notebook, notes or calendar app, etc). + +Save old ideas and projects even if they have "failed". They might still come in handy in the future. + +Design a space that encourages productivity and minimizes distraction (but don't fuss about making it perfect). + +## Helpful Links + +[]( + diff --git a/content/garden/arboretum/knowledge/ b/content/garden/arboretum/knowledge/ @@ -0,0 +1,120 @@ +# SOME THOUGHTS ON THE REAL WORLD BY ONE WHO GLIMPSED IT AND FLED + +[← Back](./) + + +Bill Watterson + +Kenyon College Commencement + +May 20, 1990 + +I have a recurring dream about Kenyon. In it, I'm walking to the post office on the way to my first class at the start of the school year. Suddenly it occurs to me that I don't have my schedule memorized, and I'm not sure which classes I'm taking, or where exactly I'm supposed to be going. + +As I walk up the steps to the postoffice, I realize I don't have my box key, and in fact, I can't remember what my box number is. I'm certain that everyone I know has written me a letter, but I can't get them. I get more flustered and annoyed by the minute. I head back to Middle Path, racking my brains and asking myself, "How many more years until I graduate? ...Wait, didn't I graduate already?? How old AM I?" Then I wake up. + +Experience is food for the brain. And four years at Kenyon is a rich meal. I suppose it should be no surprise that your brains will probably burp up Kenyon for a long time. And I think the reason I keep having the dream is because its central image is a metaphor for a good part of life: that is, not knowing where you're going or what you're doing. + +I graduated exactly ten years ago. That doesn't give me a great deal of experience to speak from, but I'm emboldened by the fact that I can't remember a bit of MY commencement, and I trust that in half an hour, you won't remember of yours either. + +In the middle of my sophomore year at Kenyon, I decided to paint a copy of Michelangelo's "Creation of Adam" from the Sistine Chapel on the ceiling of my dorm room. By standing on a chair, I could reach the ceiling, and I taped off a section, made a grid, and started to copy the picture from my art history book. + +Working with your arm over your head is hard work, so a few of my more ingenious friends rigged up a scaffold for me by stacking two chairs on my bed, and laying the table from the hall lounge across the chairs and over to the top of my closet. By climbing up onto my bed and up the chairs, I could hoist myself onto the table, and lie in relative comfort two feet under my painting. My roommate would then hand up my paints, and I could work for several hours at a stretch. + +The picture took me months to do, and in fact, I didn't finish the work until very near the end of the school year. I wasn't much of a painter then, but what the work lacked in color sense and technical flourish, it gained in the incongruity of having a High Renaissance masterpiece in a college dorm that had the unmistakable odor of old beer cans and older laundry. + +The painting lent an air of cosmic grandeur to my room, and it seemed to put life into a larger perspective. Those boring, flowery English poets didn't seem quite so important, when right above my head God was transmitting the spark of life to man. + +My friends and I liked the finished painting so much in fact, that we decided I should ask permission to do it. As you might expect, the housing director was curious to know why I wanted to paint this elaborate picture on my ceiling a few weeks before school let out. Well, you don't get to be a sophomore at Kenyon without learning how to fabricate ideas you never had, but I guess it was obvious that my idea was being proposed retroactively. It ended up that I was allowed to paint the picture, so long as I painted over it and returned the ceiling to normal at the end of the year. And that's what I did. + +Despite the futility of the whole episode, my fondest memories of college are times like these, where things were done out of some inexplicable inner imperative, rather than because the work was demanded. Clearly, I never spent as much time or work on any authorized art project, or any poli sci paper, as I spent on this one act of vandalism. + +It's surprising how hard we'll work when the work is done just for ourselves. And with all due respect to John Stuart Mill, maybe utilitarianism is overrated. If I've learned one thing from being a cartoonist, it's how important playing is to creativity and happiness. My job is essentially to come up with 365 ideas a year. + +If you ever want to find out just how uninteresting you really are, get a job where the quality and frequency of your thoughts determine your livelihood. I've found that the only way I can keep writing every day, year after year, is to let my mind wander into new territories. To do that, I've had to cultivate a kind of mental playfulness. + +We're not really taught how to recreate constructively. We need to do more than find diversions; we need to restore and expand ourselves. Our idea of relaxing is all too often to plop down in front of the television set and let its pandering idiocy liquefy our brains. Shutting off the thought process is not rejuvenating; the mind is like a car battery-it recharges by running. + +You may be surprised to find how quickly daily routine and the demands of "just getting by: absorb your waking hours. You may be surprised matters of habit rather than thought and inquiry. You may be surprised to find how quickly you start to see your life in terms of other people's expectations rather than issues. You may be surprised to find out how quickly reading a good book sounds like a luxury. + +At school, new ideas are thrust at you every day. Out in the world, you'll have to find the inner motivation to search for new ideas on your own. With any luck at all, you'll never need to take an idea and squeeze a punchline out of it, but as bright, creative people, you'll be called upon to generate ideas and solutions all your lives. Letting your mind play is the best way to solve problems. + +For me, it's been liberating to put myself in the mind of a fictitious six year-old each day, and rediscover my own curiosity. I've been amazed at how one ideas leads to others if I allow my mind to play and wander. I know a lot about dinosaurs now, and the information has helped me out of quite a few deadlines. + +A playful mind is inquisitive, and learning is fun. If you indulge your natural curiosity and retain a sense of fun in new experience, I think you'll find it functions as a sort of shock absorber for the bumpy road ahead. + +So, what's it like in the real world? Well, the food is better, but beyond that, I don't recommend it. + +I don't look back on my first few years out of school with much affection, and if I could have talked to you six months ago, I'd have encouraged you all to flunk some classes and postpone this moment as long as possible. But now it's too late. + +Unfortunately, that was all the advice I really had. When I was sitting where you are, I was one of the lucky few who had a cushy job waiting for me. I'd drawn political cartoons for the Collegian for four years, and the Cincinnati Post had hired me as an editorial cartoonist. All my friends were either dreading the infamous first year of law school, or despondent about their chances of convincing anyone that a history degree had any real application outside of academia. + +Boy, was I smug. + +As it turned out, my editor instantly regretted his decision to hire me. By the end of the summer, I'd been given notice; by the beginning of winter, I was in an unemployment line; and by the end of my first year away from Kenyon, I was broke and living with my parents again. You can imagine how upset my dad was when he learned that Kenyon doesn't give refunds. + +Watching my career explode on the lauchpad caused some soul searching. I eventually admitted that I didn't have what it takes to be a good political cartoonist, that is, an interest in politics, and I returned to my firs love, comic strips. + +For years I got nothing but rejection letters, and I was forced to accept a real job. + +A REAL job is a job you hate. I designed car ads and grocery ads in the windowless basement of a convenience store, and I hated every single minute of the 4-1/2 million minutes I worked there. My fellow prisoners at work were basically concerned about how to punch the time clock at the perfect second where they would earn another 20 cents without doing any work for it. + +It was incredible: after every break, the entire staff would stand around in the garage where the time clock was, and wait for that last click. And after my used car needed the head gasket replaced twice, I waited in the garage too. + +It's funny how at Kenyon, you take for granted that the people around you think about more than the last episode of Dynasty. I guess that's what it means to be in an ivory tower. + +Anyway, after a few months at this job, I was starved for some life of the mind that, during my lunch break, I used to read those poli sci books that I'd somehow never quite finished when I was here. Some of those books were actually kind of interesting. It was a rude shock to see just how empty and robotic life can be when you don't care about what you're doing, and the only reason you're there is to pay the bills. + +Thoreau said, + +"the mass of men lead lives of quiet desperation." + +That's one of those dumb cocktail quotations that will strike fear in your heart as you get older. Actually, I was leading a life of loud desperation. + +When it seemed I would be writing about "Midnite Madness Sale-abrations" for the rest of my life, a friend used to console me that cream always rises to the top. I used to think, so do people who throw themselves into the sea. + +I tell you all this because it's worth recognizing that there is no such thing as an overnight success. You will do well to cultivate the resources in yourself that bring you happiness outside of success or failure. The truth is, most of us discover where we are headed when we arrive. At that time, we turn around and say, yes, this is obviously where I was going all along. It's a good idea to try to enjoy the scenery on the detours, because you'll probably take a few. + +I still haven't drawn the strip as long as it took me to get the job. To endure five years of rejection to get a job requires either a faith in oneself that borders on delusion, or a love of the work. I loved the work. + +Drawing comic strips for five years without pay drove home the point that the fun of cartooning wasn't in the money; it was in the work. This turned out to be an important realization when my break finally came. + +Like many people, I found that what I was chasing wasn't what I caught. I've wanted to be a cartoonist since I was old enough to read cartoons, and I never really thought about cartoons as being a business. It never occurred to me that a comic strip I created would be at the mercy of a bloodsucking corporate parasite called a syndicate, and that I'd be faced with countless ethical decisions masquerading as simple business decisions. + +To make a business decision, you don't need much philosophy; all you need is greed, and maybe a little knowledge of how the game works. + +As my comic strip became popular, the pressure to capitalize on that popularity increased to the point where I was spending almost as much time screaming at executives as drawing. Cartoon merchandising is a $12 billion dollar a year industry and the syndicate understandably wanted a piece of that pie. But the more I though about what they wanted to do with my creation, the more inconsistent it seemed with the reasons I draw cartoons. + +Selling out is usually more a matter of buying in. Sell out, and you're really buying into someone else's system of values, rules and rewards. + +The so-called "opportunity" I faced would have meant giving up my individual voice for that of a money-grubbing corporation. It would have meant my purpose in writing was to sell things, not say things. My pride in craft would be sacrificed to the efficiency of mass production and the work of assistants. Authorship would become committee decision. Creativity would become work for pay. Art would turn into commerce. In short, money was supposed to supply all the meaning I'd need. + +What the syndicate wanted to do, in other words, was turn my comic strip into everything calculated, empty and robotic that I hated about my old job. They would turn my characters into television hucksters and T-shirt sloganeers and deprive me of characters that actually expressed my own thoughts. + +On those terms, I found the offer easy to refuse. Unfortunately, the syndicate also found my refusal easy to refuse, and we've been fighting for over three years now. Such is American business, I guess, where the desire for obscene profit mutes any discussion of conscience. + +You will find your own ethical dilemmas in all parts of your lives, both personal and professional. We all have different desires and needs, but if we don't discover what we want from ourselves and what we stand for, we will live passively and unfulfilled. Sooner or later, we are all asked to compromise ourselves and the things we care about. We define ourselves by our actions. With each decision, we tell ourselves and the world who we are. Think about what you want out of this life, and recognize that there are many kinds of success. + +Many of you will be going on to law school, business school, medical school, or other graduate work, and you can expect the kind of starting salary that, with luck, will allow you to pay off your own tuition debts within your own lifetime. + +But having an enviable career is one thing, and being a happy person is another. + +Creating a life that reflects your values and satisfies your soul is a rare achievement. In a culture that relentlessly promotes avarice and excess as the good life, a person happy doing his own work is usually considered an eccentric, if not a subversive. Ambition is only understood if it's to rise to the top of some imaginary ladder of success. Someone who takes an undemanding job because it affords him the time to pursue other interests and activities is considered a flake. A person who abandons a career in order to stay home and raise children is considered not to be living up to his potential-as if a job title and salary are the sole measure of human worth. + +You'll be told in a hundred ways, some subtle and some not, to keep climbing, and never be satisfied with where you are, who you are, and what you're doing. There are a million ways to sell yourself out, and I guarantee you'll hear about them. + +To invent your own life's meaning is not easy, but it's still allowed, and I think you'll be happier for the trouble. + +Reading those turgid philosophers here in these remote stone buildings may not get you a job, but if those books have forced you to ask yourself questions about what makes life truthful, purposeful, meaningful, and redeeming, you have the Swiss Army Knife of mental tools, and it's going to come in handy all the time. + +I think you'll find that Kenyon touched a deep part of you. These have been formative years. Chances are, at least of your roommates has taught you everything ugly about human nature you ever wanted to know. + +With luck, you've also had a class that transmitted a spark of insight or interest you'd never had before. Cultivate that interest, and you may find a deeper meaning in your life that feeds your soul and spirit. Your preparation for the real world is not in the answers you've learned, but in the questions you've learned how to ask yourself. + +Graduating from Kenyon, I suspect you'll find yourselves quite well prepared indeed. + +I wish you all fulfillment and happiness. Congratulations on your achievement. + +Bill Watterson + +Mirrored from: diff --git a/content/garden/arboretum/opinions/ b/content/garden/arboretum/opinions/ @@ -0,0 +1,110 @@ +# Computing Hardware Opinions + +[← Back](./) + + +## Framework + +**GENERALLY POSITIVE** (Last Updated: 2022-09-19) + +I don't have a Framework laptop simply because I don't need a new laptop right now. However, if I had to purchase a brand new laptop today, I would probably choose this one. Most of these thoughts are based on the videos I've seen and accounts from people I know who have one. + +Here's a good review from someone with similar priorities in laptops to myself: + +[]( + + +Some positives: + +* Excellent repairability compared to most other modern laptops +* Excellent resolution, 200DPI, 13.5" glossy display +* Good company ethos and track record so far (offering standalone motherboards and top case lids for upgrades) +* Plenty of spare parts available for purchase; repair guides and schematics also available +* Keyboard has a good amount of travel compared to other contemporary laptops +* Performance is quite good with 12th-gen Intel processors +* It is quite portable thanks to its size and weight + +Some negatives: + +* Screen/lid feels flimsy and doesn't feel like a quality part compared to Dell XPS or MacBook, (supposedly that has been improved in the latest iteration?) +* The number of ports is limited and the whole modular port idea isn't really that compelling compared to just having lots of I/O (more below) +* Battery life is sub-par (~6 hours for normal use) +* Aesthetically, I prefer the squared/boxy looks of the MacBooks compared to this angular look of the Framework and other laptops, but that's not a big deal + +### A Rant About Modular Ports + +TL;DR: What I'm saying is that, while the modular port idea is kind of cool, the level of I/O available for the Framework is not any better than most contemporary laptops and they don't live up to the purpose they're marketed for (eliminating dongles). In a lot of relatively common usecases, it doesn't eliminate the need for a typical dongle or docking station with even more ports. I'd much rather have way more, denser I/O on a replaceable circuit board (which would also enable repairability and upgradability) in the Framework than these expansion ports, or have a combination of the two solutions. We can keep one or two of these expansion slots and at the same time have a collection of two or three USB-A ports, two USB-C ports, and a display connector just built into the laptop like how laptops used to be in the era of PCMCIA cards. That's a level of I/O sure to garner a lot of praise while keeping the aspects that are good about the expansion slots. + +While at first the idea of modular ports seems really cool and compelling, I would liken it more to a gimmick than a useful feature compared to the alternative. The big issue with these ports is that you're not only paying a sizeable amount of extra money for what are essentially recessed, single-purpose USB-C dongles ($12 a piece for USB-A and C, $25 for display connectors or SD card, $51 for ethernet (prices in CAD)), you're also quite limited in terms of the number of slots available. + +There are only 4 available expansion slots on the Framework. One of them must be USB-C if you wish to charge so that leaves 3 choices. Many will then choose one HDMI or DisplayPort to be able to hook the laptop up to an external monitor or projector and the final 2 might be another USB-C to be able to charge on the other side of the laptop and a USB-A to be able to plug in some peripheral, USB stick, or external drive. So, that's likely 2 USB-C, 1 USB-A, and one HDMI/DisplayPort. Not a lot of I/O for $61 CAD (roughly $46 USD) worth of single-use dongles. + +That's not even counting that you can buy 250GB or 1TB storage cards, which is a really cool idea since it's basically like an integrated USB thumb drive or spare hard disk that you can plug and unplug from your laptop like it's an old Thinkpad UltraBay, but you lose a whole port of I/O when they're plugged in. Also, if you use them like regular USB thumb drives, well, a regular USB thumb drive is going to be way more convenient since you won't have to fiddle with a latch on the bottom of the laptop just to disconnect the drive. + +Then there's the argument that these ports allow for upgrades of existing ports or changing to a new port standard. If you can upgrade an older SD card slot to one that supports faster speeds, that's way better than having an old and now less useful SD card slot built into the computer. This is definitely an advantage of the modular ports and why I don't want to see them disappear but, at the same time, an increase in speed also needs to come with a motherboard that supports it. If the Framework has 4 recessed USB-C ports that are all USB4 20Gbps, you're limited to that no matter the speed supported by a new port. For example, HDMI 2.0 has a maximum bandwidth of 18Gbps, but HDMI 2.1 has a maximum bandwidth of 48Gbps so it doesn't matter if your HDMI expansion card theoretically supports a resolution of 8K 120Hz if the laptop simply cannot do that. + +Now, this is still nice because you can just upgrade your expansion cards and motherboard and keep the rest of the laptop (battery, screen, keyboard, etc.) which is undoubtedly good, but there's also no reason that we can't also have built-in, denser I/O. Even 5Gbps USB speeds and older HDMI/DisplayPort standards are fast enough for most people's uses today and have been for the past decade (many people get by just fine with resolutions at 4K 60Hz or lower which has been supported since HDMI 2.0 (2013) and DisplayPort 1.2 (2010)). Most commonly available USB thumb drives and external SSDs aren't that limited by USB 3.0 5Gbps speeds either, if at all. These ports don't need to be upgraded every couple of years or even every decade; those speeds are fast enough for the majority of uses these days and for the foreseeable future. + +These modular ports also just end up being much more inconvenient compared to an all-in-one dongle which might have 2 USB-A 5Gbps ports, 2 USB-C ports, HDMI, and a card reader in one, combined, less expensive package that's not much larger than two of the Framework expansion cards put together ([Here's an example on Amazon]( If you want to switch up your ports instead of just picking a loadout and sticking with it, you end up with a lot of these expansion cards that you have to carry with you or throw in a drawer at your desk (one for Ethernet, another USB-A, maybe a different display connector, etc.). It's way less convenient to carry around a box of the Framework expansion cards to be able to reconfigure your ports on the fly when you can just carry around a single dongle that has all the extra ports you might need, even if you don't use some of the ports on that dongle. Not to mention the cost of all the extra Framework expansion cards compared to the cost of that one dongle. + +Yes, you're not going to have a dongle hanging off your laptop with the built-in, swappable ports but that doesn't matter if the I/O in the laptop is too limited anyways because there simply aren't enough ports for what you need. If you want to "dock" your Framework to a workstation with two monitors, a keyboard, and a mouse, you're still going to need a dongle because there won't be any ports left to charge your laptop. If you want to hook up a thumb drive, keyboard, and mouse while charging, you'll still need a dongle because you won't have enough ports left for any external displays. If we had enough ports on our laptops in the first place, we wouldn't need dongles at all. Framework didn't solve this, they just said they did. + +## Thinkpads + +**NEGATIVE** (Last Updated: 2022-08-29) + +"The Cult of the Thinkpad" is a very accurate way to describe the collection of people who worship this sub-par hardware. Thinkpads are creaky, plasticy, loud, hot, and have terrible screens and battery life. If you have a newer Thinkpad which is not necessarily as loud or hot and might have a better screen or better battery life, they're worse than comparable models from companies like Dell because at least those don't have soldered-on RAM or WiFi cards. + +My experience with the T440s and T420s that I have owned was that they were great machines at first, but quickly started to fall apart in various ways. My T440s had its internal battery die, and then its trackpad became flakey, and then its external battery died, all within one year of ownership. My T420s, aside from being just generally hot and loud with a terribly undersized cooling solution, has had a genuine replacement battery fail within one year and the screen, in comparison to my MacBook Pro from 2009, is absolutely awful to look at. + +Both were plasticy and creaky, especially compared to laptops like the Dell XPS and my MacBook Pro. I want to stress that a MacBook Pro from 5 years before the T440s and 2-3 years before the T420s has a better look and feel than these Thinkpads. + +One thing they do have going for them is their repairability. Sure you can swap parts relatively easily, but, if we're being honest, they're far from the only laptops that allow that. Dell Precision and Latitude notebooks have allowed that for a long time, as has HP's professional line of laptops, and especially today with the likes of the MNT Reform and Framework, what's the point of putting up with the awful user experience that old Thinkpads offer. + +If you like your Thinkpad, and have spent hundreds of dollars on adding an IPS display, upgrading the battery, adding an extra drive in the ultrabay, repairing your hinges, and so on, then I'm glad that you have something that you enjoy. I simply do not think those machines are worth that much time and effort. + +## Apple + +**NEGATIVE** (Last Updated: 2022-08-29) + +Despite using a MacBook Pro and an iPhone (both of which I got for free), I really dislike Apple. + +They have some of the best UI/UX, best feeling hardware, and the best ecosystem out of any tech company that currently exists. However, that comes at a great human cost. Not only does Apple treat their customers like they are impotent morons, they are known to have known about yet continued to use slave labour through the factories they contract to produce their products. + +They have consistently fought against right to repair under the guise of improving user privacy and security, but in reality it's because such things would hurt their bottom line. + +They have driven industry-wide trends (because most other manufacturers are incapable of being original and just copy what Apple does) that have seen the removal of removable batteries, headphone jacks, and ports from computers under the guise of things like waterproofness or design, but in reality it's so they can sell more devices or complementary products. + +They have strategically blocked third-party ads under the guise of improving privacy for their users only to announce that they're aiming to increase their own ad revenue by six billion dollars by serving more first-party ads to their users. + +They are an unethical, anti-consumer company devoid of morals and with a holier-than-thou attitude, driving us straight into the tech dystopia right along with Google, Microsoft, Meta and others like them. As much as I can admire their design skill and attention to detail, I will never give them my money. + +## Seasonic/EVGA PSUs + +**POSITIVE** (Last Updated: 2022-05-03) + +Consistently high quality PSUs that are designed and perform well. Worth every penny they cost to not have to worry about the reliability of one of the most important components in a desktop system. + +## Noctua Coolers/Fans + +**POSITIVE** (Last Updated: 2022-05-03) + +Consistently high quality and reliable products with one of the best mounting systems in the industry. They're a company that respects both their customers and employees, and they make products worth every penny. + +## Logitech Mice + +**POSITIVE** (Last Updated: 2022-05-03) + +I have owned a G420 and an MX Ergo, and both have been fantastic with no issues. They are solid and reliable input devices that have never caused me frustration. The MX Ergo is the best mouse I have purchased and has made using a computer a lot more comfortable. + +## G.Skill RAM + +**POSITIVE** (Last Updated: 2022-05-03) + +I have used a few kits of G.Skill RAM (both DDR4 and DDR3) over the years and they have been solid and reliable. They use high-quality memory dies and controllers so I am confident that, when I buy RAM modules from them, they will be able to reach their advertised speeds and be reliable for a long time. + +## Dell Prebuilt Desktop PCs + +**NEGATIVE** (Last Updated: 2022-05-03) + +In recent years, Dell has become notorious for attempting to scam customers into various support contracts. They also design very bad systems with proprietary components that end up as e-waste after a few years. Avoid if at all possible. Check out Gamer's Nexus on YouTube for their coverage of Dell prebuilt gaming PCs. diff --git a/content/garden/arboretum/opinions/ b/content/garden/arboretum/opinions/ @@ -0,0 +1,42 @@ +# Opinions + +``` + _---~~(~~-_. + _{ ) ) + , ) -~~- ( ,-' )_ + ( `-,_..`., )-- '_,) + ( ` _) ( -~( -_ `, } + (_- _ ~_-~~~~`, ,' ) + `~ -^( __;-,((())) + ~~~~ {_ -_(()) + `\ } + { } +Art By: Steven James Walker <> +``` + +[← Back](../) + + +This is where I keep and catalog all of the opinions I care to write down and +share. This is something I use both as a personal reference when I'm having +discussions with people and as a place to point people to get them up to speed +about my thoughts on a given subject. + +Please keep in mind that the older an opinion is here, the less likely it may be +to still reflect my current thoughts. I do come back and re-evaluate them +occasionally, but know that I am not steadfast in all of my opinions and things +will change over time. + +I have categorized my opinions to make them easier to find: + +[Computing Hardware](computing-hardware.html) + +[Operating Systems](operating-systems.html) + +[Software Licensing](software-licensing.html) + +[Video Games](video-games.html) + +[Miscellaneous Opinions](miscellaneous.html) + + diff --git a/content/garden/arboretum/opinions/ b/content/garden/arboretum/opinions/ @@ -0,0 +1,54 @@ +# Miscellaneous Opinions + +[← Back](./) + + +## Emoji + +**POSITIVE/MIXED** (Last Updated: 2022-08-28) + +I think emoji get an undue amount of hate from certain online communities (e.g. Reddit). Sometimes it's an understandable level of derision because of how people can overuse them to the point where they lose all their meaning and become something that clutters text instead of clarifying its meaning. + +Overall I think emoji are a good thing. They allow us to express the emotion or intent behind a statement in a way that emoticons (:-), :-*, :S, etc.) do not allow. An emoticon equivalent of 🥺 or 🥲 are not easily replicated in ASCII text form. They are very effective when used to this end, and can help remove a lot of the tone ambiguity from text-only forms of communication. + +However, I dislike three main aspects of emojis: + +1. The design is not standardized, which means emoji can look different on different systems, kind of eliminating the reason they were created in the first place + +2. They are very western and Japanese society centric. The origin of emoji is Japan, and there are a lot of Japanese-specific emoji in there as well as an overabundance of western and white cultural icons and an absence of those of other cultures. + +3. A lot of emoji are unnecessary. They should be limited to symbols that help express meaning more clearly, not things like 🗻, 💒, and 🍍. The Unicode Consortium is famous for not adding things like a vacuum cleaner emoji because "that function is represented in the broom emoji" (both of which I think shouldn't be in anyways) yet also add "➕" for which an identical symbol "+" exists. + +[Designing With Emoji]( + + +## Leuchtturm1917 Journals + +**POSITIVE** (Last Updated: 2022-05-03) + +Consistently high quality paper, features, and bindings with hard covers that are available in multiple colours. The paper is also some of my favourite to write on. + +## Rhodia Paper Products + +**POSITIVE** (Last Updated: 2022-05-25) + +Excellent paper and a wide variety of sizes, prints, and form factors. My favourite are the top bound spiral notebooks with dot grid printing, orange covers, and A5 size paper, but I've also used some notebooks and other notepads from them over the years. + +## Casio fx-991EX Calculator + +**POSITIVE** (Last Updated: 2022-05-03) + +A fantastic, versatile, and durable calculator with many functions including: solving integrals and derivatives, linear systems of equations, and matrices. The visual equation display also makes it very easy to read what's on the screen. I prefer to always have it with me wherever I am, as I find it much nicer to use than a calculator on my PC or phone. + +## Skullcandy Earbuds + +**POSITIVE** (Last Updated: 2022-05-03) + +The only pairs of earbuds that I have ever purchased which have lasted longer than a handful of months. They are also the ones that sit most comfortably and securely in my ears, and I like the sound profile. I keep buying their ~$30 pair of wired earbuds (I have only had to buy two pairs over the past three years). + +## Busybox + +**NEGATIVE** (Last Updated: 2022-05-03) + +Added [awful, disgusting quality code]( to one of their utilities all to [avoid having someone's name and copyright]( +associated with the project. diff --git a/content/garden/arboretum/opinions/ b/content/garden/arboretum/opinions/ @@ -0,0 +1,43 @@ +# Operating System Opinions + +[← Back](./) + + +## Manjaro Linux + +**NEGATIVE** (Last Updated: 2022-09-13) + +Manjaro is a troubled distribution that got a PR boost through being easy to use and gamer friendly. However, it has had multiple problems throughout the years including multiple, repeated expirations of their SSL certs, misuse of donated funds to buy the project leader a new laptop against the wishes of the project's treasurer (who promptly resigned), shipping work-in-progress software as if it was stable, and more. + +This is a good summary: + +[]( + + +Do not use Manjaro. + +## ElementaryOS + +**POSITIVE** (Last Updated: 2022-05-03) + +A project with design as its number one priority. They are creating a beautiful, usable, easy-to-recommend Linux distribution. While they aren't perfect and still have a number of issues, I think they're an important project to keep an eye on. + +## Fedora Linux + +**POSITIVE** (Last Updated: 2022-05-03) + +One of the only Linux distributions I've tried which well and truly gets out of my way, doesn't break, and doesn't require a ton of fiddling for basic things. It's the _only_ Linux distribution I've tried which allowed me to print _and_ scan with my hplip-supported HP printer out of the box. Note that I have only used Fedora KDE and Fedora Cinnamon, not Fedora with GNOME. + +## OpenSUSE Tumbleweed Linux + +**POSITIVE** (Last Updated: 2022-05-03) + +I have pretty much the same thoughts about OpenSUSE Tumbleweed as I do about Fedora, with a couple of exceptions. OpenSUSE does take more effort to set up than Fedora, though not by much (mostly adding some repos for the software I want) and I did have to manually install printer drivers to get my printer and scanner to work, but it did work without issue. OpenSUSE has a slight advantage in that Tumbleweed is a rolling release distribution unlike Fedora's 6-month regular release schedule, and OpenSUSE does full disk encryption properly because it encrypts not only your root file system, but also the boot partition so you have to enter a password in GRUB to start booting unlike almost every other Linux distribution. + +## OpenBSD + +**POSITIVE** (Last Updated: 2022-05-03) + +I love the philosophy and development practices of the developers. They are a model for anybody in software development because of their focus on security, documentation, clean code, and not bending to the will of every person who wants their special features in the OS. They build what they want for themselves, and they do a damn good job. + +OpenBSD ships with a useful set of server software containing only needed functionality with little to no extraneous components or features. They have a very tight security footprint, as they prioritize security above all else. Their operating system is very easy to use, very well documented (to the point where you find your answers on the OS in the manpages instead of in half-assed SEO-optimized blogs that are years old), and very reliable and easy to administrate. diff --git a/content/garden/arboretum/opinions/ b/content/garden/arboretum/opinions/ @@ -0,0 +1,43 @@ +# Software Licensing Opinions + +[← Back](./) + + +## Copycentre/Anti-Copyright Licenses + +**POSITIVE** (Last Updated: 2022-05-03) + +Licenses which are simple, easy to understand for everyone, and don't place +undue burden on developers or users. My preferred licenses are: the Unlicense, +CC0, the ISC/MIT/BSD-2-clause Licenses, and CC-BY. + +## Copyleft Licenses + +**NEGATIVE** (Last Updated: 2022-05-03) + +They utterly fail at their stated goal, instead reinforcing copyright as a tool +to get one's way and protect one's "intellectual property". This results in much +more hassle for developers with no true real-world gain compared to +anti-copyright or copycentre licenses. Read [A Critique of Free +Software](/a-critique-of-free-software) and [Free Software is an Abject +Failure](/blog/free-software-is-an-abject-failure) for more on this topic. + +## "Ethical" Licenses + +**NEGATIVE** (Last Updated: 2022-05-03) + +Licenses that attempt to control how one can use software without any real basis +in law or reality. They are, practically, just proprietary source-available +licenses that don't achieve anything meaningful. + +## FSF/OSI + +**NEGATIVE** (Last Updated: 2022-05-03) + +Organizations that place themselves in the position of deciding what is and +isn't an "approved license". Not only are they run by people famous for +bikeshedding and doing next to nothing actually useful for the industry +(remember the FSF sending a hard drive to Microsoft telling them to put the +Windows 7 source code on it?), they can't even make consistent decisions about +the licenses they approve (e.g. the SSPL is just a stronger AGPL, but they both +call it "non-free"). diff --git a/content/garden/arboretum/opinions/ b/content/garden/arboretum/opinions/ @@ -0,0 +1,45 @@ +# Video Game Opinions + +[← Back](./) + + +## Elite Dangerous + +**Score**: 75/100 +**Hours Played**: 86 +**Last Updated**: 2022-12-27 + +I own the Horizons expansion but not Odyssey (for which the launch was a disappointing mess). I do find some aspects of the game fun; the graphics are pretty, the ship models are beautiful, and exploring the universe can be fun and rewarding. However, I found that the game doesn't have anywhere near enough depth or detail to keep me engaged. Most of the professions got stale and felt repetitive after a while. Most of the gameplay feels grindy and the game world feels kind of empty because things are procedurally generated and the world is so large that seeing another player is really rare outside of the super heavily populated systems. + +I often find myself asking: "Why am I even doing this?" when I launch it and start to explore or trade or gather some rare material to upgrade my ship. I don't see much of a point because I'm just grinding these things for me and there's no overarching story or goal I'm working towards. The game might be multiplayer, but there isn't anywhere near enough of an adequate framework to facilitate socialization or bonding with your fellow players unless you want to join some Discord servers or forums. Unlike EVE Online, Elite Dangerous really doesn't feel like an MMO, it feels like a singleplayer game that your friends can join in occasionally for co-op play. + +It's a game that was revolutionary at its time and a game that many astronomy/spaceship enthusiasts will likely enjoy, but to me it feels kind of shallow and pointless, especially when your friends don't want to accompany you for idle jumping from star system to star system or the hundredth identical bounty hunting mission. Even the "space trucking simulator" aspects are dull compared to Euro Truck Simulator 2 or similar games. + +I think the game could be improved by including more social aspects: making it easier to find and play with a group of players, allowing groups to have their own bases (more than the money-sink fleet carriers) or manufacturing facilities, and possibly even allowing them to control/manage a system or two. That would go a long way to making the more grindy aspects of the game feel like they have a purpose and make the game feel much more worthwhile, but I suspect the game is not built to facilitate this. + +## Star Citizen + +**Score**: 85/100 +**Hours Played**: 150+ +**Last Updated**: 2022-12-27 + +In contrast to Elite Dangerous, I only recently got into and purchased Star Citizen. So far, despite bugs and the occasional crash, it has been really fun to play and explore. I went into it not only with the knowledge that it is still in alpha and that I can expect bugs, but also that, because it is in alpha, there are going to be wipes of the things you own (your character, your money, etc.) which means that I play with the goal of exploring and having fun instead of having some kind of pressure to get up to the level the other players are at. + +Star Citizen offers an experience that isn't like any other game on the market at the moment. It offers a combination of the multiplayer aspects of EVE Online, the exploration and profession (i.e. trading, bounty hunting, mining, etc.) aspects of Elite Dangerous, with the first person gameplay aspects of No Man's Sky in a setting that is more detailed than all of those other games combined. It is, in essence, the kind of space exploration era game I've been wanting to play since I got into games like Kerbal Space Program and EVE Online. + +The game is currently lacking mechanics that drive the player to do things. There isn't really a point to grinding to make a bunch of money unless you want to own/use/explore a ship that you don't own (but you can do this once or twice a year during the global Invictus and Intergalactic Aerospace Expo events) or unless you want to practice your skills. Once a new player is done exploring all the game has to offer, it generally becomes a sandbox where various guilds organize things like races, combat scenarios, PvP tournaments, or just roleplay as paramedics or bounty hunters. More is slowly being added to the game to bring a purpose to players' actions, and more is being done to facilitate emergent PvP and co-op gameplay over time, so it's still worth revisiting every few months to see what is new until core gameplay loops take hold. + +Finally, although the pace of development has felt very slow, it does seem to be picking up as the development team finalizes core engine components and they finally seem to have figured out exactly what they want the game to be. (Yes, it took a long time to get to that point, but it is what it is.) + +## Cities Skylines + +**Score**: 74/100 Vanilla, 88/100 Modded +**Hours Played**: 92 +**Last Updated**: 2022-12-27 + +When this game came out it was the spiritual successor to the much beloved Sim City 4 and was beloved by fans of the City Builder genre worldwide, myself included. I've played many hours vanilla, I've modded the game to the point that it made my computer run out of free memory (the Unity Engine seems to have a memory management problem), and have built many cities from scratch. I also own a large number of the DLCs available for the game. I can confidently say that it is a fun and engaging city builder and a fan of the genre will most likely enjoy playing for many hours. However, the vanilla game does leave me wanting for more. + +Although the game is made by a European game studio, it seems that the cities they have you build are very North American (i.e. bad) in design. There is a lack of mixed-use zoning/buildings, mixed infrastructure beyond roads that either have a bike or a bus lane, and detailed traffic management. The game needs heavy modding to add these, and it's a ton of work to do so, but ultimately worth it when you can make a well-designed city that doesn't have traffic jams everywhere because the AI only seems to ever want to use one lane. + +Despite its issues (which are largely fixed by mods and some time and effort), it is a pretty good game. I'd love to see a lot of what the mods have added with regards to mixed use/modern city building in whatever the next iteration of the game is but, if you're willing to put in the time and effort (and have enough RAM), the modded experience is great. + diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,15 @@ +# C + +[← Back](./) + + +[A collection of helpers for ANSI C]( + + +[Advanced C: The UB and optimizations that trick good programmers.]( + + +[How I program C]( + + +^ By the same person who made the "Advanced C" video, this video is way more useful than the title lets on. It goes over a lot of advanced programming concepts and writing good C code. diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,15 @@ +# General Programming Tips and Advice + +[← Back](./) + + +## Refactoring + +A nice technique when refactoring large amounts of code is to use the compiler to catch missed replacements. This is something that's afforded to you by strongly/statically typed languages but not languages like Python or JavaScript where, if you miss a replacement, you have no idea if you broke something until you hit that piece of code. This can be called the "compile by fire" technique. + +A helpful technique for catching errors is also to wrap a block of code in an outer block, define the variable with a type you know is not the type of the variable to be replaced, and then let the compiler yell at you to fix things because the types don't match. For example, if you're replacing an integer variable called "c" with one called "constant", surround relevant blocks of code in {} (or whatever your language has for denoting blocks) and define "float c;" at the top or something like that. + +From: + +[]( + diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,39 @@ +# Using Git + +[← Back](./) + + +Mostly things I don't do often and want a quick reference for. + +## Making a Release + +Create an annotated tag: + +``` +git tag -a <tag name> +``` + +Add any relevant text (see Generating a Changelog below). + +Use: + +``` +git push --tags +OR +git push --follow-tags +``` + +To either push the latest tag, or push tags with any un-pushed commits respectively. + +Add the following to ~/.config/git/config to make that default behaviour when doing git push: + +``` +[push] + followTags = true +``` + +## Generating a Changelog + +``` +git shortlog --numbered <previous_tag>..HEAD +``` diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,37 @@ +# Programming and Computing + +``` + ___________________________________ +|.-.--.--.--.--.--.--.--.--.--.--.-.| +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +||_|__|__|__|__|__|__|__|__|__|__|_|| +[_>_______________________________<_] +||"|""|""|""|""|""|""|""|""|""|""|"|| +|| | | | | | | | | | | | || +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +||(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)(_)|| +|'-'--'--'--'--'--'--'--'--'--'--'-'| jgs +`"""""""""""""""""""""""""""""""""""` +``` + +[← Back](../) + + +[C](c.html) + +[General Programming Tips and Advice](general-programming-tips-advice.html) + +[Using Git](git.html) + +[Programming Philosophy](programming-philosophy.html) + +[Raku](raku.html) + +[Style](style.html) + +[Vim](vim.html) + diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,53 @@ +# Programming Values + +[← Back](./) + + +* Beautiful is better than ugly. +* Explicit is better than implicit. +* Simple is better than complex. +* Complex is better than complicated. +* Flat is better than nested. +* Sparse is better than dense. +* Readability counts. + +One does not have to be an expert or engineer to program in a non-professional setting. Programming should be open and available to all. In the same way anyone can pick up a hammer and hang a painting or put together furniture, one should be able to slap together a temperature monitor or work with data with ease. Some great examples of this are Excel and visual programming systems. + +## Paraphrasing Alex Wennerberg's ( impromptu rant about StackOverflow and the state of the Software Engineering industry while working on Advent of Code 2022 Day 2: + +> I don't like StackOverflow. It's not the best. It's not where I want us to go. 'Cause it's not knowledge, it's just information. The problem is that we have these systems that are so complex that no one could conceivably understand all of them. No one could possibly understand all of the systems that some professional engineer works with in, for example, AWS. So what we have to do is get really good in the whole industry about building tools for partial understanding so that if you know a little bit about one thing you can learn a little bit about another thing. StackOverflow is really good about that. You can get a lot of partial understanding about a lot of different things. Which is good in some sense, but I think the fact that we're not using systems that we can understand deeply is a fundamental problem. + +> We've gone so far into complexity that no person can understand the whole system or some programming environment top to bottom. Whereas with Forth you can understand the entire programming environment from machine to source code. I can tell you where all the bits and bytes go, and all of the operations and all of the memory access. That is not even remotely possible even with a language like C these days and I think what's unfortunate is that we're moving so far away from that, that people don't understand computers. The future we're headed to is one in which you don't even understand them at the level that we do now because you just have a machine that you feed some input into and it gives you something that you don't exactly understand but maybe kinda fits the problem that you're doing, and it's probably really inefficient, and maybe it's correct? I don't know. Because the machine spit it out. I think that's not where we should be going as an industry. + +> We should be going more towards understanding systems deeply, and building things correctly as opposed to offloading knowledge onto some other machine that does more stuff for us. People talk about these as if it's this magic system that is like SkyNet that just thinks for you, but that's not how these systems work. You interact with these AI, and they do something—and they can do something that's really impressive—but it doesn't give you knowledge, it just gives you information. There was something that Facebook released where you just type in something like "give me an encyclopedia article about Bernie Sanders". And you read it. And all but one or two things this machine spit out was wrong. The system doesn't give you knowledge. It's not that these systems are useless, they just don't actually understand the domain and you still need human beings that have abstract understanding of a system or a field in order to create and disseminate knowledge. What I worry is that those institutions are not being invested in. Things like libraries, Wikipedia, universities—these institutions are where knowledge happens and we undervalue and de-value that kind of knowledge work in favour of crazy, flashy AI things. + +> That's why you have to learn Forth. That's why you have to suffer through the bits and the bytes. You have to suffer because suffering will make you a better person. It will make you a better programmer to suffer. But it's a specific kind of suffering, it's not toil. Toil is how most people do engineering work. Toil is like: "Ugh, why is this code so bad. What does this system even do?" and that's so horrible. To deal with toil as an engineer is miserable but that's what most of Software Engineering is. And so we just proliferate toil. That's how we do engineering. And then we say we'll just hire 5,000 engineers and they'll all toil. Whereas doing something like Forth is a different kind of suffering. It's the suffering of developing an understanding that you didn't have before. It's the suffering of really mastering something really deeply which, I think, unfortunately, is something we do less and less as engineers. + +##'s Take on Perl + +> So I’ve been meaning to write a post about my Perl “hot takes” so to speak, or at least what I like about the language and why I unironically defend it + +> I first got into Perl back in 2015, after having used C, PHP, JavaScript, and Shell Scripting. I started playing around with different languages to decide on one to learn and decided to make small programs in a few languages to compare how they felt. I tried Go, Python, Ruby, and Perl and out of all of them Perl felt the best and I found myself wanting to do more and more with it + +> Sure, the semi colon made it syntactically similar to the languages I already knew but it felt like it was super general purpose and in a very expressive way that actively stimulated my mind + +> I think one of the best ways to sum this up comes in Perl’s motto itself, “there’s more than one way to do it”. This is often contrasted with Python’s “there’s only one way to do it” and I felt this very heavily. While I’m sure the consistency and standard structure of Python makes it appealing for big projects, I was just doing my own thing and learning Perl felt more like learning to paint or writing a poem. I could express myself and do things in the ways that felt good for my brain + +> It just felt incredibly expressive and I loved how it flowed, how I could very easily rearrange statements and subroutines, and have as much as I wanted on a single line (or not) to suit my own style. Perl is often insulted as a “write only” language but I feel like this is part of the beauty of Perl, in that it’s let the coder put their own personality in. Much like handwriting, you’re using the same words, and some are easier to read than others, but ultimately it’s part of who that person is, a mark left on the world + +> I think when people criticize Perl they often see it as “it’s either good at making big complex software projects or it’s bad” when it is at its core an expressive hacker language that’s easy to learn and yet you’ll still be learning new tricks a decade later. You can use it to quickly write little automation tools or scripts where writing it in Bash would be pain, but you can go bigger with it too. It has a big module repository (and was one of the first to pioneer the idea I believe) which means you can very quickly build little tools and projects in your own way + +> I think people get far too hung up on what they see as a very professional and standard set of tools and that the freedom Perl gives is bad for maintainability, but I think that isn’t and shouldn’t be the whole picture, I think there should be room for a fun expressive language that lets you add a piece of yourself to everything you write, your own quirks, your own style. You can actually have a lot of fun and learn a lot by reworking a single statement of code in many ways, and in fact, there’s the “Just Another Perl Hacker” thing where people try to find their own way to write code that simply prints out that string, and there are so many creative and interesting examples including one where the source code is ascii art of a camel + +> I’m not saying you should start doing everything in Perl or adopt it as your main language but that you should give it a chance and at least not cast it away as a mistake of the past. I think it very much embodies the late 80s and 90s hacker culture in its very makeup and really does lean into programming as an art not just a science + +> If you asked 10 artists to paint a horse you’d get 10 different styles, and likewise, the “write only” criticism of Perl is that if you asked 10 Perl programmers for a basic program, you’d get 10 different sets of source code but I think it’s honestly nice for that to exist, a project should be an endeavour of passion and creativity, and being able to do that in your own unique way is a good thing imo + +[]( + + +## Why I Like Languages Like C, Lisp, Assembly, Scheme, etc. + +Languages like C and Scheme are very barebones. They contain very basic syntax and very few features yet are complete programming languages. I find myself increasingly drawn to these languages over languages such as Python and C++ specifically because of this simplicity. Although these more "modern" languages reduce the work needed to build a robust and correct program, they also feel constraining in a way. + +When I program in Python, it feels like I'm building a house out of pre-defined pieces that I'm treating as black boxes. When I'm programming in C, it feels like I'm building a house out of pieces that I'm sculpting and tailoring to the problem I'm trying to solve. Where in Python I use the built-in data structures, in C I craft my own. Where in Python I might throw together a prototype to better understand the problem domain, in C I carefully stitch together a final product that tackles the problem using only what is needed, eschewing any other cruft or considerations. In C, I'm not worried about making generalizable data structures and have no need for functions like `exec()`. diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,13 @@ +# Raku + +[← Back](./) + + +[]( + +[]( + +[]( + +[]( + diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,9 @@ +# Style + +[← Back](./) + + +This document describes my preferred programming style. + +[]( + diff --git a/content/garden/arboretum/programming/ b/content/garden/arboretum/programming/ @@ -0,0 +1,7 @@ +# Vim Notes + +[← Back](./) + + +[uxntal.vim — Syntax highlighting for Uxntal]( + diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,41 @@ +# Aloo Gobi + +[← Back](./) + + +## Ingredients + +* 3 Tbsp neutral-flavour oil (canola, vegetable, etc.) +* ½ tsp cumin seed +* 1 small onion +* 2 chile peppers +* 1 tsp ginger paste +* 2 tsp ground coriander +* ¼ tsp paprika +* ½ tsp turmeric powder +* ½ tsp cayenne pepper +* ½ tsp garam masala +* 2 medium baking potatoes +* 1 tsp salt +* ½ head cauliflower +* 2 tsp lemon juice + +## Preparation + +* Quarter and slice the one onion +* Mince the two chile peppers +* Peel and cut the two potatoes into 2-3cm pieces +* Cut the ½ head of cauliflower head into florets + +## Instructions + +* Heat 2 Tbsp of oil over medium-high heat in the large pot +* Fry the ½ tsp of cumin seeds until they turn golden brown and begin to pop +* Reduce heat to medium and stir in the sliced onion; cook until lightly browned +* Stir in the chile peppers and 1 tsp of ginger paste; fry for 1 minute +* Add the 2 tsp of ground coriander, ¼ tsp of paprika, ½ tsp of turmeric powder, ½ tsp of cayenne pepper, and ½ tsp of garam masala; mix and cook until fragrant (~30 seconds) +* Stir the cut potatoes and 1 tsp of salt into the pot, cover, and cook for 5-7 minutes +* Add the florets of cauliflower, cover, and cook 20 minutes or until cauliflower is tender +* Stir in the 2 tsp of lemon juice +* Pour remaining 1 Tbsp oil around the edges of the pot +* Increase heat to medium-high and fry 3-5 minutes, stirring gently diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,15 @@ +# Anti-Mildew Plant Spray + +[← Back](./) + + +* 1L Water +* ¼ Tbsp Baking Soda +* ⅛ Tsp Mild Dish Soap + +Mix all components together and pour into a sprayer. Gently spray on plants on +a cloudy day, making sure to get tops and bottoms of leaves, stems, and flowers. + +Note: I'm not sure if this really works. My plants didn't really seem affected +by it, and if anything the extra moisture just encouraged additional mold growth +:/ diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,10 @@ +# Banana Bread + +[← Back](./) + + +Preheat your oven to 350°F and grease a 9" loaf pan. + +In a medium-sized mixing bowl, mash 350-400g of bananas (3-4 bananas), add ⅓ of a cup of neutral flavoured oil or applesauce, 1 teaspoon of vanilla extract, and mix well. Then add 210g of flour (all-purpose, whole wheat, spelt are all okay), 75g of sugar, 1½ teaspoons of baking powder, ½ teaspoon of baking soda, a pinch of salt, optionally 1 teaspoon of cinnamon, and mix until the flour is combined (do not overmix). The batter will be slightly thick and some lumps are okay. If the mixture is too thick, add up to 50mL of a milk or milk alternative. + +Pour the batter into the loaf pan and bake for 50 minutes to 1 hour. When done, insert a toothpick in the top of the loaf and pull it out. If it comes out clean then the loaf is ready. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,32 @@ +# Barley and Split Pea Stew + +[← Back](./) + + +## Ingredients + +* 1 Tbsp oil +* 4 cups vegetable broth +* 1 cup pearl barley +* ½ cup yellow split peas +* ½ cup green split peas +* 1 medium yellow onion +* 4 cloves garlic +* 1 28oz can of tomatoes +* thyme, salt, pepper, paprika to taste (1 tsp of each is a good start) + +## Preparation + +* Wash 1 cup of barley and the ½ cup each of green and yellow split peas +* Dice the onion +* Crush the 4 cloves of garlic + +## Instructions + +* Add the 1 Tbsp of oil to the pot and heat on medium-high heat +* Sauté the diced onion and crushed garlic cloves until the onion is transparent +* Add the washed barley and split peas +* Add the 4 cups of broth and the one 28oz can of tomatoes +* Add 1 tsp of thyme and 1 tsp of paprika; mix well +* Bring to a boil, cover, lower the heat and simmer for 60-90 minutes +* Season with salt and pepper to taste diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,40 @@ +# Bean Salad + +[← Back](./) + + +## Tools & Cookware + +* Knife and cutting board +* Whisk or fork +* Small bowl +* Large bowl +* Stirring implement + +## Ingredients + +* 1 15oz. can kidney beans +* 1 15oz. can white beans +* 1.5 cups green beans +* ¼ cup chopped parsley +* ¼ cup red onion +* ¼ cup apple cider vinegar +* ¼ cup olive oil +* 2 Tbsp sugar +* 1 tsp salt +* ¼ tsp freshly cracked pepper +* 1 tsp Dijon mustard + +## Preparation + +* Open and drain the cans of kidney and cannellini beans and rinse the beans +* Slice the red onion, then soak in a bowl of ice-cold water for ~5 minutes and drain, then finely dice +* Chop the ¼ cup of parsley + +## Instructions + +* Add the 1 drained can of kidney beans, 1 drained can of white beans, 1.5 cups of green beans, diced onion, and parsley into the large bowl +* Whisk the ¼ cup of vinegar, 2Tbsp of sugar, ¼ cup of olive oil, 1 tsp of salt, ¼ tsp of pepper, and 1 tsp of Dijon mustard in the small bowl +* Pour the contents of the small bowl into the large bowl and stir to combine +* Put the resulting salad into the fridge for at least 30 minutes +* Stir again just before serving diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,40 @@ +# Bean Soup + +[← Back](./) + + +## Ingredients + +* 0.5 kg of dried beans +* 1 large yellow onion +* 2 large carrots +* 2 large celery stalks +* 2 tbsp olive oil +* 2 cloves garlic +* 4 sprigs thyme +* salt and pepper + +## Preparation + +* Soak the 0.5 kg of beans in water overnight, covering them with 2-3cm of water +* Chop the 1 onion, 2 carrots, and 2 stalks of celery into bite-sized pieces +* Crush the 2 cloves of garlic +* Tie the 4 sprigs of thyme together + +## Instructions + +* Add the 2 tbsp of olive oil and heat until shimmering +* Add the chopped onion, carrots, and celery; sauté until onion is transparent +* Drain the water from the beans and rinse them; add them to the pot and mix +* Add the thyme bundle, crushed garlic, and fresh water to cover the beans by 2-3cm of water +* Bring to a boil, cover and lower heat to simmer for 4 hours or until beans are soft but not mushy +* Remove the thyme bundle and season the soup to taste (see suggested seasonings) + +## Suggested Seasonings + +Aside from salt and pepper: + +* Thyme and tarragon for a French-style soup +* Cumin for Mexican-style +* Italian herbs for Italian-style +* Vegan sausages for heartiness (cook for an extra 20 minutes) diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,28 @@ +# Brownies + +[← Back](./) + + +## Ingredients + +* 2 cups all-purpose flour +* 2 cups sugar +* ¾ cups cocoa powder +* 1 tsp baking powder +* 1 tsp salt +* 1 cup water +* 1 cup vegetable oil +* 1 tsp vanilla extract +* (Optional) 1 tbsp decaf instant coffee + +## Instructions + +* Preheat oven to 350°F (175°C) +* Mix the dry ingredients together +* Add the wet ingredients into the dry ingredients +* Mix until well blended +* Spread evenly into a baking pan +* Bake 25-30 minutes in oven +* Let cool for 10 minutes and cut into squares + +Best served with a drizzle of chocolate sauce and light sprinkle of cocoa powder or very fine sugar alongside fruit or vegan vanilla ice cream diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,39 @@ +# Butternut Squash Soup + +[← Back](./) + + +## Ingredients + +* 1 tbsp olive oil +* 1 medium onion +* 3 cloves garlic +* 2 tsp fresh ginger +* (Optional) 2 tbsp tomato paste +* salt and pepper to taste (1 teaspoon each to start) +* ½ tsp thyme leaves +* 1 medium butternut squash +* 4 cups vegetable stock +* ¾ cup coconut milk or half of a crusty loaf of bread + +## Preparation + +* Dice the onion +* Mince the garlic +* Finely chop the thyme leaves +* Grate the 2 tsp of ginger +* Peel and cut the squash into 2-3cm cubes +* If using bread, cut into 2-3cm cubes + +## Instructions + +* Heat a large pot over medium heat and heat 1 tbsp of oil +* Add the diced onion, minced garlic, grated ginger, 1 tsp each of salt and pepper, and ½ tsp of thyme; sauté until the onion is transparent +* (Optional) Add the 2 tbsp of tomato paste and mix +* Add the cubes of squash and mix +* Add the 4 cups of stock and mix (the liquid level should be slightly lower than the squash, adjust exact liquid amount as needed) +* Bring to a boil, cover and reduce heat to simmer the soup for 20 minutes, or until the squash is easily pierced by a fork +* Remove from the heat, add the ¾ cup of coconut milk or half of the loaf of bread (if using bread, mix well and let stand for 5 minutes, covered) +* Purée the soup with the immersion blender, or carefully scoop/pour into counter-top blender + +Note: This does not freeze well, probably due to the bread used. Perhaps coconut cream would be a better thickening agent. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,37 @@ +# Cabbage Lentil Stew + +[← Back](./) + + +## Ingredients + +* 2 tbsp canola oil +* 1 medium yellow onion +* 4 cloves garlic +* ¼ head cabbage +* ½ cup lentils (any kind) +* 1 cup vegetable broth +* 3 cups water +* 2 tsp all-purpose flour +* 1 tbsp paprika +* salt and pepper to taste +* balsamic vinegar to taste + +## Preparation + +* Dice the onion +* Peel and slice the cloves of garlic +* Chop the cabbage into long strips + +## Instructions + +* Add the 2 tbsp of canola oil to the pot and heat at medium-high heat +* Add the diced onion and sauté until transparent +* Add the sliced garlic and sauté for 1 minute +* Add the chopped cabbage and sauté for 3-4 minutes +* Add the ½ cup of lentils followed by 3 cups of water and 1 cup of broth +* Add the 2 tsp of flour and 1 tbsp of paprika and mix well +* Bring to a high simmer/low boil, reduce heat, cover, and simmer for 15-20 minutes or until lentils are tender +* Add 1-2 tbsp of balsamic vinegar and mix in well + +Best served with warm crunchy bread. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,47 @@ +# Cabbage Soup + +[← Back](./) + + +## Ingredients + +* 1 yellow onion +* 4 cloves garlic +* 1 tbsp olive oil +* 4 carrots +* 4 stalks celery +* 1 green bell pepper +* 1 28oz. can diced tomatoes +* 1 8oz. can tomato sauce +* ½ lb. green beans +* ¼ cup chopped parsley +* ½ tbsp smoked paprika +* 1 tsp dried oregano +* ½ tsp dried thyme +* ¼ tsp freshly cracked black pepper +* 6 cups chopped cabbage (½ head) +* 6 cups vegetable broth +* 1 tsp salt +* 1 tbsp lemon juice + +## Preparation + +* Dice the onion +* Mince the 4 cloves of garlic +* Peel and slice the 4 carrots into small chunks +* Chop the 4 stalks of celery into small chunks +* Dice the bell pepper +* Chop the half head of cabbage into 1-inch (2.5cm) pieces + +## Instructions + +* Add the diced onion, minced garlic, and 1 tbsp olive oil to a large soup pot and sauté over medium heat until the onions are soft +* Add the sliced carrot, chunks of celery, and diced bell pepper to the pot and continue sautéing for a couple minutes +* Add the can of diced tomatoes (with juices), can of tomato sauce, ½ lb of green beans, ¼ cup of chopped parsley, ½ tbsp of smoked paprika, 1 tsp of oregano, ½ tsp thyme, and ¼ tsp black pepper, continue cooking for 5 minutes +* Add the chopped cabbage to the pot along with the 6 cups of vegetable broth and stir to combine +* Place a lid on the pot, turn the heat up to medium-high, and allow the soup to come to a boil +* Reduce the heat to medium-low and continue to simmer, stirring occasionally, for about 40 minutes +* Once the cabbage is tender, season the soup with salt, ½ tsp at a time to your desired saltiness +* Finish the soup by adding 1 tbsp of lemon juice and stirring to combine + +Best served with crusty bread. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,47 @@ +# Granola Bars + +[← Back](./) + + +![/img/recipes/granola-bars.jpg](/img/recipes/granola-bars.jpg) + + +## Cooking Implements + +* Knife +* Baking pan +* Parchment paper +* Food processor +* Spoon for mixing +* Medium-size mixing bowl +* Something with a flat surface to press with + +## Ingredients + +* 1½ cup oats (any processed oats like rolled or steel-cut or quick should work) +* 1 cup pumpkin or sunflower seeds +* 1¼ cup pitted dates, raisins, cranberries or other dried fruit +* ¼ cup maple syrup (or other sweet syrup) +* ¼ cup peanut butter (or seed butter) +* 3 tablespoons of poppy, sesame, flax, or chia seeds, and/or coconut flakes + +## Instructions + +* Put the 1¼ cup of dried fruits into the food processor and process down into small pieces +* Add the 1½ cup of oats (and the larger seeds, if used) to the food processor and process until mixed +* Pour out the mixture into the bowl +* Add the ¼ cup of syrup and ¼ cup of nut/seed butter to the bowl +* Add the smaller seeds/coconut flakes to the bowl +* Mix until thoroughly combined (you may have to use your hands) +* Line the baking pan with parchment paper, pour the mixture into the pan, and flatten roughly with the back of a spoon +* Place parchment paper on top and press the mixture down flat with the bottom of a glass or other flat object +* Place the mixture in the freezer for 20 minutes or the fridge for 40-60 minutes +* After chilling, remove the mixture from the baking pan, take off the parchment paper, and cut into equal portions + +Depending on the ingredients used, they will usually keep for a couple weeks in the fridge or a couple months in the freezer. Although the ingredients are shelf stable on their own, I'm not yet sure how long it takes for a room-temperature granola bar to go bad, but I'd imagine you want to consume it within three days or so. + +## Alterations + +Generally this recipe just consists of oats, dried fruits, seeds, a sweetener, and something to bind it all together. You can play around with pretty much all of those ingredients to find a set of flavours that you like the best. You can also play around with the proportions of ingredients to arrive at a consistency that you like. + +If you don't have a food processor, you could manually chop the ingredients into smaller pieces, or keep them whole if you're not using large seeds or dried fruit. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,38 @@ +# James Hoffmann's Aeropress Technique + +[← Back](./) + + +## For Light Roast: + +* 55g/L - High extraction +* Finer grind +* Hot water as close to boiling as possible + +## For Dark Roast: + +* 60-66g/L - Lower extraction +* Coarser grind +* Less than boiling water, maybe even as low as ~85°C + +## Steps + +Put filter paper into holder, lock it into the water holder then put that on top of the mug. + +Place grounds in holder, give a bump to spread them out. + +Start timer, add an appropriate proportion of water to ground coffee. + +Wait 2 minutes. + +Give a gentle swirl to knock floating ground coffee down. + +Wait 30 seconds. + +Press the press down relatively gently, no need to lean into it. + +Press it all the way down, then pull back slightly to prevent drips. + +Clean the Aeropress. + +Tweak grind size or temperature until you find a good balance. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,107 @@ +# Recipes + +``` + _____ + _..--'''@ @'''--.._ + .' @_/-//-\/>/>'/ @ '. + ( @ /_<//<'/----------^-) + |'._ @ //|###########| + |~ ''--..@|',|}}}}}}}}}}}| + | ~ ~ |/ |###########| + | ~~ ~ ~|./|{{{{{{{{{{{| + '._ ~ ~ ~ |,/````````````` + jrei ''--.~.|/ +``` + +[← Back](../) + + +A catalog of recipes I found or created. + +All recipes below are vegan and free of tree nuts unless otherwise noted. + +## Bread + +[Sourdough Bread](sourdough-bread.html) + +[Sourdough Starter](sourdough-starter.html) + + +## Breakfast + +[Overnight Oats](overnight-oats.html) + +[Pancakes](pancakes.html) + + +## Drinks + +[James Hoffmann's Aeropress Technique (Coffee)](hoffmann-aeropress.html) + +[Lemonade](lemonade.html) + + +## Fermentation + +[Lacto-Fermentation](lacto-fermentation.html) + + +## Salads + +[Bean Salad](bean-salad.html) + +[Vinaigrettes](vinaigrettes.html) + +[Peanut Noodle Salad](peanut-noodle-salad.html) + + +## Snacks + +[Brownies](brownies.html) + +[Granola Bars](granola-bars.html) + +[Banana Bread](banana-bread.html) + + +## Soups and Stews + +[Barley and Split Pea Stew](barley-split-pea-stew.html) + +[Bean Soup](bean-soup.html) + +[Butternut Squash Soup](butternut-squash-soup.html) + +[Cabbage Lentil Stew](cabbage-lentil-stew.html) + +[Cabbage Soup](cabbage-soup.html) + +[Red Lentil Stew](red-lentil-stew.html) + +[Split Pea Soup](split-pea-soup.html) + +[Solyanka](solyanka.html) + + +## Other + +[Aloo Gobi](aloo-gobi.html) + +[Sauces](sauces.html) + +[Spiced Lentils With Carrots](spiced-lentils-with-carrots.html) + +[Vegetable Curry](vegetable-curry.html) + +[Oven Roasted Corn on the Cob](oven-roasted-corn-on-the-cob.html) + +[Pizza Dough](pizza-dough.html) + +[Wild Rice Pilaf](wild-rice-pilaf.html) + + +## Non-Food + +[Anti-Mildew Plant Spray](anti-mildew-plant-spray.html) + + diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,14 @@ +# Lacto-Fermentation + +[← Back](./) + + +## Sauerkraut + +* Chop a cabbage into thin strips and add to a bowl +* Add 2% of the cabbage's weight in salt to the bowl +* With your hands, mash and massage the salt and cabbage together until a decent amount of water begins to pool at the bottom of the bowl (upwards of 20 minutes) +* Transfer the cabbage to a jar, and pack it down very tightly until the waterline is above the cabbage +* If more water is needed, mix up a 2% salt-in-water solution and pour until the waterline is just above the cabbage +* Weigh down the cabbage leaves with something like plastic wrap and weights or a plastic bag full of water so nothing can float to the top + diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,18 @@ +# Lemonade + +[← Back](./) + + +## Ingredients + +* 2 lemons +* 5 tablespoons of sugar +* 1L of water + +## Instructions + +* Slice the 2 lemons in half and juice them +* Pour the juice into the flask +* Add the 5 tablespoons of sugar into the flask +* Fill the flask with 1L of water +* Shake well, serve chilled diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,6 @@ +# Oven Roasted Corn on the Cob + +[← Back](./) + + +Pre-heat your oven to 425°F (220°C). Stir together one quarter cup of softened butter, one tablespoon of dried or chopped fresh parsley, two minced cloves of garlic, one teaspoon of dried or chopped fresh rosemary, one teaspoon of dried or chopped fresh thyme, three quarters of a teaspoon of kosher salt, and half a teaspoon of black pepper. This is enough for about four to six cobs of corn. Spread about one tablespoon of this mixture on each cob of corn, then wrap the cobs individually in aluminium foil, place on a baking sheet, and bake in the oven for twenty minutes, turning halfway. Remove from foil, let cool, and serve. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,21 @@ +# Overnight Oats + +[← Back](./) + + +## Ingredients + +* ⅓ cup oats +* ¼ tsp cinnamon +* 1 tbsp chia seeds +* 1 tbsp peanut butter +* ½-⅓ cup oat milk +* ½ cup fresh or frozen fruit (blueberries work well) +* maple syrup + +## Instructions + +* Mix the dry ingredients together in the container +* Add the wet ingredients and the peanut butter and mix well +* Top with the fruit and a drizzle of maple syrup +* Cover and refrigerate overnight diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,22 @@ +# Pancakes + +[← Back](./) + + +## Ingredients + +* 1¼ cups all-purpose flour +* 2 tbsp sugar +* 2 tbsp baking soda +* ½ tsp salt +* 1¼ cups water +* 1 tbsp oil + +## Instructions + +* Mix the dry ingredients together +* Add the water and oil into the dry ingredients +* Mix until combined but still lumpy +* Heat the pan on medium-high heat +* Spoon 2-3 tbsp of the mixture into the pan and cook until done, flipping halfway through (this differs based on the heat and how much was added to the pan, trial and error) +* Repeat previous step until the batter is used up diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,14 @@ +# Peanut Noodle Salad + +[← Back](./) + + +Prepare a peanut lime dressing as follows: + +In a bowl, whisk together until smooth 3 tablespoons of peanut butter, 1 tablespoon of brown sugar, 1 minced clove of garlic, ½ teaspoon of grated fresh ginger, 2 tablespoons of lime juice, 2 teaspoons of soy sauce, and ¼ cup of neutral-flavoured oil (e.g. canola). + +Then, bring a pot of water to a boil and add ~220 grams of spaghetti, broken in half, to cook until tender. Once this is done, strain the spaghetti thoroughly. + +While the spaghetti is cooking, shred 4 cups of cabbage and 2 carrots as finely as possible, roughly chop ½ cup of peanuts and ½ cup of cilantro, and slice ½ cup of green onions. + +Combine the vegetables and peanuts with the spaghetti and toss with the dressing. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,12 @@ +# Pizza Dough + +[← Back](./) + + +Dissolve one teaspoon of yeast and one tablespoon of sugar in three quarters of a cup of warm water. Allow this mixture to sit until a thick layer of foam forms on top. While waiting, add one cup of all-purpose flour and one teaspoon of salt to a large bowl and stir well to combine. When the yeast mixture has foamed, add one tablespoon of olive oil, then pour that mixture into the bowl with the flour and salt. One quarter to half of a cup at a time, add flour to the bowl while stirring until a ball of dough is formed that can be no longer stirred with a spoon (about one extra cup of flour should be appropriate). Turn the dough out onto a lightly floured work surface and knead for five minutes, adding flour as necessary to prevent sticking. + +To use the dough that same day: place the dough back into the bowl, drizzle it with a little olive oil, coat the dough in the oil, cover the dough and let it rise at room temperature for about one hour or until doubled in volume. + +To use the dough the next day: follow the above instructions but place the dough in the refrigerator for 18-24 hours instead of letting it rise at room temperature. + +Once the dough is finished proofing, roll it out into a circle, add toppings, and bake in a pre-heated 450°F (230°C) oven for 10-12 minutes. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,47 @@ +# Red Lentil Stew + +[← Back](./) + + +This recipe is copyright Grimgrains/Hundred Rabbits © 2014-2021 CC-BY-NC-SA-4.0 + +[Grimgrains Red Lentil Stew Recipe]( + +[CC-BY-NC-SA-4.0 License]( + + +This recipe has been condensed from the original to better match my needs. Under the terms of the CC-BY-NC-SA-4.0 license, this recipe is therefore copyright Jake Bauer © 2021 under the same license. + +## Ingredients + +* 1 tbsp olive oil +* 1 medium yellow onion +* ¼ tsp black pepper +* ½ tsp whole cumin seeds +* ¼ tsp ground turmeric +* 1 medium carrot +* 2 medium potatoes +* ¼ head cabbage +* ½ cup red lentils +* 1½ cups vegetable broth +* salt to taste + +## Preparation + +* Dice the onion +* Chop the carrot into small cubes +* Chop the 2 potatoes into small cubes +* Chop the ¼ head of cabbage + +## Instructions + +* Add the 1 tbsp of oil to the pot and heat at medium heat +* Add the diced onion and sauté until transparent +* Add the ¼ tsp black pepper, ½ tsp of whole cumin seeds, and ¼ ground turmeric +* Add the cubed carrot, cubed potatoes, chopped cabbage and mix well +* Lower the heat, cover, and cook for 5-7 minutes (add a small amount of water if vegetables are sticking to the bottom of the pot) +* Mix in the ½ cup of red lentils and the 1½ cups of vegetable broth +* Bring to a boil, cover, and lower heat to simmer for 10 minutes +* When ready, season with salt to taste + +Best served over basmati rice or flat bread. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,23 @@ +# Sauces + +[← Back](./) + + +## Basic Stir Fry Sauce + +* 3 cloves garlic, minced +* 3 tbsp soy sauce +* 1 tbsp rice vinegar +* 1 tbsp brown sugar (regular sugar is fine) +* ½ cup broth or water +* 1½ tbsp corn starch + +## Better Stiry Fry Sauce + +* ¼ cup soy sauce +* ¼ cup water +* 2 Tbsp brown sugar +* 1 tsp toasted sesame oil +* 2 cloves garlic, minced +* 1 tsp grated fresh ginger +* 1 Tbsp cornstarch diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,6 @@ +# Solyanka + +[← Back](./) + + +Dice one large carrot, finely mince one medium-sized onion, mince two cloves of garlic, peel and dice two medium-sized potatoes, drain and rinse one can of kidney beans, and dice two medium-sized dill pickles. Heat one tablespoon of olive oil in a large pot over medium heat. Add the onion, carrot, a half teaspoon of salt, a quarter teaspoon of black pepper, and saute until onions are translucent. Add the garlic and stir until fragrant. Stir in one tablespoon of tomato paste, five cups of vegetable broth, and the potatoes. Bring the pot to a boil, reduce to a simmer and cook for ten minutes. Add the kidney beans and dill pickles and simmer for an additional five minutes. Add three tablespoons of capers, one third of a cup of olives, two tablespoons of dill pickle juice, and one tablespoon of lemon juice. Cook for one more minute, season with salt and pepper to taste, and serve. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,30 @@ +# Sourdough Bread + +[← Back](./) + + +## Ingredients + +* 520g Wheat Flour (any kind, but a mix of 70g rye and the rest another kind is good) +* 385g Water +* 12g Fine-Ground Salt (table salt or sea salt is okay) +* 1/3 Cup Sourdough Starter + +## Instructions + +* Mix the salt and flour in a bowl +* Mix the sourdough starter into the water using a fork until no clumps of starter remain +* Combine wet and dry ingredients and stir with wooden spoon into a thick dough. Make sure all the flour is incorporated. If the mix is too dry, add water (1 Tbsp at a time) until all the flour is mixed in. +* Cover with a damp kitchen towel for 15 minutes. +* Stretch and fold the dough (grab a corner, stretch it up (but don't break it!) and fold it back in, then turn the bowl 90° and do it again, repeat 4 times total). +* Repeat steps 4 and 5. +* Cover with a damp kitchen towel and leave it on the counter overnight for 8-12 hours. +* Check the dough has finished rising by jiggling it. If the dough is jiggly and poking it doesn't feel hard, it's ready. +* Add the parchment to a second bowl. +* Separate the dough from the sides of the bowl it was proofing in and lift it about 1-2ft (30-60cm) up, then place it back down. If the dough is sticky, wetting your hands helps. Do this three times, and on your third lift, place the dough into the parchment-lined bowl. +* Sprinkle the dough with flour, seeds, or whatever you like. +* Place the dough in the fridge and pre-heat the oven (with the cast iron pan and sheet pan placed underneath, or dutch oven inside) to 500°F (260°C) for 50-60 minutes. +* Carefully take out the dutch oven or pan from your oven and gently lift the parchment with the dough and place it inside the pan or dutch oven. Score the top of the dough with a sharp knife swiftly and deeply in an X or off-center slice. +* Put the lid on the dutch oven if you're using it and place your cooking vessel into the oven. +* If using a cast iron pan, pour a cup of water into the pre-heated sheet pan at the bottom of the oven and close the oven door, bake for 35 minutes. If using a dutch oven, bake for 22 minutes, take off the lid, and bake for another 10-15 minutes until the top is a deep golden colour. +* Remove the bread from the oven, lift it out by the parchment paper and place it on a cooling rack. WAIT BEFORE SLICING >:( Usually about 1.5-2 hours is needed to let the loaf cool before you can eat it. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,47 @@ +# Sourdough Starter + +[← Back](./) + + +## Tools & Cookware + +* 4 qt. glass jar, medium-sized Weck jar, or other medium food-safe container +* Measuring cups + +## Ingredients + +* Wheat Flour (any kind will work) +* Water + +## Instructions + +### Day 1 + +In your container, mix 120 grams of flour with 120 grams of water. Use a fork to ensure it's all mixed together well (it should end up being thick like peanut butter, add water _sparingly_ to get to that point). Cover the opening of the container with a loose lid or wet towel. You want to keep moisture in but not seal it. Leave this on your counter outside of direct sunlight and in a relatively warm place. + +### Day 2 + +You should notice some bubbling in your container, this may take longer than 24 hours depending on temperature and other factors. (If there is no bubbling by 48 hours, throw your starter out and begin again, perhaps using filtered water or a warmer location.) + +Discard all but 1/2 cup of starter (~130g), and put this 1/2 cup of starter aside. Clean out the jar with some warm water to get off any bits stuck to the side. Put your starter back in and add again 120 grams of water and flour, mixing together with a fork. Cover the container and leave it for another 24 hours. + +### Day 3-6 + +Repeat the process from day 2, except as the starter continues to grow, you want to only feed it when it shows signs of hunger. When the starter is hungry, it will have sunk down from its peak rise point, leaving residue on the walls of the container above the bulk of the starter. Depending on the temperature and other factors, you may need to feed your starter one or two times per day. Just keep an eye on it every couple hours to see when it gets hungry. + +After about 4-6 hours of the final feeding on day 6, the starter should have doubled in size. You can do a float test to determine if the starter is ready for breadmaking. Take one spoon of the starter, and gently drop it into a tall glass of water. If the starter floats, it is ready for breadmaking later that day. + +If, by day 6, the starter is not very active and doesn't pass the float test, it's possible that the temperature is too cold or there are other factors hindering its growth. It can take up to two weeks to get a starter really going, so be persistent and keep following the pattern of discarding, feeding when its hungry, and checking if it's ready. + +Once your starter is ready, the "discard" becomes what you use to bake bread with. Usually 1/3 cup of starter is a good amount for a loaf of bread, just make sure you have enough starter (1/2-1/3 cup) left in your container to feed and grow. + +## Storage + +An established sourdough starter can be stored in the fridge for quite a while and come right back when needed. If you've just used your starter to make bread or it has recently peaked, you can place the starter in the fridge to slow its metabolism and take it out when you're ready to feed it again. + +I have stored my starter in the fridge for 20 days and used it to make bread 24 hours after taking it out of the fridge and feeding it. + +## Safety + +As a sourdough starter is made up of a bunch of living organisms, sometimes things can go wrong, especially when it's getting established. Trust your senses. If you notice oddly coloured (green, black, blue, etc) stuff in your container, a really foul smell, or any other signs that something is not right, throw out your starter and wash your container with warm water and soap. A little flour and water is not worth risking your health over. + diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,37 @@ +# Spiced Lentils With Carrots + +[← Back](./) + + +## Ingredients + +* 1 yellow onion +* 4 cloves garlic +* 1 tsp fresh ginger +* 4 carrots (about 2 cups chopped) +* 2 tbsp olive oil +* 1 tsp ground cumin +* ½ tsp cinnamon +* ½ tsp allspice +* ¼ tsp crushed red pepper +* 1 cup brown lentils +* 3 tbsp tomato paste +* ¼ cup chopped dried apricots or raisins +* 3 cups vegetable broth +* 1 tbsp chopped parsley (optional) + +## Preparation + +* Dice the onion +* Mine the 4 cloves garlic +* Grate the 1 tsp of ginger +* Peel and dice the 4 carrots + +## Instructions + +* Add the diced onion, minced garlic, grated ginger, and 2 tbsp olive oil to the skillet and sauté over medium heat until the onions are soft and translucent +* Add the diced carrots, 1 tsp cumin, ½ tsp cinnamon, ½ tsp allspice, and ¼ tsp crushed red pepper and continue to sauté for a couple more minutes +* Add the 1 cup brown lentils, 3 tbsp tomato paste, ¼ cup dried fruit, and 3 cups vegetable broth and stir until the tomato paste has dissolved into the broth +* Place a lid on the skillet and turn the heat to high +* Allow the broth to come to a full boil, then lower the heat to medium-low and simmer with the lid on for 30 minutes with occasional stirring +* Taste for seasoning (salt/pepper) and serve topped with 1 tbsp chopped fresh parsley diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,36 @@ +# Split Pea Soup + +[← Back](./) + + +## Ingredients +* 2 cloves garlic +* 1 yellow onion +* 3 ribs celery +* 3 carrots +* 2 tbsp olive oil +* 1 lb. split peas +* ½ tsp smoked paprika +* 1 tsp dried parsley +* ½ tsp dried oregano +* ¼ tsp dried thyme +* ¼ tsp black pepper +* 6 cups water +* 1½ tsp salt (or to taste) + +## Preparation + +* Mince the 2 cloves of garlic +* Dice the onion +* Dice the 3 ribs celery +* Dice the 3 carrots + +## Instructions + +* Add the minced garlic, diced onion, diced celery, and diced carrots to a large pot with 2 tbsp olive oil and sauté over medium heat until the onions are soft and translucent +* Add the 1 lb. split peas, ½ tsp smoked paprika, 1 tsp parsley, ½ tsp oregano, ¼ tsp thyme, ¼ tsp black pepper, and 6 cups of water to the pot and stir to combine +* Cover and increase the heat to medium-high to bring the water to a boil +* Turn the heat down to medium-low and let the soup simmer for 45 minutes, stirring occasionally. The soup should become quite thick. +* Season with salt ½ a teaspoon at a time + +Best served with crackers or crusty bread. diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,26 @@ +# Vegetable Curry + +[← Back](./) + + +## Ingredients + +* 700g frozen or fresh mixed vegetables (e.g. broccoli, carrots, snap peas) +* 2 cups vegetable broth +* 1 13.5oz. can coconut milk +* 1 tbsp curry powder +* ½ tsp dried ground ginger +* salt and pepper to taste + +## Preparation + +* Chop the vegetables into bite-sized pieces if using fresh vegetables + +## Instructions + +* Add the vegetables and broth to a soup pot, turn the heat to high and bring to a boil +* Stir, turn the heat down to low, add the can of coconut milk, 1 tbsp curry powder, and ½ tsp ginger and stir to combine +* Let simmer for a few minutes +* Taste the broth and season to your liking + +Best served with rice diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,37 @@ +# Vinaigrettes + +[← Back](./) + + +Combine ingredients in a container or small bowl and shake or whisk together. Let stand 10 minutes. Shake again and dress salad. + +A plain oil+vinegar vinaigrette can last weeks refrigerated, but adding fresh ingredients like garlic drastically reduces their storage time due to the risk of botulism. Consume those vinaigrettes within a few days at most. + +## Basic Vinaigrette + +* 3 parts oil +* 2 parts vinegar +* salt and pepper to taste + +## Balsamic Vinaigrette + +* 3 parts extra virgin olive oil +* 1 parts balsamic vinegar +* 1 small-medium minced garlic clove per 75mL of oil +* salt and pepper to taste + +## Italian Vinaigrette + +* 3 parts extra virgin olive oil +* 2 parts red wine vinegar +* 1 small-medium minced garlic clove per 75mL of oil +* 0.5g (or 1/2 tsp) Italian seasoning per 50mL of oil +* salt and pepper to taste + +## Lemon "Vinaigrette" + +* 1 part extra virgin olive oil +* 1 part lemon juice +* 1 small-medium minced garlic clove per 75mL of oil +* 0.5g (or 1/2 tsp) oregano per 50mL of oil +* salt and pepper to taste diff --git a/content/garden/arboretum/recipes/ b/content/garden/arboretum/recipes/ @@ -0,0 +1,6 @@ +# Wild Rice Pilaf + +[← Back](./) + + +Add one cup of wild rice blend and two cups of vegetable broth to a saucepan. Cover and bring to a boil, then reduce to a simmer and cook until the rice is done. While the rice cooks, dice two yellow onions, six stalks of celery, and two apples. Heat four tablespoons of butter in a large skillet and add the onions. Saute until the onions are softened. Add the apples, celery, one teaspoon of dried sage, one teaspoon of dried thyme, and half a teaspoon each of salt and black pepper to the skillet with the onions. Continue sauteing until the apples and celery begin to soften. Once the rice has finished cooking, add it to the skillet along with half a cup of dried cranberries and two tablespoons of chopped parsley. Stir to combine, season to taste, and serve. diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,79 @@ +# Computer Names + +[← Back](./) + + +In keeping with RFC 1178, + +[]( + + +I name my computers after elements of the Greek underworld: + +``` ++----------------+-----------------------------------------------------+---------------------------+ +| NAME OF ENTITY | DESCRIPTION | CURRENT USE | ++----------------+-----------------------------------------------------+---------------------------+ +| ==Rivers== | ++----------------+-----------------------------------------------------+---------------------------+ +| Styx | River of hatred | | +| Acheron | River of pain | Router/Firewall | +| Lethe | River of forgetfullness | | +| Phlegethon | River of fire, leads to depths of Tartarus | | +| Cocytus | River of wailing | | +| Oceanus | River that encircles the world, edge of Underworld | | ++----------------+-----------------------------------------------------+---------------------------+ +| ==The Front Entrance to the Underworld== | ++----------------+-----------------------------------------------------+---------------------------+ +| Penthos | Grief | | +| Curae | Anxiety | | +| Nosoi | Diseases | | +| Geras | Old Age | Thinkpad T420s | +| Phobos | Fear | | +| Limos | Hunger | | +| Aporia | Need | | +| Thanatos | Non-Violent Death | | +| Algea | Agony | | +| Hypnos | Sleep | | ++----------------+-----------------------------------------------------+---------------------------+ +| ==Behind the Entrance to the Underworld== | ++----------------+-----------------------------------------------------+---------------------------+ +| Polemos | War | | +| Alecto | Punisher of moral crimes (anger, etc.) | | +| Magaera | Punisher of infidelity, oath-breakers, and theft | | +| Tisiphone | Punisher of murderers | | +| Eris | Discord | | ++----------------+-----------------------------------------------------+---------------------------+ +| ==Major Figures== | ++----------------+-----------------------------------------------------+---------------------------+ +| Charon | The ferryman of the dead | | +| Cerberus | Guardian of the gates to the Underworld | Main Server | +| Minos | Judge of the final vote | | +| Rhadamanthus | Lord of Elysium, judge of the men of Asia | | +| Aeacus | Guards keys of Underworld, judge of men of Europe | | +| Hades | God of the Underworld | Desktop Computer | +| Persephone | Mistress of Hades | | +| Hecate | Associated with magic, witchcraft, light, dogs | Game Server | +| Melinoë | Persephone's dgt. Bringer of nightmares and madness | | +| Nyx | Goddess of the night | | +| Achlys | Personification of misery and sadness | | +| Styx | Goddess of the river Styx | | +| Eurynomos | A daemon of the underworld, eats flesh of corpses | NAS System | ++----------------+-----------------------------------------------------+---------------------------+ +| ==Major Locations== | ++----------------+-----------------------------------------------------+---------------------------+ +| Elysium | Place for distinguished people, those close to gods | | +| Tartarus | Pits of oblivion, dungeon of torment and suffering | Mail Server | +| Asphodel | | | +| Meadows | Place for ordinary or indifferent souls | | +| Mourning | | | +| Fields | Place for who wasted their lives on unrequited love | | +| Isles of | | | +| the Blessed | Ppl reborn 3 times, achieved Elysium every time | | ++----------------+-----------------------------------------------------+---------------------------+ +``` + +Here is some more inspiration for computer names: + +[]( + diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,64 @@ +# General Tips and Tricks + +[← Back](./) + + +## Use OpenBSD + +> Get used to minimalism and security: componentised, privilege-separated binaries in file-system jails. Most of all, forget your instincts to search Google and StackExchange for every parameter and function call: man pages are your new best friend. + +[--]( + + +OpenBSD ships with sensible and secure defaults. OpenBSD has excellent documentation: I can use the system to learn about the system instead of looking things up on half-baked, SEO-optimized, outdated articles. OpenBSD has straightforward and easy to manage system components (daemons, init system, updating, etc). OpenBSD doesn't randomly break or unexpectedly change things out from under you when there's an update (they let you know about changes well in advance of you needing to upgrade). OpenBSD ships with a set of useful, well-written programs that make setting up a server a breeze (httpd, acme-client, relayd, etc.). + +From the Ratfactor blog: + +> People always tell you not to reinvent the wheel. +> With MS and Apple, you have to use their wheels. +> Linux runs whatever wheels it can find. +> Over in OpenBSD land, they fix the broken wheels…​until they have time to make better wheels. And it works! The OpenBSD wheels are better! +> As a wheel reinventor myself, I’m a huge fan of the OpenBSD model. OpenBSD is why we can have nice things! + +[Dave's OpenBSD Blog 5. Tour conclusion]( + + +To summarize: OpenBSD isn't a pain. + +## Writing SystemD Service Files + +[]( + +[]( + + +## Benchmarking Scripts + +[]( + + +## Ten Things to do After Installing FreeBSD + +[]( + + +## Network Management with the OpenBSD Packet Filter Toolset (BSDCan 2022) + +[Network Management with the OpenBSD Packet Filter Toolset (BSDCan 2022)]( + + +## Stop Using Fail2Ban + +[]( + + +## Alternatives to CertBot + +CertBot is prone to random breakage. It's happened to me multiple times. Here are some alternatives: + +[dehydrated]( + +[]( + + +Or acme-client if on OpenBSD. It's built into the system. diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,14 @@ +# Using Goaccess with OpenBSD's httpd + +[← Back](./) + + +Create the .goaccessrc file in the home directory of your user (probably root) and add to it + +```.goaccessrc +time-format %T +date-format %d/%b/%Y +log-format %v %h %^ %^ [%d:%t %^] "%r" %s %b +``` + +Goaccess should now work as expected and properly parse httpd's log files. diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,51 @@ +# Sysadmin + +``` +.---------------------------------. +| .---------------------------. | +|[]| |[]| +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| | | | +| `---------------------------' | +| __________________ _____ | +| | ___ | | | +| | | | | | | +| | | | | | | +| | | | | | | +| | |___| | | | +\_____|__________________|_____|__|dp +``` + +[← Back](../) + + +[Computer Names](computer-names.html) + +[General Tips and Tricks](general-tips-and-tricks.html) + +[Using Goaccess with OpenBSD's httpd](goaccess-with-openbsd-httpd.html) + +[ Admin Scripts](jaderune-admin-scripts.html) + +[Misskey Setup](misskey.html) + +[OpenBSD NAS](openbsd-nas.html) + +[OpenBSD Router](openbsd-router.html) + +[OpenBSD Server Details](openbsd-server-details.html) + +[Relaying Service Mail With OpenSMTPD](relaying-service-mail-with-opensmtpd.html) + +[Server Security](server-security.html) + +[Tarsnap Backups With Acts](tarsnap-backups-with-acts.html) + +[UW IMAP Server Documentation](uw-imap.html) + diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,199 @@ +# Administration Documentation + +[← Back](./) + + +A collection of documentation and scripts used to administer + +## Register an XMPP User + +This is a custom script created to allow admins who don't otherwise have access to the infrastructure to register users with ejabberd. + +A simple script was created to do this: + +``` +#!/bin/sh + +if [ -z "$1" ]; then + echo "You must provide a username" + exit 1 +else + username="$1" +fi + +iocage exec xmpp su -l ejabberd -c "ejabberdctl register $username 'temppass'" +exit 0 +``` + +This script takes a name as an argument and registers a user with that name and the configured temporary password. + +It can be run as the admin user using the following command: + +``` +doas register_xmpp_user <name> +``` + +Doas has been set up as follows: + +``` +permit admin as root cmd register_xmpp_user +``` + +## Manage SMTP Users + +``` +#!/bin/sh + +# smtp_user +# A POSIX shell script to manage users in an OpenSMTPD/Dovecot system using +# a passwd-file credential storage backend. +# Copyright (C) 2020 Jake Bauer under the terms of the ISC License + +set -o errexit +IFS=$(printf '\n\t') + +DOMAIN="" +MAILBOXES="/var/vmail" +DOVECOT_USER_FILE="/etc/dovecot/users" + +# This is the message sent to all new users upon registration +MESSAGE="FROM: admin@$DOMAIN +Subject: Welcome to + +Hello and welcome to! + +We offer a variety of services for you to use. Please see our website +[1] for a complete listing and instructions on how to access each +service. + +Also, please make sure to familiarize yourself with our rules and how +things work around here [2]. + +If you have any issues, please send us an email or XMPP message. + +-- +The Admin Team + +[1]: +[2]:" +# END MESSAGE + +PROGNAME="$0" +CMD="$1" +USER="$2" +NEWPASS="$3" +OLDPASS="$4" + +if [ `whoami` != root ]; then + echo "Please run as root" + exit 1 +fi + +function print_help +{ + printf "Usage: %s <command> [<options>]\n" "$PROGNAME" + printf "Commands:\n" + printf " add <username> <password>\n" + printf " del <username>\n" + printf " chg <username> <password> <old_password>\n" + printf "NOTE: This script must be run as root\n" +} + +function add_user +{ + if [ -z "$USER" ] || [ -z "$NEWPASS" ]; then + echo "Error: Missing username or password." + print_help + exit 1 + fi + + echo "Generating new password hash..." + smtppass=$(smtpctl encrypt "$NEWPASS") + echo "$USER:$smtppass::::" >> "$DOVECOT_USER_FILE" + + echo "Sending welcome message..." + echo "$MESSAGE" | /usr/local/libexec/dovecot/dovecot-lda -d "$USER" +} + +function del_user +{ + if [ -z "$USER" ]; then + echo "Error: Missing username." + print_help + exit 1 + fi + + echo "Removing user account entry and mailbox..." + sed -i "/^$USER/d" "$DOVECOT_USER_FILE" + rm -r "$MAILBOXES"/"$USER" +} + +function change_pass +{ + if [ -z "$USER" ] || [ -z "$NEWPASS" ] || [ -z "$OLDPASS" ]; then + echo "Error: Missing username, old password, or new password." + print_help + exit 1 + fi + + # Authenticate the user with the existing password + HASH=$(grep -e ^"$USER" /etc/dovecot/users | cut -d':' -f2) + if ! doveadm pw -t '{BLF-CRYPT}'"$HASH" -p "$OLDPASS" >/dev/null; then + echo "Failed to verify password" + exit 2 + fi + + # Generate new hash and replace old password + echo "Generating new password hash..." + smtppass=$(smtpctl encrypt "$NEWPASS") + sed -i "/^$USER/d" "$DOVECOT_USER_FILE" + echo "$USER:$smtppass::::" >> "$DOVECOT_USER_FILE" +} + +function reload_credentials +{ + printf "Reloading smtpd credentials table: " + smtpctl update table credentials +} + +case "$1" in + add) + add_user + reload_credentials + printf "Added user %s\n" "$USER" + exit 0 + ;; + del) + del_user + reload_credentials + printf "Removed user %s\n" "$USER" + exit 0 + ;; + chg) + change_pass + reload_credentials + printf "Password changed for user %s\n" "$USER" + exit 0 + ;; + *) + echo "Command not recognized." + print_help + exit 1 + ;; +esac +``` + +To add a user, remove a user, or change a user's password, use the following commands respectively: + +``` +manage_smtp_user add <username> <password> +manage_smtp_user del <username> +manage_smtp_user chg <username> <password> <old_password> +``` + +The script must be run as root. Doas has been set up as follows: + +``` +permit administrator as root cmd manage_smtp_user +``` + diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,84 @@ +# Installing Misskey on Debian 11 + +[← Back](./) + + +Install NodeJS v16.x+ using the repo from Node's website. Then install: + +``` +nodejs redis postgresql yarn ffmpeg gulp git +``` + +Add a new user to postgres: + +``` +su - postgres +createuser misskey -P; +createdb misskey; +psql +GRANT ALL PRIVILEGES ON DATABASE misskey TO misskey; +``` + +Make sure the following environment is set: + +``` +NODE_ENV=production NODE_PATH=/usr/lib/nodejs:/usr/share/nodejs +``` + +You will probably have to: + +``` +yarn add querystring js-yaml +``` + +Run the following to build and install misskey: + +``` +su - misskey +git clone --recursive -b master git:// +cd misskey +git submodule update --init +git checkout master +yarn install +cp .config/example.yml .config/default.yml +<EDIT THE CONFIG FILE YOU JUST COPIED> +yarn build +yarn run init +``` + +Test that it works by running: + +``` +yarn start +``` + +Create and install the following systemd service file into `/etc/systemd/system/misskey.service`: + +``` +[Unit] +Description=Misskey daemon + +[Service] +Type=simple +User=misskey +ExecStart=/usr/bin/npm start +WorkingDirectory=/home/misskey/misskey +Environment="NODE_ENV=production" +TimeoutSec=60 +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=misskey +Restart=always + +[Install] +``` + +To start Misskey from the service file, do: + +``` +systemctl daemon-reload +systemctl enable misskey +systemctl start misskey +``` + diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,107 @@ +# OpenBSD NAS + +[← Back](./) + + +The machine is a Dell Optiplex 3020MT with the following specs: + +* CPU: i3-4150 @ 3.50GHz (2C/4T) +* RAM: 2+4GB DDR3 +* Boot: Samsung 870 EVO 250GB SSD +* Storage: Mirror of Two HGST HDN726040ALE614 (4TB) HDDs +* Backup Storage: Seagate Expansion 8TB External HDD + +In addition to my normal OpenBSD Server Setup: + +[OpenBSD Server Setup](openbsd-server-setup.html) + + +## Creating the RAID 1 Array + +Assuming `sd0` and `sd1` are the disks to be mirrored, and `sd3` is the result +(it may not be, check first and check output of bioctl): + +``` +# fdisk -gy sd0 +# fdisk -gy sd1 +# disklabel -E sd0 +sd0> a a +offset: [64] +size: [<max>] * +FS type: [4.2BSD] RAID +sd0*> w +sd0> q +# disklabel sd0 > layout +# dislabel -R sd1 layout +# rm layout +# bioctl -c 1 -l sd0a,sd1a softraid0 +# disklabel -E sd3 +sd3> a a +offset: [0] +size: [<max>] * +FS type: [4.2BSD] +sd3*> w +sd3> q +# newfs sd3a +``` + +Then make note of the duid returned by `sysctl hw.disknames` for sd3 and, in `/etc/fstab`: + +``` +<duid>.a /var/syncthing ffs rw,nodev,nosuid,noatime,noexec 1 2 +``` + +Note that syncthing on OpenBSD is configured by default to serve out of `/var/syncthing`. The `_syncthing` user must have `rwx` permissions on that directory. + +## Monitoring and Fixing the Array + +Checking the status of the mirror can be done with the command: + +``` +# bioctl <duid> +``` + +and should be added to a daily cronjob/script. + +Should a hard drive fail, assuming the replaced disk is `sd1`, the RAID can be rebuilt like so: + +``` +# disklabel -E sd1 +sd0> a a +offset: [64] +size: [<max>] * +FS type: [4.2BSD] RAID +sd0*> w +sd0> q +# bioctl -R /dev/sd1a sd3 +``` + +## Syncthing + +Since I'm running syncthing on this machine, I installed the `syncthing` package, and did the following to increase the number of open files allowed by the daemon: + +``` +# echo 'kern.maxfiles=131072' > /etc/sysctl.conf +# sysctl kern.maxfiles=131072 +# cat >> /etc/login.conf +syncthing:\ + :openfiles=124042:\ + :tc=daemon: +``` + +The syncthing GUI only listens on the localhost address by default. To access this from my machines, I added the following line to `~/.ssh/config` under the entry for my server: + +``` +LocalForward 8385 +``` + +which lets me go to `localhost:8385` in my browser when I'm SSHed into the NAS. + +## Backups + +Using OpenBSD's built-in `dump(1)`, after an initial dump of the filesystem is created at level `0`, incremental backups are done to an external drive from `/etc/daily.local`: + +``` +next_part "Backing up filesystems:" +dump -1auf /var/backups/syncthing/$(date +%Y%m%d).dump.1 /var/syncthing +``` diff --git a/content/garden/arboretum/sysadmin/ b/content/garden/arboretum/sysadmin/ @@ -0,0 +1,167 @@ +# OpenBSD Router + +[← Back](./) + + +The machine is a Dell Optiplex 3010 SFF PC with the following specs: + +* CPU: i5-3470 @ 3.20GHz (4C/4T) +* RAM: 4+4GB DDR3 +* Storage: 120GB Crucial SSD +* Networking: 2x1GbE PCIe Ethernet Card + +There are three major software components to this router: + +* DHCP - dhcpd +* Firewall - pf +* DNS - unbound + +### DHCP + +DHCP is handled by dhcpd, configuration is in `/etc/dhcpd.conf`. + +This is the configuration: + +```/etc/dhcpd.conf +option domain-name ""; + +subnet netmask { + option routers; + option domain-name-servers; + range; + host hades { + fixed-address; + hardware ethernet 70:85:c2:54:98:92; + } + host hecate { + fixed-address; + hardware ethernet a4:1f:72:61:f4:fc; + } + host cerberus { + fixed-address; + hardware ethernet b0:83:fe:9b:8a:e3; + } + host eurynomos { + fixed-address; + hardware ethernet f8:bc:12:87:39:93; + } +} +subnet netmask { + option routers; + option domain-name-servers; + range; +} +``` + +There are two subnets, one for LAN ( and one for WLAN ( + +There are reserved addresses for hades (my desktop), hecate (my test server), cerberus (my main server), and eurynomos (my NAS). The reserved addresses range for the LAN network is probably larger than it needs to be, but I won't have anywhere close to 200 devices/services anyways. + +### Firewall + +The firewall is handled by pf which stores its configuration at `/etc/pf.conf`. + +This is the basic configuration, with port-forwarding rules appended if needed: + +```/etc/pf.conf +WAN = "em0" +LAN = "em1" +WLAN = "re0" + +table <martians> { \ + \ + \ + } + +# Set basic firewall settings +set block-policy drop +set loginterface egress +set skip on lo0 + +# Normalize incoming packets and perform NAT translation +match in all scrub (no-df random-id max-mss 1440) +match out on egress inet from !(egress:network) to any nat-to (egress:0) + +# Protect from spoofed addresses and block traffic to/from non-routables +block in from no-route +block in quick from urpf-failed +block in quick on egress from <martians> to any +block return out quick on egress from any to <martians> + +# Default deny incoming traffic +block all + +# Block all DNS requests not addressed to this router +block return in quick on $LAN proto { udp tcp } to ! $LAN port { 53 853 } +block return in quick on $WLAN proto { udp tcp } to ! $WLAN port { 53 853 } + +# Allow all outbound traffic +pass out quick + +# Allow internal LAN/WLAN traffic +pass in on { $LAN $WLAN } + +# Allow ICMP pings +pass in quick on egress inet proto icmp icmp-type echoreq max-pkt-rate 100/10 + +