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

commit ba478bc53ca8391ba1cc736d4d12cf290a69aa91
parent 4e69a6d8ad967a01f4fa083b54afc1b4665a7e2d
Author: Jake Bauer <>
Date:   Tue, 15 Feb 2022 01:48:37 -0500

Move to new sbs format

M.gitignore | 13+------------
MLICENSE | 16+--------------- | 48+++---------------------------------------------
Dbuild/footer.html | 1-
Dbuild/header.html | 26--------------------------
Dbuild/logos/logo-ftp.svg | 196-------------------------------------------------------------------------------
Dbuild/logos/logo-git.svg | 116-------------------------------------------------------------------------------
Dbuild/logos/logo-main.svg | 159-------------------------------------------------------------------------------
Dbuild/logos/logo-mastodon.svg | 126-------------------------------------------------------------------------------
Dbuild/logos/logo-status-uptimerobot.svg | 135-------------------------------------------------------------------------------
Dbuild/logos/logo-status.svg | 113-------------------------------------------------------------------------------
Dbuild/logos/logo-wiki.svg | 523-------------------------------------------------------------------------------
Dbuild/logos/logo.svg | 101-------------------------------------------------------------------------------
Dcompile | 323-------------------------------------------------------------------------------
Aconfig.ini | 5+++++
Acontent/ | 105+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 326+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 229+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 97+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 35+++++++++++++++++++++++++++++++++++
Acontent/blog/ | 89+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 74++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 87+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 253+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 167+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 62++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 522+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 52++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 39+++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 44++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 48++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 75+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 82+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 245+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 102+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 494+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 226+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 146+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 121+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 122+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 73+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 68++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 61+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 24++++++++++++++++++++++++
Acontent/blog/ | 59+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 33+++++++++++++++++++++++++++++++++
Acontent/blog/ | 85+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 51+++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 96+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 114+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 38++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 53+++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 94+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 76++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 58++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 60++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 95+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 49+++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 99+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 0
Acontent/blog/ | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 38++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 83+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/blog/ | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 69+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 65+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 381+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 25+++++++++++++++++++++++++
Acontent/ | 57+++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 46++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 39+++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 71+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/projects/ | 39+++++++++++++++++++++++++++++++++++++++
Acontent/ | 134+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 135+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/ | 28++++++++++++++++++++++++++++
Dpages/ | 108-------------------------------------------------------------------------------
Dpages/ | 15---------------
Dpages/ | 331-------------------------------------------------------------------------------
Dpages/ | 232-------------------------------------------------------------------------------
Dpages/blog/ | 79-------------------------------------------------------------------------------
Dpages/blog/ | 102-------------------------------------------------------------------------------
Dpages/blog/ | 101-------------------------------------------------------------------------------
Dpages/blog/ | 40----------------------------------------
Dpages/blog/ | 94-------------------------------------------------------------------------------
Dpages/blog/ | 78------------------------------------------------------------------------------
Dpages/blog/ | 79-------------------------------------------------------------------------------
Dpages/blog/ | 92-------------------------------------------------------------------------------
Dpages/blog/ | 258-------------------------------------------------------------------------------
Dpages/blog/ | 65-----------------------------------------------------------------
Dpages/blog/ | 74--------------------------------------------------------------------------
Dpages/blog/ | 172-------------------------------------------------------------------------------
Dpages/blog/ | 67-------------------------------------------------------------------
Dpages/blog/ | 84-------------------------------------------------------------------------------
Dpages/blog/ | 69---------------------------------------------------------------------
Dpages/blog/ | 63---------------------------------------------------------------
Dpages/blog/ | 51---------------------------------------------------
Dpages/blog/ | 64----------------------------------------------------------------
Dpages/blog/ | 527-------------------------------------------------------------------------------
Dpages/blog/ | 57---------------------------------------------------------
Dpages/blog/ | 44--------------------------------------------
Dpages/blog/ | 64----------------------------------------------------------------
Dpages/blog/ | 49-------------------------------------------------
Dpages/blog/ | 53-----------------------------------------------------
Dpages/blog/ | 80-------------------------------------------------------------------------------
Dpages/blog/ | 87-------------------------------------------------------------------------------
Dpages/blog/ | 85-------------------------------------------------------------------------------
Dpages/blog/ | 250-------------------------------------------------------------------------------
Dpages/blog/ | 107-------------------------------------------------------------------------------
Dpages/blog/ | 499-------------------------------------------------------------------------------
Dpages/blog/ | 231-------------------------------------------------------------------------------
Dpages/blog/ | 76----------------------------------------------------------------------------
Dpages/blog/ | 151------------------------------------------------------------------------------
Dpages/blog/ | 126-------------------------------------------------------------------------------
Dpages/blog/ | 83-------------------------------------------------------------------------------
Dpages/blog/ | 127-------------------------------------------------------------------------------
Dpages/blog/ | 78------------------------------------------------------------------------------
Dpages/blog/ | 85-------------------------------------------------------------------------------
Dpages/blog/ | 73-------------------------------------------------------------------------
Dpages/blog/ | 66------------------------------------------------------------------
Dpages/blog/ | 76----------------------------------------------------------------------------
Dpages/blog/ | 64----------------------------------------------------------------
Dpages/blog/ | 38--------------------------------------
Dpages/blog/ | 90-------------------------------------------------------------------------------
Dpages/blog/ | 56--------------------------------------------------------
Dpages/blog/ | 55-------------------------------------------------------
Dpages/blog/ | 101-------------------------------------------------------------------------------
Dpages/blog/ | 119-------------------------------------------------------------------------------
Dpages/blog/ | 43-------------------------------------------
Dpages/blog/ | 58----------------------------------------------------------
Dpages/blog/ | 99-------------------------------------------------------------------------------
Dpages/blog/ | 81-------------------------------------------------------------------------------
Dpages/blog/ | 63---------------------------------------------------------------
Dpages/blog/ | 65-----------------------------------------------------------------
Dpages/blog/ | 100-------------------------------------------------------------------------------
Dpages/blog/ | 68--------------------------------------------------------------------
Dpages/blog/ | 54------------------------------------------------------
Dpages/blog/ | 104-------------------------------------------------------------------------------
Dpages/blog/ | 0
Dpages/blog/ | 139-------------------------------------------------------------------------------
Dpages/blog/ | 43-------------------------------------------
Dpages/blog/ | 88-------------------------------------------------------------------------------
Dpages/blog/ | 51---------------------------------------------------
Dpages/blog/ | 121-------------------------------------------------------------------------------
Dpages/ | 61-------------------------------------------------------------
Dpages/ | 72------------------------------------------------------------------------
Dpages/ | 380-------------------------------------------------------------------------------
Dpages/ | 28----------------------------
Dpages/ | 60------------------------------------------------------------
Dpages/projects/ | 49-------------------------------------------------
Dpages/projects/ | 42------------------------------------------
Dpages/projects/ | 74--------------------------------------------------------------------------
Dpages/projects/ | 42------------------------------------------
Dpages/ | 137-------------------------------------------------------------------------------
Dpages/ | 138-------------------------------------------------------------------------------
Dpages/ | 31-------------------------------
Dpublic/blogroll.opml | 67-------------------------------------------------------------------
Dpublic/feeds/sitewide-feed.xml | 7214-------------------------------------------------------------------------------
Dpublic/img/misskey/admin-overview.png | 0
Dpublic/img/misskey/database-thumb.png | 0
Dpublic/img/misskey/database.png | 0
Dpublic/img/misskey/drive-thumb.png | 0
Dpublic/img/misskey/drive.png | 0
Dpublic/img/misskey/federation-thumb.png | 0
Dpublic/img/misskey/federation.png | 0
Dpublic/img/misskey/mfm-thumb.png | 0
Dpublic/img/misskey/mfm.png | 0
Dpublic/img/misskey/threading-thumb.png | 0
Dpublic/img/misskey/threading.png | 0
Dpublic/img/misskey/widgets.png | 0
Dpublic/img/more-banned-ips.png | 0
Dpublic/img/mx-toolbox-results-thumb.png | 0
Dpublic/img/mx-toolbox-results.png | 0
Dpublic/img/neomutt-threading.png | 0
Dpublic/img/neomutt-thumb.png | 0
Dpublic/img/neomutt.png | 0
Dpublic/img/office-365-spam-thumb.png | 0
Dpublic/img/office-365-spam.png | 0
Dpublic/img/old-logo.png | 0
Dpublic/img/openbsd-logo.png | 0
Dpublic/img/openbsd-logo.svg | 2--
Dpublic/img/paritybit-gopher-lynx-thumb.png | 0
Dpublic/img/paritybit-gopher-lynx.png | 0
Dpublic/img/projects/usrmnt/screenshot.png | 0
Dpublic/img/reporting-cisco-error-thumb.png | 0
Dpublic/img/reporting-cisco-error.png | 0
Dpublic/img/seo-report.png | 0
Dpublic/img/slack-tracking.png | 0
Dpublic/img/st-lynx-thumb.png | 0
Dpublic/img/st-lynx.png | 0
Dpublic/img/st-tc.png | 0
Dpublic/img/st-vim.png | 0
Dpublic/img/syncthing-dashboard-thumb.png | 0
Dpublic/img/syncthing-dashboard.png | 0
Dpublic/img/t420s/laptop-looking-good-thumb.jpg | 0
Dpublic/img/t420s/laptop-looking-good.jpg | 0
Dpublic/img/t420s/new-sticker-thumb.jpg | 0
Dpublic/img/t420s/new-sticker.jpg | 0
Dpublic/img/t420s/t420s-close-thumb.jpg | 0
Dpublic/img/t420s/t420s-close.jpg | 0
Dpublic/img/t420s/t420s-thinklight-thumb.jpg | 0
Dpublic/img/t420s/t420s-thinklight.jpg | 0
Dpublic/img/t420s/t420s-trackpad-thumb.jpg | 0
Dpublic/img/t420s/t420s-trackpad.jpg | 0
Dpublic/img/t420s/t420s-wide-thumb.jpg | 0
Dpublic/img/t420s/t420s-wide.jpg | 0
Dpublic/img/threading-thumb.png | 0
Dpublic/img/threading.png | 0
Dpublic/img/urxvt-lynx-thumb.png | 0
Dpublic/img/urxvt-lynx.png | 0
Dpublic/img/urxvt-tc.png | 0
Dpublic/img/urxvt-vim.png | 0
Dpublic/img/valid-rss-rogers.png | 0
Dpublic/img/vcss.gif | 0
Dpublic/img/vim-airline.gif | 0
Dpublic/img/vim-airline.mp4 | 0
Dpublic/img/vim-no-airline.gif | 0
Dpublic/img/vim-no-airline.mp4 | 0
Dpublic/img/widgets.png | 0
Dpublic/js/borderlands-3-dps-calculator.js | 151------------------------------------------------------------------------------
Dpublic/js/generator.js | 79-------------------------------------------------------------------------------
Dpublic/js/initiative.js | 171-------------------------------------------------------------------------------
Dpublic/js/roll.js | 147-------------------------------------------------------------------------------
Dpublic/js/time-duration-calculator.js | 116-------------------------------------------------------------------------------
Dpublic/robots.txt | 3---
Dpublic/sitemap.xml | 135-------------------------------------------------------------------------------
Dpublic/vid/claws-mail-git.webm | 0
Dpublic/vid/noswallow-animated-thumb.webm | 0
Dpublic/vid/noswallow-animated.webm | 0
Dpublic/vid/swallow-animated-thumb.webm | 0
Dpublic/vid/swallow-animated.webm | 0
Dpublish | 198-------------------------------------------------------------------------------
Rpublic/favicon.png -> static/favicon.png | 0
Astatic/feed.xml | 7051+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Rpublic/img/admin-overview-thumb.png -> static/img/admin-overview-thumb.png | 0
Rpublic/img/admin-overview.png -> static/img/admin-overview.png | 0
Rpublic/img/banned-ips-now.png -> static/img/banned-ips-now.png | 0
Rpublic/img/banned-ips.png -> static/img/banned-ips.png | 0
Rpublic/img/brokerage-comparison-thumb.png -> static/img/brokerage-comparison-thumb.png | 0
Rpublic/img/brokerage-comparison.png -> static/img/brokerage-comparison.png | 0
Rpublic/img/cisco-ssl-error-thumb.png -> static/img/cisco-ssl-error-thumb.png | 0
Rpublic/img/cisco-ssl-error.png -> static/img/cisco-ssl-error.png | 0
Rpublic/img/claws-mail-actions.png -> static/img/claws-mail-actions.png | 0
Rpublic/img/current-desktop-ws.png -> static/img/current-desktop-ws.png | 0
Rpublic/img/current-desktop.png -> static/img/current-desktop.png | 0
Rpublic/img/database-thumb.png -> static/img/database-thumb.png | 0
Rpublic/img/database.png -> static/img/database.png | 0
Rpublic/img/debian-with-btrfs/boot-mount.png -> static/img/debian-with-btrfs/boot-mount.png | 0
Rpublic/img/debian-with-btrfs/commands-before-boot-mount.png -> static/img/debian-with-btrfs/commands-before-boot-mount.png | 0
Rpublic/img/debian-with-btrfs/df.png -> static/img/debian-with-btrfs/df.png | 0
Rpublic/img/debian-with-btrfs/partition-results.png -> static/img/debian-with-btrfs/partition-results.png | 0
Rpublic/img/debian-with-btrfs/partition-screen.png -> static/img/debian-with-btrfs/partition-screen.png | 0
Rpublic/img/debian-with-btrfs/shell.png -> static/img/debian-with-btrfs/shell.png | 0
Rpublic/img/debian-with-btrfs/target-fstab.png -> static/img/debian-with-btrfs/target-fstab.png | 0
Rpublic/img/desktop-thumb.png -> static/img/desktop-thumb.png | 0
Rpublic/img/desktop.png -> static/img/desktop.png | 0
Rpublic/img/diefen/cafeteria-store.jpg -> static/img/diefen/cafeteria-store.jpg | 0
Rpublic/img/diefen/comms-rack.jpg -> static/img/diefen/comms-rack.jpg | 0
Rpublic/img/diefen/comms-room.jpg -> static/img/diefen/comms-room.jpg | 0
Rpublic/img/diefen/computers.jpg -> static/img/diefen/computers.jpg | 0
Rpublic/img/diefen/conference-room.jpg -> static/img/diefen/conference-room.jpg | 0
Rpublic/img/diefen/hard-disk-platter.jpg -> static/img/diefen/hard-disk-platter.jpg | 0
Rpublic/img/diefen/mainframes.jpg -> static/img/diefen/mainframes.jpg | 0
Rpublic/img/diefen/operating-theatre.jpg -> static/img/diefen/operating-theatre.jpg | 0
Rpublic/img/diefen/oscilloscope.jpg -> static/img/diefen/oscilloscope.jpg | 0
Rpublic/img/diefen/situation-room.jpg -> static/img/diefen/situation-room.jpg | 0
Rpublic/img/diefen/tape-rack.jpg -> static/img/diefen/tape-rack.jpg | 0
Rpublic/img/diefen/thumbnails/cafeteria-store.jpg -> static/img/diefen/thumbnails/cafeteria-store.jpg | 0
Rpublic/img/diefen/thumbnails/comms-rack.jpg -> static/img/diefen/thumbnails/comms-rack.jpg | 0
Rpublic/img/diefen/thumbnails/comms-room.jpg -> static/img/diefen/thumbnails/comms-room.jpg | 0
Rpublic/img/diefen/thumbnails/computers.jpg -> static/img/diefen/thumbnails/computers.jpg | 0
Rpublic/img/diefen/thumbnails/conference-room.jpg -> static/img/diefen/thumbnails/conference-room.jpg | 0
Rpublic/img/diefen/thumbnails/hard-disk-platter.jpg -> static/img/diefen/thumbnails/hard-disk-platter.jpg | 0
Rpublic/img/diefen/thumbnails/mainframes.jpg -> static/img/diefen/thumbnails/mainframes.jpg | 0
Rpublic/img/diefen/thumbnails/operating-theatre.jpg -> static/img/diefen/thumbnails/operating-theatre.jpg | 0
Rpublic/img/diefen/thumbnails/oscilloscope.jpg -> static/img/diefen/thumbnails/oscilloscope.jpg | 0
Rpublic/img/diefen/thumbnails/situation-room.jpg -> static/img/diefen/thumbnails/situation-room.jpg | 0
Rpublic/img/diefen/thumbnails/tape-rack.jpg -> static/img/diefen/thumbnails/tape-rack.jpg | 0
Rpublic/img/diefen/thumbnails/vintage-computer.jpg -> static/img/diefen/thumbnails/vintage-computer.jpg | 0
Rpublic/img/diefen/thumbnails/workshop.jpg -> static/img/diefen/thumbnails/workshop.jpg | 0
Rpublic/img/diefen/vintage-computer.jpg -> static/img/diefen/vintage-computer.jpg | 0
Rpublic/img/diefen/workshop.jpg -> static/img/diefen/workshop.jpg | 0
Rpublic/img/double-desktop-email-thumb.png -> static/img/double-desktop-email-thumb.png | 0
Rpublic/img/double-desktop-email.png -> static/img/double-desktop-email.png | 0
Rpublic/img/drive-thumb.png -> static/img/drive-thumb.png | 0
Rpublic/img/federation-thumb.png -> static/img/federation-thumb.png | 0
Rpublic/img/federation.png -> static/img/federation.png | 0
Rpublic/img/fedora-tablet-desktop-thumb.png -> static/img/fedora-tablet-desktop-thumb.png | 0
Rpublic/img/fedora-tablet-desktop.png -> static/img/fedora-tablet-desktop.png | 0
Rpublic/img/feed-icon.png -> static/img/feed-icon.png | 0
Rpublic/img/firefox-settings-thumb.png -> static/img/firefox-settings-thumb.png | 0
Rpublic/img/firefox-settings.png -> static/img/firefox-settings.png | 0
Rpublic/img/flip-phone-open-thumb.png -> static/img/flip-phone-open-thumb.png | 0
Rpublic/img/flip-phone-open.png -> static/img/flip-phone-open.png | 0
Rpublic/img/floppy-thumb.jpg -> static/img/floppy-thumb.jpg | 0
Rpublic/img/floppy.jpg -> static/img/floppy.jpg | 0
Rpublic/img/giorno-3.png -> static/img/giorno-3.png | 0
Rpublic/img/hacker-quarterly-thumb.jpg -> static/img/hacker-quarterly-thumb.jpg | 0
Rpublic/img/hacker-quarterly.jpg -> static/img/hacker-quarterly.jpg | 0
Rpublic/img/home-directory.png -> static/img/home-directory.png | 0
Rpublic/img/husky-screenshot-thumb.png -> static/img/husky-screenshot-thumb.png | 0
Rpublic/img/husky-screenshot.png -> static/img/husky-screenshot.png | 0
Rpublic/img/ -> static/img/ | 0
Rpublic/img/icon.white.svg -> static/img/icon.white.svg | 0
Rpublic/img/keyboard-side-thumb.jpg -> static/img/keyboard-side-thumb.jpg | 0
Rpublic/img/keyboard-side.jpg -> static/img/keyboard-side.jpg | 0
Rpublic/img/keyboard-top-thumb.jpg -> static/img/keyboard-top-thumb.jpg | 0
Rpublic/img/keyboard-top.jpg -> static/img/keyboard-top.jpg | 0
Rpublic/img/laptop-open-with-touchpad-thumb.jpg -> static/img/laptop-open-with-touchpad-thumb.jpg | 0
Rpublic/img/laptop-open-with-touchpad.jpg -> static/img/laptop-open-with-touchpad.jpg | 0
Rpublic/img/laptop-screenshot-old-thumb.png -> static/img/laptop-screenshot-old-thumb.png | 0
Rpublic/img/laptop-screenshot-old.png -> static/img/laptop-screenshot-old.png | 0
Rpublic/img/live-testing-touchpad-thumb.jpg -> static/img/live-testing-touchpad-thumb.jpg | 0
Rpublic/img/live-testing-touchpad.jpg -> static/img/live-testing-touchpad.jpg | 0
Rpublic/img/logo-256.png -> static/img/logo-256.png | 0
Rpublic/img/logo-256x256.png -> static/img/logo-256x256.png | 0
Rpublic/img/logo-ftp.png -> static/img/logo-ftp.png | 0
Rpublic/img/logo-git-256.png -> static/img/logo-git-256.png | 0
Rpublic/img/logo-git.png -> static/img/logo-git.png | 0
Rpublic/img/logo-main-256.png -> static/img/logo-main-256.png | 0
Rpublic/img/logo-main.png -> static/img/logo-main.png | 0
Rpublic/img/logo-mastodon.png -> static/img/logo-mastodon.png | 0
Rpublic/img/logo-matrix.png -> static/img/logo-matrix.png | 0
Rpublic/img/logo-pleroma-128.png -> static/img/logo-pleroma-128.png | 0
Rpublic/img/logo-pleroma-32.png -> static/img/logo-pleroma-32.png | 0
Rpublic/img/logo-pleroma-512.png -> static/img/logo-pleroma-512.png | 0
Rpublic/img/logo-wiki.png -> static/img/logo-wiki.png | 0
Rpublic/img/ls-highlights.png -> static/img/ls-highlights.png | 0
Rpublic/img/ls-no-highlights.png -> static/img/ls-no-highlights.png | 0
Rpublic/img/lwn-homepage-colours.png -> static/img/lwn-homepage-colours.png | 0
Rpublic/img/lwn-we-colours.png -> static/img/lwn-we-colours.png | 0
Rpublic/img/m1-cpubenchmark.png -> static/img/m1-cpubenchmark.png | 0
Rpublic/img/mastodon-error-thumb.png -> static/img/mastodon-error-thumb.png | 0
Rpublic/img/mastodon-error.png -> static/img/mastodon-error.png | 0
Rpublic/img/mastodon-status-announcement.png -> static/img/mastodon-status-announcement.png | 0
Rpublic/img/mfm-thumb.png -> static/img/mfm-thumb.png | 0
Rpublic/img/mfm.png -> static/img/mfm.png | 0
Rpublic/img/misskey/admin-overview-thumb.png -> static/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/old-logo.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/projects/usrmnt/screenshot.png | 0
Astatic/img/reporting-cisco-error-thumb.png | 0
Astatic/img/reporting-cisco-error.png | 0
Astatic/img/seo-report.png | 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/threading-thumb.png | 0
Astatic/img/threading.png | 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/valid-rss-rogers.png | 0
Astatic/img/vcss.gif | 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/img/widgets.png | 0
Astatic/js/borderlands-3-dps-calculator.js | 151++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/js/generator.js | 79+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/js/initiative.js | 171+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/js/roll.js | 147+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/js/time-duration-calculator.js | 116+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/robots.txt | 2++
Astatic/style.css | 218+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Astatic/style.min.css | 1+
Astatic/vid/claws-mail-git.webm | 0
Astatic/vid/noswallow-animated-thumb.webm | 0
Astatic/vid/noswallow-animated.webm | 0
Astatic/vid/swallow-animated-thumb.webm | 0
Astatic/vid/swallow-animated.webm | 0
Dstyle/initiative.css | 53-----------------------------------------------------
Dstyle/main.css | 222-------------------------------------------------------------------------------
Dstyle/morrowind.css | 94-------------------------------------------------------------------------------
Dstyle/roll.css | 207-------------------------------------------------------------------------------
Dstyle/tdc.css | 66------------------------------------------------------------------
Atemplates/footer.html | 19+++++++++++++++++++
Atemplates/header.html | 26++++++++++++++++++++++++++
438 files changed, 15857 insertions(+), 19022 deletions(-)

diff --git a/.gitignore b/.gitignore @@ -1,13 +1,2 @@ # Ignore generated output files -public/feeds/*.bak -public/*.html -public/html/** -public/gopher/** -public/gemini/** -public/css/** - -# Ignore intermediate build files except header/footer/logos -build/* -!build/logos/ -!build/heater.html -!build/footer.html +static/**.html diff --git a/LICENSE b/LICENSE @@ -1,15 +1 @@ -ISC License - -Copyright (c) 2019-2021, Jake Bauer - -Permission to use, copy, modify, and/or distribute this software for any -purpose with or without fee is hereby granted, provided that the above -copyright notice and this permission notice appear in all copies. - -THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. +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/ @@ -1,47 +1,5 @@ -# Web Site +# -_**NOTE:** This README is out of date and will be updated soon._ +Content corresponding to [the website]( -## Use of Git Logo - -The Git Logo (incorporated in the logo for -[]( by me) was created by [Jason -Long]( and is licensed under the [Creative Commons -Attribution 3.0 Unported License]( -It was retrieved from - -## Build Scripts - -The build script `compile` was written to serve the needs of building my -webpages and was not coded to be a tool for the general public. Therefore, a lot -of the solutions depend on structuring a page in a specific way and the whole -script looks quite hacky. It makes me feel warm and fuzzy. - -The publishing script `publish` was also written in a similar way and is -particularly tailored to the layout and design of my webpages. - -## Format of a Valid Page - -To build a page that is properly compiled by the script, there are 5 essential -things: - -1. The first line of the file must be the title for the page. The text here will - become the content of the HTML \<title\> tag. -2. The third line of the file must be a description of the content of the page. - This text will become the content of the HTML \<meta\> description tag. -3. The fifth line of the file must be a list of the CSS files that the HTML page - needs. This is a space-separated list of css files like so: `"base.css - extra.css test.css"`. -4. The seventh line of the file must be a list of the - sections/subsections/subsubsections which will become the content of the - table of contents (the name of a section and the name of the header it is - pointing to _must_ be identical). This is a semicolon `;` separated list of - header names like so: `"Introduction; Building; sub:Compiling; subsub:clang; - subsub:gcc; sub:Environment; Further Reading"`. -5. The content of 2-4 must be enclosed by double-quote `"` characters and - preceded by markdown "comment markers": `[//]:`. If any of 1-4 are not - needed, the line must still exist but, other than the markdown comment - marker, the line must be blank. There shouldn't even be double quote - characters on the line. - -See the files in the `pages/` directory for examples. +This site is built using [sbs]( diff --git a/build/footer.html b/build/footer.html @@ -1 +0,0 @@ -</main><hr><footer><small><div style="float:left"><a href="">←</a> <a href="">Fediring</a> <a href="">→</a></div><center>© 2019-2022 Jake Bauer — <a href="">CC-BY 4.0</a> <a href="" target="_blank" style="float:right"><img id="xxiivv-icon" src="/img/" width="20px" height="20px" alt="XXIIVV webring"/></a></center></small></footer></body></html> diff --git a/build/header.html b/build/header.html @@ -1,26 +0,0 @@ -<!DOCTYPE html> -<html lang="en"> -<head> - <meta charset="utf-8"> - <meta name="viewport" content="width=device-width, initial-scale=1.0"> - <meta name="description" content=""> - <link rel="alternate" type="application/rss+xml" title="RSS feed" - href=""> - <link rel="icon" type="image/png" href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAAACAAAAAgCAMAAABEpIrGAAABX1BMVEUAAAABAAAAAAAAAAAAAAAAAAAAAAC7amoAAABlPz8AAAAAAAAGAwMAAAAAAAAAAAC7d3cKBwe7d3e7d3eWX1/ny4+WX18CAQGHVlaTXl4BAAApGhpiPj7ny4/ny4/oy4/ozI/qz5Ona2u7d3d4TEzny48MCAhlQEC7d3e7d3cAAAAAAAC7d3e8d3cAAAC8d3fnzI+8dnYAAADpzJC9eHjny4+WX1+TXV13S0u7d3fny492S0vnzI/ny4+EU1PnzI8mFxe7d3cjFhZgPT3ny5AAAAC7d3fny4+7d3cAAADozJC6d3e7d3cAAADozI/my5Dny44AAAAAAAC7d3e4d3fkx5DpzY69c3O7d3eoamroy4+FVVWEVFR0Skq7d3e7d3e8d3cAAAC6eHi7eHi7eHi8dna8dnYAAADozJAAAADkyY28eXnqyJHqzY63eHi/dXXny48AAAC7d3e5dXW2dHSjLYEdAAAAcHRSTlMA9cj58gYaBOrflhjq44MI/ePbaP348u/u6Oba1sW+oosL/Pbv7ejnyLuXlI54RkM8Oy4iG/v38efl4ODf2tfT09LQz87FwbeimJeJf397ZUlIRTQvGxYP9/Xv4ODZz86yk4JxYlRQSjctJiYlJCAYM3tXUgAAAg1JREFUOMttk1V3ImEQRO8MQ3CChACBIHF3l427+7q7Tjfz/88+sNhk67Vuf3K6CuryXo2Yfo/HbwYnvDxW25EldVnBNpfdHjVErO2dJ9nsk51tS8SItreMmyLxV46qakxVndW4iNl0yExEjHxFEyfTcz7f3PT7La0EDInM1PxQRMJZTSQbE5OvtbNLuv6d0W5K1zM99DXf6RvTnrCY1XdExcjqKcD9RbFQKF7cAyS105AoQJsheT0EyqWUbdu2badKZeBEA2KFgCOJVxI+uNu169q9A4YqAxIEryWr+hnKG3aTNsowrX2S9vJFLGcLOLZbdAwMO4ZMMCKbegq/5luB+VlIak6CmJLXGzi3XTqHOQ2IiV9e6gMU3EABeJoRPx7p7AXW3cA6kOgQTw1YcwNrNcAvL/QBut1AN9CbET+m5PUWSm6gBH90UEyCsqnjMOUGvsJHzckoV2I4Q8BBq38AvHUMucZryZJOwmx/s98/C7exPkl7YUTilTc+mHre5E8Bw5UBGa2uO6BjwPf6T7p/AuM6WF03UTEWNQlwWVxJpVaKlwCfYgseOatFLtyjYy2RYzzWE5Y9byO0izo02bBv9nUhXA9tNfaBiu5/+OED3+/ksFYGPRL55irOkqOqy8sxVadvQGQv9Kh6Ri6Q6ejIBHKGiHXmLnAomG6UNz0a+k+/vRPBav3fXTdN/wUXrszXABeiEwAAAABJRU5ErkJggg=="> - <title></title> -</head> -<body> - <header></header> - <nav id="navigation"> - <a href="/">Home</a> - <a href="/blog">Blog</a> - <a href="/links">Links</a> - <a href="/projects">Projects</a> - <a href="/wiki">Wiki</a> - <a href="/uses">Uses</a> - <a href="/now">Now</a> - </nav> - <hr> - <main> - <!--TOC--> -<!-- END OF HEADER FILE --> diff --git a/build/logos/logo-ftp.svg b/build/logos/logo-ftp.svg @@ -1,196 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo-ftp.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-ftp-512.png" - inkscape:export-xdpi="87.923096" - inkscape:export-ydpi="87.923096"> - <defs - id="defs2"> - <marker - inkscape:stockid="Arrow1Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lend" - style="overflow:visible;" - inkscape:isstock="true"> - <path - id="path2111" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" - transform="scale(0.8) rotate(180) translate(12.5,0)" /> - </marker> - <marker - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="marker3836" - style="overflow:visible;" - inkscape:isstock="true"> - <path - id="path3834" - style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" - d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " - transform="scale(1.1) rotate(180) translate(1,0)" /> - </marker> - <marker - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="marker3790" - style="overflow:visible;" - inkscape:isstock="true"> - <path - id="path3788" - style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" - d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " - transform="scale(1.1) rotate(180) translate(1,0)" /> - </marker> - <marker - inkscape:stockid="Arrow1Lstart" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow1Lstart" - style="overflow:visible" - inkscape:isstock="true"> - <path - id="path2108" - d="M 0.0,0.0 L 5.0,-5.0 L -12.5,0.0 L 5.0,5.0 L 0.0,0.0 z " - style="fill-rule:evenodd;stroke:#000000;stroke-width:1pt;stroke-opacity:1;fill:#000000;fill-opacity:1" - transform="scale(0.8) translate(12.5,0)" /> - </marker> - <marker - inkscape:stockid="Arrow2Lend" - orient="auto" - refY="0.0" - refX="0.0" - id="Arrow2Lend" - style="overflow:visible;" - inkscape:isstock="true"> - <path - id="path2129" - style="fill-rule:evenodd;stroke-width:0.625;stroke-linejoin:round;stroke:#000000;stroke-opacity:1;fill:#000000;fill-opacity:1" - d="M 8.7185878,4.0337352 L -2.2072895,0.016013256 L 8.7185884,-4.0017078 C 6.9730900,-1.6296469 6.9831476,1.6157441 8.7185878,4.0337352 z " - transform="scale(1.1) rotate(180) translate(1,0)" /> - </marker> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.4990144" - inkscape:cx="228.62111" - inkscape:cy="266.94658" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="false" - inkscape:window-width="945" - inkscape:window-height="1035" - inkscape:window-x="2885" - inkscape:window-y="35" - inkscape:window-maximized="0" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol"> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:71.79847717px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.79496181" - x="58.452442" - y="100.78219" - id="text3924"><tspan - sodipodi:role="line" - id="tspan3922" - x="58.452442" - y="100.78219" - style="stroke-width:1.79496181">⤓</tspan></text> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:71.79847717px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:1.79496181" - x="-89.669899" - y="-48.767139" - id="text3924-3" - transform="scale(-1)"><tspan - sodipodi:role="line" - id="tspan3922-6" - x="-89.669899" - y="-48.767139" - style="stroke-width:1.79496181">⤓</tspan></text> - </g> -</svg> diff --git a/build/logos/logo-git.svg b/build/logos/logo-git.svg @@ -1,116 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo-git.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-git-128.png" - inkscape:export-xdpi="21.980774" - inkscape:export-ydpi="21.980774"> - <defs - id="defs2" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.9899495" - inkscape:cx="-5.4594237" - inkscape:cy="358.28923" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="false" - inkscape:window-width="1920" - inkscape:window-height="1080" - inkscape:window-x="1920" - inkscape:window-y="0" - inkscape:window-maximized="0" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol"> - <g - transform="matrix(0.75126883,0,0,-0.75126883,39.250378,109.59548)" - inkscape:label="ink_ext_XXXXXX" - id="g1412"> - <g - transform="scale(0.1)" - id="g1414"> - <path - inkscape:connector-curvature="0" - id="path1416" - style="fill:#100f0d;fill-opacity:1;fill-rule:nonzero;stroke:none" - d="M 901.547,500.352 500.355,901.527 c -23.093,23.11 -60.566,23.11 -83.691,0 L 333.363,818.211 439.039,712.535 c 24.559,8.293 52.723,2.727 72.293,-16.847 19.688,-19.696 25.207,-48.102 16.699,-72.75 L 629.887,521.094 c 24.648,8.496 53.066,3.004 72.754,-16.711 27.5,-27.492 27.5,-72.059 0,-99.574 -27.52,-27.516 -72.078,-27.516 -99.61,0 -20.683,20.703 -25.801,51.097 -15.312,76.582 l -95,94.992 V 326.414 c 6.699,-3.32 13.027,-7.742 18.613,-13.312 27.5,-27.497 27.5,-72.059 0,-99.598 -27.5,-27.488 -72.09,-27.488 -99.57,0 -27.5,27.539 -27.5,72.101 0,99.598 6.797,6.789 14.668,11.925 23.066,15.363 v 252.281 c -8.398,3.438 -16.25,8.531 -23.066,15.367 -20.828,20.821 -25.84,51.395 -15.157,76.977 L 292.426,777.285 17.3281,502.211 c -23.10544,-23.129 -23.10544,-60.602 0,-83.711 L 418.539,17.3242 c 23.098,-23.10545 60.559,-23.10545 83.691,0 L 901.547,416.641 c 23.117,23.113 23.117,60.605 0,83.711" /> - </g> - </g> - </g> -</svg> diff --git a/build/logos/logo-main.svg b/build/logos/logo-main.svg @@ -1,159 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo-main.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-main-32.png" - inkscape:export-xdpi="5.4951935" - inkscape:export-ydpi="5.4951935"> - <defs - id="defs2" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="1.4" - inkscape:cx="124.16203" - inkscape:cy="270.64655" - inkscape:document-units="mm" - inkscape:current-layer="layer4" - showgrid="false" - inkscape:window-width="945" - inkscape:window-height="1029" - inkscape:window-x="1930" - inkscape:window-y="41" - inkscape:window-maximized="0" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol"> - <rect - style="fill:none;fill-opacity:1;stroke:#000000;stroke-width:0.92275137;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="rect1516" - width="54.932537" - height="61.036152" - x="46.271008" - y="44.213783" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.53634924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 101.20351,64.660892 H 46.271013" - id="path1533" - inkscape:connector-curvature="0" /> - <path - style="fill:#000000;fill-opacity:1;stroke:#000000;stroke-width:0.53634924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 101.20351,84.802822 H 46.271013" - id="path1535" - inkscape:connector-curvature="0" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.53634924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 64.88704,105.24997 V 44.213781" - id="path1537" - inkscape:connector-curvature="0" /> - <path - style="fill:none;stroke:#000000;stroke-width:0.53634924;stroke-linecap:butt;stroke-linejoin:miter;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - d="M 83.197886,105.24997 V 44.213781" - id="path1541" - inkscape:connector-curvature="0" /> - <circle - style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92275137;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path1543" - cx="55.589924" - cy="95.004578" - r="7.629519" /> - <circle - style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92275137;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path1543-3" - cx="74.173256" - cy="94.950089" - r="7.6295199" /> - <circle - style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92275137;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path1543-3-6" - cx="92.102631" - cy="95.004585" - r="7.6295199" /> - <circle - style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92275137;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path1543-3-7" - cx="92.059029" - cy="75.058838" - r="7.6295199" /> - <circle - style="fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.92275137;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path1543-3-5" - cx="74.064255" - cy="54.622627" - r="7.6295199" /> - </g> -</svg> diff --git a/build/logos/logo-mastodon.svg b/build/logos/logo-mastodon.svg @@ -1,126 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo-mastodon.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-mastodon-512.png" - inkscape:export-xdpi="87.923096" - inkscape:export-ydpi="87.923096"> - <defs - id="defs2"> - <filter - style="color-interpolation-filters:sRGB;" - inkscape:label="Fade to Black or White" - id="filter4560"> - <feColorMatrix - values="1 0 0 0 0 0 1 0 0 0 0 0 1 0 0 0 0 0 1 0" - id="feColorMatrix4558" - result="fbSourceGraphic" /> - <feColorMatrix - result="fbSourceGraphicAlpha" - in="fbSourceGraphic" - values="0 0 0 -1 0 0 0 0 -1 0 0 0 0 -1 0 0 0 0 1 0" - id="feColorMatrix4566" /> - <feColorMatrix - id="feColorMatrix4568" - values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" - in="fbSourceGraphic" /> - </filter> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.9899495" - inkscape:cx="141.76492" - inkscape:cy="291.64704" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="false" - inkscape:window-width="1900" - inkscape:window-height="1035" - inkscape:window-x="1930" - inkscape:window-y="35" - inkscape:window-maximized="0" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol"> - <path - id="path4547" - d="m 73.669701,42.474716 c -8.370982,0.0683 -16.423336,0.974795 -21.115839,3.129841 0,0 -9.30683,4.163336 -9.30683,18.367563 0,3.252606 -0.06322,7.141906 0.03979,11.266296 0.337819,13.890959 2.54677,27.580974 15.38984,30.980334 5.921861,1.56746 11.005805,1.89541 15.100562,1.67019 7.425536,-0.41176 11.594236,-2.6495 11.594236,-2.6495 l -0.24525,-5.38761 c 0,0 -5.306334,1.67273 -11.265731,1.46896 -5.904363,-0.20263 -12.137515,-0.63641 -13.092271,-7.885838 -0.08834,-0.636693 -0.132645,-1.317694 -0.132645,-2.032844 0,0 5.796273,1.416753 13.141661,1.753444 4.49156,0.206022 8.703716,-0.263313 12.981636,-0.773852 8.20419,-0.979592 15.34751,-6.034468 16.24554,-10.653311 1.4145,-7.275961 1.29822,-17.756269 1.29822,-17.756269 0,-14.204227 -9.30626,-18.367563 -9.30626,-18.367563 -4.69251,-2.155046 -12.74994,-3.061543 -21.120923,-3.129841 z m -9.473623,11.098656 c 3.486851,0 6.127036,1.340554 7.872861,4.021097 l 1.697282,2.844797 1.697847,-2.844797 c 1.745542,-2.680825 4.385727,-4.021097 7.872856,-4.021097 3.01357,0 5.44181,1.059461 7.296,3.12589 1.79719,2.066711 2.69212,4.859861 2.69212,8.374652 v 17.199164 h -6.81425 V 65.579937 c 0,-3.519024 -1.47997,-5.305488 -4.44161,-5.305488 -3.274616,0 -4.915736,2.119204 -4.915736,6.308787 v 9.136932 h -6.773889 v -9.136932 c 0,-4.189583 -1.64112,-6.308787 -4.91574,-6.308787 -2.961636,0 -4.442172,1.786464 -4.442172,5.305771 V 82.273078 H 54.2074 V 65.073914 c 0,-3.515073 0.894926,-6.307941 2.692679,-8.374652 1.854198,-2.066429 4.282152,-3.12589 7.295999,-3.12589 z" - inkscape:connector-curvature="0" - style="fill:#ffffff;stroke-width:0.28222185;filter:url(#filter4560)" /> - </g> -</svg> diff --git a/build/logos/logo-status-uptimerobot.svg b/build/logos/logo-status-uptimerobot.svg @@ -1,135 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="400" - height="200" - viewBox="0 0 105.83333 52.916664" - version="1.1" - id="svg8" - sodipodi:docname="logo-status-uptimerobot.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-uptimerobot.png" - inkscape:export-xdpi="96" - inkscape:export-ydpi="96"> - <defs - id="defs2" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="2.4925514" - inkscape:cx="191.24505" - inkscape:cy="82.130595" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="true" - inkscape:window-width="1908" - inkscape:window-height="1043" - inkscape:window-x="1926" - inkscape:window-y="31" - inkscape:window-maximized="1" - showguides="true" - units="px"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" - enabled="false" /> - <inkscape:grid - type="xygrid" - id="grid829" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-95.646319)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center" /> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring" /> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:12.80232334px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.32005808" - x="-0.77381283" - y="146.61012" - id="text833"><tspan - sodipodi:role="line" - id="tspan831" - x="-0.77381283" - y="146.61012" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:9.38837147px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.32005808"></tspan></text> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol" - transform="translate(0,-94.994418)"> - <g - id="g862" - transform="matrix(0.67792776,0,0,0.67792776,38.055823,37.549294)"> - <circle - r="12.134953" - cy="126.93154" - cx="21.935648" - id="path882" - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:1.83457553;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - transform="translate(-0.0146637,-0.65190137)" /> - <ellipse - ry="17.757233" - rx="17.812899" - style="fill:none;stroke:#bb7777;stroke-width:2.57933354;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - cy="126.83401" - cx="21.935648" - id="path3713-3" - transform="translate(-0.0146637,-0.65190137)" /> - <circle - r="20.310299" - clip-path="none" - style="fill:none;stroke:#000000;stroke-width:2.94541979;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - cy="126.76708" - cx="21.935648" - id="path3713" - transform="translate(-0.0146637,-0.65190137)" /> - <text - id="text929" - y="134.95427" - x="14.789393" - style="font-style:normal;font-weight:normal;font-size:3.11723542px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.07793089" - xml:space="preserve"><tspan - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:23.69099236px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.07793089" - y="134.95427" - x="14.789393" - id="tspan927" - sodipodi:role="line">X</tspan></text> - </g> - </g> -</svg> diff --git a/build/logos/logo-status.svg b/build/logos/logo-status.svg @@ -1,113 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo-status.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-status.png" - inkscape:export-xdpi="34.344959" - inkscape:export-ydpi="34.344959"> - <defs - id="defs2" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.88125001" - inkscape:cx="205.66062" - inkscape:cy="256.35182" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="false" - inkscape:window-width="1908" - inkscape:window-height="1043" - inkscape:window-x="1926" - inkscape:window-y="31" - inkscape:window-maximized="1" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol"> - <text - xml:space="preserve" - style="font-style:normal;font-weight:normal;font-size:10.58333302px;line-height:1.25;font-family:sans-serif;letter-spacing:0px;word-spacing:0px;fill:#000000;fill-opacity:1;stroke:none;stroke-width:0.26458332" - x="50.102608" - y="103.96513" - id="text929"><tspan - sodipodi:role="line" - id="tspan927" - x="50.102608" - y="103.96513" - style="font-style:normal;font-variant:normal;font-weight:bold;font-stretch:normal;font-size:80.43333435px;font-family:'DejaVu Sans Mono';-inkscape-font-specification:'DejaVu Sans Mono, Bold';font-variant-ligatures:normal;font-variant-caps:normal;font-variant-numeric:normal;font-feature-settings:normal;text-align:start;writing-mode:lr-tb;text-anchor:start;stroke-width:0.26458332">X</tspan></text> - </g> -</svg> diff --git a/build/logos/logo-wiki.svg b/build/logos/logo-wiki.svg @@ -1,523 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:xlink="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo-wiki.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-wiki-128.png" - inkscape:export-xdpi="21.980774" - inkscape:export-ydpi="21.980774"> - <defs - id="defs2"> - <inkscape:perspective - id="perspective10" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_x="0 : 526.18109 : 1" - sodipodi:type="inkscape:persp3d" /> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective2390" /> - <inkscape:perspective - sodipodi:type="inkscape:persp3d" - inkscape:vp_x="0 : 526.18109 : 1" - inkscape:vp_y="0 : 1000 : 0" - inkscape:vp_z="744.09448 : 526.18109 : 1" - inkscape:persp3d-origin="372.04724 : 350.78739 : 1" - id="perspective2455" /> - <filter - style="color-interpolation-filters:sRGB;" - inkscape:label="Fade to Black or White" - id="filter4667"> - <feColorMatrix - values="0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 0 1 0" - id="feColorMatrix4665" /> - </filter> - </defs> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.9899495" - inkscape:cx="181.37413" - inkscape:cy="260.96657" - inkscape:document-units="mm" - inkscape:current-layer="layer4" - showgrid="false" - inkscape:window-width="1900" - inkscape:window-height="1035" - inkscape:window-x="1930" - inkscape:window-y="35" - inkscape:window-maximized="1" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title></dc:title> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer2" - inkscape:label="Wiki"> - <image - y="39.488144" - x="34.921379" - id="image4713" - xlink:href="data:image/png;base64,iVBORw0KGgoAAAANSUhEUgAABAAAAAQACAQAAADVFOMIAAAABGdBTUEAALGPC/xhBQAAACBjSFJN -AAB6JgAAgIQAAPoAAACA6AAAdTAAAOpgAAA6mAAAF3CculE8AAAAAmJLR0QA/4ePzL8AAAAHdElN -RQfhCAgLLh4ZVdoHAABTvUlEQVR42u3dd3xVVbr/8W8IEEgICVUEBREVFQsW7L0rYxd773Xsjr3N -6NgVxTp2rx177w0rVnQQUEGa0gkhpJf7h5EBpOScPLs8e3/e53Xn3tfvN5yz9/NdWXuddfZeSwIA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAADSKyeyT15BZ2t3raA8SXUqXeD/ -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 -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAAA -AAAAAAAAAAAAAAAAAAAAAAAASfP/C9ZX+FrbuZkAAAAldEVYdGRhdGU6Y3JlYXRlADIwMTctMDgt -MDhUMTE6NDY6MzArMDA6MDAWw9+QAAAAJXRFWHRkYXRlOm1vZGlmeQAyMDE3LTA4LTA4VDExOjQ2 -OjMwKzAwOjAwZ55nLAAAAABJRU5ErkJggg== -" - style="image-rendering:optimizeQuality" - preserveAspectRatio="none" - height="77.697456" - width="77.697456" /> - </g> -</svg> diff --git a/build/logos/logo.svg b/build/logos/logo.svg @@ -1,101 +0,0 @@ -<?xml version="1.0" encoding="UTF-8" standalone="no"?> -<!-- Created with Inkscape ( --> - -<svg - xmlns:dc="" - xmlns:cc="" - xmlns:rdf="" - xmlns:svg="" - xmlns="" - xmlns:sodipodi="" - xmlns:inkscape="" - width="147.91107mm" - height="147.91107mm" - viewBox="0 0 147.91107 147.91107" - version="1.1" - id="svg8" - sodipodi:docname="logo.svg" - inkscape:version="0.92.4 (5da689c313, 2019-01-14)" - inkscape:export-filename="/home/jbauer/logo-256.png" - inkscape:export-xdpi="43.961548" - inkscape:export-ydpi="43.961548"> - <defs - id="defs2" /> - <sodipodi:namedview - id="base" - pagecolor="#ffffff" - bordercolor="#666666" - borderopacity="1.0" - inkscape:pageopacity="0.0" - inkscape:pageshadow="2" - inkscape:zoom="0.9899495" - inkscape:cx="368.03909" - inkscape:cy="291.64704" - inkscape:document-units="mm" - inkscape:current-layer="layer5" - showgrid="false" - inkscape:window-width="945" - inkscape:window-height="1035" - inkscape:window-x="1930" - inkscape:window-y="35" - inkscape:window-maximized="1" - showguides="true"> - <inkscape:grid - type="xygrid" - id="grid826" - originx="-0.014663695" - originy="-148.43702" /> - </sodipodi:namedview> - <metadata - id="metadata5"> - <rdf:RDF> - <cc:Work - rdf:about=""> - <dc:format>image/svg+xml</dc:format> - <dc:type - rdf:resource="" /> - <dc:title /> - </cc:Work> - </rdf:RDF> - </metadata> - <g - inkscape:label="Ring" - inkscape:groupmode="layer" - id="layer1" - transform="translate(-0.0146637,-0.65190125)"> - <g - inkscape:groupmode="layer" - id="layer4" - inkscape:label="Center"> - <circle - style="fill:#e7cb8f;fill-opacity:1;stroke:none;stroke-width:6.22857141;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - id="path882" - cx="73.96994" - cy="75.165779" - r="41.199406" /> - </g> - <g - inkscape:groupmode="layer" - id="layer3" - inkscape:label="Inner Ring"> - <ellipse - id="path3713-3" - cx="74.200211" - cy="74.834587" - style="fill:none;stroke:#bb7777;stroke-width:8.75710011;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - rx="60.476608" - ry="60.287617" /> - </g> - <circle - id="path3713" - cx="73.9702" - cy="74.607437" - style="fill:none;stroke:#000000;stroke-width:10;stroke-miterlimit:4;stroke-dasharray:none;stroke-opacity:1" - r="68.955536" - clip-path="none" /> - </g> - <g - inkscape:groupmode="layer" - id="layer5" - inkscape:label="Symbol" /> -</svg> diff --git a/compile b/compile @@ -1,323 +0,0 @@ -#!/bin/sh - -# compile -# A POSIX shell script to build pages and minify css for a simple website. -# NOTE: See the README for the expected format of md files. -# -# Copyright (C) 2020 Jake Bauer -# -# Permission to use, copy, modify, and/or distribute this software for any -# purpose with or without fee is hereby granted, provided that the above -# copyright notice and this permission notice appear in all copies. -# -# THE SOFTWARE IS PROVIDED "AS IS" AND THE AUTHOR DISCLAIMS ALL WARRANTIES -# WITH REGARD TO THIS SOFTWARE INCLUDING ALL IMPLIED WARRANTIES OF -# MERCHANTABILITY AND FITNESS. IN NO EVENT SHALL THE AUTHOR BE LIABLE FOR -# ANY SPECIAL, DIRECT, INDIRECT, OR CONSEQUENTIAL DAMAGES OR ANY DAMAGES -# WHATSOEVER RESULTING FROM LOSS OF USE, DATA OR PROFITS, WHETHER IN AN -# ACTION OF CONTRACT, NEGLIGENCE OR OTHER TORTIOUS ACTION, ARISING OUT OF -# OR IN CONNECTION WITH THE USE OR PERFORMANCE OF THIS SOFTWARE. - -### CONFIGURATION ### -# The name of the site in the <title> tags -siteName="" -# Set to "false" to disable auto-upload -autoUpload="true" -# Where to upload files -remote="" -# Where md files are -pageDir="pages/" -# Where compiled md -> html pages will go -htmlDir="public/html" -# Where minified css will go -cssDir="public/css" -# Where optimized images will go -imgDir="public/img" -# Your API key -apiKey="" -# Where intermediate build files will go -buildDir="build/" -### END CONFIGURATION ### - -# POSIX Shell "Strict Mode" -set -o errexit -set -o nounset -IFS=$(printf '\n\t') - -# Check that all the required programs are installed -if [ ! -x "$(command -v rsync)" ]; then - echo "The program 'rsync' is needed but was not found." - exit 1 -fi -if [ ! -x "$(command -v curl)" ]; then - echo "The program 'curl' is needed but was not found." - exit 1 -fi -if [ ! -x "$(command -v lowdown)" ]; then - echo "The program 'lowdown' is needed but was not found." - exit 1 -fi - -# Define colours -CLEAR="\033[0m" -RED="\033[0;31m" -GREEN="\033[0;32m" -YELLOW="\033[0;33m" - -# Ensure configured directories exist -mkdir -p "$htmlDir" -mkdir -p "$cssDir" -mkdir -p "$imgDir" -mkdir -p "$buildDir" - -# Prints the message passed as the 1st argument in red. -print_error_msg() { printf "$RED[ee] %s\n$CLEAR" "$1" ; } -# Prints the message passed as the 1st argument in green. -print_success_msg() { printf "$GREEN[ok] %s\n$CLEAR" "$1" ; } -# Prints the message passed as the 1st argument in yellow. -print_header_msg() { printf "$YELLOW[hh] %s\n$CLEAR" "$1" ; } -# Prints the message passed as the 1st argument with default colours. -print_info_msg() { printf "$CLEAR[ii] %s\n" "$1" ; } - -auto_upload() -{ - if [ "$autoUpload" != "true" ]; then - return 0 - fi - print_info_msg "Auto-uploading file" - if [ "$autoUpload" = "true" ]; then - if [ "$fileExt" = "css" ] || [ "$fileExt" = "md" ]; then - outputFile="$(echo "$outputFile" | cut -d'/' -f2-)" - cd public && rsync -rR "$outputFile" "$remote" && cd .. - fi - fi -} - -optimize_img() -{ - print_header_msg "OPTIMIZING IMG: $file" - outputFile="$imgDir/$fileName.$fileExt" - - response=$(curl \ - --user api:"$apiKey" \ - --data-binary @"$file" \ - --dump-header /dev/stdout) - downloadURL=$(echo "$response" | grep location: | cut -d' ' -f2 | tr -d '\r') - if [ $? != 0 ]; then - print_error_msg "There was an issue minifying this image." - exit 1 - fi - - curl --output "$outputFile" "$downloadURL" - if [ $? != 0 ]; then - print_error_msg "There was an issue downloading the minified image." - exit 1 - fi -} - -resize_img() -{ - print_header_msg "RESIZING IMG: $file" - outputFile="$imgDir/$fileName.$fileExt" - convert "$file" -resize "$resizeFactor"% "$outputFile" - if [ $? != 0 ]; then - print_error_msg "There was an error resizing the image." - exit 1 - fi -} - -minify_css() -{ - print_header_msg "MINIFYING CSS: $file" - outputFile="$cssDir/$fileName.min.css" - curl --data "input=$(cat "$file")" \ - > "$outputFile" - if [ $? != 0 ]; then - print_error_msg "There was an issue minifying this CSS." - exit 1 - fi -} - -compile_md() -{ - print_header_msg "COMPILING MARKDOWN: $file" - mkdir -p "$buildDir"/"$subDir" - mkdir -p "$htmlDir"/"$subDir" - - lowdown -o "$buildDir"/"$subDir"/"$fileName"-content.html -Thtml $file \ - --html-no-skiphtml --html-no-escapehtml - - cat "$buildDir"/header.html \ - "$buildDir"/"$subDir"/"$fileName"-content.html \ - "$buildDir"/footer.html \ - > "$htmlDir"/"$subDir"/"$fileName".html - - outputFile="$htmlDir/$subDir/$fileName.html" - set_html_title - set_html_meta - set_html_csslink - set_html_toc -} - -set_html_title() -{ - title="$(head -n1 "$file" | cut -d' ' -f2-)" - print_info_msg "Setting <title>: \"$title\"" - sed -i -e "s/<title>.*<\/title>/<title>$title - $siteName<\/title>/" \ - "$outputFile" -} - -set_html_meta() -{ - meta="$(head -n3 "$file" | tail -n1 \ - | cut -d'#' -f2 | sed -e 's/^[[:space:]]*//')" - print_info_msg "Setting <meta> description" - sed -i -e "s/content=\"\"/content=$meta/" "$outputFile" -} - -set_html_csslink() -{ - cssList="$(head -n5 "$file" | tail -n1 \ - | cut -d'#' -f2 | sed -e 's/^[[:space:]]*//')" - print_info_msg "Adding CSS <link>s" - echo "$cssList" | tr ' ' '\n' | while read cssFile; do - cssFile="/css/$(echo "$cssFile" | tr -d '"')" - sed -i -e "/<title>/a\\ - <link rel=\"stylesheet\" href=\"$cssFile\">" \ - "$outputFile" - done -} - -# This still feels a bit messy -set_html_toc() -{ - tocList="$(head -n7 "$file" | tail -n1 \ - | cut -d'#' -f2 | sed -e 's/^[[:space:]]*//' | tr -d '"')" - print_info_msg "Adding Table of Contents" - if [ -z "$tocList" ]; then - return 0 - fi - sed -i -e "/TOC/a\\ - <div id=\"table-of-contents\" aria-label=\"Table of Contents\"><h2 id=\"toc-title\">Table of Contents</h2>" \ - "$outputFile" - sed -i -e "/toc-title/a\\ - </ul></div>" "$outputFile" - echo "$tocList" | tr ';' '\n' \ - | awk '{a[i++]=$0} END {for (j=i-1; j>=0;) print a[j--] }' \ - | while read tocEntry; do - tocEntry="$(echo "$tocEntry" | sed -e 's/^[[:space:]]*//')" - if echo "$tocEntry" | grep -qi "^subsub:"; then - tocEntry="$(echo "$tocEntry" | cut -d':' -f2-)" - tocEntryId="$(echo "$tocEntry" | sed 's/ /%20/g' | tr -d ':' )" - sed -i -e "/toc-title/a\\ - <ul><ul><li><a href=\"#$tocEntryId\">$tocEntry</a></li></ul></ul>" \ - "$outputFile" - sed -i -e "/$tocEntry<\/h5>/i\\ - </section><section>" \ - "$outputFile" - elif echo "$tocEntry" | grep -qi "^sub:"; then - tocEntry="$(echo "$tocEntry" | cut -d':' -f2-)" - tocEntryId="$(echo "$tocEntry" | sed 's/ /%20/g' | tr -d ':' )" - sed -i -e "/toc-title/a\\ - <ul><li><a href=\"#$tocEntryId\">$tocEntry</a></li></ul>" \ - "$outputFile" - sed -i -e "/$tocEntry<\/h4>/i\\ - </section><section>" \ - "$outputFile" - else - tocEntryId="$(echo "$tocEntry" | sed 's/ /%20/g' | tr -d ':' )" - sed -i -e "/toc-title/a\\ - <li><a href=\"#$tocEntryId\">$tocEntry</a></li>" \ - "$outputFile" - sed -i -e "/$tocEntry<\/h3>/i\\ - </section\><section>" \ - "$outputFile" - fi - done - sed -i -e "/toc-title/a\\ - <ul>" "$outputFile" - sed -i -e "/END OF HEADER FILE/a\\ - <section>" "$outputFile" - sed -i -e "/<\/main>/i\\ - </section>" "$outputFile" -} - -# Read and parse command line flags -resizeFactor="0" -while test $# -gt 0; do - case "$1" in - -h|--help) - echo "compile - generate static web pages" - echo "" - echo "usage: compile [-ahn] [-r NUMBER] files" - echo "" - echo "options:" - echo "-a|--auto-upload auto-upload generated files" - echo "-h|--help show brief help" - echo "-n|--no-auto-upload do not auto-upload the generated files" - echo "-r|--resize NUMBER resize input image by NUMBER percent" - exit 0 - ;; - -n|--no-auto-upload) - autoUpload="false" - shift - ;; - -a|--auto-upload) - autoUpload="true" - shift - ;; - -r|--resize) - shift - resizeFactor="$1" - shift - ;; - --|*) - break - ;; - esac -done - -for file in "$@"; do - if [ ! -f "$file" ]; then - print_error_msg "ERROR: $file not found or is not a file." - continue - fi - - # First run of fileName needed because if the for loop operates on $file, - # the extension will not be properly pruned - fileName=$(basename "$file" .md) - for ext in md css png jpg jpeg; do - fileName=$(basename "$fileName" ."$ext" ) - done - fileExt=$(echo "$file" | awk -F . '{if (NF>1) {print $NF}}') - fileDir=$(dirname "$file") - subDir=$(echo "$fileDir" | sed "s/^pages//") - - if [ "$fileExt" = "css" ]; then - minify_css - auto_upload - elif [ "$fileExt" = "md" ]; then - compile_md - auto_upload - elif [ "$fileExt" = "png" ] || [ "$fileExt" = "jpg" ] || [ "$fileExt" = "jpeg" ]; then - if [ ! -x "$(command -v convert)" ]; then - echo "The program 'convert' from ImageMagick is needed but was not found." - exit 1 - fi - if [ "$resizeFactor" -gt 0 ]; then - fileName="$fileName-thumb" - resize_img - else - optimize_img - auto_upload - fi - else - print_error_msg "ERROR: nothing to do." - fi - - if [ "$fileExt" = "md" ]; then - print_success_msg "FINISHED: https://$siteName/$subDir/$fileName.html" - else - print_success_msg "FINISHED: $fileName.$fileExt" - fi -done diff --git a/config.ini b/config.ini @@ -0,0 +1,5 @@ +siteURL = +siteName = +languageCode = en-ca +blogDir = blog/ +buildOptions = -Thtml --html-no-skiphtml --html-no-escapehtml diff --git a/content/ b/content/ @@ -0,0 +1,105 @@ +Title: Likes and Dislikes +Summary: Things that I like and dislike, with reasons explaining why. + +# [%title] + +This is my page of opinions. Here I detail what I like, what I dislike, and why. + +## Things I Like + +These are things that I have had good experiences with, respect, donate to, or +things I think are especially important. + +### Tech + +* **Casio fx-991EX Calculator**: A fantastic, versatile, and durable calculator + with many functions inlcuding: 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 beside me on my desk, as I find it much nicer to use than a + calculator on my PC. + +* **Seasonic/EVGA PSUs**: 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**: Consistently high quality products with one of the + best mounting systems in the industry. They're a company that respects + both their customers and employees, and are also worth every penny. + +* **Logitech Mice**: 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. + +* **Skullcandy Earbuds**: 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. + +* **ElementaryOS**: 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**: The only Linux distribution 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. + +* **OpenBSD**: 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. + +### Non-Tech + +* **Leuchtturm1917 Journals**: 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. + +* **Copycentre/Anti-Copyright Licenses**: 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. + +## Things I Dislike + +These are things I have either had bad experiences with or dislike after either +doing research on them or hearing about experiences from reputable sources. + +### Tech + +* **Dell Prebuilt PCs**: 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 you can. + +* **Busybox**: Added [awful, disgusting, abhorrent code]( + to one of their utilities all to [avoid having someone's name and + copyright]( + associated with the project. + +### Non-Tech + +* **Copyleft Licenses**: 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**: 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**: 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/ 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/ b/content/ @@ -0,0 +1,229 @@ +Title: Blog +Summary: This is the place where I put all of my ramblings, rants, essays, and random thoughts and ideas. + +# [%title] + +Welcome to the blog! Most of what I have written and published for this site is +listed below (I have removed posts I think are low quality or lack any valuable +insight). Please note that older posts—even those that are less than a year +old—may not match my current views or practices. + +For more short-form content, you can find me on [the Mastodon +instance]( + +<a href="/feed.xml"> <img src="/img/feed-icon.png" width="15" height="15" +alt="RSS Icon"/> Subscribe with RSS</a> + +<form action="" method="get"> + <input name="sites" type="hidden" value=""> + <label for="q">Search: </label> + <input name="q" id="q" type="text" placeholder="Search This Blog" > + <button aria-label="Submit search query.">&#128270;</button> +</form> + +November 8, 2021<br> +[Free Software is an Abject Failure](blog/free-software-is-an-abject-failure) + +October 26, 2021<br> +[A Git Workflow With Claws Mail](blog/a-git-workflow-with-claws-mail) + +August 18, 2021<br> +[Laptops Suck (or Why I Might Get a New MacBook Air)](blog/laptops-suck-why-i-might-get-a-macbook-air) + +August 5, 2021<br> +[Mastodon Is Dead, Long Live Misskey 🍮](blog/mastodon-is-dead-long-live-misskey) + +February 17, 2021<br> +[Migrating from nginx to OpenBSD's httpd and relayd](blog/migrating-from-nginx-to-openbsd-httpd-and-relayd) + +December 10, 2020<br> +[Flip Phone Challenge Complete](blog/flip-phone-challenge-complete) + +November 30, 2020<br> +[One Week Flip Phone Challenge](blog/flip-phone-challenge) + +November 02, 2020<br> +[Gemini is Up and Running](blog/gemini-is-up-and-running) + +August 30, 2020<br> +[Why IRC is Still Good in $CURRENT_YEAR](blog/why-irc-is-still-good) + +August 14, 2020<br> +[The Hacker Quarterly Magazine](blog/the-hacker-quarterly-magazine) + +August 13, 2020<br> +[Ethical Investing](blog/ethical-investing) + +August 12, 2020<br> +[Choosing An Investment Brokerage](blog/choosing-an-investment-brokerage) + +August 08, 2020<br> +[Gentoo Isn't for Me](blog/gentoo-isnt-for-me) + +August 03, 2020<br> +[My Journey With Computers](blog/my-journey-with-computers) + +August 02, 2020<br> +[The Vortex ViBE Mechanical Keyboard](blog/vortex-vibe-keyboard) + +July 29, 2020<br> +[My Git Server Was DDoSed](blog/my-git-server-was-ddosed) + +July 16, 2020<br> +[Why I Hate The Term "Modern"](blog/why-i-hate-the-term-modern) + +July 15, 2020<br> +[Be A Good Netizen](blog/be-a-good-netizen) + +July 14, 2020<br> +[Installing Debian 10 Buster with Encrypted LVM and btrfs Subvolumes](blog/debian-with-btrfs) + +July 13, 2020<br> +[Using the "rm" Command with Trash](blog/using-rm-with-trash) + +July 11, 2020<br> +[Colours for Gitea Issues](blog/colours-for-gitea-issues) + +July 08, 2020<br> +[My TODO Solution](blog/my-todo-solution) + +July 07, 2020<br> +[Are TODO Applications a Waste of Time?](blog/are-todo-applications-a-waste-of-time) + +July 06, 2020<br> +[Improving Blog Searching](blog/improving-blog-searching) + +July 05, 2020<br> +[Switching to cgit](blog/switching-to-cgit) + +July 04, 2020<br> +[Generating My Geek Code](blog/generating-my-geek-code) + +July 02, 2020<br> +[A Month-and-a-Half of Self-Hosted Email](blog/a-month-and-a-half-of-self-hosted-email) + +June 28, 2020<br> +[How I Keep My Home Directory Clean](blog/how-i-keep-my-home-directory-clean) + +June 26, 2020<br> +[Use Syncthing to Sync Things](blog/use-syncthing-to-sync-things) + +June 26, 2020<br> +[Why dwm's Window Swallowing Patch Can't Swallow tmux](blog/why-dwm-swallowing-cant-swallow-tmux) + +June 22, 2020<br> +[My LWN Theme](blog/my-lwn-theme) + +June 16, 2020<br> +[My Beginnings with Gentoo](blog/my-beginnings-with-gentoo) + +June 15, 2020<br> +[My New T420s](blog/my-new-t420s) + +June 13, 2020<br> +[How I Manage My Dotfiles](blog/how-i-manage-my-dotfiles) + +June 12, 2020<br> +[Making My Site Easier to Read](blog/making-my-site-easier-to-read) + +June 08, 2020<br> +[Scripting My Way to Success](blog/scripting-my-way-to-success) + +June 07, 2020<br> +[Why Email is the Best Discussion Platform](blog/why-email-is-the-best-discussion-platform) + +June 02, 2020<br> +[Toggling Between Indentation Styles in Vim](blog/toggling-between-indentation-styles-in-vim) + +May 28, 2020<br> +[A Quick Rant About Web Font Sizes](blog/a-quick-rant-about-web-font-sizes) + +May 26, 2020<br> +[Choosing a Self-Hosted Git Service](blog/choosing-a-self-hosted-git-service) + +May 25, 2020<br> +[Going From User to Contributor With FOSS](blog/going-from-user-to-contributor-with-foss) + +May 25, 2020<br> +[Paying for Software](blog/paying-for-software) + +May 23, 2020<br> +[Two of the Most Valuable Lessons I've Learned](blog/two-of-the-most-valuable-lessons-ive-learned) + +May 22, 2020<br> +[Rewriting My Static Site Generator](blog/rewriting-my-static-site-generator) + +May 19, 2020<br> +[Self-Hosted Email is Now Live!](blog/self-hosted-mail-now-live) + +May 19, 2020<br> +[Attempting to Replace My Thinkpad's Touchpad](blog/attempting-to-replace-my-thinkpads-touchpad) + +May 18, 2020<br> +[Trying Out aerc](blog/trying-out-aerc) + +May 17, 2020<br> +[Setting Up GPG Keys from Scratch](blog/setting-up-gpg-keys-from-scratch) + +May 16, 2020<br> +[Self-Hosting Email](blog/self-hosting-email) + +May 15, 2020<br> +[Preparing to Self-Host Email](blog/preparing-to-self-host-email) + +May 13, 2020<br> +[Diving Deeper Into the Small Internet](blog/diving-deeper-into-the-small-internet) + +May 12, 2020<br> +[Setting Up A Gopher Site](blog/setting-up-a-gopher-site) + +May 11, 2020<br> +[A Brief Review of Fedora 32](blog/a-brief-review-of-fedora-32) + +May 10, 2020<br> +[Why I Love the Fediverse](blog/why-i-love-the-fediverse) + +May 09, 2020<br> +[Submitting a Bug Report to FreeBSD](blog/submitting-a-bug-report-to-freebsd) + +May 07, 2020<br> +[The Joys of Old Tech](blog/the-joys-of-old-tech) + +May 05, 2020<br> +[Refining My NeoMutt Configuration](blog/refining-my-neomutt-config) + +May 03, 2020<br> +[The Diefenbunker Museum](blog/the-diefenbunker-museum) + +May 02, 2020<br> +[The Disappearance of <em>One</em>](blog/the-disappearance-of-one) + +May 01, 2020<br> +[Caring About SEO](blog/caring-about-seo) + +April 28, 2020<br> +[How Far Translation Tools Have Come](blog/how-far-translation-tools-have-come) + +April 25, 2020<br> +[Why I Blog and #100DaysToOffload](blog/why-i-blog) + +April 11, 2020<br> +[Decommissioning My Rackmount Server](blog/decommissioning-my-rackmount-server) + +February 28, 2020<br> +[Redesigning My Website's Logo](blog/logo-redesign) + +February 24, 2020<br> +[Making My Own Vim Statusline](blog/making-my-own-vim-statusline) + +February 14, 2020<br> +[Switching from urxvt to st](blog/urxvt-to-st) + +December 20, 2019<br> +[The Difficulty of Educating People About Online Privacy](blog/difficulty-of-privacy-education) + +November 23, 2019<br> +[China](blog/china) + +June 20, 2019<br> +[Why I Switched Back to Firefox from Qutebrowser](blog/qutebrowser-to-firefox) diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,74 @@ +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](/uses#Tablets) 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. + +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,96 @@ +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]( 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](, 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,35 @@ +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 cranked up to 20px because it's way easier to read and I +don't need to strain my eyes just to fit more text on screen at once. + +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 box or re-design that section because it +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,89 @@ +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,73 @@ +Title: Be A Good Netizen +Author: Jake Bauer +Date: 2020-07-15 +Summary: Since my post for today is taking longer than expected, I want to share this story to encourage others to be good netizens. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I was working on my post for today and since that's taking a little longer than +expected, I figured I'd tell this story in the hopes that it gets more people to +do the same when they encounter a situation like this. + +A toot on the Fediverse about some recent Cisco vulnerabilities caught my +attention. I'm used to seeing Cisco vulnerabilities, but what I wasn't used to +was the following SSL connection error I encountered when trying to view the +advisories: + +<figure> + <a href="/img/cisco-ssl-error.png"><img src="/img/cisco-ssl-error-thumb.png" + alt="A tab in Mozilla Firefox showing an attempt to connect to + with the following error message: Secure Connection Failed + An error occurred during a connection to Peer attempted old + style (potentially vulnerable) handshake. Error code: + SSL_ERROR_UNSAFE_NEGOTIATION The page you are trying to view cannot be shown + because the authenticity of the received data could not be verified."/></a> +</figure> + +Which I was only alerted to when I shared this link with a friend, and he told +me about the following settings (which I have since activated) in Firefox: + +<figure> + <a href="/img/firefox-settings.png"><img + src="/img/firefox-settings-thumb.png" alt="Mozilla Firefox's about:config + page showing the settings 'security.ssl.require_safe_negotiation' and + 'security.ssl.treat_unsafe_negotation_as_broken' both set to true."/></a> +</figure> + +When those settings are activated (technically only the first is strictly +necessary to prevent connections to broken sites) they will stop the browser from +connecting to websites with broken SSL negotiation. This is a [fairly +significant issue]( so it's good +to have those settings activated. + +I poked fun at Cisco in a response to the original toot because... well... how +does a company this large which specializes in networking and network security +equipment allow something like this to happen, especially on their security +advisories page? + +However, the moral of this story (aside from turning on those settings in +Firefox), is: when something is broken be a good +[netizen]( and let the +siteowners know; things can't be fixed if they don't know about it. I submitted +the following report to Cisco letting them know of the problem: + +<figure> + <a href="/img/reporting-cisco-error.png"><img + src="/img/reporting-cisco-error-thumb.png" alt="A Cisco general contact page with + a filled out contact form. The form is filled out with information relating + to the SSL error I experienced when previously trying to connect to + Also filled in is my email address, my name, and the link + that I was trying to access. On the right is a set of radio buttons labelled + 'Page rating' with the least favourable option 'Poor minus minus' + selected."/></a> +</figure> + +If you come across something like this in the future, I hope you too will be a +good netizen and do the right thing! + +_This is my seventy-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,74 @@ +Title: Caring About SEO +Author: Jake Bauer +Date: 2020-05-01 +Summary: In this I talk about SEO and whether or not I care much about it. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +A few days ago, [Kev Quirk wrote a blog +post]( in response to [Desmond +Rivet]( +about how he follows basic SEO hygiene even though it's not something at the top +of his mind when writing. + +For those unfamiliar with the abominable world of SEO, it stands for "Search +Engine Optimization" and is something that many sites to do appear higher up in +search results on sites like Google and Bing. The algorithms which decide what +is good SEO and what is bad SEO are constantly changing and we just have to +guess, based on the guidance of what corporations like Google say and what their +SEO reports tell us about our sites, if we're doing a good job or not. + +Now, don't get me wrong, I'm not saying that if one focuses on or optimizes for +SEO that they're a bad person or anything like that. I call it abominable because +there are many sites which abuse SEO to appear higher in search rankings despite +having less useful information or unsubstantial content compared to sites which +don't focus on it. It's not enough to just be a good website or blog, if one +wants to appear very high up one must optimize the way one structures their site +and writes their content. There is a danger that if one focuses too much on SEO, +one can fall down the rabbit hole of writing SEO-optimized drivel to appeal to +the algorithm and therefore drive more visitors to their site at the expense of +the quality of their writing. They cease to be themselves and instead write to +appease an algorithm. + +Now, all that being said, my site scores quite well in SEO tests! + +<figure> + <a href="/img/seo-report.png"><img src="/img/seo-report.png" alt="The + results page from a webpagetest lighthouse report showing an SEO score of + 100 for a recent blog post of mine."/></a> + <figcaption> + Test performed using <a + href=""></a> + </figcaption> +</figure> + +I don't actually focus on SEO at all. It's just a coincidence that my site +happens to do quite well and I'm honestly not sure why. Perhaps it's the blog +post being focused on one topic, the number of words on the page, or the lack of +dynamic media content which would cause problems if improperly implemented. No +idea. + +It's not that I don't care if people read my content; in [a previous +post]( I explained that I enjoy it when +others read what I write. I do, however, not really have much interest in +putting in a lot of work or worrying much about optimizing things to appear +higher in search rankings. I do post about my content on Mastodon, though, and I +will happily link someone to something I've written if I think it will be useful +to them. I don't make any money off of this site and I'm not writing for fame or +to be recognized so I don't feel it worth it to put in so much effort to appease +an ever-changing, black-box algorithm; I'm fine with the more "organic" traffic +my site receives. + +Today on Mastodon, someone posted a link to an article entitled _[41 SEO quick +wins you can do within an hour]( +which I may read to learn a bit more about what affects a site's SEO score. +After all, it's not bad to make sure one's site is following generally good +practises so long as one makes sure they're not falling down that rabbit hole of +tailoring their content for SEO. + +_This is my 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,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,253 @@ +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] + +_**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. + +## 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="">Switching to cgit</a></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,60 @@ +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] + +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,69 @@ +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,167 @@ +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]( +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,64 @@ +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](/now) and a [Contact +page](/contact) 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,58 @@ +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]( 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,522 @@ +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. + +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. 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. + +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). + +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 ~~cult~~ community of Free +Software, GNU code has a reputation of 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>.</p> + +<p class="note">You may also be interested in reading the <a +href="">discussion on +Mastodon</a> or the <a +href="">discussion on</a>.</p> + diff --git a/content/blog/ b/content/blog/ @@ -0,0 +1,52 @@ +Title: Gemini is Up and Running +Author: Jake Bauer +Date: 2020-11-02 +Summary: The Gemini protocol has fascinated me since I heard about it. So, as a fitting way to end the #100DaysToOffload challenge, I wanted to announce that my Gemini page and blog are now live and talk a bit about how I set things up. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +_This post is also available [on +Gemini](gemini:// + +The [Gemini protocol]( is a new "small +Internet" protocol which aims to sit in between Gopher and the HTTP-based Web in +terms of functionality. I [previously wrote a bit about +it]( and you +can find a nice quick breakdown in this [blog post on Drew DeVault's +blog]( + +When I wrote that first blog post about Gemini and the small Internet, I got a +quick and dirty Gemini server set up which mirrored what I had created for +Gopher. That whole situation was a little bit clunky and I didn't have a good +way to maintain it in the long run, so I instead decided to scrap that and start +over. Having ditched Gopher (because I don't really see a reason to run it +alongside Gemini), I now run only Gemini and HTTP sites. + +I am now running the [gmnisrv]( Gemini +server and maintain a `gemini/` folder alongside an `http/` folder in my +[website's repository]( now. I chose +gmnisrv because of its simple implementation (minimal dependencies, low LoC +count, etc.). + +I also briefly experimented with converting all of these HTML pages over to +Gemini so one could get a perfectly mirrored copy of what is available here over +on Gemini. Unfortunately, because it was scripted, that resulted in pages which +were clunky, messy, and ultimately lead to a degraded experience viewing this +site using Gemini. I came to the conclusion that text hosted on Gemini should be +written in gemtext and explicitly tailored to the constraints of that platform +rather than trying to fit the square peg of made-for-HTTP content into the round +hole of Gemini. + +Blog posts written for this site will also be made available on Gemini, as will +any other pages. A Gemini-specific Atom feed will also be appearing soon. I +suppose it's also fitting that this is my final blog post for +\#100DaysToOffload: ending an era of HTTP-only blog posts whilst beginning an +era of content on two protocols. I have very much enjoyed this challenge and +look forward to continuing to write more. + +_This is my one hundredth 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,39 @@ +Title: Generating My Geek Code +Author: Jake Bauer +Date: 2020-07-04 +Summary: I've seen something called the Geek Code around the Internet on some people's profiles and decided to have a go at creating one for myself. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I've seen something called the Geek Code around the Internet on some people's +profiles. After reading a [recent blog post by Marc +Grondin](, +I figured it would be fun to create my own Geek Code. + +A Geek Code is essentially a sequence of symbols that, when parsed, give other +people a general idea about someone within the context of very geeky things like +computers and Star Trek. It's straightforward to set up since you just have to +go through the [Geek Code document]( and fill out +your code with the qualifiers that fit you the best. It does lack a little bit +of nuance in some areas, so don't get too hung up on choosing _exactly_ the +right value. + +My Geek Code (as of the time of writing) came out to: + +``` +-----BEGIN GEEK CODE BLOCK----- +Version: 3.1 +GCS/TW/O d-(+) s:- !a C++(+++) UL+++/++++ P+>+++ L+++>++++ E--- W--(++) N+ o? +K- w-- O? M+ V? PS++ PE-- Y++ PGP t++ 5? X? R !tv b++ D G- e>++ h +r++>+++ y? +------END GEEK CODE BLOCK------ +``` + +Which can be [decoded here]( + +_This is my sixtieth 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: Gentoo Isn't for Me +Author: Jake Bauer +Date: 2020-08-08 +Summary: I've been using Gentoo on and off since I tried it out, but I've come to the conclusion that it's just not for me. These are the reasons why. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +After using Gentoo on and off since I [tried it +out]( a few months ago, +I think I've come to the conclusion that it's just not for me. While I really +like the idea, I just don't think that the paradigm is particularly good for me +to use as a daily driver. + +My issues with it mainly just boil down to time. Running Gentoo as a daily +driver would be a breeze on my desktop machine with its 6C/12T Ryzen 5 1600 CPU +but, on my T420s with its 2C/4T Intel i5-2520M, things take a non-trivial amount +of time to install because everything is compiled from source. For example, it +took me approximately 1-2 hours just to install Gentoo because of kernel and +base program compilation and it took me 7.5 hours just to install Firefox. Yes, +I did make sure to use the `-j` flag in my `make.conf`. + +Now, there are ways to speed this up; I could use +[distcc]( to compile things for my laptop +on my desktop machine or I could also set up +[ccache]( so that, if a library is common +between two packages, it will only have to be compiled once. For heavy packages +such as Firefox, there are also binary packages available so that one can avoid +the insane compilation times. + +However, even though doing these things will make it faster to install new +software, it still feels like it takes an unreasonably long time to get a system +up and running. Not to mention, when I'm working on something and need a new +piece of software, the time it takes along with the occasional configuration +file issues I have to work out pulls me out of the flow of the task that I want +to accomplish. Needing to fix some USE flag incompatibility or wait for the +piece of software to be compiled annoys me when I just want to get on with +whatever task I need to complete. + +It was definitely very fun to install Gentoo for the first few times, plus the +novelty of the Gentoo way of doing things was cool to play around with and the +sheer amount of freedom it offers the user in choosing how they want to build +their system (LibreSSL vs. OpenSSL, runit vs. OpenRC vs. systemd, etc) is very +intriguing. I just don't think it would suit me as a daily driver because of the +fact that nearly _everything_ has to be compiled from source. + +One thing I really liked about Gentoo was the ability to slim down my system a +lot. So, to get away from systemd and to move to using even more simple +software, I will be trying out Alpine Linux as a daily driver on my laptop. It +uses musl libc and OpenRC, and is a binary-based distribution instead of a +source-based distribution. Fun fact: the Alpine folk used to build their +packages using Gentoo's emerge (though I couldn't quickly find anything that +could confirm if this is still the case). + +_This is my eighty-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,44 @@ +Title: Going From User to Contributor With FOSS +Author: Jake Bauer +Date: 2020-05-25 +Summary: How access to Free and Open Source Software lead to my growth as a person, and changed how I view and interact with computers. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I used to be like the majority of people when it came to using my computers. I +would log onto Windows, open Chrome, browse to YouTube and social media sites, +and generally just consume content. If I was frustrated with a piece of +software or encountered a bug, I would learn to accept it because I thought I +had no other choice if I wanted to keep using that software. That was many years +ago now and, since then, things have changed quite a bit. + +Not only did I enter into a Computer Science program at university which exposed +me to many fundamental computing concepts, I also became acquainted with the +world of Free and Open Source Software. Slowly, I learned to program and do +things for myself. Eventually, I switched to using Linux full-time and spiralled +ever further down the rabbit hole of the history and philosophies behind +computing, Free and Open Source Software, and alternative operating systems. + +I've come a long way since those days of being nothing more than a consumer of +content and I think I can attribute a lot of my growth to FOSS. Now when I +encounter a problem, instead of my first thought being, "I _need_ to find a +piece of software to solve this problem," or, "oh well, nothing I can do against +these big companies", my first thought is usually, "how can I solve this problem +myself." Now, instead of giving up when web searches yield no useful results, +I'll turn to the source code, official documentation, or specifications (most of +which are generally freely available) for answers. + +The availability of code under Free and Open Source licenses, and the ability to +freely share and collaborate online has changed the way that I view and interact +with computers. It's turned me from a simple consumer of what others create, +into someone who tries to solve problems myself if an existing solution is not +available or is unsatisfactory. + +You might even say that FOSS has empowered me, as it has many others. + +_This is my twenty-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,48 @@ +Title: How Far Translation Tools Have Come +Author: Jake Bauer +Date: 2020-04-28 +Summary: Today, with over 100 tabs open at one point, I was reading a whole bunch of blog posts from others partaking in the #100DaysToOffload challenge. As you can tell by looking at my blogroll, although most blogs are in English, there are a handful that I follow which aren't. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Today, with over 100 tabs open at one point, I was reading a whole bunch of blog +posts from others partaking in the #100DaysToOffload challenge. As you can tell +by looking at my [blogroll](, although +most blogs are in English, there are a handful that I follow which aren't. + +I have about an [A2-B1 +level]( +of comprehension in both German and French. I can usually understand simple, +common texts with little difficulty while reading and comprehending at a pace +comparable to the speed at which I read English. Even so, most of the blogs +which I follow tend to use complex or technical terms which are currently way +above my comprehension level. This is where my trusty German-English dictionary, +French-English dictionary, or online translation services come in handy. Using +Google Translate, earlier today I was able to read [a blog post by +jolek78]( written entirely +in Italian. Take a look at how well Google Translate was able to handle this +text: + +<figure> + <a href="/img/giorno-3.png"><img src="/img/giorno-3.png" alt="A screenshot + of Google Translate translating Italian text into English with near-perfect + accuracy."/></a> +</figure> + +That reads pretty much as if a native English speaker wrote that text. I was +surprised considering that, for most of my education, Google Translate was a +tool not to be trusted as it would often times get things very wrong. For +example, the humorous translation of the English word "preservative" into the +French word "préservatif", which actually means "condom". + +It is really cool that we can have services like this which are able to take +complex linguistic constructs and translate them from one language into another +with relative ease. Of course, these systems are nowhere near perfect, but +they've certainly come a long way over the years. + +_This is my 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,75 @@ +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,82 @@ +Title: How I Manage My Dotfiles +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,80 @@ +Title: Improving Blog Searching +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 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 on my site. + +## 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. + +_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,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,494 @@ +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] + +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,226 @@ +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> + +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,71 @@ +Title: My Beginnings with Gentoo +Author: Jake Bauer +Date: 2020-06-16 +Summary: I'm not sure what possessed me to try out Gentoo, but here we are. My thought's about trying the distribution for the very first time. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +I'm not sure what possessed me to try out Gentoo, but here we are. + +Gentoo is a source-based distribution where, any time you install a package, +programs and their dependencies are compiled from their source code. One of the +advantages to this is that you can decide (via USE flags in Gentoo) which +components you would like to compile into that particular software. This is in +comparison to binary-based distributions where usually all the functionality is +compiled in. The most obvious disadvantage to this is that some programs, like +Firefox or LibreOffice, take a _long_ time to compile. + +Gentoo also has you set up your entire Linux installation from scratch. You are +dumped in a live shell environment and you must format your disks, create +filesystems, download base utilities, and prepare your system manually including +compiling the kernel. For those familiar with Arch Linux, it's like Arch but... +more. + +I find the concept to be really cool considering I've spent my entire time with +Linux using distributions like Ubuntu, Mint, Debian, and Fedora which do a lot +of this hard work for you (I've installed Arch a handful of times, but never +stuck with it). However, I definitely feel very out of my depth with all that +there is to Gentoo. + +I started by printing out the excellent [Gentoo +Handbook]( (came out to 23 pieces +of paper, double sided, with 4 pages per side) and burning a minimal +installation USB stick. With the help of the first part of this handbook, and +after cleaning out my T420s' vents so it would stop overheating while compiling +the kernel, I was able to get a Gentoo system up and running in about 2-3 hours. + +I used the easy options for most of the installation, sticking with mostly what +the wiki told me to do and using `genkernel` to automatically compile my kernel +as the plethora of options with a manual configuration felt quite daunting. For +now, I just want to get used to the Gentoo ecosystem and didn't want to risk +breaking things by trying to get fancy my first time around. + +I held my breath after issuing the `reboot` command from the installation +environment and got incremental boosts of dopamine as I got through the GRUB +menu, loading the kernel, watching OpenRC's output scroll by, and finally +reaching a login prompt. Setting up the general user account was easy and I +chose to go with `doas` instead of `sudo` because I like the simplicity of it. + +As of right now, I'm compiling the software necessary to get my desktop +environment in order. It's taken about 2 or so hours just to compile the bare +minimum of X11 packages I need plus all of the other things that make up my +desktop environment like compton, dunst, etc. While all that is compiling, I did +a test `startx` which interestingly ignored my `XINITRC` variable and just +launched the `xinitrc` found in `/etc` (I checked with the `env` command that +the variable did exist in my environment). Starting it with `startx +.config/X11/xinitrc` worked though, and I had my desktop environment up and +running (albeit without all of the flash). + +My first impressions of the distribution are overall positive, though I still +feel very out of my depth. I'm going to have to do a lot of reading about the +various Gentoo-specific tools, recommended USE flags, how `emerge` works, and +then probably re-install a few times to get comfortable with the procedure. +Regardless, I feel like I already know a lot more about how to put a Linux +system together and I'm enjoying the challenge. + +_This is my forty-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,146 @@ +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,121 @@ +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]( 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](, +[self-hosting my own email +server](, [participating in my +first CTF]( and more. + +I am _deep_ in 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,78 @@ +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,122 @@ +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,73 @@ +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]( +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,80 @@ +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. + +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,61 @@ +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,71 @@ +Title: Rewriting My Static Site Generator +Author: Jake Bauer +Date: 2020-05-22 +Summary: After a brief hiatus, I'm back with a rewrite of my static site generator script. + +# [%title] + +**Author:** [%author] | **Posted:** [%date] + +After a brief, two day hiatus in posting to refill my creative juices, I'm back +with a rewrite of the script I use to generate my website. This has been a long +time coming (for me, anyways) as my old script had become too messy to work with +and I wanted to switch to using pandoc to compile my webpages. Back when I +originally wrote the script, I was still fairly new to shell scripting and the +quality of the code reflects that. This new script is much easier to read, much +better laid out, and is far easier to extend and adapt in the future. It's also +now possible to use this script for sites other than my own, as long as those +sites have their markdown files structured the same way. + +Previously, I was using `markdown` as the program to take my `.md` files and +transform them into `.html` files. Unfortunately, it had a couple of issues: It +wouldn't interpret triple-backticks as code blocks so I had to use `<pre><code>` +anywhere I wanted a code block, and it would add empty `<p>` tags before and +after `<img>` and `<figure>` tags. Additionally, using `pandoc` also enables me +to add simple syntax highlighting for code blocks since it does syntax +highlighting as part of the transformation process. + +I also took the time to make sure that the syntax highlighting colour scheme I'm +using has an appropriate set of contrast ratios. I targeted a minimum ratio of +4.5:1 and I ended up basing the colour scheme off of the +[iceberg]( colour scheme which I also use +in Vim. + +One other thing that I wanted to do with this rewrite was to make my script +POSIX-compliant so it is as portable as possible. My script used to require bash +but now it should work with any POSIX-compliant shell. It should also now only +be using POSIX-compliant flags in POSIX programs. + +<em>**Update**: After further testing, I've switched from using `tput` to ANSI +escape codes for colours, added the `-e` flag to the `sed` commands, and added a +newline everytime I use the `a` or `i` command with `sed`. These changes were +required to get the script to work on FreeBSD. As long as pandoc is available on +a system, the script should now be portable between all *nix systems (I +hope).</em> + +This new script clocks in at 7207 bytes, 235 total lines, and 180 source lines +of code as of the time of writing. This is in comparison to the old script's +10812 bytes, 253 total lines, and 152 source lines of code. This is mostly due +to the fact that the new script is easier to read and therefore doesn't require +as many comments. Also, adding syntax highlighting only increased the size of +my main CSS file by ~1kB. + +I am considering releasing this script, along with documentation, examples, and +my publish script (which also needs to be made POSIX-compliant), as a separate +project which could be used by anyone looking for a simple static site +generator. Before I do that, however, I would like to work on scripts to +transform the HTML files output by the compilation script into Gemini- and +Gopher-compatible syntax. I am thinking of writing perl scripts to accomplish +this since parsing HTML is quite complicated and perl has a good set of +libraries to accomplish that. + +You can view the new script [on +SourceHut]( +([mirror]( +If you really want to see the horrors of the old script, you'll find it lurking +in the commit history. + +_This is my twenty-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,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,59 @@ +Title: Scripting My Way to Success +Author: Jake Bauer +Date: 2020-06-08 +Summary: How I solve almost all my problems with scripting. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Something that I love about *nix systems is the composability of all of the +different available tools allowing for very quick prototyping, fast and easy +one-liners, and efficient text processing. I thoroughly (ab)use this to get +nearly everything done. + +Yesterday, when I was curating my blogroll, I needed a way to update the list of +blogs and feeds I follow on my [links page](/links#blogroll). Of course I didn't +want to do this manually since that would be a huge pain. Instead, like whenever +I encounter a problem, I turned to scripting. I came up with a script I call +`` ([view the script +here]( +which composes the export functionality of `newsboat`, the standard `awk`, +`cut`, `tr`, `sort`, and `sed` utilities along with `vim`/`nvim`'s scripting +abilities and `rsync` for uploading the changed files. + +The script basically goes through the exported OPML file from Newsboat, breaks +each line up into a title, html URL, and feed URL, and then replaces the content +of my blogroll page with the new, auto-generated list. Once that's done, it +uploads the exported `blogroll.opml` file and the newly compiled `links.html` +page. It's not portable to other websites but that doesn't matter at all because +it's not supposed to be. I'm not creating a tool for someone else to use, I'm +hacking out a script to perform a simple, repeatable function which would +otherwise be a pain to do manually. + +I created and refined the script over the course of about 30-60 minutes of +actual work and, in doing so, learned about how to properly use `vim`'s +scripting abilities, practiced my POSIX shell scripting skills, and had a bunch +of fun. + +That's the beauty of scripting and the *nix environment. Any time I encounter a +similar problem, I write a script to handle it for me. Need to parse stats from +a log file? Script it. Need a way to download the content of an entire website? +Script it. Need to test how fast a program runs, then average the runtimes? +Script it. Need to generate an entire website from markdown files? Script it ([I +did for this +site](!). + +Scripting is also great for saving time at work; the more time saved doing +menial tasks, the more time can be spent doing interesting things. Plus, you get +to show off in front of your co-workers and that's always a bonus. + +The next time you have a menial task to do, even if it's just a small one, give +scripting a shot. It doesn't matter whether or not it saves you time in the long +run (unless this is a critical task, then you should probably care), do it for +the fun of it! + +_This is my thirty-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,33 @@ +Title: Self-Hosted Email is Now Live! +Author: Jake Bauer +Date: 2020-05-19 +Summary: I've successfully migrated email for to my own SMTP server. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Following my experiments with self-hosting email, which I posted about in a +[previous blog post](/blog/self-hosting-email), I've now migrated email for this +domain off of ProtonMail and onto my mail server. + +Last night, I spun up a new mail server on Vultr, running OpenBSD (as previously +discussed), and got the machine ready so that I could quickly get email up and +running today. Humourously, I woke up this morning to the release of the next +version of OpenBSD but upgrading was about as painless as could be; a +`sysupgrade` followed by a `pkg_add -u` did the trick. + +Thanks to my previous experiments, I was able to get this mail server up and +running in about 20 minutes including switching over all of my DNS records. I've +[set up aerc]( with my mail +account and I'm excited to now have completely hassle-free email. + +As always, contact and GPG details can be found on [the contact page](/contact). +My email address did not change and is still ``. I also made +sure to have the appropriate [RFC 2142]( +mailbox names for my domain, which are also listed on the contact page. + +_This is my twenty-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,85 @@ +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,51 @@ +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> + +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,50 @@ +Title: Submitting a Bug Report to FreeBSD +Author: Jake Bauer +Date: 2020-05-09 +Summary: In which I detail my experience reporting a bug in FreeBSD. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Today I installed and started using a FreeBSD system for the first time. I had +previously run through the installation and played around with it in a virtual +machine, but this time the plan is to keep it on the system for at least a +little while. + +On every system I own, I install either Vim or NeoVim depending on what is +available. On FreeBSD, when I went to `pkg install vim`, it reported that it +would use an extra 709MiB of space and would pull in a bunch of X and wayland +libraries! I then checked `pkg install neovim` and it reported that it would +only use an extra 29MiB of space. Being the FreeBSD newb that I am, I went ahead +and installed the `neovim` package and then posted about my experience on +Mastodon. + +Within a couple hours, it was pointed out to me that there is actually a +`vim-console` package which doesn't include the graphical libraries and is +packaged specifically for use in the console only. In hindsight, this makes +perfect sense, but coming from Linux where Vim is usually packaged as `vim` for +the console version and `vim-gtk` for the graphical version, this didn't even +cross my mind. Especially since neovim behaved as I expected it to. + +After some further discussion, it was suggested by @Evilham that I submit a bug +report about the difference in naming convention between the `vim` and `neovim` +packages. I thought this was a great idea and is exactly the right thing to do +when an issue such as this is identified. I created my account on +[]( and [reported the +bug]( + +It was, overall, a really painless process. Many people dislike when they have +to create an account for each project just to report bugs but, with a password +manager like KeepassXC, it's really easy to create and then store a lot of these +accounts. Reporting the bug was also super intuitive with the quick links +available on the front page of their Bugzilla instance. Plus, the suggestion +from @Evilham of what to write made me more confident that I was giving a +quality bug report. + +Will this be the start of my becoming a FreeBSD contributor? + +_This is my fifteenth 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,96 @@ +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](, +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,114 @@ +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,38 @@ +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,53 @@ +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,94 @@ +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,76 @@ +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 (Neovim, actually), 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 spaces being good for accessibility _and_ tabs). 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,58 @@ +Title: Two Months with aerc +Author: Jake Bauer +Date: 2020-07-19 +Summary: Two months ago I wrote about trying out aerc, a new terminal email client. After two months of using it as my only mail client, I want to share my thoughts about it. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +Two months ago I wrote about [trying out +aerc](, a new terminal email +client spearheaded by Drew DeVault. After two months of using it as my only mail +client, I want to share my thoughts about it and what I'm looking forward to +seeing with it. + +Since I switched to aerc from NeoMutt, managing and interacting with email has +felt a lot more streamlined and easy. That could partially also be because I +switched from ProtonMail to self-hosting email at the same time, but aerc also +provided advantages such as being able to fully reference other conversations +when drafting an email. I've also found the default keybindings easy to learn +and use and the configuration files are easy to understand and much, much less +complicated than NeoMutt's. + +Even though aerc is still well in development, there's not a whole lot that +feels like it's missing and I've only encountered a couple of issues; nothing +that would make me stop using the client though. + +The most major thing that I can see missing from aerc at the moment is good PGP +support. I can receive PGP emails (though I had a few crashes related to them), +and signed messages will display a line showing whether or not the message is +verified by my keychain, but it is still missing the ability to send +PGP-encrypted emails and the integration seems to be in its early stages. This +isn't such a big deal since I can count on one hand the number of times I've +wanted to send PGP-encrypted emails in my (admittedly short) lifetime and this +feature looks like it's being actively worked on. + +The only other major issue that I've encountered is the lack of properly +updating connection statuses. If I put my computer to sleep and wake it back up +again, this will kill aerc's connection to my email server. However, the bar at +the bottom still says "Connected." and I have to restart aerc to get it to +reconnect. This also seems like it's receiving some attention (at least judging +by my brief skims of the mailing lists). + +Another feature that I miss coming from NeoMutt is a threaded message view which +would be really useful for keeping track of mailing lists. This doesn't seem +like that much of an issue so long as I am on top of my emails, but if I am away +for a few days, I could easily see myself coming back to 20 email messages from +3-4 different mailing lists and having a harder time sifting through them. + +Overall, it's been a really good experience and I'm going to keep using aerc +into the foreseeable future. I'm glad to have a desktop mail client that +integrates well with git, isn't super complicated, and makes email not feel like +a chore to manage. + +_This is my seventy-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,60 @@ +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,63 @@ +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,49 @@ +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,99 @@ +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,134 @@ +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] + +_**Update**: Expand on asynchronous nature and federated structure. Additions in +italics._ + +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. To them, email seems like an +archaic platform where you can't embed images, it's not completely synchronous, +and... I honestly couldn't think of a third thing... + +I get it. These platforms are perhaps more inviting because of a friendly UI, +inline image, GIF, 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 +(public mailing list software typically preserves all the messages and they can +be viewed online). + +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 these so called "modern" platforms is that they're +actually 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. + +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 and 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-only 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 as fast as how Silicon +Valley thinks everyone's computer runs. + +So, what does email bring to the table over the "modern" 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 very 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 actually lower than with other +platforms. _Also, it being federated means that you're not at the mercy of a +couple of appointed moderators or administrators who could choose to ban you +over a disagreement or difference in opinion. Federation allows one to more +freely speak their mind without fear of being kicked off of the platform._ + +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 very important for many hackers who often heavily +customize the software they run to fit their workflow and their needs. Using +email allows for this freedom. + +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 on +one to respond immediately and there are no anxiety-inducing typing indicators._ + +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 the content. The best part? Plain text email still supports emoji +because it'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,38 @@ +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. + +[#100DaysToOffload]( 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" = "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,46 @@ +Title: Why I Love the Fediverse +Author: Jake Bauer +Date: 2020-05-10 +Summary: In which I discuss why I've been enjoying my time in the fediverse and why I think it's so much better than other social platforms. + +# [%title] + +**Author:** [%author] | **Published:** [%date] + +The [fediverse]( (federated universe) is +made up of different pieces of [federating +software]( such as +[Pleroma]( or [Mastodon]( +There are some obvious benefits to this model such as having the ability to run +your own instance, the protocols and software being open source, and having +control over your own data unlike on other platforms such as Facebook or +Twitter, but that's not what I want to focus on in this post. + +A few years back I, swore off of social media after experiencing the toxicity of +places like Reddit and Twitter which have undoubtedly been +[Septembered]( The influx of +"normal people" has lead to a decrease in the quality of discussions and an +increase in the number of unpleasant encounters and general rudeness. There are +bastions of sanity and most sites have the ability to block people, but it wears +down on one's morale over time especially when it feels like one can't have good +discussions anymore. + +Using Mastodon (which is the only part of the fediverse I currently use), on the +other hand, has been completely the opposite experience. I've noticed that +people on Mastodon have been super welcoming, willing to help and incredibly +nice. Perhaps its because Mastodon is still quite small compared to the walled +garden social networks, or perhaps it's because each instance has its own +culture and set of people with common views, but regardless, it's been a great +experience. + +... and here I was saying I'd never use social media. + +(If you're looking to give Mastodon a shot, and are interested at all in the +FOSS community, a great hosted instance to sign up at is +[]( It's run by some great folk and +many of the people I follow are from there.). + +_This is my sixteenth 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,116 @@ +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](, +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 Freenode IRC network alongside the Undernet, EFnet, and +so on. + +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. Sure, you can usually register a nickname +with a network's NickServ bot to reserve it, but that's not mandatory on most +networks. This means you can join however many IRC networks you want with little +hassle; you just have to connect and set your nick. + +So, overall, 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 as long as you can trust everyone in the group to be +competent. 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. There are also improvements coming 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/ b/content/ @@ -0,0 +1,69 @@ +Title: The Hostnames I Use +Summary: A list of the hostnames I use when naming my computers. + +# [%title] + +These are the names I have given my computers/VMs. They are chosen from elements +of the Greek Underworld mythology. + +<table> <thead> +<tr><th>Name</th> <th>Lore</th> <th>Current Use</th> <th>OS</th></tr> +</thead> </tbody> +<tr><th colspan="4" style="text-align: center;">Standalone Machines</th></tr> +<tr> + <td>Acheron</td> + <td>River of pain</td> + <td>Router/Firewall</td> + <td>OpenBSD</td> +</tr> +<tr> + <td>Cerberus</td> + <td>Guardian of the gates to the Underworld</td> + <td>Primary Home Server</td> + <td>FreeBSD</td> +</tr> +<tr> + <td>Hecate</td> + <td>Associated with magic, witchcraft, sorcery, crossroads, etc.</td> + <td>Test System</td> + <td>Varies</td> +</tr> +<tr> + <td>Eurynomos</td> + <td>Daemon of rotting corpses</td> + <td>Backup Server/NAS</td> + <td>FreeBSD</td> +</tr> +<tr> + <td>Geras</td> + <td>Old Age</td> + <td>Thinkpad T420s</td> + <td>OpenBSD</td> +</tr> +<tr> + <td>Hades</td> + <td>God of the Underworld</td> + <td>Desktop Computer</td> + <td>Fedora Linux</td> +</tr> +<tr><th colspan="4" style="text-align: center;">Virtual Private Servers</th></tr> +<tr> + <td>Misskey</td> + <td>N/A</td> + <td>Misskey Server</td> + <td>Debian Stable</td> +</tr> +<tr> + <td>temp-matrix</td> + <td>N/A</td> + <td>Temporary Matrix and website server</td> + <td>OpenBSD</td> +</tr> +<tr> + <td>Tartarus</td> + <td>Pits of oblivion, dungeon of torment and suffering</td> + <td>Mail Server</td> + <td>OpenBSD</td> +</tr> +</tbody> </table> + diff --git a/content/ b/content/ @@ -0,0 +1,65 @@ +Title: Welcome! +Summary: The personal website and blog of Jake Bauer. + +# [%title] + +My name is Jake though I usually go by "jbauer" online. I am a hobbyist +sysadmin, recreational programmer, and staunch supporter of online freedom, +privacy rights, and free and open access to information and knowledge. I love +simple and sustainable technologies, tea, writing, and gardening. I'm also a big +fan of the small internet and low-tech or analog solutions to everyday problems. + +You can finger(1) me at +[finger://](finger:// or by specifying +`finger` on the command line. + +After a little outage, is back online. I am in the process of +converting the various pages over to my new static site builder, so some may +give 404 errors for the time being. + +[]( is currently offline. + +## Blog + +I blog mostly about technology and computing. I also took part in +[#100DaysToOffload]( in 2020. Here are some to get +you started: + +* [Free Software is an Abject Failure](/blog/free-software-is-an-abject-failure) +* [Why IRC is Still Good in $CURRENT_YEAR](/blog/why-irc-is-still-good) +* [Why Email is the Best Discussion Platform](/blog/why-email-is-the-best-discussion-platform) +* [Choosing a Self-Hosted Git Service](/blog/choosing-a-self-hosted-git-service) +* [Paying for Software](/blog/paying-for-software) +* [The Joys of Old Tech](/blog/the-joys-of-old-tech) +* [A Month-and-a-Half of Self-Hosted Email](/blog/a-month-and-a-half-of-self-hosted-email) +* [Are TODO Applications a Waste of Time?](/blog/are-todo-applications-a-waste-of-time) +* [Why I Hate The Term “Modern”](/blog/why-i-hate-the-term-modern) + +## About This Site + +This is a static website generated from Markdown using +[lowdown]( with my POSIX shell-based static +site generator. It is designed to be lightweight, accessible, and +privacy-respecting. The source code is available on +[sourcehut]( and +[]( This site is also +featured on []( and is a part of the [XXIIVV +Webring]( and the [Fediring +webring]( + +## Contact + +Ordered from most to least preferred, I can be contacted using: + +* Email: [](; +* XMPP: Not unless I know you; +* Fediverse: [](; +* IRC: `jbauer` on OFTC,, maybe other networks. + +If you're contacting me using XMPP, please use OMEMO if you can. My device +fingerprints (which can change) are currently: + +``` +PC: 60b3e979 10fc5a65 66cfe8fa a37f7b8a 7cd0678f 3bfdca6f 530a99cd 364a4444 +Phone: 795483e4 695342bc 57c4f07a cb8b2009 247c5594 e6c52c8f b4781a96 1ae58277 +``` diff --git a/content/ b/content/ @@ -0,0 +1,381 @@ +Title: Links +Summary: Useful links that I've collected and wish to share or remember for the future. Everything from Internet culture, useful pieces of wisdom, other blogs, and more. + +# [%title] + +Useful links that I've collected and wish to share or remember for the future. +Everything from Internet culture, useful pieces of wisdom, other blogs, and +more. + +## Friends + +These are people I consider my friends who also happen to have personal sites +with stuff on them. Consider checking them out: + +* [Alexandra]( +* [Amolith]( +* [Ari]( +* [Atsuko Tominaga]( +* [Avery]( +* [Captain Epoch]( +* [Fristi]( +* [Leon Baram]( +* [Richard Bowey]( +* [Striker]( +* [Sol Fisher Romanoff]( +* [Toast]( +* [Toromino]( +* [Volpeon]( + +## General Life + +* [How To Argue Effectively And Productively: 31 Rules of Argument]( - + Save yourself a lot of pain and headache by learning how to argue the right + way. + +* [A cheatsheet on Discourse]( - + A nice cheatsheet on having good discourse. + +## Internet and Hacker Culture + +* [Hacker Laws]( - "Laws, Theories, + Principles and Patterns that developers will find useful." + +* [How To Ask Questions The Smart Way]( - + A document by [Eric S. + Raymond]( about how to ask + questions on the Internet. An essential read for everyone seeking help of + strangers on the Internet. + +* [How to ask good questions]( - + An article by [Julia Evans]( about asking good + questions. This deals more with asking questions of people you know rather + than of strangers on the Internet and it is also more friendly in its tone + (although I do like and respect the + ["kick-in-the-pants"]( + tone of Eric S. Raymond's essay). + +* [How to Become a Hacker]( - + A valuable read for anyone wanting to become a programmer, wanting to + contribute to free/open source projects, or anyone who is a self-proclaimed + "hacker". + +* [Use plaintext email]( - A website detailing the + reasons why you should use plaintext email instead of HTML email. Also talks + about email etiquette which makes this a must-read if you are thinking of + contributing to software projects which do most of their communication over + email (e.g. Debian, the Linux kernel). + +* [Email Etiquette]( - + Bits of email etiquette which remain relevant to this day. + +* [Thoughts on the subject of ethical licenses]( - + An email Drew DeVault sent to license-discuss (an OSI mailing list) about + his feelings on Ethical Software licenses. His words pretty closely echo my + own feelings about Ethical Software licenses. + +* [How I do my computing]( - + An interesting article written by [Richard + Stallman]( on how he uses his + computers. + +* [Should I Block Ads?]( + +* [Tech’s Masturbatory Historiography]( - + A criticism of the way we look at the history of technology when, in + reality, we are so far off the mark of what the creator's originally + envisioned. + +* [Rediscovering the Small Web]( + +* []( - What is a greybeard anyways? + +* [The ASCII Ribbon Campaign]( - + One of the first movements shunning HTML email. + +* [Conduct unbecoming of a hacker]( - + Stop bikeshedding and flaming, start solving problems with patches. + +* [HTTP/2.0 — The IETF is Phoning It In]( - + Why HTTP/2.0 is not a good successor to HTTP/1.1. + +* [Permacomputing]( - + "A collection of random thoughts regarding the application of permacultural + ideas to the computer world." + +* [Permacomputing - XXIIVV]( - + A good jumping off point for a lot of thoughts about The Collapse, + permacomputing, sustainable living, and related topics. + +## Writing + +* [George Orwell's Essay: Politics and the English Language]( - + A very compelling essay on how writers and speakers use the English language + to say very little and what we should try to do in our writing to not + succumb to these anti-patterns. Although this was written in 1946, it easily + sounds like it could have been written in 2020. + +## The Workplace + +* [The Unspoken Truth About Managing Geeks]( - + A valuable read for anyone managing a technical group of people. + +## Business + +* [Doordash and Pizza Arbitrage]( - + More evidence of the unsustainable, ridiculous business models behind food + delivery startups. + +* [Why Mastodon and the fediverse are “doomed to fail”]( + +* [Killed by Google]( - A list of things (apps, + services, etc.) created/owned then killed by Google. + +* [Killed by Mozilla]( - A list of things (apps, + services, etc.) created/owned then killed by Mozilla. + +## Videos and Lectures + +* [The Missing Semester of Your CS Education]( - + A great resource on the things that are really helpful as a programmer and + computer scientist but which school glosses over and expects you to figure + out on your own. Things like making effective use of the terminal, using + tools like vim, and version control. + +* [FOSDEM 2020 - The Selfish Contributor Expla