paritybit.ca

Raw content of https://www.paritybit.ca.
git clone https://git.sr.ht/~jbauer/paritybit.ca
Log | Files | Refs | README | LICENSE

commit 6f65ba6476387f45214df6deba522cf6bddbf04c
parent 9592ac2df0ff2b0c50424541f0492073493096f8
Author: Jake Bauer <jbauer@paritybit.ca>
Date:   Fri, 19 Aug 2022 15:50:20 -0400

*

Diffstat:
Mconfig.ini | 2+-
Mcontent/blog.md | 2+-
Dcontent/garden-gate.md | 27---------------------------
Acontent/garden/arboretum/documentation/bicycle-shops-ottawa.gmi | 45+++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/git.gmi | 36++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/hoffmann-aeropress.gmi | 30++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/index.gmi | 40++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/productivity-tips.gmi | 17+++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/freebsd-nas.gmi | 101+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/goaccess-with-openbsd-httpd.gmi | 11+++++++++++
Acontent/garden/arboretum/documentation/sysadmin/jaderune/admin.gmi | 34++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/jaderune/freebsd-server.gmi | 63+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/misskey.gmi | 80+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/openbsd-router.gmi | 216+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/openbsd-server-details.gmi | 257+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/openbsd-server-overview.gmi | 78++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/relaying-service-mail-with-opensmtpd.gmi | 27+++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/sysadmin/tarsnap-backups-with-acts.gmi | 64++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/documentation/uw-imap.gmi | 107+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Mcontent/garden/arboretum/index.gmi | 18++++++++++++++++++
Mcontent/garden/arboretum/opinions/index.gmi | 24+++++++++++++++++++-----
Acontent/garden/arboretum/recipes/aloo-gobi.gmi | 44++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/barley-split-pea-stew.gmi | 35+++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/bean-salad.gmi | 37+++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/bean-soup.gmi | 44++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/brownies.gmi | 31+++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/butternut-squash-soup.gmi | 42++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/cabbage-lentil-stew.gmi | 40++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/cabbage-soup.gmi | 50++++++++++++++++++++++++++++++++++++++++++++++++++
Mcontent/garden/arboretum/recipes/index.gmi | 35++++++++++++++++++++++++++++++++++-
Acontent/garden/arboretum/recipes/lacto-fermentation.gmi | 14++++++++++++++
Acontent/garden/arboretum/recipes/overnight-oats.gmi | 22++++++++++++++++++++++
Acontent/garden/arboretum/recipes/pancakes.gmi | 25+++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/red-lentil-stew.gmi | 47+++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/sauces.gmi | 20++++++++++++++++++++
Acontent/garden/arboretum/recipes/sourdough-bread.gmi | 35+++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/sourdough-starter.gmi | 44++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/spiced-lentils-with-carrots.gmi | 40++++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/split-pea-soup.gmi | 39+++++++++++++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/vegetable-curry.gmi | 29+++++++++++++++++++++++++++++
Acontent/garden/arboretum/recipes/vinaigrettes.gmi | 34++++++++++++++++++++++++++++++++++
Mcontent/garden/arboretum/values-and-beliefs/index.gmi | 24+++++++++++++++++++++++-
Mcontent/garden/compost/index.gmi | 3+++
Mcontent/garden/greenhouse/index.gmi | 84+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/greenhouse/tactics-and-mindset-shifts-for-making-the-most-of-life.gmi | 31+++++++++++++++++++++++++++++++
Mcontent/garden/index.gmi | 28++++++++++++++++++----------
Acontent/garden/plots/buy-nothing-site.gmi | 5+++++
Mcontent/garden/plots/index.gmi | 8++++++++
Acontent/garden/plots/ios-evaluation.gmi | 17+++++++++++++++++
Acontent/garden/plots/macos-evaluation.gmi | 204+++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++
Acontent/garden/plots/philosophy-software-development.gmi | 17+++++++++++++++++
Acontent/garden/plots/server-monitor.gmi | 8++++++++
Mtemplates/header.html | 2+-
53 files changed, 2370 insertions(+), 47 deletions(-)

diff --git a/config.ini b/config.ini @@ -3,4 +3,4 @@ siteName = paritybit.ca languageCode = en-ca blogDir = blog/ buildOptions = -Thtml --html-no-skiphtml --html-no-escapehtml -pushcmd = rsync -rv static/* cerberus:/var/www/paritybit.ca/ && ssh cerberus "chown -R www /var/www/paritybit.ca/" +pushcmd = rsync -rdv static/* cerberus:/var/www/paritybit.ca/ && ssh cerberus "chown -R www /var/www/paritybit.ca/" diff --git a/content/blog.md b/content/blog.md @@ -3,7 +3,7 @@ Summary: Welcome to my blog. This is where I put my more polished essays, though # [%title] -This is my blog, the fruit stand of my [digital garden](/garden-gate); the place +This is my blog, the fruit stand of my [digital garden](/garden/); the place where I put my more polished essays, thoughts, and writings out into the world. Most of what I have written and published is listed below though I have removed posts I think are low quality or lack any valuable insight (fruit that has gone diff --git a/content/garden-gate.md b/content/garden-gate.md @@ -1,27 +0,0 @@ -Title: Digital Garden -Summary: My digital garden is a place where I dump interesting facts, notes, links or anything else I might be working on. It's my second brain, helping to hold all the things I want to remember and helping me make new connections. - -# [%title] - -[Enter the Garden →](/garden/) - -My digital garden is the place where I collect, curate, and cultivate -interesting facts, notes, links, or anything else I might be working on. It's -also my second brain, helping to hold all the things I want to remember and -helping me make new connections. - -An important property of the garden is that it's constantly changing. Pages will -be added, deleted, moved, and re-connected without hesitation so something could -be in one place at one time and gone the next. If you find anything you want to -keep, you should save it because there are no guarantees it will be there when -you come back. (Well, I suppose there's the git repository, but nobody wants to -go digging around in the guts of a git repository.) - -Also, I'm heavily leaning into this gardening metaphor both because I love -gardening in the physical world and because I find it a compelling way to -organize my thoughts. - -[Enter the Garden →](/garden/) - -The garden is also available for browsing using the Gemini protocol if you -prefer. Just visit [gemini://paritybit.ca](gemini://paritybit.ca). diff --git a/content/garden/arboretum/documentation/bicycle-shops-ottawa.gmi b/content/garden/arboretum/documentation/bicycle-shops-ottawa.gmi @@ -0,0 +1,45 @@ +# Bicycle Shops in Ottawa, Canada + +The Cyclery - 1115 Bank St, Ottawa, ON K1S 3X4 + +=> https://www.thecyclery.ca/ https://www.thecyclery.ca/ + +Phat Moose - 98 Hawthorne Ave, Ottawa, ON K1S 0B1 + +=> https://www.phatmoosecycles.com/ https://www.phatmoosecycles.com/ + +Cyco's - 25 Hawthorne Ave, Ottawa, ON K1S 0A9 + +=> http://www.cycosport.ca/ http://www.cycosport.ca/ + +Joe Mamma Cycles - 767 Bank St, Ottawa, ON K1S 3V3 + +=> https://www.joemammacycles.com/ https://www.joemammacycles.com/ + +Re-Cycles - 445 Catherine St Unit 1, Ottawa, ON K1R 5T7 + +=> http://www.re-cycles.ca/ http://www.re-cycles.ca/ + +Dave's Bike Dump - 407 Catherine St, Ottawa, ON K1R 5T6 + +=> https://bikedump.store/ https://bikedump.store/ + +Foster's - 305 Bank St, Ottawa, ON K2P 1X7 + +=> https://fosterssports.ca/ https://fosterssports.ca/ + +McCrank's - 1b McCormick St, Ottawa, ON K1Y 1M4 + +=> https://www.mccranks.com/ https://www.mccranks.com/ + +Retro Rides - 79 Sparks St, Ottawa, ON K1P 5A5 + +=> https://www.retro-rides.ca/ https://www.retro-rides.ca/ + +Tall Tree Cycles - 281 Sunnyside Ave Ottawa, ON K1S 0R4 + +=> https://talltreecycles.ca/ https://talltreecycles.ca/ + +Giant Ottawa - 1162 Bank St, Ottawa, ON K1S 3X8 + +=> https://www.giantottawa.ca/ca https://www.giantottawa.ca/ca diff --git a/content/garden/arboretum/documentation/git.gmi b/content/garden/arboretum/documentation/git.gmi @@ -0,0 +1,36 @@ +# Using Git + +Mostly things I don't do often and want a quick reference for. + +## Making a Release + +Create an annotated tag: + +``` +git tag -a <tag name> +``` + +Add any relevant text (see Generating a Changelog below). + +Use: + +``` +git push --tags +OR +git push --follow-tags +``` + +To either push the latest tag, or push tags with any un-pushed commits respectively. + +Add the following to ~/.config/git/config to make that default behaviour when doing git push: + +``` +[push] + followTags = true +``` + +## Generating a Changelog + +``` +git shortlog --numbered <previous_tag>..HEAD +``` diff --git a/content/garden/arboretum/documentation/hoffmann-aeropress.gmi b/content/garden/arboretum/documentation/hoffmann-aeropress.gmi @@ -0,0 +1,30 @@ +# James Hoffmann's Aeropress Technique + +Default Technique: + +Light Roast: 55g/L - High extraction +Dark Roast: 60-66g/L - Lower extraction + +Filter paper into holder, lock in place, put on top of mug + +Grind -> Light roast really fine close to espresso, darker grinds coarser grind maybe + +Place grounds in holder, give a bump to spread them out + +Water Temp -> Lighter roasts up to boiling, drop temp for darker roasts, really dark roasts ~85°C + +Start timer, add 200g water or however much you are using + +Wait 2 min + +Give a gentle swirl to knock ground cofe down + +Wait 30s + +Press relatively gently, no need to lean into it + +Press all the way down, then pull back slightly to prevent drips + +Clean the Aeropress + +Tweak grind size or temperature diff --git a/content/garden/arboretum/documentation/index.gmi b/content/garden/arboretum/documentation/index.gmi @@ -0,0 +1,40 @@ +# Documentation + +```ASCII Art of an open book and an ink bottle with quill + __ + (`/\ + `=\/\ __...--~~~~~-._ _.-~~~~~--...__ + `=\/\ \ / \\ + `=\/ V \\ + //_\___--~~~~~~-._ | _.-~~~~~~--...__\\ + // ) (..----~~~~._\ | /_.~~~~----.....__\\ + ===( INK )==========\\|//==================== +__ejm\___/________dwb`---`_______________________ +``` + +A collection of instructional documents, notes, configurations, or other bits and pieces of documentation I find valuable. + +## Digital Tools + +=> git.gmi Using Git + +## Miscellaneous + +=> hoffmann-aeropress.gmi James Hoffmann's Aeropress Technique +=> productivity-tips.gmi Personal Productivity Tips +=> bicycle-shops-ottawa.gmi Bicycle Shops in Ottawa, Canada + +## System Administration + +=> sysadmin/openbsd-server-overview.gmi OpenBSD Server Overview +=> sysadmin/openbsd-server-details.gmi OpenBSD Server Details +=> sysadmin/misskey.gmi Misskey Setup +=> sysadmin/openbsd-router.gmi OpenBSD Router +=> sysadmin/freebsd-nas.gmi FreeBSD NAS +=> sysadmin/jaderune/setup.gmi JadeRune.net Setup +=> sysadmin/jaderune/admin.gmi JadeRune.net Administration +=> sysadmin/tarsnap-backups-with-acts.gmi Tarsnap Backups With Acts +=> sysadmin/goaccess-with-openbsd-httpd.gmi Using Goaccess with OpenBSD's httpd +=> sysadmin/uw-imap.gmi UW IMAP Server Documentation +=> sysadmin/relaying-service-mail-with-opensmtpd.gmi Relaying Service Mail With OpenSMTPD + diff --git a/content/garden/arboretum/documentation/productivity-tips.gmi b/content/garden/arboretum/documentation/productivity-tips.gmi @@ -0,0 +1,17 @@ +# Personal Productivity Tips + +* End a session with clear next steps of what to do next +* e.g. Know what needs to be implemented next in software +* e.g. Know what comes next in a story or essay +* Do not exert all energy at once. Stop when spirits are still high and the path ahead is clear. +* Control the scope of projects. +* Break things into smaller chunks and focus on those that will produce results quickly instead of worrying about the whole picture +* Create habits around mundane parts of life to make room for creative thinking +* Always have the ability to write down ideas and notes anywhere +* Always have several problems or projects active for your subconscious to ponder +* Apply new concepts/ideas/solutions to these whenever you encounter them +* These can be material (e.g. How do I implement this feature?) or immaterial (e.g. How can we improve equality in society) +* Save information you come across that inspires, intrigues, or seems useful +* Externalize checklists, mundane tasks, appointments and reminders to a more appropriate medium (notebook, notes or calendar app, etc) +* Save old ideas and projects even if they have "failed" +* Design a space that encourages productivity and minimizes distraction (but don't fuss about making it perfect) diff --git a/content/garden/arboretum/documentation/sysadmin/freebsd-nas.gmi b/content/garden/arboretum/documentation/sysadmin/freebsd-nas.gmi @@ -0,0 +1,101 @@ +# FreeBSD NAS + +## Hardware + +The machine is a Dell Optiplex 3020MT with the following specs: + +* CPU: i3-4150 @ 3.50GHz (2C/4T) +* RAM: 2+4GB DDR3 +* Boot: Samsung 870 EVO 250GB SSD +* Storage: Mirror of Two HGST HDN726040ALE614 (4TB) HDDs + +## Software + +FreeBSD was installed to the system using ZFS on the boot drive. A zfs pool was created on the two hard drives with: + +```zfs pool creation +zpool create -f -o ashift=12 -m /var/nas nas mirror /dev/ada1 /dev/ada2 +``` + +Periodic maintenance is done by copying /etc/defaults/periodic.conf to /etc/periodic.conf and editing it to include regular ZFS status checking, a scrub every 7 days, and smartctl checking (requires the smartmontools package to be installed and `sysrc smartd_enable=YES`): + +```/etc/periodic.conf +# 404.status-zfs +daily_status_zfs_enable="YES" # Check ZFS +daily_status_zfs_zpool_list_enable="YES" # List ZFS pools + +# 800.scrub-zfs +daily_scrub_zfs_enable="YES" +daily_scrub_zfs_pools="" # empty string selects all pools +daily_scrub_zfs_default_threshold="7" # days between scrubs + +# 900 Smart status +daily_status_smart_devices="/dev/ada0 /dev/ada1 /dev/ada2" +``` + +/etc/aliases was changed to point mails that would otherwise go to root to my personal email. + +DMA from DragonflyBSD was installed to handle forwarding these status messages to my personal email from this machine (which is behind NAT on a residential network and therefore can't send its own emails). It was configured as follows: + +```/usr/local/etc/dma/dma.conf +SMARTHOST mail.paritybit.ca +PORT 465 +AUTHPATH /usr/local/etc/dma/auth.conf +SECURETRANSFER +MAILNAME mail.paritybit.ca +MASQUERADE no-reply@paritybit.ca +``` + +With the following in the auth.conf file: + +```/usr/local/etc/dma/auth.conf +no-reply|mail.paritybit.ca:SUPERSECUREPASSWORD +``` + +### Samba + +A Samba file server is used to distribute files. First, the latest samba package was installed, then the following configuration was placed in /usr/local/etc/smb4.conf: + +```/usr/local/etc/smb4.conf +[global] + workgroup = NASGROUP + realm = nasgroup.local + netbios name = NAS + +[nas] + path = /var/nas + public = no + writable = yes + printable = no + guest ok = no + valid users = jbauer +``` + +This was followed by: + +``` +sysrc samba_server_enable=YES +system samba_server start +``` + +A system user with the same name as listed in "valid users" was created, and then `pdbedit -a -u jbauer` was used to enable the user for Samba. + +### Tuning + +Some tuning for performance was done. The following settings were set in /etc/sysctl.conf: + +```sysctl.conf +kern.maxfiles=25600 +kern.maxfilesperproc=16384 +kern.inet.tcp.sendspace=65536 +kern.inet.tcp.recvspace=65536 +``` + +And the following settings were configured for the zfs pool: + +```zfs pool settings +zfs set relatime=on nas +zfs set compression=lz4 nas +zfs set recordsize=1M nas +``` + diff --git a/content/garden/arboretum/documentation/sysadmin/goaccess-with-openbsd-httpd.gmi b/content/garden/arboretum/documentation/sysadmin/goaccess-with-openbsd-httpd.gmi @@ -0,0 +1,11 @@ +# Using Goaccess with OpenBSD's httpd + +Create the .goaccessrc file in the home directory of your user (probably root) and add to it + +```.goaccessrc +time-format %T +date-format %d/%b/%Y +log-format %v %h %^ %^ [%d:%t %^] "%r" %s %b +``` + +Goaccess should now work as expected and properly parse httpd's log files. diff --git a/content/garden/arboretum/documentation/sysadmin/jaderune/admin.gmi b/content/garden/arboretum/documentation/sysadmin/jaderune/admin.gmi @@ -0,0 +1,34 @@ +# JadeRune.net Administration Documentation + +A collection of documentation and scripts used to administer JadeRune.net. + +## register_xmpp_user + +This is a custom script created to allow admins who don't otherwise have access to the infrastructure to register users with ejabberd + +A simple script was created to do this: +```register_xmpp_user script +#!/bin/sh + +if [ -z "$1" ]; then + echo "You must provide a username" + exit 1 +else + username="$1" +fi + +iocage exec xmpp su -l ejabberd -c "ejabberdctl register $username jaderune.net 'temppass'" +exit 0 +``` + +This script takes a name as an argument and registers that user with the given temporary password. + +It can be run as the admin user using the following command: +``` +doas register_xmpp_user <name> +``` + +Doas has been set up as follows: +``` +permit admin as root cmd register_xmpp_user +``` diff --git a/content/garden/arboretum/documentation/sysadmin/jaderune/freebsd-server.gmi b/content/garden/arboretum/documentation/sysadmin/jaderune/freebsd-server.gmi @@ -0,0 +1,63 @@ +# FreeBSD Jail-Based Server + +## Why Jails? + +Jails are basically just fancy chroots. I don't need any ability to limit resources (even though that is possible with jails), nor to do anything other than isolate the services I am running. I mostly wish to isolate them for management purposes, and ZFS+Jails makes for very easy snapshotting and backing up. + +In fact, I wish for all of the jails to have all of the access to the host system since the resources of my home servers are limited relative to enterprise-grade servers and none of my services are hit hard enough simultaneously for that to be an issue. + +## Seting up iocage + +Search for the iocage package and install the latest (it's named differently depending on the Python version). + +Make sure iocage is started at boot with `service iocage enable`. + +Add the following to `$HOME/.login_conf`: + +```$HOME/.login_conf +me:\ + :charset=UTF-8:\ + :lang=en_US.UTF-8:\ + :setenv=LC_COLLATE=C: +``` + +Run `iocage activate iocage` to create a new ZFS pool with the name `iocage` for your jails. + +Run `iocage fetch` to get a list of available releases and choose the latest. + +Create a (thick) jail with `iocage create -T -n <name> ip4_addr=<ipv4> ip6_addr=<ipv6> -r <exact_release_name> + +Instead of specifying the IP addresses, use `disable` to disable a particular IP version, `inherit` to inherit the host's IP, or `new` to let the jail request an IP (if it has a DHCP client running). I prefer to use IPv4 addresses in the range 10.0.0.10-10.0.0.50 for my jails. + +Enter the created jail with `iocage console <name>` and set up the application from there as if it was like any other machine. + +Set the jail to start on machine boot with `iocage set boot=on <name>`. + +## Managing Jails + +Update with `iocage update <name>` (still have to enter each jail and run `[kg update/upgrade` manually). + +Take snapshots with `iocage snapshot -n <snapshot_name> <jail_name>`. + +Rollback to a snapshot with `iocage rollback -n <snapshot_name> <jail_name>`. + +## WWW Jail + +Using OpenBSD httpd and OpenBSD ftpd + +``` +pkg install obhttpd +``` + +## Git Jail + +Using stagit + +## Gemini Jail + +Using gmid + +## IRC Jail + +Using soju+gamja? Maybe just a client, or perhaps not at all. + diff --git a/content/garden/arboretum/documentation/sysadmin/misskey.gmi b/content/garden/arboretum/documentation/sysadmin/misskey.gmi @@ -0,0 +1,80 @@ +# Installing Misskey on Debian 11 + +Install NodeJS v16.x using the repo from Node's website. Then install: + +``` +nodejs redis postgresql yarn ffmpeg gulp git +``` + +Add a new user to postgres: + +``` +su - postgres +createuser misskey -P; +createdb misskey; +psql +GRANT ALL PRIVILEGES ON DATABASE misskey TO misskey; +``` + +Make sure the following environment is set + +``` +NODE_ENV=production NODE_PATH=/usr/lib/nodejs:/usr/share/nodejs +``` + +You probably have to +``` +yarn add querystring js-yaml +``` + +Run the following to build and install misskey + +``` +su - misskey +git clone --recursive -b master git://github.com/misskey-dev/misskey.git +cd misskey +git submodule update --init +git checkout master +yarn install +cp .config/example.yml .config/default.yml +<EDIT THE CONFIG FILE YOU JUST COPIED> +yarn build +yarn run init +``` + +Test that it works by running + +``` +yarn start +``` + +Create and install the following systemd service file into `/etc/systemd/system/misskey.service`: + +``` +[Unit] +Description=Misskey daemon + +[Service] +Type=simple +User=misskey +ExecStart=/usr/bin/npm start +WorkingDirectory=/home/misskey/misskey +Environment="NODE_ENV=production" +TimeoutSec=60 +StandardOutput=syslog +StandardError=syslog +SyslogIdentifier=misskey +Restart=always + +[Install] +WantedBy=multi-user.target +``` + +To start Misskey from the service file, do: + +``` +systemctl daemon-reload +systemctl enable misskey +systemctl start misskey +``` + diff --git a/content/garden/arboretum/documentation/sysadmin/openbsd-router.gmi b/content/garden/arboretum/documentation/sysadmin/openbsd-router.gmi @@ -0,0 +1,216 @@ +# OpenBSD Router + +## Hardware + +The hardware consists of an HP Compaq Pro 4300 SFF PC with the following specifications: + +* CPU: Intel Core i3-3220 +* RAM: 2x2GB DDR3 +* Storage: 120GB Crucial SSD +* 2x1GbE PCIe Ethernet Card +* 1x1GbE PCI Ethernet Card + +## Software + +There are three major software components to this router: + +* DHCP - dhcpd +* Firewall - pf +* DNS - unbound + +### DHCP + +DHCP is handled by dhcpd, configuration is in `/etc/dhcpd.conf`. + +This is the configuration: + +```/etc/dhcpd.conf +option domain-name "paritybit.ca"; + +subnet 10.0.0.0 netmask 255.255.255.0 { + option routers 10.0.0.1; + option domain-name-servers 10.0.0.1; + range 10.0.0.51 10.0.0.254; + host hades { + fixed-address 10.0.0.2; + hardware ethernet 70:85:c2:54:98:92; + } + host hecate { + fixed-address 10.0.0.3; + hardware ethernet a4:1f:72:61:f4:fc; + } + host cerberus { + fixed-address 10.0.0.4; + hardware ethernet b0:83:fe:9b:8a:e3; + } + host eurynomos { + fixed-address 10.0.0.5; + hardware ethernet f8:bc:12:87:39:93; + } +} +subnet 10.0.1.0 netmask 255.255.255.0 { + option routers 10.0.1.1; + option domain-name-servers 10.0.1.1; + range 10.0.1.3 10.0.1.254; +} +``` + +There are two subnets, one for LAN (10.0.0.0/24) and one for WLAN (10.0.1.0/24). + +There are reserved addresses for hades (my desktop), hecate (my test server), cerberus (my main server), and eurynomos (my NAS). The reserved addresses range for the LAN network is probably larger than it needs to be, but I won't have anywhere close to 200 devices/services anyways. + +### Firewall + +The firewall is handled by pf which stores its configuration at `/etc/pf.conf`. + +This is the basic configuration, with port-forwarding rules appended if needed: + +```/etc/pf.conf +WAN = "em0" +LAN = "em1" +WLAN = "bge0" + +table <martians> { 0.0.0.0/8 10.0.0.0/8 127.0.0.0/8 169.254.0.0/16 \ + 172.16.0.0/12 192.0.0.0/24 192.0.2.0/24 224.0.0.0/3 \ + 192.168.0.0/16 198.18.0.0/15 198.51.100.0/24 \ + 203.0.113.0/24 } + +# Set basic firewall settings +set block-policy drop +set loginterface egress +set skip on lo0 + +# Normalize incoming packets and perform NAT translation +match in all scrub (no-df random-id max-mss 1440) +match out on egress inet from !(egress:network) to any nat-to (egress:0) + +# Protect from spoofed addresses and block traffic to/from non-routables +block in from no-route +block in quick from urpf-failed +block in quick on egress from <martians> to any +block return out quick on egress from any to <martians> + +# Default deny incoming traffic +block all + +# Block all DNS requests not addressed to this router +block return in quick on $LAN proto { udp tcp } to ! $LAN port { 53 853 } +block return in quick on $WLAN proto { udp tcp } to ! $WLAN port { 53 853 } + +# Allow all outbound traffic +pass out quick inet + +# Allow internal LAN/WLAN traffic +pass in on { $LAN $WLAN } inet +``` + +### DNS + +DNS is provided by unbound which keeps its configuration at `/var/unbound/etc/unbound.conf`. + +Here is the configuration: + +```/var/unbound/etc/unbound.conf +server: + interface: 10.0.0.1 + interface: 10.0.1.1 + interface: 127.0.0.1 + + access-control: 127.0.0.1/8 allow + access-control: 10.0.0.0/24 allow + access-control: 10.0.1.0/24 allow + do-not-query-localhost: no + + hide-identity: yes + hide-version: yes + + cache-min-ttl: 3600 + prefetch: yes + + # Perform DNSSEC validation. + auto-trust-anchor-file: "/var/unbound/db/root.key" + val-log-level: 2 + + # Synthesize NXDOMAINs from DNSSEC NSEC chains. + # https://tools.ietf.org/html/rfc8198 + aggressive-nsec: yes + +forward-zone: + name: "." + forward-addr: 1.1.1.1 + +remote-control: + control-enable: yes + control-interface: /var/run/unbound.sock +``` + +Note that, because the WAN address is acquired with DHCP, the following is required in `/etc/dhclient.conf`: + +```/etc/dhclient.conf +interface "em0" { + ignore domain-name-servers; +} +``` + +# Reverse Proxy + +```relayd.conf +table <webserver> { 127.0.0.1 } +table <webserver2> { 127.0.0.1 } +table <matrixserver> { 127.0.0.1 } + +http protocol "https" { + tcp { nodelay, sack, socket buffer 65536, backlog 128 } + + tls keypair "paritybit.ca" + tls keypair "jbauer.ca" + + 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" + + # set CORS header for .well-known/matrix/server, .well-known/matrix/client + # httpd does not support setting headers, so do it here + match request path "/.well-known/matrix/*" tag "matrix-cors" + match response tagged "matrix-cors" header set "Access-Control-Allow-Origin" value "*" + + pass quick path "/_matrix/*" forward to <matrixserver> + pass quick path "/_synapse/client/*" forward to <matrixserver> + + pass request quick header "Host" value "matrix.paritybit.ca" \ + forward to <matrixserver> + + # pass other traffic to webserver + pass request header "Host" value "paritybit.ca" forward to <webserver> + pass request header "Host" value "www.paritybit.ca" forward to <webserver> + pass request header "Host" value "ftp.paritybit.ca" forward to <webserver> + pass request header "Host" value "jbauer.ca" forward to <webserver2> +} + +relay "https_traffic" { + listen on egress port https tls + protocol "https" + forward to <matrixserver> port 8008 check tcp + forward to <webserver> port 8080 check tcp + forward to <webserver2> port 8081 check tcp +} + +http protocol "matrix" { + tcp { nodelay, sack, socket buffer 65536, backlog 128 } + tls keypair "paritybit.ca" + block + pass quick path "/_matrix/*" forward to <matrixserver> + pass quick path "/_synapse/client/*" forward to <matrixserver> +} + +relay "matrix_federation" { + listen on egress port 8448 tls + protocol "matrix" + forward to <matrixserver> port 8008 check tcp +} +``` diff --git a/content/garden/arboretum/documentation/sysadmin/openbsd-server-details.gmi b/content/garden/arboretum/documentation/sysadmin/openbsd-server-details.gmi @@ -0,0 +1,257 @@ +# OpenBSD Server Details + +This article gives a detailed look at the configuration of the services I run. An overview and rationale is available in the following article: + +=> openbsd-server-overview.gmi + +## IPv6 + +Hetzner supports IPv6, but seemingly only through DHCPv6 or manual configuration. OpenBSD supports IPv6, but only using SLAAC or manual configuration. Therefore, some manual configuration in hostname.vio0 was needed to get IPv6 to work: + +```/etc/hostname.vio0 +dhcp +inet6 alias 2a01:4ff:f0:f61::1 64 +!route add -inet6 default fe80::1%vio0 +``` + +Note that Hetzner routes all IPv6 traffic for their cloud instances through fe80::1. + +## TLS Certificates + +OpenBSD's acme-client is used to request certificates. This is the configuration: + +```/etc/acme-client.conf +authority letsencrypt { + api url "https://acme-v02.api.letsencrypt.org/directory" + account key "/etc/acme/letsencrypt-privkey.pem" +} + +domain paritybit.ca { + alternative names { www.paritybit.ca, ftp.paritybit.ca, git.paritybit.ca, jbauer.ca } + domain key "/etc/ssl/private/paritybit.ca.key" + domain full chain certificate "/etc/ssl/paritybit.ca.fullchain.pem" + sign with letsencrypt +} +``` + +Renewing the certificates is handled by /etc/monthly.local, which is run by cron once a month. The output is sent to me in an email. + +```/etc/monthly.local +next_part "Renewing TLS certificate(s):" +acme-client -v -F paritybit.ca +rcctl reload relayd httpd +``` + +## Daily Jobs + +A series of jobs are run daily to provide a daily report of basic server status. This is configured in /etc/daily.local: + +```/etc/daily.local +next_part "Checking for updates:" +pkg_add -un 2>&1 +next_part "Checking for available system patches:" +syspatch -c +next_part "Disk usage report:" +df -h +``` + +## HTTP Server + +All of the domains are served by the following httpd configuration. It also handles the file server since that is done over http. + +```/etc/httpd.conf +types { + include "/usr/share/misc/mime.types" +} + +# For certificate renewal +server "paritybit.ca" { + alias "jbauer.ca" + alias "ftp.paritybit.ca" + alias "git.paritybit.ca" + listen on * port 80 + location "/.well-known/acme-challenge/*" { + root "/acme" + request strip 2 + } + location * { + block return 301 "https://$HTTP_HOST$REQUEST_URI" + } +} + +# Redirect to WWW +server "paritybit.ca" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/paritybit.ca.fullchain.pem" + key "/etc/ssl/private/paritybit.ca.key" + } + hsts { + max-age 31536000 + preload + subdomains + } + location * { + block return 301 "https://www.paritybit.ca$REQUEST_URI" + } +} + +server "www.paritybit.ca" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/paritybit.ca.fullchain.pem" + key "/etc/ssl/private/paritybit.ca.key" + } + hsts { + max-age 31536000 + preload + } + + root "paritybit.ca" + + location match "/([^%.]+)$" { + request rewrite "/%1.html" + } +} + +server "jbauer.ca" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/paritybit.ca.fullchain.pem" + key "/etc/ssl/private/paritybit.ca.key" + } + hsts { + max-age 31536000 + preload + subdomains + } + root "jbauer.ca" +} + +server "ftp.paritybit.ca" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/paritybit.ca.fullchain.pem" + key "/etc/ssl/private/paritybit.ca.key" + } + hsts { + max-age 31536000 + preload + } + root "ftp.paritybit.ca" + directory auto index + location "/paste/" { + directory no index + } +} + +server "git.paritybit.ca" { + listen on * tls port 443 + tls { + certificate "/etc/ssl/paritybit.ca.fullchain.pem" + key "/etc/ssl/private/paritybit.ca.key" + } + hsts { + max-age 31536000 + preload + } + root "git.paritybit.ca" +} +``` + +### Gemini Server + +vger configuration is extremely simple since it just uses inetd and relayd: + +This is the inetd configuration: + +```/etc/inetd.conf +127.0.0.1:11965 stream tcp nowait _vger /usr/local/bin/vger vger +``` + +And this is the relayd configuration: + +```/etc/relayd.conf +log connection +tcp protocol "gemini" { + tls keypair paritybit.ca +} + +relay "gemini" { + listen on egress port 1965 tls + protocol "gemini" + forward to 127.0.0.1 port 11965 +} +``` + +/etc/ssl/paritybit.ca.fullchain.pem is symlinked to /etc/ssl/paritybit.ca.crt for relayd. + +The content of the gemini server is a git repository that lives in /var/gemini. When updates to the wiki are made, I can simply SSH into the server and run `git pull` to update the content. The _vger group has the ability to read the contents of /var/gemini but only root has permissions for the .git folder so the gemini server can't serve it. + +### Finger Server + +The configuration in inetd for fingerd is: + +```/etc/inetd.conf +finger stream tcp nowait _fingerd /usr/libexec/fingerd fingerd -lsmu +finger stream tcp6 nowait _fingerd /usr/libexec/fingerd fingerd -lsmu +``` + +A user (jbauer) was created with ~/.plan and ~/.project files which are displayed by fingerd. + +### Git Server + +The static pages generated by stagit are served using the configuration in httpd.conf. Git repositories live in /var/git and updates are pushed there using SSH. The git daemon for cloning using the git:// protocol is invoked using inetd with the following configuration: + +```/etc/inetd.conf +git stream tcp nowait _gitdaemon /usr/local/bin/git git daemon --inetd --verbose --base-path=/var/git --export-all /var/git/ +git stream tcp6 nowait _gitdaemon /usr/local/bin/git git daemon --inetd --verbose --base-path=/var/git --export-all /var/git/ +``` + +The following script is run as an hourly cronjob to update the static pages and incorporate recently pushed changes. I may switch to using a post-receive hook instead of a cronjob if this doesn't end up fitting my needs. + +```stagit-update +#!/bin/sh + +# Update all individual repos +for repo in /var/git/*; do + cd /var/www/git.paritybit.ca/"$(basename "$repo" .git)" + /usr/local/bin/stagit "$repo" +done + +# Re-generate the index page +cd /var/www/git.paritybit.ca +/usr/local/bin/stagit-index /var/git/* > index.html +``` + +The following script is used to make adding a new repository quicker and easier: + +```stagit-new +#!/bin/sh + +printf "Project Name: " +read name + +printf "Project Description: " +read desc + +#printf "Project URL: " +#read url +url="https://git.sr.ht/~jbauer/$name" + +#printf "Project Owner: " +#read owner +owner="Jake Bauer" + +cd /var/www/git.paritybit.ca +mkdir "$name" && cd "$name" +ln -s ../favicon.png . +ln -s ../logo.png . +ln -s ../style.css . + +cd /var/git +git clone --bare "$url" +echo "$desc" > "$name".git/description +echo "$owner" > "$name".git/owner +echo "$url" > "$name".git/url +``` diff --git a/content/garden/arboretum/documentation/sysadmin/openbsd-server-overview.gmi b/content/garden/arboretum/documentation/sysadmin/openbsd-server-overview.gmi @@ -0,0 +1,78 @@ +# OpenBSD Server Overview + +All paritybit.ca services (except Misskey) run off of a single OpenBSD VPS. + +This article gives an overview of the rationale and list of services running. Setup details are in the following article: + +=> openbsd-server-details.gmi + +## Why OpenBSD? + +> Get used to minimalism and security: componentised, privilege-separated binaries in file-system jails. Most of all, forget your instincts to search Google and StackExchange for every parameter and function call: man pages are your new best friend. + +=> https://learnbchs.org/ -- LearnBCHS.org + +OpenBSD ships with sensible and secure defaults. OpenBSD has excellent documentation: I can use the system to learn about the system instead of looking things up on half-baked, SEO-optimized, outdated articles. OpenBSD has straightforward and easy to manage system components (daemons, init system, updating, etc). OpenBSD doesn't randomly break or unexpectedly change things out from under you when there's an update (they let you know about changes well in advance of you needing to upgrade). OpenBSD ships with a set of useful, well-written programs that make setting up a server a breeze (httpd, acme-client, relayd, etc.). + +To summarize: OpenBSD isn't a pain. + +## Why a VPS? + +I wanted to run everything from home to avoid paying for a VPS, but this came with its own set of drawbacks. I would be unable to experiment with things on my home network without taking down my public-facing services, there is no IPv6 access from my ISP, the bandwidth is limited so if someone wanted to download a larger file from me or many people were accessing my site at once my own internet access would suffer, and the cost of a relatively powerful VPS is €3.99/month which is very affordable. + +## Hardware + +The VPS runs on a Hetzner CPX11 which has: + +* 2 EPYC-based vCPUs +* 2GB RAM +* 40GB SSD +* 20TB Bandwidth + +This amount of resources is about double than what the things I publicly host use, but it leaves room for more services and I didn't want to go lower than 2 vCPUs so that the server would be able to deal with influxes of traffic. + +The total cost is €3.99/month which is approximately CAD$5.80/month; less than a USD$5/month VPS with providers like Vultr and Linode for better hardware. + +## Services + +The server hosts: an http server, a gemini server, a finger server, a git server, and a file sharing server. + +### HTTP Server + +The HTTP server uses OpenBSD's httpd which is very easy to configure and very light on resources. + +### Gemini Server + +I chose Solène Rapenne's vger as my gemini server. It uses OpenBSD's inetd to handle incoming connections and OpenBSD's relayd for TLS. + +=> https://tildegit.org/solene/vger vger gemini server + +### Finger Server + +OpenBSD's inetd is used to call OpenBSD's fingerd. + +### Git Server + +The "git server" is really nothing more than a git daemon to handle cloning/fetching/pulling and stagit to generate static pages for each repository so code and changes can be browsed from a web browser. SSH is used to push changes to the server, and the git daemon is invoked using OpenBSD's inetd. + +=> https://codemadness.org/git/stagit/file/README.html stagit + +### File Server + +The file server is hosted over HTTP also using httpd. Although the subdomain is "ftp", the ftp daemon is not active as it doesn't actually provide any benefit or use over just serving files with HTTP. There are no users who need to upload their own files to the server and httpd and ftpd chroot to different locations which would complicate administration. + +## Software + +All of these services are run on the host machine. No "containers", "jails", or virtual machines are used. This was done intentionally to eliminate those as points of failure and administration headaches for a server that simply does not need to take advantage of those technologies. + +### Backups and Snapshots + +This server is not backed up. Configuration files are saved both here in this wiki (the content of which is in a git repository also hosted on sourcehut) and on my personal computer. If those are lost, they are easy to re-create anyways. All data on the server already lives in git repositories which are on sourcehut, my own machines, and the server itself. Files served by the file server are not critical and also already exist on my local machines. It is trivial to wipe away the server and re-create it so I have no need to pay extra for automated backups or tarsnap usage. + +Whenever updates are done or some significant change is needed, I can manually create a snapshot of the VPS in Hetzner's online console. + +### Mail + +Mail is set up using the configuration described in: + +=> relaying-service-mail-with-opensmtpd.gmi diff --git a/content/garden/arboretum/documentation/sysadmin/relaying-service-mail-with-opensmtpd.gmi b/content/garden/arboretum/documentation/sysadmin/relaying-service-mail-with-opensmtpd.gmi @@ -0,0 +1,27 @@ +# Relaying Service Mail With OpenSMTPD + +This configuration is very useful for allowing services to send email, especially when on a residential connection or when port 25 is blocked for a different reason. It also eliminates the need to maintain individual local mail servers and instead route all mail through a domain's central mail server. + +This requires an email server which is already set up to accept submissions from remote hosts. I use SMTPS (port 465) but this also works with SMTP+STARTTLS (port 587). + +First, create one or more accounts on the central mail server to handle the email (could be servicename@example.com or no-reply@example.com, etc). Creating multiple accounts when using SMTP AUTH is convenient in the case that a machine gets compromised and therefore the password used to authenticate with the mailserver gets compromised. If only one account is used, when you need to change the password for the service account, you need to update the configuration on all machines. On the other hand, one account for all service emails is easier to manage up front. + +On the machine which will be sending email, add an alias for the relevant users to `/etc/mail/aliases`. For example: `root: jbauer@paritybit.ca` which will send all emails that would normally be sent to the root user (for output of cron jobs, etc.) to my personal email. + +Modify the `/etc/mail/smtpd.conf` file as follows (this configuration uses the account service@example.com and SMTP AUTH PLAIN): + +```/etc/mail/smtpd.conf +table aliases file:/etc/mail/aliases +table credentials { service = service:thisisarandomandsecurepassword } + +listen on socket +listen on lo0 + +action "local_mail" mbox alias <aliases> +action "outbound" relay host smtps://service@mail.example.com tls auth <credentials> mail-from host@example.com + +match from local for local action "local_mail" +match from local for any action "outbound" +``` + +Finally, reload OpenSMTPD so it loads the new configuration. diff --git a/content/garden/arboretum/documentation/sysadmin/tarsnap-backups-with-acts.gmi b/content/garden/arboretum/documentation/sysadmin/tarsnap-backups-with-acts.gmi @@ -0,0 +1,64 @@ +# Tarsnap Backups With ACTS + +ACTS is a POSIX shell script that handles creation and rotation of backups with tarsnap. It requires the tarsnap key is already generated (and it's a good idea to back this key up separately). ACTS can be installed by downloading and un-tarring the latest release found on: + +=> https://github.com/alexjurkiewicz/acts + +I generally configure my systems as follows: + +```acts.conf +#!/bin/sh +# What to back up +backuptargets="var/backups/ <any_other_config_files>" + +# How to all tarsnap +tarsnap="nice -n19 tarsnap" + +# What arguments to give to tarsnap +# Assumes keyfile and cachefile are set in tarsnap.conf +tarsnapbackupoptions="--one-file-system --humanize-numbers --print-stats" + +# How much to log +verbose=1 + +# Identifies the backup by adding a hostname to the name of the backup +hostname=$(hostname) + +# Scripts to run before & after the backup +prebackupscript=/root/acts-pre.sh +postbackupscript=/root/acts-post.sh + +# Location of the lockfile +lockfile=/tmp/acts +``` + +I run two simple scripts, acts-pre.sh and acts-post.sh, to make dumps of my databases or do other things to get the system to be ready to be backed up. Here is an example of scripts which dump all the postgresql databases and keep the last 7 on disk: + +```acts-pre.sh +#!/bin/sh + +day="$(date +%Y-%m-%d)" +dumpfile="/var/backups/postgres-backup-$day" +touch "$dumpfile" +chown postgres:postgres "$dumpfile" + +su -c "pg_dumpall > $dumpfile" postgres + +chown 0:0 "$dumpfile" +chmod 600 "$dumpfile" +``` + +Note that `su` may have different syntax on other OSes. It may be necessary to run `pg_dumpall -U postgres` without su (optionally with password protection and possibly also a user other than postgres). + +```acts-post.sh +#!/bin/sh + +# Only keep db backups less than 7x24h old +find /var/backups/ -type f -mtime +7 -delete +``` + +Acts should be run regularly. My crontab looks like: + +```crontab +30 04 * * * /root/acts-1.4.2/acts +``` diff --git a/content/garden/arboretum/documentation/uw-imap.gmi b/content/garden/arboretum/documentation/uw-imap.gmi @@ -0,0 +1,107 @@ +# UW IMAP Server Documentation + +I am archiving the following document here in my knowledgebase because the University of Washington appears to have removed it from their site and the Internet Archive cannot be trusted to stay around forever. + +```UW IMAP Server Documentation + +/* ======================================================================== +* Copyright 1988-2006 University of Washington +* +* Licensed under the Apache License, Version 2.0 (the "License"); +* you may not use this file except in compliance with the License. +* You may obtain a copy of the License at +* +* http://www.apache.org/licenses/LICENSE-2.0 +* +* +* ======================================================================== +*/ + +[I wrote this tongue-in-cheek, but there's a lot here that people who +build IMAP clients should take careful note. Most existing clients +violate at least one, generally several, of these commandments. +These are based on known user-visible problems that occur with various +commonly used clients. Put another way, behind each commandment is a +plethora of user (and server administrator) complaints caused by a +violator.] + +Ten Commandments of How to Write an IMAP client +Mark Crispin + +1. Thou shalt not assume that it is alright to open multiple IMAP +sessions selected on the same mailbox simultaneously, lest thou face +the righteous wrath of mail stores that doth not permit such access. +Instead, thou shalt labor mightily, even unto having to use thy brain +to thinketh the matter through, such that thy client use existing +sessions that are already open. + +2. Thou shalt not abuse the STATUS command by using it to check for +new mail on a mailbox that you already have selected in an IMAP +session; for that session hath already told thou about new mail +without thy having to ask. + +3. Thou shalt remember the 30 minute inactivity timeout, and remember +to speak to the IMAP server before that timeout expires. If thou +useth the IDLE command, thou shalt send DONE from the IDLE before 29 +minutes hath passed, and issue a new IDLE. If thou maketh no use of +IDLE, then thou shalt send NOOP every few minutes, and the server +shalt tell you about new mail, and there will be much rejoicing in the +land. + +4. Thou shalt not assume that all names are both the name of a mailbox +and the name of a upper level of hierarchy that contains mailboxes; +lest thou face the righteous wrath of mail stores in which a mailbox +is a file and a level of hierarchy is a directory. Thou shalt pay +diligent attention to the \NoSelect and \NoInferiors flags, so that +your users may praise you with great praise. + +5. Thou shalt learn and understand the unique features of IMAP, such +as the unsolicited data model, the strict ascending rule of UIDs, how +UIDs map to sequence numbers, the ENVELOPE and BODYSTRUCTURE +structures; so that thou may use the IMAP protocol effectively. For a +POP client hacked to babble IMAP protocol is still no more than a POP +client. + +6. Thou shalt remember untagged data sent by the server, and when thou +needest data thou shalt consult your memory before asking the server. +For those who must analyze thy protocol transactions are weak of +stomach, and are likely to lose their recent meal should they see thou +repeatedly re-fetch static data. + +7. Thou shalt labor with great effort to work within the IMAP +deleted/expunge model, even if thy own model is that of a trashcan; +for interoperability is paramount and a trashcan model can be done +entirely in the user interface. + +8. Thou shalt not fear to open multiple IMAP sessions to the server; +but thou shalt use this technique with wisdom. For verily it is true; +if thou doth desire to monitor continuously five mailboxes for new +mail, it is better to have five IMAP sessions continuously open on the +mailboxes. It is generally not good to do a succession of five SELECT +or STATUS commands on a periodic basis; and it is truly wretched to +open and close five sessions to do a STATUS or SELECT on a periodic +basis. The cost of opening and closing a session is great, especially +if that session is SSL/TLS protected; and the cost of a STATUS or +SELECT can also be great. By comparison, the cost of an open session +doing an IDLE or getting a NOOP every few minutes is small. Great +praise shall be given to thy wisdom in doing what is less costly +instead of "common sense." + +9. Thou shalt not abuse subscriptions, for verily the LIST command is +the proper way to discover mailboxes on the server. Thou shalt not +subscribe names to the user's subscription list without explicit +instructions from the user; nor shalt thou assume that only subscribed +names are valid. Rather, thou shalt treat subscribed names as akin to +a bookmarks, or perhaps akin to how Windows shows the "My Documents" +folder -- a set of names that are separate from the hierarchy, for +they are such. + +10. Thou shalt use the LIST "*" wildcard only with great care. If +thou doth not fully comprehend the danger of "*", thou shalt use only +"%" and forget about the existance of "*". + +Honor these commandments, and keep them holy in thy heart, so that thy +users shalt maximize their pleasure, and the server administrators +shalt sing thy praises and recommend thy work as a model for others to +emulate. +``` diff --git a/content/garden/arboretum/index.gmi b/content/garden/arboretum/index.gmi @@ -12,3 +12,21 @@ |.| | | | | jgs \\/ ._\//_/__/ ,\_//__\\/. \_//__/_ ``` + +The Arboretum is the place for long-lived concepts. Here you can find my opinions, values and beliefs, recipes, and other similar things. + +=> documentation/ 📚 Documentation + +A collection of instructional documents, notes, configurations, or other bits and pieces of documentation I find valuable. + +=> opinions/ 💭 Opinions + +The place where I keep and catalog all of the opinions I care to write down and share. + +=> recipes/ 🍜 Recipes + +A catalog of recipes I found or created. + +=> values-and-beliefs/ ⚖️ Values and Beliefs + +What I value and believe in. diff --git a/content/garden/arboretum/opinions/index.gmi b/content/garden/arboretum/opinions/index.gmi @@ -1,5 +1,19 @@ # Opinions +``` + _---~~(~~-_. + _{ ) ) + , ) -~~- ( ,-' )_ + ( `-,_..`., )-- '_,) + ( ` _) ( -~( -_ `, } + (_- _ ~_-~~~~`, ,' ) + `~ -^( __;-,((())) + ~~~~ {_ -_(()) + `\ } + { } +Art By: Steven James Walker <swalker1@emerald.tufts.edu> +``` + This is where I keep and catalog all of the opinions I care to write down and share. This is something I use both as a personal reference when I'm having discussions with people and as a place to point people to get them up to speed @@ -12,9 +26,9 @@ will change over time. I have categorized my opinions to make them easier to find: -=> /opinions/computer-components.gmi Computer Components -=> /opinions/operating-systems.gmi Operating Systems -=> /opinions/software-licensing.gmi Software Licensing -=> /opinions/video-games.gmi Video Games -=> /opinions/miscellaneous.gmi Miscellaneous Opinions +=> computer-components.gmi Computer Components +=> operating-systems.gmi Operating Systems +=> software-licensing.gmi Software Licensing +=> video-games.gmi Video Games +=> miscellaneous.gmi Miscellaneous Opinions diff --git a/content/garden/arboretum/recipes/aloo-gobi.gmi b/content/garden/arboretum/recipes/aloo-gobi.gmi @@ -0,0 +1,44 @@ +# Aloo Gobi + +## Tools & Cookware + +* Knife and cutting board +* Stirring implement +* Large pot + +## Ingredients + +* 3 Tbsp neutral-flavour oil (canola, vegetable, etc.) +* ½ tsp cumin seed +* 1 small onion +* 2 chile peppers +* 1 tsp ginger paste +* 2 tsp ground coriander +* ¼ tsp paprika +* ½ tsp turmeric powder +* ½ tsp cayenne pepper +* ½ tsp garam masala +* 2 medium baking potatoes +* 1 tsp salt +* ½ head cauliflower +* 2 tsp lemon juice + +## Preparation + +* Quarter and slice the onion +* Mince the chile peppers +* Peel and cut the potatoes into 2-3cm pieces +* Cut the cauliflower head into florets + +## Instructions + +* Heat 2 Tbsp oil over medium-high heat in the large pot +* Fry cumin seeds until they turn golden brown and begin to pop +* Reduce heat to medium and stir in the onion; cook until lightly browned +* Stir in pepper and ginger; fry for 1 minute +* Add coriander, paprika, turmeric, cayenne, garam masala; mix and cook until fragrant (~30 seconds) +* Stir potatoes and salt into the pot, cover, and cook for 5-7 minutes +* Add cauliflower, cover, and cook 20 minutes or until cauliflower is tender +* Stir in lemon juice +* Pour remaining 1 Tbsp oil around the edges of the pot +* Increase heat to medium-high and fry 3-5 minutes, stirring gently diff --git a/content/garden/arboretum/recipes/barley-split-pea-stew.gmi b/content/garden/arboretum/recipes/barley-split-pea-stew.gmi @@ -0,0 +1,35 @@ +# Barley and Split Pea Stew + +## Tools & Cookware + +* Knife and cutting board +* Stirring implement +* Medium-large soup/stock pot + +## Ingredients + +* 1 Tbsp oil +* 4 cups vegetable broth +* 1 cup pearl barley +* ½ cup yellow split peas +* ½ cup green split peas +* 1 medium yellow onion +* 4 cloves garlic +* 1 28oz can of tomatoes +* thyme, salt, pepper, paprika to taste + +## Preparation + +* Wash barley and split peas +* Dice onion +* Crush garlic + +## Instructions + +* Add the oil to the pot and heat on medium-high heat +* Sauté onions and garlic until onions are transparent +* Add barley and split peas +* Add the broth and the can of tomatoes +* Add thyme and paprika; mix well +* Bring to a boil, cover, lower the heat and simmer for 60-90 minutes +* Season with salt and pepper to taste diff --git a/content/garden/arboretum/recipes/bean-salad.gmi b/content/garden/arboretum/recipes/bean-salad.gmi @@ -0,0 +1,37 @@ +# Bean Salad + +## Tools & Cookware + +* Knife and cutting board +* Whisk or fork +* Small bowl +* Large bowl +* Stirring implement + +## Ingredients + +* 1 15oz. can kidney beans +* 1 15oz. can cannellini beans +* 1.5 cups frozen green beans (thawed) +* ¼ cup chopped parsley +* ¼ cup finely diced red onion +* ¼ cup apple cider vinegar +* ¼ cup olive oil +* 2 Tbsp sugar +* 1 tsp salt +* ¼ tsp freshly cracked pepper +* 1 tsp Dijon mustard + +## Preparation + +* Open and drain the cans of beans and rinse the beans +* Slice the red onion, then soak in a bowl of ice-cold water for ~5 minutes and drain, then finely dice +* Chop the parsley + +## Instructions + +* Add the three types of beans, onion, and parsley into the large bowl +* Whisk the vinegar, sugar, olive oil, salt, pepper, and Dijon mustard in the small bowl +* Pour the contents of the small bowl into the large bowl and stir to combine +* Put the resulting salad into the fridge for at least 30 minutes +* Stir again just before serving diff --git a/content/garden/arboretum/recipes/bean-soup.gmi b/content/garden/arboretum/recipes/bean-soup.gmi @@ -0,0 +1,44 @@ +# Bean Soup + +## Tools & Cookware + +* Knife and cutting board +* Stirring implement +* Large soup/stock pot +* String to tie herbs together + +## Ingredients + +* 0.5kg of dried beans (just about any kind works) +* 1 large yellow onion +* 2 large carrots +* 2 large celery stalks +* 2 tbsp olive oil +* 2 cloves garlic +* 4 sprigs thyme +* salt and pepper + +## Preparation + +* Soak the beans in water overnight, covering them by 2-3cm of water +* Chop the onion, carrots, and celery into bite-sized pieces +* Crush the garlic +* Tie the sprigs of thyme together + +## Instructions + +* Add the olive oil and heat until shimmering +* Add the onion, carrots, and celery; sauté until onion is transparent +* Drain the water from the beans and rinse them; add them to the pot and mix +* Add the thyme bundle, garlic, and fresh water to cover the beans by 2-3cm of water +* Bring to a boil, cover and lower heat to simmer for 4 hours or until beans are soft but not mushy +* Remove the thyme bundle and season the soup to taste (see suggested seasonings) + +## Suggested Seasonings + +Aside from salt and pepper: + +* Thyme and tarragon for a French-style soup +* Cumin for Mexican-style +* Italian herbs for Italian-style +* Vegan or non-vegan sausages for heartiness (cook for an extra 20 minutes) diff --git a/content/garden/arboretum/recipes/brownies.gmi b/content/garden/arboretum/recipes/brownies.gmi @@ -0,0 +1,31 @@ +# Brownies + +## Tools & Cookware + +* Mixing bowl +* Baking pan +* Measuring spoons/cups + +## Ingredients + +* 2 cups all-purpose flour +* 2 cups sugar +* ¾ cups cocoa powder +* 1 tsp baking powder +* 1 tsp salt +* 1 cup water +* 1 cup vegetable oil +* 1 tsp vanilla extract +* (Optional) 1 tbsp decaf instant coffee + +## Instructions + +* Preheat oven to 350°F (175°C) +* Mix the dry ingredients together +* Add the wet ingredients into the dry ingredients +* Mix until well blended +* Spread evenly into a baking pan +* Bake 25-30 minutes in oven +* Let cool for 10 minutes and cut into squares + +Best served with a drizzle of chocolate sauce and light sprinkle of cocoa powder or very fine sugar alongside fruit or vegan vanilla ice cream diff --git a/content/garden/arboretum/recipes/butternut-squash-soup.gmi b/content/garden/arboretum/recipes/butternut-squash-soup.gmi @@ -0,0 +1,42 @@ +# Butternut Squash Soup + +## Tools & Cookware + +* Knife and cutting board +* Stirring implement +* Large soup/stock pot +* Immersion or counter-top blender + +## Ingredients + +* 1 Tbsp olive oil +* 1 medium onion +* 3 cloves garlic +* 2 tsp grated fresh ginger +* (Optional) 2 Tbsp tomato paste +* salt and pepper to taste (1 teaspoon each to start) +* 1/2 tsp thyme leaves +* 1 medium butternut squash +* 4 cups vegetable stock +* 3/4 cup coconut milk or half of a crusty loaf of bread + +## Preparation + +* Dice the onion +* Mince the garlic +* Finely chop the thyme leaves +* Peel and cut the squash into 2-3cm cubes +* If using bread, cut into 2-3cm cubes + +## Instructions + +* Heat a large pot over medium heat and heat the oil +* Add the onion, garlic, ginger, salt and pepper, and thyme; sauté until the onion is transparent +* (Optional) Add the tomato paste and mix +* Add the squash and mix +* Add the stock and mix (the liquid level should be slightly lower than the squash, adjust exact liquid amount as needed) +* Bring to a boil, cover and reduce heat to simmer the soup for 20 minutes, or until the squash is easily pierced by a fork +* Remove from the heat, add the coconut milk or bread (if using bread, mix well and let stand for 5 minutes, covered) +* Purée the soup with the immersion blender, or carefully scoop/pour into counter-top blender + +Note: This does not freeze well, probably due to the bread used. Perhaps coconut cream would be a better thickening agent. diff --git a/content/garden/arboretum/recipes/cabbage-lentil-stew.gmi b/content/garden/arboretum/recipes/cabbage-lentil-stew.gmi @@ -0,0 +1,40 @@ +# Cabbage Lentil Stew + +## Tools & Cookware + +* Knife and cutting board +* Stirring implement +* Medium pot or high-walled pan + +## Ingredients + +* 2 tbsp canola oil +* 1 medium yellow onion +* 4 cloves garlic +* ¼ head cabbage +* ½ cup lentils (any kind) +* 1 cup vegetable broth +* 3 cups water +* 2 tsp all-purpose flour +* 1 tbsp paprika +* salt and pepper to taste +* balsamic vinegar to taste + +## Preparation + +* Dice the onion +* Peel and slice the cloves of garlic +* Chop the cabbage into long strips + +## Instructions + +* Add the oil to the pot and heat at medium-high heat +* Add the onion and sauté until transparent +* Add the garlic and sauté for 1 minute +* Add the cabbage and sauté for 3-4 minutes +* Add the lentils followed by the water and broth +* Add the flour and paprika and mix well +* Bring to a high simmer/low boil, reduce heat, cover, and simmer for 15-20 minutes or until lentils are tender +* Add 1-2 tbsp of balsamic vinegar and mix in well + +Best served with warm crunchy bread. diff --git a/content/garden/arboretum/recipes/cabbage-soup.gmi b/content/garden/arboretum/recipes/cabbage-soup.gmi @@ -0,0 +1,50 @@ +# Cabbage Soup + +## Tools & Cookware + +* Knife and cutting board +* Large soup pot or dutch oven +* Stirring implement + +## Ingredients + +* 1 yellow onion +* 4 cloves garlic +* 1 Tbsp olive oil +* 4 carrots +* 4 ribs celery +* 1 green bell pepper +* 1 28oz. can diced tomatoes +* 1 8oz. can tomato sauce +* ½ lb. frozen green beans +* ¼ cup chopped parsley +* ½ Tbsp smoked paprika +* 1 tsp dried oregano +* ½ tsp dried thyme +* ¼ tsp freshly cracked black pepper +* 6 cups chopped cabbage (½ head) +* 6 cups vegetable broth +* 1 tsp salt +* 1 Tbsp lemon juice + +## Preparation + +* Dice the onion +* Mince the garlic +* Peel and slice the carrots into small chunks +* Chop the celery into small chunks +* Dice the bell pepper +* Chop the cabbage into 1-inch (2.5cm) pieces + +## Instructions + +* Add the onion, garlic, and olive oil to a large soup pot and sauté over medium heat until the onions are soft +* Add the carrot, celery, and bell pepper to the pot and continue sautéing for a couple minutes +* Add the diced tomatoes (with juices), tomato sauce, frozen green beans, chopped parsley, smoked paprika, oregano, thyme, and pepper, continue cooking for 5 minutes +* Add the cabbage to the pot along with the vegetable broth and stir to combine +* Place a lid on the pot, turn the heat up to medium-high, and allow the soup to come to a boil +* Reduce the heat to medium-low and continue to simmer, stirring occasionally, for about 40 minutes +* Once the cabbage is tender, season the soup with salt, ½ tsp at a time to your desired saltiness +* Finish the soup by adding the lemon juice and stirring to combine + +Best served with crusty bread. diff --git a/content/garden/arboretum/recipes/index.gmi b/content/garden/arboretum/recipes/index.gmi @@ -1,5 +1,38 @@ # Recipes ``` -Future ASCII Art of A Cooking Pot or something + _____ + _..--'''@ @'''--.._ + .' @_/-//-\/>/>'/ @ '. + ( @ /_<//<'/----------^-) + |'._ @ //|###########| + |~ ''--..@|',|}}}}}}}}}}}| + | ~ ~ |/ |###########| + | ~~ ~ ~|./|{{{{{{{{{{{| + '._ ~ ~ ~ |,/````````````` + jrei ''--.~.|/ ``` + +A catalog of recipes I found or created. + +All recipes below are vegan and free of tree nuts unless otherwise noted. + +=> aloo-gobi.gmi Aloo Gobi +=> barley-split-pea-stew.gmi Barley and Split Pea Stew +=> bean-salad.gmi Bean Salad +=> bean-soup.gmi Bean Soup +=> brownies.gmi Brownies +=> butternut-squash-soup.gmi Butternut Squash Soup +=> cabbage-lentil-stew.gmi Cabbage Lentil Stew +=> cabbage-soup.gmi Cabbage Soup +=> lacto-fermentation.gmi Lacto-Fermentation +=> overnight-oats.gmi Overnight Oats +=> pancakes.gmi Pancakes +=> red-lentil-stew.gmi Red Lentil Stew +=> sauces.gmi Sauces +=> sourdough-bread.gmi Sourdough Bread +=> sourdough-starter.gmi Sourdough Starter +=> spiced-lentils-with-carrots.gmi Spiced Lentils With Carrots +=> split-pea-soup.gmi Split Pea Soup +=> vegetable-curry.gmi Vegetable Curry +=> vinaigrettes.gmi Vinaigrettes diff --git a/content/garden/arboretum/recipes/lacto-fermentation.gmi b/content/garden/arboretum/recipes/lacto-fermentation.gmi @@ -0,0 +1,14 @@ +# Lacto-Fermentation + +## Sauerkraut + +* Chop a cabbage into thin strips and add to a bowl +* Add 2% of the cabbage's weight in salt to the bowl +* With your hands, mash and massage the salt and cabbage together until a decent amount of water begins to pool at the bottom of the bowl (upwards of 20 minutes) +* Transfer the cabbage to a jar, and pack it down very tightly until the waterline is above the cabbage +* If more water is needed, mix up a 2% salt-in-water solution and pour until the waterline is just above the cabbage +* Weigh down the cabbage leaves with something like plastic wrap and weights or a plastic bag full of water so nothing can float to the top + +## Eggplant + + diff --git a/content/garden/arboretum/recipes/overnight-oats.gmi b/content/garden/arboretum/recipes/overnight-oats.gmi @@ -0,0 +1,22 @@ +# Overnight Oats + +## Tools & Cookware + +* A jar or bowl + +## Ingredients + +* ⅓ cup oats +* ¼ tsp cinnamon +* 1 tbsp chia seeds +* 1 tbsp peanut butter +* ½-⅓ cup oat milk +* ½ cup fresh or frozen fruit (blueberries work well) +* maple syrup + +## Instructions + +* Mix the dry ingredients together in the container +* Add the wet ingredients and the peanut butter and mix well +* Top with the fruit and a drizzle of maple syrup +* Cover and refrigerate overnight diff --git a/content/garden/arboretum/recipes/pancakes.gmi b/content/garden/arboretum/recipes/pancakes.gmi @@ -0,0 +1,25 @@ +# Pancakes + +## Tools & Cookware + +* Mixing bowl +* Stirring & spooning implement +* Non-stick/cast-iron pan + +## Ingredients + +* 1¼ cups all-purpose flour +* 2 tbsp sugar +* 2 tbsp baking soda +* ½ tsp salt +* 1¼ cups water +* 1 tbsp oil + +## Instructions + +* Mix the dry ingredients together +* Add the water and oil into the dry ingredients +* Mix until combined but still lumpy +* Heat the pan on medium-high heat +* Spoon 2-3 tbsp of the mixture into the pan and cook until done, flipping halfway through (this differs based on the heat and how much was added to the pan, trial and error) +* Repeat previous step until the batter is used up diff --git a/content/garden/arboretum/recipes/red-lentil-stew.gmi b/content/garden/arboretum/recipes/red-lentil-stew.gmi @@ -0,0 +1,47 @@ +# Red Lentil Stew + +This recipe is copyright Grimgrains/Hundred Rabbits © 2014-2021 CC-BY-NC-SA-4.0 + +=> http://grimgrains.com/site/red_lentil_stew.html Grimgrains Red Lentil Stew Recipe +=> https://creativecommons.org/licenses/by-nc-sa/4.0/ CC-BY-NC-SA-4.0 License + +This recipe has been condensed from the original to better match my needs. Under the terms of the CC-BY-NC-SA-4.0 license, this recipe is therefore copyright Jake Bauer © 2021 under the same license. + +## Tools & Cookware + +* Knife and cutting board +* Stirring implement +* Medium pot + +## Ingredients + +* 1 tbsp olive oil +* 1 medium yellow onion +* black pepper +* cumin seeds +* ground turmeric +* 1 medium carrot +* 2 medium potatoes +* ¼ head cabbage +* ½ cup red lentils +* 1½ cups vegetable broth +* salt to taste + +## Preparation + +* Dice the onion +* Chop the carrot into small cubes +* Chop the cabbage + +## Instructions + +* Add the oil to the pot and heat at medium heat +* Add the onion and sauté until transparent +* Add the pepper, whole cumin seeds, and turmeric powder +* Add the carrot, potatoes, cabbage and mix well +* Lower the heat, cover, and cook for 5-7 minutes (add a small amount of water if vegetables are sticking to the bottom of the pot) +* Mix in the red lentils and the vegetable broth +* Bring to a boil, cover, and lower heat to simmer for 10 minutes +* When ready, season with salt to taste + +Best served over basmati rice or flat bread. diff --git a/content/garden/arboretum/recipes/sauces.gmi b/content/garden/arboretum/recipes/sauces.gmi @@ -0,0 +1,20 @@ +# Sauces + +## Basic Stir Fry Sauce + +* 3 cloves garlic, minced +* 3 tbsp soy sauce +* 1 tbsp rice vinegar +* 1 tbsp brown sugar (regular sugar is fine) +* ½ cup broth or water +* 1½ tbsp corn starch + +## Better Stiry Fry Sauce + +* ¼ cup soy sauce +* ¼ cup water +* 2 Tbsp brown sugar +* 1 tsp toasted sesame oil +* 2 cloves garlic, minced +* 1 tsp grated fresh ginger +* 1 Tbsp cornstarch diff --git a/content/garden/arboretum/recipes/sourdough-bread.gmi b/content/garden/arboretum/recipes/sourdough-bread.gmi @@ -0,0 +1,35 @@ +# Sourdough Bread + +## Tools & Equipment + +* 2 bowls +* Dutch oven or cast iron pan (add a sheet pan if using a cast iron pan) +* Measuring spoons and cups +* High heat parchment paper +* Sharp knife or other scoring tool + +## Ingredients + +* 520g Wheat Flour (any kind, but a mix of 70g rye and the rest another kind is good) +* 385g Water +* 12g Fine-Ground Salt (table salt or sea salt is okay) +* 1/3 Cup Sourdough Starter + +## Instructions + +* Mix the salt and flour in a bowl +* Mix the sourdough starter into the water using a fork until no clumps of starter remain +* Combine wet and dry ingredients and stir with wooden spoon into a thick dough. Make sure all the flour is incorporated. If the mix is too dry, add water (1 Tbsp at a time) until all the flour is mixed in. +* Cover with a damp kitchen towel for 15 minutes. +* Stretch and fold the dough (grab a corner, stretch it up (but don't break it!) and fold it back in, then turn the bowl 90° and do it again, repeat 4 times total). +* Repeat steps 4 and 5. +* Cover with a damp kitchen towel and leave it on the counter overnight for 8-12 hours. +* Check the dough has finished rising by jiggling it. If the dough is jiggly and poking it doesn't feel hard, it's ready. +* Add the parchment to a second bowl. +* Separate the dough from the sides of the bowl it was proofing in and lift it about 1-2ft (30-60cm) up, then place it back down. If the dough is sticky, wetting your hands helps. Do this three times, and on your third lift, place the dough into the parchment-lined bowl. +* Sprinkle the dough with flour, seeds, or whatever you like. +* Place the dough in the fridge and pre-heat the oven (with the cast iron pan and sheet pan placed underneath, or dutch oven inside) to 500°F (260°C) for 50-60 minutes. +* Carefully take out the dutch oven or pan from your oven and gently lift the parchment with the dough and place it inside the pan or dutch oven. Score the top of the dough with a sharp knife swiftly and deeply in an X or off-center slice. +* Put the lid on the dutch oven if you're using it and place your cooking vessel into the oven. +* If using a cast iron pan, pour a cup of water into the pre-heated sheet pan at the bottom of the oven and close the oven door, bake for 35 minutes. If using a dutch oven, bake for 22 minutes, take off the lid, and bake for another 10-15 minutes until the top is a deep golden colour. +* Remove the bread from the oven, lift it out by the parchment paper and place it on a cooling rack. WAIT BEFORE SLICING >:( Usually about 1.5-2 hours is needed to let the loaf cool before you can eat it. diff --git a/content/garden/arboretum/recipes/sourdough-starter.gmi b/content/garden/arboretum/recipes/sourdough-starter.gmi @@ -0,0 +1,44 @@ +# Sourdough Starter + +## Tools & Cookware + +* 4 qt. glass jar, medium-sized Weck jar, or other medium food-safe container +* Measuring cups + +## Ingredients + +* Wheat Flour (any kind will work) +* Water + +## Instructions + +### Day 1 + +In your container, mix 120 grams of flour with 120 grams of water. Use a fork to ensure it's all mixed together well (it should end up being thick like peanut butter, add water _sparingly_ to get to that point). Cover the opening of the container with a loose lid or wet towel. You want to keep moisture in but not seal it. Leave this on your counter outside of direct sunlight and in a relatively warm place. + +### Day 2 + +You should notice some bubbling in your container, this may take longer than 24 hours depending on temperature and other factors. (If there is no bubbling by 48 hours, throw your starter out and begin again, perhaps using filtered water or a warmer location.) + +Discard all but 1/2 cup of starter (~130g), and put this 1/2 cup of starter aside. Clean out the jar with some warm water to get off any bits stuck to the side. Put your starter back in and add again 120 grams of water and flour, mixing together with a fork. Cover the container and leave it for another 24 hours. + +### Day 3-6 + +Repeat the process from day 2, except as the starter continues to grow, you want to only feed it when it shows signs of hunger. When the starter is hungry, it will have sunk down from its peak rise point, leaving residue on the walls of the container above the bulk of the starter. Depending on the temperature and other factors, you may need to feed your starter one or two times per day. Just keep an eye on it every couple hours to see when it gets hungry. + +After about 4-6 hours of the final feeding on day 6, the starter should have doubled in size. You can do a float test to determine if the starter is ready for breadmaking. Take one spoon of the starter, and gently drop it into a tall glass of water. If the starter floats, it is ready for breadmaking later that day. + +If, by day 6, the starter is not very active and doesn't pass the float test, it's possible that the temperature is too cold or there are other factors hindering its growth. It can take up to two weeks to get a starter really going, so be persistent and keep following the pattern of discarding, feeding when its hungry, and checking if it's ready. + +Once your starter is ready, the "discard" becomes what you use to bake bread with. Usually 1/3 cup of starter is a good amount for a loaf of bread, just make sure you have enough starter (1/2-1/3 cup) left in your container to feed and grow. + +## Storage + +An established sourdough starter can be stored in the fridge for quite a while and come right back when needed. If you've just used your starter to make bread or it has recently peaked, you can place the starter in the fridge to slow its metabolism and take it out when you're ready to feed it again. + +I have stored my starter in the fridge for 20 days and used it to make bread 24 hours after taking it out of the fridge and feeding it. + +## Safety + +As a sourdough starter is made up of a bunch of living organisms, sometimes things can go wrong, especially when it's getting established. Trust your senses. If you notice oddly coloured (green, black, blue, etc) stuff in your container, a really foul smell, or any other signs that something is not right, throw out your starter and wash your container with warm water and soap. A little flour and water is not worth risking your health over. + diff --git a/content/garden/arboretum/recipes/spiced-lentils-with-carrots.gmi b/content/garden/arboretum/recipes/spiced-lentils-with-carrots.gmi @@ -0,0 +1,40 @@ +# Spiced Lentils With Carrots + +## Tools & Cookware + +* Knife and cutting board +* Large skillet +* Stirring implement + +## Ingredients + +* 1 yellow onion +* 4 cloves garlic +* 1 tsp fresh grated ginger +* 4 carrots (about 2 cups chopped) +* 2 Tbsp olive oil +* 1 tsp ground cumin +* ½ tsp cinnamon +* ½ tsp allspice +* ¼ tsp crushed red pepper +* 1 cup brown lentils +* 3 Tbsp tomato paste +* ¼ cup chopped dried apricots or raisins +* 3 cups vegetable broth +* 1 Tbsp chopped parsley (optional) + +## Preparation + +* Dice the onion +* Mine the garlic +* Grate the ginger +* Peel and dice the carrots + +## Instructions + +* Add the onion, garlic, ginger, and olive oil to the skillet and sauté over medium heat until the onions are soft and translucent +* Add the diced carrots, cumin, allspice, and crushed red pepper and continue to sauté for a couple more minutes +* Add the uncooked lentils, tomato paste, dried fruit, and broth and stir until the tomato paste has dissolved into the broth +* Place a lit on the skillet and turn the heat to high +* Allow the broth to come to a full boil, then lower the heat to medium-low and simmer with the lid on for 30 minutes with occasional stirring +* Taste for seasoning (salt/pepper) and serve topped with chopped fresh parsley diff --git a/content/garden/arboretum/recipes/split-pea-soup.gmi b/content/garden/arboretum/recipes/split-pea-soup.gmi @@ -0,0 +1,39 @@ +# Split Pea Soup + +## Tools & Cookware + +* Knife and cutting board +* Medium-sized pot or dutch oven +* Stirring implement + +## Ingredients +* 2 cloves garlic +* 1 yellow onion +* 3 ribs celery +* 3 carrots +* 2 Tbsp olive oil +* 1 lb. split peas (dry) +* ½ tsp smoked paprika +* 1 tsp dried parsley +* ½ tsp dried oregano +* ¼ tsp dried thyme +* ¼ tsp freshly cracked pepper +* 6 cups water +* 1½ tsp salt (or to taste) + +## Preparation + +* Mince the garlic +* Dice the onion +* Dice the celery +* Dice the carrots + +## Instructions + +* Add the garlic, onion, celery, and carrots to a large pot with olive oil and sauté over medium heat until the onions are soft and translucent +* Add the dry split peas, smoked paprika, parsley, oregano, thyme, pepper, and water to the pot and stir to combine +* Cover and increase the heat to medium-high to bring the water to a boil +* Turn the heat down to medium-low and let the soup simmer for 45 minutes, stirring occasionally +* The soup should be quite thick, season with salt ½ a teaspoon at a time + +Best served with crackers or crusty bread. diff --git a/content/garden/arboretum/recipes/vegetable-curry.gmi b/content/garden/arboretum/recipes/vegetable-curry.gmi @@ -0,0 +1,29 @@ +# Vegetable Curry + +## Tools & Cookware + +* Knife and cutting board +* Medium soup pot or dutch oven +* Stirring implement + +## Ingredients + +* 700g frozen or fresh mixed vegetables (e.g. broccoli, carrots, snap peas) +* 2 cups vegetable broth +* 1 13.5oz. can coconut milk +* 1 Tbsp curry powder +* ½ tsp dried ground ginger +* salt and pepper to taste + +## Preparation + +* Chop the vegetables into bite-sized pieces if using fresh vegetables + +## Instructions + +* Add the vegetables and broth to a soup pot, turn the heat to high and bring to a boil +* Stir, turn the heat down to low, add the coconut milk, curry powder, and ginger and stir to combine +* Let simmer for a few minutes +* Taste the broth and season to your liking + +Best served with rice diff --git a/content/garden/arboretum/recipes/vinaigrettes.gmi b/content/garden/arboretum/recipes/vinaigrettes.gmi @@ -0,0 +1,34 @@ +# Vinaigrettes + +Combine ingredients in a container or small bowl and shake or whisk together. Let stand 10 minutes. Shake again and dress salad. + +A plain oil+vinegar vinaigrette can last weeks refrigerated, but adding fresh ingredients like garlic drastically reduces their storage time due to the risk of botulism. Consume those vinaigrettes within a few days at most. + +## Basic Vinaigrette + +* 3 parts oil +* 2 parts vinegar +* salt and pepper to taste + +## Balsamic Vinaigrette + +* 3 parts extra virgin olive oil +* 1 parts balsamic vinegar +* 1 small-medium minced garlic clove per 75mL of oil +* salt and pepper to taste + +## Italian Vinaigrette + +* 3 parts extra virgin olive oil +* 2 parts red wine vinegar +* 1 small-medium minced garlic clove per 75mL of oil +* 0.5g (or 1/2 tsp) Italian seasoning per 50mL of oil +* salt and pepper to taste + +## Lemon "Vinaigrette" + +* 1 part extra virgin olive oil +* 1 part lemon juice +* 1 small-medium minced garlic clove per 75mL of oil +* 0.5g (or 1/2 tsp) oregano per 50mL of oil +* salt and pepper to taste diff --git a/content/garden/arboretum/values-and-beliefs/index.gmi b/content/garden/arboretum/values-and-beliefs/index.gmi @@ -1,5 +1,27 @@ # Values and Beliefs ``` -Dunno what ASCII Art to put here yet + ,ggg, gg ,ggg, + d8P""8b ,d88b, d8""Y8b + Y8b,__,,aadd88888bbaaa,888888,aaadd88888bbaa,,__,d8P + "88888888888888888888I888888I88888888888888888888" + /|\`""YY8888888PP""""`888888'""""YY8888888PP""'/|\ + / | \ `WWWW' / | \ + / | \ ,dMMb, / | \ + / | \ I8888I / | \ + / | \ `Y88P' / | \ + / | \ `YP' / | \ + / | \ 88 / | \ + / | \ i88i / | \ + / | \ 8888 / | \ +"Y88888888888888888888888P" i8888i "Y88888888888888888888888P" + `""Y888888888888888P""' ,888888, `""Y888888888888888P""' + I888888I + Y888888P + `Y8888P' + `WWWW' Normand + dMMb Veilleux + _,ad8888ba,_ + __,,aaaadd888888888888888bbaaaa,,__ + d8888888888888888888888888888888888888b ``` diff --git a/content/garden/compost/index.gmi b/content/garden/compost/index.gmi @@ -17,3 +17,6 @@ \_____||_____/ ¯¯ ``` + +The Compost Heap is an archive of completed projects and other things I am finished with. Things here may eventually spark new ideas or be incorporated into new projects. + diff --git a/content/garden/greenhouse/index.gmi b/content/garden/greenhouse/index.gmi @@ -9,3 +9,87 @@ | | ·| |___________________| _\|/__|__|__|_|___________________|__ ``` + +The Greenhouse is the place where new things are incorporated into the garden. It is the sprouting place for seeds that may eventually develop into projects. + +Here are links, documents, and other things I found interesting. + +## To-Read + +Items are added to the top of the list as I come across them. + +=> https://nchrs.xyz/beliefs.html +=> https://txt.eli.li/pb/rss/feeds.html +=> https://thenewstack.io/larry-walls-quest-100-year-programming-language/ +=> https://en.wikipedia.org/wiki/Obscurantism +=> https://en.wikipedia.org/wiki/Postmodernism +=> https://github.com/haydenjames/bench-scripts +=> https://wileywiggins.com/merveilles.html +=> https://specbranch.com/posts/one-big-server/ +=> https://permacomputing.net/human-scale/ +=> https://htmx.org/essays/how-did-rest-come-to-mean-the-opposite-of-rest/ +=> https://text.causal.agency/018-operating-systems.txt +=> https://text.causal.agency/017-unpasswords.txt +=> https://www.digitalocean.com/community/tutorials/understanding-systemd-units-and-unit-files +=> https://lwn.net/Articles/899543/ +=> https://www.robinrendle.com/notes/the-difference-between-correct-ness-and-useful-ness-in-a-design-system/ +=> https://blog.jim-nielsen.com/2022/there-is-no-bar-but-having-one-is-good-too/ +=> https://matthiasott.com/notes/just-put-stuff-out-there +=> https://chriscoyier.net/2022/06/27/there-is-no-bar/ +=> https://blog.jim-nielsen.com/2022/finding-stuff-to-write-about/ +=> https://blog.jim-nielsen.com/2022/writing-and-waiting/ +=> https://blog.jim-nielsen.com/2022/my-office-space/ +=> https://blog.jim-nielsen.com/2022/software-over-time/ +=> https://blog.jim-nielsen.com/2022/reading-notes-june/ +=> https://web.mit.edu/jmorzins/www/C-H-speech.html +=> https://world.hey.com/jason/don-t-defer-quality-aaa105e4 +=> https://www.baldurbjarnason.com/2022/on-online-collaboration/ +=> https://adactio.com/journal/19125 +=> https://merveilles.town/@zens/108651671078029864 +=> https://chaos.social/@cityroler/108697761132980120 +=> https://merveilles.town/@cassvs/107680774859753930 +=> https://ritualdust.com/ +=> http://akkartik.name/post/division-of-labor +=> https://alexschroeder.ch/ +=> https://hackaday.io/project/171381-fluff-m0 +=> https://wimvanderbauwhede.github.io/articles/frugal-computing/ +=> https://merveilles.town/@neauoire/107374978219904539 +=> https://github.com/buoyantair/addictive-apps +=> https://computer.rip/2021-12-26-diy-mail.html +=> https://www.theguardian.com/science/2022/jan/02/attention-span-focus-screens-apps-smartphones-social-media +=> https://compudanzas.itch.io/introduction-to-uxn-programming +=> http://basalgangster.macgui.com/RetroMacComputing/The_Long_View/Entries/2011/1/22_MoreMasters%3B.html +=> https://skeeto.s3.amazonaws.com/share/onward17-essays2.pdf +=> https://vladh.net/alternatives-to-wage-labour + +## Project-Related + +=> https://github.com/Mozilla/readability +=> https://docs.openstack.org/devstack/latest/guides/single-machine.html +=> https://www.process-one.net/blog/category/ejabberd/ +=> https://ircdocs.horse/ +=> https://github.com/The-Invent0r/8-bit-Computer-PCB +=> https://github.com/cc65/cc65 +=> https://www.shellhacks.com/systemd-service-file-example/ +=> https://www.freedesktop.org/software/systemd/man/systemd.service.html + +## Digital Garden + +=> https://tomcritchlow.com/2018/10/10/of-gardens-and-wikis/ +=> https://maggieappleton.com/garden-history +=> https://github.com/MaggieAppleton/digital-gardeners +=> https://hapgood.us/2015/10/17/the-garden-and-the-stream-a-technopastoral/ +=> https://www.theatlantic.com/magazine/archive/1945/07/as-we-may-think/303881/ +=> https://www.eastgate.com/garden/Introduction.html +=> https://devonzuegel.com/post/epistemic-statuses-are-lazy-and-that-is-a-good-thing +=> https://drewdevault.com/2022/08/10/Organizing-my-thoughts.html + +## Done, Need Summarizing + +=> https://twitter.com/vgr/status/1047925106423603200 +=> https://www.wired.com/story/i-finally-reached-computing-nirvana-what-was-it-all-for/ +=> https://thomasjbevan.substack.com/p/all-news-is-bad-news +=> https://bsd.network/@jbauer/108737351720121006 +=> https://www.theguardian.com/commentisfree/2010/mar/22/charlie-brooker-newspapers-dangerous-drug +=> https://ottawavelooutaouais.com/2022/07/30/biking-to-the-ottawa-international-airport-from-downtown/ +=> https://www.mtajchert.com/libraries-and-open-spaces/ diff --git a/content/garden/greenhouse/tactics-and-mindset-shifts-for-making-the-most-of-life.gmi b/content/garden/greenhouse/tactics-and-mindset-shifts-for-making-the-most-of-life.gmi @@ -0,0 +1,31 @@ +# Notes from AoM Tactics and Mindset Shifts for Making the Most of Life + +=> https://www.artofmanliness.com/character/advice/podcast-825-tactics-and-mindset-shifts-for-making-the-most-of-life/ Podcast #825: Tactics and Mindset Shifts for Making the Most of Life + +Getting a physical letter is a tangible and permanent reminder that someone in the world appreciates you + +Don’t make every thing A Thing + +100-year-old plan: consult your 100 year old self... what would they have cared about in the moment + +Figure out what is actually important and let the rest flow by + +Take time, think: Where am I, who am I, how did I get here, what point on the horizon am I currently chasing. No point = stagnant, living days that look the same as the last and are unremarkable. + +Think about life in minutes - seize the minutes here and there to do something instead of thinking that just because there isn’t a block set aside nothing can be done and wasting it on idle tasks like scrolling reddit or twitter that probably wont even make you feel good. Can use it to get some small portion of the task done. + +Most people unwilling to make hard decision to chase their dreams so they make no decision and end up down path of least resistance not using their time well + +Spend less time on routine activities so we can spend more time doing the important things, especially routines that are not required of us (e.g going to 3-4 different grocery stores) + +Tie mundane things to existing habits things to form new habits + +Details matter but don’t forget to step back and see the whole forest instead of getting lost in the trees + +Practice intentional incuriosity. There are plenty of things that don’t matter to us, so there’s no reason to get involved or become knowledgable about it. It doesn’t lead you anywhere/help you. + +Break rules/norms to see what happens... do people actually care about X, Y, or Z. You’ll find out if they do or don’t. If it is, you say sorry, don’t do it again, and move on with your life. + +Creative people start by making terrible things, its ok to release those because thats how you improve. + +People are too focused on themselves and their lives that they will likely not notice you or judge you, and if they do they will likely forget very quickly. diff --git a/content/garden/index.gmi b/content/garden/index.gmi @@ -5,23 +5,29 @@ : : : : :: .''.''. :: .''. .''. .''. .''. .''; ; ;''. .''. .''. .''. .''. - | |oo| || | | | | | ; ; | | | | | | |oo| | + | | | || | | | | | ; ; | | | | | | | | | --| |--| d|--| |--| |-| ; ; ; |-| |--| |--| |--| |-- --|| |--| |--| |--| |-| ; ; |-| |--| |--| |--| |-- -.o|b | | |o.| | | | | ; | | | | |.o| | | |o. -o'| | | |`o| | | | | ; ; o| | | | |o'| | | |`o -o | | | || o| | | | | ; ; | | | | |o | | | | o + |b | | | | | | | | ; | | | | | | | | | + | | | | | | | | | ; ; o| | | | | | | | | + | | | || | | | | | ; ; | | | | | | | | | --| |--| b|--| |--| |-| ; ; |-| |--| |--| |--| |-- --| |--| |--| |--| |-| ; ; |-| |--| |--| |--| |-- -`o| | | |o'| | | | | ; ; ; | | | | |`o| | | |o' - `|__|oo|__|' |__| |__| |__;__;__;__| |__| |__| `|__|oo|__|' - "" "" ___________ - "" "" "" / \ - /"" WELCOME \ - / "" \ + | | | | | | | | | ; ; ; | | | | | | | | | + |__| |__| |__| |__| |__;__;__;__| |__| |__| |__| |__| + \|/ ___________ + \|/ / \ \|/ + /"" WELCOME \ \|/ + \|/ / "" \ \|/ AMC ~~~~~~~~~~~~~~~~~ ``` +My digital garden is the place where I collect, curate, and cultivate interesting facts, notes, links, or anything else I might be working on. It's also my second brain, helping to hold all the things I want to remember and helping me make new connections. + +An important property of the garden is that it's constantly changing. Pages will be added, deleted, moved, and re-connected without hesitation so something could be in one place at one time and gone the next. If you find anything you want to keep, you should save it because there are no guarantees it will be there when you come back. (Well, I suppose there's the git repository, but nobody wants to go digging around in the guts of a git repository.) + +Also, I'm heavily leaning into this gardening metaphor both because I love gardening in the physical world and because I find it a compelling way to organize my thoughts. + If this is your first time visiting this garden, please have a look at my Digital Garden Philosophy. It describes what you can expect when visiting here, and the philosophy by which I curate this garden. => /garden/digital-garden-philosophy.gmi 📜 Digital Garden Philosophy @@ -44,6 +50,8 @@ The Arboretum is the place for long-lived concepts. Here you can find my opinion The Compost Heap is an archive of completed projects and other things I am finished with. Things here may eventually spark new ideas or be incorporated into new projects. +The garden is also available for browsing using the Gemini protocol at "gemini://paritybit.ca". + Unless otherwise noted, all content in this garden is licensed under the terms of the CC-BY 4.0. => https://creativecommons.org/licenses/by/4.0/ © CC-BY 4.0 diff --git a/content/garden/plots/buy-nothing-site.gmi b/content/garden/plots/buy-nothing-site.gmi @@ -0,0 +1,5 @@ +# Buy Nothing Site + +Provide buy nothing groups, individual chats, moderation features, marketplace style with search, etc + +Oauth login with twitter facebook gmail reddit etc also email diff --git a/content/garden/plots/index.gmi b/content/garden/plots/index.gmi @@ -10,3 +10,11 @@ \\|//jgs\\|/// \\\|//\\\|/// \|/// \\\|// \\|// \\\|// ^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^^ ``` + +The Plots are where active projects live. Here you can find actively worked on technical projects, essays, or anything else that’s being grown into something that may eventually be put out into the world. + +=> philosophy-software-development.gmi Notes on A Philosophy of Software Development +=> macos-evaluation.gmi Evaluating MacOS as a Linux/BSD user +=> ios-evaluation.gmi Evaluating iOS as a Linux/BSD user +=> buy-nothing-site.gmi Buy Nothing Site +=> server-monitor.gmi Server Monitoring Made Easy diff --git a/content/garden/plots/ios-evaluation.gmi b/content/garden/plots/ios-evaluation.gmi @@ -0,0 +1,17 @@ +# iOS Evaluation + +Testing iOS 12.5.5 on iPhone 6 + +Going back to Android from iOS felt like going from Android to a Linux phone. + +## AirDrop vs. KDE Connect + +KDE Connect did not work on my desktop running Fedora 35 Cinnamon. The interface was terrible and it didn’t find my mobile phone. + +I installed Kubuntu 21.10 on my laptop and it worked. I was able to pair my laptop and my phone. Controlling the mouse/keyboard from the phone worked, sending a file to the laptop from the phone worked, notifications that popped up on my phone also popped up on my laptop, remote input from the laptop to the phone also worked. Sending a file to the phone from my laptop did not work as far as I could tell. + +AirDrop is much more convenient, easier to share files to people around you without having to pair with them first or even install any additional applications. Although AirDrop is Apple-ecosystem-only, KDE Connect doesn’t feel that much freer since it didn’t work on my existing Linux installation. + +KDE Connect offers much more in terms of being able to control your other devices from your phone or computer, though the only thing I could see this being personally useful for is controlling a media streaming machine (e.g. home theatre) from your phone, or controlling a presentation from your phone. + +As is typical for Linux vs. Apple, it seems that the Linux option is much more geared towards technical people (programmers, people who like to tinker, etc), whereas AirDrop is geared towards being as simple and straightforward to use for the everyday person. diff --git a/content/garden/plots/macos-evaluation.gmi b/content/garden/plots/macos-evaluation.gmi @@ -0,0 +1,204 @@ +# MacOS Evaluation + +Evaluating user experience of MacOS from the perspective of a Linux/BSD user. + +Tested on a Mac Pro (Late 2013) running macOS Monterey (latest version as of the time of writing) + +Specs: +Intel Xeon E5-1620v2 4C/8T @ 3.7Ghz +64 GB DDR3 ECC @ 1866 MHz +1TB SATA SSD +2x AMD FirePro D300 GPU + +Tips & Customizations + +Look thoroughly through the System Preferences and Preferences dialogs of the apps you use. There are lots of useful options (e.g. in Finder) that can be toggled. + +Quickly viewing a file: select the file (in Finder or on the desktop) and press Spacebar to get a view without having to open an app (mainly useful for quickly seeing pictures or 3D models). + +Quick rename files using Finder by selecting multiple files, right clicking, clicking rename, and you can very quickly batch-rename a bunch of files using find & replace, appending or prepending text, etc, from the GUI. + +You can customize the toolbar of many of Apple’s MacOS apps by right clicking on the toolbar and clicking “Customize Toolbar…”. Can also toggle option to show icons, icons+text, or text only in Finder. In Finder you can also drag applications or folders to your toolbar. Why is GNOME so bad. + +Also in Finder, it’s useful to activate “Show Path Bar” and “Show Status Bar” under the View menu bar item. Path bar is more useful than status bar, but it’s nice information to see. Another handy tip is Shift+⌘+P to toggle a preview pane which makes looking through a large directory of images much nicer. + +Cut and Paste of files is less intuitive than in Windows or Linux. Instead of ⌘ + X & ⌘ + V, you ⌘ + C to copy then ⌥ + ⌘ + V + +Hold the option key when in menus to see alternative options to what is presented. For example, clicking on a file in Finder and then clicking File in the menu bar shows you “Move to Trash” as an option. If you hold the option key after clicking File, you will see “Delete Immediately” (keyboard shortcut is ⌥+⌘+Delete. + +Use Shift+⌘+. to toggle showing Hidden Files (dotfiles) system-wide. + +Keyboard shortcuts for tiling windows: + +System Preferences -> Keyboard -> Shortcuts +Add a new App Shortcut +Type “Move Window to Left Side of Screen” and assign the shortcut (e.g. Shift + ⌘ + ←) +Type “Move Window to Right Side of Screen” and assign the shortcut (e.g. Shift + ⌘ + →) +Type “Zoom” and assign the shortcut (e,g. Shift + ⌘ + ↑)  + +Easy typing of MacOS symbols: + +System Preferences -> Keyboard -> Text +Add a new replacement +Type something like “cmdsym” under the “Replace” column and copy-paste or type the replacement symbol (e.g. ⌘) under the “With” column. + +Create a keyboard shortcut for launching any app: + +Open Automator +Create a new Quick Action +At the top, select “Accepts input from no sources” +Add a “Launch Application” action +Select the application +Save the Quick Action +Go to Keyboard Shortcut settings > Services, scroll down to General +Add your shortcut + +Useful Applications + +MailMate, $65.45 CAD (maybe free if through homebrew?) - An excellent email client configured for plain text email communication out of the box. Great smart mailbox support with a good UI. + +TinkerTool, FREE - For when you want the extra customization options, but don’t want to have to go to the command line to do them + +ImageOptim, FREE - GUI app to optimize images very easily + +BeagleIM, FREE - A pretty decent XMPP app which supports OMEMO + +IINA, FREE - A media player with a nicer interface and more MacOS integration than something like mpv + +CheatSheet, FREE - A simple app that shows you all the keyboard shortcuts you can type at any given moment, useful for learning what you can do with the keyboard + +My Customizations + +System Preferences + +* In General: Dark mode on (even though auto is good, prefer always dark), show scroll bars always, click in the scroll bar to jump to the spot that’s clicked, default web browser chromium +* In Dock & Menu Bar: size to ~1/4, automatically hide and show the dock +* In Clock: Use a 24-hour clock +* Spotlight: Uncheck “Show in Menu Bar” +* In Security & Privacy: Turn on Firewall, Under Privacy > Apple Advertising, turn off Personalized Ads +* In Keyboard: Use F-keys as standard function keys, under Shortcuts: Use keyboard navigation to move focus between controls +* In Mouse: Uncheck natural scrolling +* In Displays: Scale my 4K display to have as much space as 1080p +* In Sharing: Check Remote Login and Allow full disk access for remote users + +Other + +* Install homebrew to get eloston-chromium, keepassxc, mumble, mailmate, lagrange casks; hledger formula +* Install BeagleIM from App Store +* Download and install IBM Plex fonts (Mono, Serif, Sans) +* Download and install NetNewsWire (RSS Reader) +* Added keyboard shortcuts for tiling windows +* In Finder: Sidebar: Check all items, Advanced: Show all filename extensions, Keep folders on top in windows when sorting by name, Under View: Show path bar and status bar +* In Terminal: cursor: underline, when the shell exits close if the shell exited cleanly, disable audible bell, disable visual bell only when sound is muted + +## Notes + +The UI is, as expected, pretty clean and easy to work with + +Settings manager is familiar from DEs like cinnamon + +It is dead simple to connect the Apple bluetooth keyboard and mouse + +Also very easy to pair and add my MX Ergo, but took me a bit to realize I shouldn’t add it from the Mouse settings section, since that checks for Apple mice specifically, instead have to check the Bluetooth section + +Built in apps don’t feel like bloatware, if you have a use for them then they are all pretty useful without extraneous features or other annoyances, similar to stock apps shipped with Fedora Cinnamon + +It is definitely cool to have an iPhone at the same time and be able to do things like send messages from the Mac, easily sync files or do backups from the phone to the Mac, access files on the iPhone from the Mac and so on + +Printer was so easy to set up, exactly like Fedora where you just add it and all the functions work out of the box, no manual driver downloading or anything like that + +There is definitely a learning curve to getting used to some of the different keybindings, but this is fine for most things as it is a completely different OS (e.g. Home/End is opt+left/right) + +It’s still a unix-like system with a zsh shell so everything on the terminal is pretty much the exact same as on Linux with the main difference being some different locations for folders. (e.g. home directories for users are under /Users not /home). + +Homebrew is a perfectly fine package manager, used it to install vim, tmux, ungoogled-chromium, htop. No “sudo” required. + +RAM usage is very aggressive. I notice the system using many GB of RAM despite not much being open at the moment, however, this is likely caching + +Launching applications and searching the system with Spotlight Search is very good, can also search internet from there which is very nice for quickly jumping to a Wikipedia page for e.g. + +Because you get a free 5GB with iCloud, it’s easy to sync basic things like notes across the Mac and the iPhone. Can easily be replicated with NextCloud or something, but NextCloud is also quite an annoying application compared to iCloud which just runs in the background + +Very easy to opt out of analytics when you install and ability to opt out of targeted advertising (but kind of buried in settings menu, would prefer that to be an option right at the start). + +No ads in the OS…. Thanks Microsoft for making this a + + +A bit of a song-and-dance to launch ungoogled-chromium.app because Apple likes to scan unsigned apps for malware. From an inexperienced-user perspective, this might make sense, but it is also a pain the butt for the rest of us and potentially a privacy concern. (Song-and-dance: Open the App, go to Security and Privacy in Settings, General Tab, click the lock icon, click OK in the opened app dialog window, create an exception in the settings window) + +Syncing between iPhone and Mac via iCloud is very nice for notes, calendar, safari tabs and bookmarks, and any other data you’d like to share. Especially useful for the keychain where you have a built-in password manager shared with all your devices. + +As long as you’re not sharing a ton of photos/videos/large files through iCloud, 5GB goes a long way and upgrading to the next storage tiers is not expensive. + +Like automatic iCloud backups of things like Documents… makes it very hard to lose things by default unless you turn such syncing off and don’t set up Timeshift or something similar. + +Automatic switching between dark and light themes is _very_ good. Even the default desktop background changes and even third-party apps respect this preference. + +Honestly, Apple keyboard is not bad at all. Nice and crisp key feel even though there is short travel. Easily better than modern Thinkpad keyboards, maybe not as good as the T430 or Core 2 Duo-era MacBooks (which is one of the best I’ve used). Plus, of course you get the keys labeled with MacOS functions. Using it wirelessly is quite nice and bluetooth is safe enough as I am not targeted by nation state actors. + +## Apple App Evaluation + +Evaluating the various Apps. + +General + +I can very much see where GNOME got their App design language from. They appear to have tried to copy Apple in many respects, but fall short of an actually good user experience unlike Apple. In Apple apps, icons are used in place of text quite often, but have design language that makes sense and most functions are not hidden behind a hamburger menu (in fact, they rarely are). There is also ample room to grab windows with the mouse without accidentally clicking buttons in the window. Also, the menu bar for the apps being in the top is fine. It keeps that from being attached to every individual window giving each window just a tad more room with which to show its contents. Honestly not a bad design. + +Finder + +Decent files application. Tweaked the settings to show my home folder in the side bar as well as to open the home folder when finder is opened. I can see what Apple is doing trying to hide most of the filesystem away from general users and making them only aware of their Documents, Pictures, etc. Even though I disagree with that choice, I’m glad they make it easy for advanced users to show more. Also, it has tabs and split panes which Windows Explorer… still doesn’t have? + +Safari + +It’s a pretty decent web browser. It integrates with the Apple ecosystem very well, as expected, and has a basic level of tracker blocking built in, but Adblock extensions would have to be downloaded from the App Store. I downloaded ungoogled-chromium instead because I want uBlock Origin and the greatest website compatibility. + +Messages + +Mail + +I did not try to use mail because it doesn’t support + +Maps + +Photos + +Facetime + +Calendar + +Contacts + +Reminders + +Notes + +I quite like it. Basic notes that feel like I’m pretty much writing markdown (though you don’t edit Markdown) with a nice UI for organizing and sharing notes. Also very much like how it syncs with iCloud so I can see and edit these notes on my iPhone. + +Apple TV + +I don’t use it. I have no need for it. + +Music + +I don’t really have much to say about it. Apple Music is another subscription service that I don’t really care to pay for since I have my own collection. What is nice is that I can have my music on my PC and just import it into the app so I can play all the music from it and use its built-in database to sort by artist, album, do searching, etc. + +It is worth noting that if you do currently pay for Spotify though, Apple Music pays artists a lot more than Spotify does so it might actually be a better service to give your money to. Especially good if you already have an Apple device. + +[CHECK IF APPLE DEVICE NEEDED] + +Podcasts + +A pretty competent podcast app. Coming from AntennaPod on Android, this let me do the exact same things and I don’t have any complaints. I can add podcasts, download episodes, listen to a queue of episodes, favourite episodes and share them easily, and it even notifies me when a new episode of a podcast is released which I quite like and which AntennaPod didn’t do. + +News + +App Store + +It’s the App Store… nothing really much to say about it. You download apps and get updates through this. Anything downloaded here is very likely to work pretty much flawlessly with the rest of the system in terms of integrations, assuming it was actually programmed well. + +Settings + +All system settings are in one nice place (glares at Windows) which makes configuring your system relatively easy and straightforward. I haven’t encountered any situations yet where I’ve wished for more than the Settings app offers, and I quite like that it exposes some very basic administrative things such as clicking a checkbox to allow SSH access so one doesn’t have to edit the config file or start a service or something along those lines. + +Terminal + +I can see exactly where GNOME terminal got its, uh, “inspiration”. The default terminal is a perfectly good terminal with very clear settings. I don’t really see the need to install iTerm2 yet since this terminal serves all my needs. I configured it to run tmux on startup and also exit when tmux closes, I configured a basic colour scheme, but otherwise it’s a perfectly competent terminal app and there’s nothing I have to complain about. diff --git a/content/garden/plots/philosophy-software-development.gmi b/content/garden/plots/philosophy-software-development.gmi @@ -0,0 +1,17 @@ +# A Philosophy of Software Development + +Develop software that fits your needs or the needs of your community, not others. + +Do not take feature requests that don’t align with your intended vision, let those people fork and do the work to make the software fit their needs. + +Software should be simple and perform broadly one task well. We do not need massive kernels which handle absolutely everything about a system, browsers which have become app platforms, or messaging apps which have become social media. + +Software should be made on the human scale. It should be simple enough that a single human can hold all the code in their head and know exactly which parts do what. Failing that, it should be broken up into a base system with an API/ABI and a set of plugins/modules/extensions such that each part can be understood on its own, like a lamp can be understood independently of the electrical grid. + +This results in simpler software that is easier to maintain, learn, and develop. Simpler software means fewer security holes and fewer things that can break (minimize the “this is broken for no reason!” moments). This includes libraries. Libraries should be vendored if possible and binaries should be statically linked so each application or program is one complete object and there can't be any surprises from libraries being updated in the background or LD_PRELOAD. Always know all aspects of your programs, fewer issues will arise as a result of putting in this effort. + +Software and computers should be tools to accomplish specific tasks the same way hammers or saws are. They can be tools for entertainment, but only when they serve the needs of the user. + +When possible, design from the ground up. You can reuse existing code or make libraries out of the things you write, but don’t rely on abstractions to take care of absolutely everything for you (cough cough Python). Expose the inner workings of your programs to developers wherever possible. Keep the human in the loop. + +Computers should be built for specific purposes in mind and should not have general purpose kernels or OSes on them. This simplifies the operation of a device at the cost of development time, but ultimately the whole stack is understood and under your control. diff --git a/content/garden/plots/server-monitor.gmi b/content/garden/plots/server-monitor.gmi @@ -0,0 +1,8 @@ +# Server Monitoring Made Easy + +Make some kind of tool that collects metrics and can send alerts + +Possible architectures: + +* client/agent + server/controller +* individual processes with export and API diff --git a/templates/header.html b/templates/header.html @@ -16,7 +16,7 @@ <a href="/blog">Blog</a> <a href="/links">Links</a> <a href="/projects">Projects</a> - <a href="/garden-gate">Digital Garden</a> + <a href="/garden/">Digital Garden</a> <a href="/uses">Uses</a> <a href="/now">Now</a> </nav>