<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Secluded.Site</title>
    <link>https://secluded.site/posts/</link>
    <description>Recent content in Posts on Secluded.Site</description>
    <language>en-us</language>
    <lastBuildDate>Tue, 19 Sep 2023 14:27:00 -0400</lastBuildDate><atom:link href="https://secluded.site/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Crash Course to LXD</title>
      <link>https://secluded.site/crash-course-to-lxd/</link>
      <category>Sysadmin/Containers/VMs/Docker/LXD</category>>
      <pubDate>Tue, 19 Sep 2023 14:27:00 -0400</pubDate>
      <guid>https://secluded.site/crash-course-to-lxd/</guid>
      <description>&lt;p&gt;If you&amp;rsquo;re wondering &lt;em&gt;why&lt;/em&gt; I like system containers, see the previous post, &lt;em&gt;&lt;a href=&#34;https://secluded.site/lxd-containers-for-human-beings/&#34;&gt;LXD: Containers for
Human Beings.&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;h2 id=&#34;installation&#34;&gt;Installation&lt;/h2&gt;

    &lt;aside class=&#34;admonition note&#34;&gt;
        &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; the instructions below say to install LXD using &lt;a href=&#34;https://en.wikipedia.org/wiki/Snap_(software)&#34;&gt;Snap.&lt;/a&gt; I
personally dislike Snap, but LXD is a Canonical product and they&amp;rsquo;re doing their
best to promote it as much as possible. &lt;a href=&#34;https://github.com/lxc/incus&#34;&gt;Incus&lt;/a&gt; is a fork of LXD by the primary
creators and maintainers and one of the first things they did was &lt;a href=&#34;https://github.com/lxc/incus/compare/9579f65cd0f215ecd847e8c1cea2ebe96c56be4a...3f64077a80e028bb92b491d42037124e9734d4c7&#34;&gt;rip out Snap
support,&lt;/a&gt; so it will eventually be installable as a proper native
package.&lt;/p&gt;
    &lt;/aside&gt;

&lt;ol&gt;
&lt;li&gt;Install snap following &lt;a href=&#34;https://earl.run/ZvUK&#34;&gt;Canonical&amp;rsquo;s tutorial&lt;/a&gt;
&lt;ul&gt;
&lt;li&gt;LXD is natively packaged for Arch and Alpine, but configuration can be a
massive headache.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;sudo snap install lxd&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxd init&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Defaults are fine for the most part; you may want to increase the size of
the storage pool.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxc launch images:debian/12 container-name&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;lxc shell container-name&lt;/code&gt;&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;
&lt;p&gt;As an example of how to use LXD in a real situation, we&amp;rsquo;ll set up &lt;a href=&#34;https://earl.run/source&#34;&gt;my URL
shortener.&lt;/a&gt; You&amp;rsquo;ll need a VPS with LXD installed and a (sub)domain pointed
to the VPS.&lt;/p&gt;
&lt;p&gt;Run &lt;code&gt;lxc launch images:debian/12 earl&lt;/code&gt; followed by &lt;code&gt;lxc shell earl&lt;/code&gt; and &lt;code&gt;apt install curl&lt;/code&gt;. Also &lt;code&gt;apt install&lt;/code&gt; a text editor, like &lt;code&gt;vim&lt;/code&gt; or &lt;code&gt;nano&lt;/code&gt; depending
on what you&amp;rsquo;re comfortable with. Head to the &lt;strong&gt;Installation&lt;/strong&gt; section of &lt;a href=&#34;https://earl.run/source&#34;&gt;earl&amp;rsquo;s
SourceHut page&lt;/a&gt; and expand the &lt;strong&gt;List of latest binaries&lt;/strong&gt;. Copy the link
to the binary appropriate for your platform, head back to your terminal, type
&lt;code&gt;curl -LO&lt;/code&gt;, and paste the link you copied. This will download the binary to your
system. Run &lt;code&gt;mv &amp;lt;filename&amp;gt; earl&lt;/code&gt; to rename it, &lt;code&gt;chmod +x earl&lt;/code&gt; to make it
executable, then &lt;code&gt;./earl&lt;/code&gt; to execute it. It will create a file called
&lt;code&gt;config.yaml&lt;/code&gt; that you need to edit before proceeding. Change the &lt;code&gt;accessToken&lt;/code&gt;
to something else and replace the &lt;code&gt;listen&lt;/code&gt; value, &lt;code&gt;127.0.0.1&lt;/code&gt;, with &lt;code&gt;0.0.0.0&lt;/code&gt;.
This exposes the application to the host system so we can reverse proxy it.&lt;/p&gt;
&lt;p&gt;The next step is daemonising it so it runs as soon as the system boots. Edit the
file located at &lt;code&gt;/etc/systemd/system/earl.service&lt;/code&gt; and paste the following code
snippet into it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;personal link shortener&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;network.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Group=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;root&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WorkingDirectory=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/root/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStart=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/root/earl -c config.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WantedBy=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Save, then run &lt;code&gt;systemctl daemon-reload&lt;/code&gt; followed by &lt;code&gt;systemctl enable --now earl&lt;/code&gt;. You should be able to &lt;code&gt;curl localhost:8275&lt;/code&gt; and see some HTML.&lt;/p&gt;
&lt;p&gt;Now we need a reverse proxy on the host. Exit the container with &lt;code&gt;exit&lt;/code&gt; or
&lt;code&gt;Ctrl+D&lt;/code&gt;, and if you have a preferred webserver, install it. If you don&amp;rsquo;t have a
preferred webserver yet, I recommend &lt;a href=&#34;https://caddyserver.com/docs/install&#34;&gt;installing Caddy.&lt;/a&gt; All that&amp;rsquo;s left
is running &lt;code&gt;lxc list&lt;/code&gt;, making note of the &lt;code&gt;earl&lt;/code&gt; container&amp;rsquo;s &lt;code&gt;IPv4&lt;/code&gt; address, and
reverse proxying it. If you&amp;rsquo;re using Caddy, edit &lt;code&gt;/etc/caddy/Caddyfile&lt;/code&gt; and
replace everything that&amp;rsquo;s there with the following.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;(sub)domain&amp;gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	encode zstd gzip
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	reverse_proxy &amp;lt;container IP address&amp;gt;:1313
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run &lt;code&gt;systemctl restart caddy&lt;/code&gt; and head to whatever domain or subdomain you
entered. You should see the home page with just the text &lt;code&gt;earl&lt;/code&gt; on it. If you go
to &lt;code&gt;/login&lt;/code&gt;, you&amp;rsquo;ll be able to enter whatever access token you set earlier and
log in.&lt;/p&gt;
&lt;h2 id=&#34;further-tips&#34;&gt;Further tips&lt;/h2&gt;
&lt;p&gt;One of the things you might want to do post-installation is mess around with
profiles. There&amp;rsquo;s a &lt;code&gt;default&lt;/code&gt; profile in LXD that you can show with &lt;code&gt;lxc profile show default&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ lxc profile show default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;config: {}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;description: Default LXD profile
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;devices:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  eth0:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    name: eth0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    network: lxdbr0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    type: nic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  root:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    path: /
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    pool: default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    type: disk
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;name: default
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;used_by: []
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Not all config options are listed here though; you&amp;rsquo;ll need to read &lt;a href=&#34;https://documentation.ubuntu.com/lxd/en/latest/config-options/&#34;&gt;the
documentation&lt;/a&gt; for a full enumeration.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve seen some people say that executing a fork bomb from inside a container is
equivalent to executing it on the host. The fork bomb will blow up the whole
system and render every application and container you&amp;rsquo;re running inoperable.
That&amp;rsquo;s partially true because LXD &lt;em&gt;by default&lt;/em&gt; doesn&amp;rsquo;t put a limit on how many
processes a particular container can spawn. You can limit that number yourself
by running&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lxc profile set default limits.processes &amp;lt;num-processes&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Any container you create under the &lt;code&gt;default&lt;/code&gt; profile will have a total process
limit of &lt;code&gt;&amp;lt;num-processes&amp;gt;&lt;/code&gt;. I can&amp;rsquo;t tell you what a good process limit is
though; you&amp;rsquo;ll need to do some testing and experimentation on your own.&lt;/p&gt;
&lt;p&gt;As stated in &lt;a href=&#34;https://secluded.site/lxd-containers-for-human-beings/#containers&#34;&gt;the containers section&lt;/a&gt; of the previous post, this doesn&amp;rsquo;t
&lt;em&gt;save&lt;/em&gt; you from fork bombs. It just helps prevent a fork bomb from affecting the
host OS or other containers.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>LXD: Containers for Human Beings</title>
      <link>https://secluded.site/lxd-containers-for-human-beings/</link>
      <category>Sysadmin/Containers/VMs/Docker/LXD</category>>
      <pubDate>Tue, 19 Sep 2023 14:26:00 -0400</pubDate>
      <guid>https://secluded.site/lxd-containers-for-human-beings/</guid>
      <description>&lt;p&gt;This is a blog post version of a talk I presented at both Ubuntu Summit 2022 and
SouthEast LinuxFest 2023. The first was not recorded, but the second was and is
on &lt;a href=&#34;https://peertube.linuxrocks.online/w/hjiTPHVwGz4hy9n3cUL1mq?start=1m&#34;&gt;SELF&amp;rsquo;s PeerTube instance.&lt;/a&gt; I apologise for the terrible audio,
but there&amp;rsquo;s unfortunately nothing I can do about that. If you&amp;rsquo;re already
intimately familiar with the core concepts of VMs or containers, I would suggest
skipping those respective sections. If you&amp;rsquo;re vaguely familiar with either, I
would recommend reading them because I do go a little bit in-depth.&lt;/p&gt;

    &lt;aside class=&#34;admonition warn&#34;&gt;
        &lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; Canonical has decided to &lt;a href=&#34;https://linuxcontainers.org/lxd/&#34;&gt;pull LXD out&lt;/a&gt; from under the Linux
Containers entity and instead continue development under the Canonical brand.
The majority of the LXD creators and developers have congregated around a fork
called &lt;a href=&#34;https://linuxcontainers.org/incus/&#34;&gt;Incus.&lt;/a&gt; I&amp;rsquo;ll be keeping a close eye on the project and intend to
migrate as soon as there&amp;rsquo;s an installable release.&lt;/p&gt;
    &lt;/aside&gt;

&lt;p&gt;Questions, comments, and corrections are welcome! Feel free to use the
self-hosted comment system at the bottom, send me an email, an IM, reply to the
fediverse post, etc. Edits and corrections, if there are any, will be noted just
below this paragraph.&lt;/p&gt;
&lt;h2 id=&#34;the-benefits-of-vms-and-containers&#34;&gt;The benefits of VMs and containers&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Isolation:&lt;/strong&gt; you don&amp;rsquo;t want to allow an attacker to infiltrate your email
server through your web application; the two should be completely separate
from each other and VMs/containers provide strong isolation guarantees.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Flexibility:&lt;/strong&gt; &lt;abbr title=&#34;Virtual Machines&#34;&gt;VMs&lt;/abbr&gt; and containers only
use the resources they&amp;rsquo;ve been given. If you tell the VM it has 200 MBs of
RAM, it&amp;rsquo;s going to make do with 200 MBs of RAM and the kernel&amp;rsquo;s &lt;abbr
title=&#34;Out Of Memory&#34;&gt;OOM&lt;/abbr&gt; killer is going to have a fun time 🤠&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Portability:&lt;/strong&gt; once set up and configured, VMs and containers can mostly be
treated as closed boxes; as long as the surrounding environment of the new
host is similar to the previous in terms of communication (proxies, web
servers, etc.), they can just be picked up and dropped between various hosts
as necessary.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Density:&lt;/strong&gt; applications are usually much lighter than the systems they&amp;rsquo;re
running on, so it makes sense to run many applications on one system. VMs and
containers facilitate that without sacrificing security.&lt;/li&gt;
&lt;li&gt;&lt;strong&gt;Cleanliness:&lt;/strong&gt; VMs and containers are applications in black boxes. When
you&amp;rsquo;re done with the box, you can just throw it away and most everything
related to the application is gone.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;virtual-machines&#34;&gt;Virtual machines&lt;/h2&gt;
&lt;p&gt;As the name suggests, Virtual Machines are all virtual; a hypervisor creates
virtual disks for storage, virtual &lt;abbr title=&#34;Central Processing
Units&#34;&gt;CPUs&lt;/abbr&gt;, virtual &lt;abbr title=&#34;Network Interface Cards&#34;&gt;NICs&lt;/abbr&gt;,
virtual &lt;abbr title=&#34;Random Access Memory&#34;&gt;RAM&lt;/abbr&gt;, etc. On top of the
virtualised hardware, you have your kernel. This is what facilitates
communication between the operating system and the (virtual) hardware. Above
that is the operating system and all your applications.&lt;/p&gt;
&lt;p&gt;At this point, the stack is quite large; VMs aren&amp;rsquo;t exactly lightweight, and
this impacts how densely you can pack the host.&lt;/p&gt;
&lt;p&gt;I mentioned a &amp;ldquo;hypervisor&amp;rdquo; a minute ago. I&amp;rsquo;ve explained what hypervisors in
general do, but there are actually two different kinds of hypervisor. They&amp;rsquo;re
creatively named &lt;strong&gt;Type 1&lt;/strong&gt; and &lt;strong&gt;Type 2&lt;/strong&gt;.&lt;/p&gt;
&lt;h3 id=&#34;type-1-hypervisors&#34;&gt;Type 1 hypervisors&lt;/h3&gt;
&lt;p&gt;These run directly in the host kernel without an intermediary OS. A good example
would be &lt;a href=&#34;https://www.linux-kvm.org&#34;&gt;KVM,&lt;/a&gt; a &lt;strong&gt;VM&lt;/strong&gt; hypervisor than runs in the &lt;strong&gt;K&lt;/strong&gt;ernel. Type 1
hypervisors can communicate directly with the host&amp;rsquo;s hardware to allocate RAM,
issue instructions to the CPU, etc.&lt;/p&gt;

&lt;a href=&#34;../_7388217717913248998.svg&#34;&gt;
&lt;img alt=&#34;diagram&#34; class=&#34;diagram diagram-kroki diagram-kroki-d2&#34; d2sketch=&#34;true&#34; d2theme=&#34;flagship-terrastruct&#34; id=&#34;h-rh-cb-kroki-0&#34; src=&#34;../_7388217717913248998.svg&#34;&gt;
&lt;/a&gt;&lt;h3 id=&#34;type-2-hypervisors&#34;&gt;Type 2 hypervisors&lt;/h3&gt;
&lt;p&gt;These run in userspace as an application, like &lt;a href=&#34;https://www.virtualbox.org/&#34;&gt;VirtualBox.&lt;/a&gt; Type 2
hypervisors have to first go through the operating system, adding an additional
layer to the stack.&lt;/p&gt;

&lt;a href=&#34;../_2209384834123665035.svg&#34;&gt;
&lt;img alt=&#34;diagram&#34; class=&#34;diagram diagram-kroki diagram-kroki-d2&#34; d2sketch=&#34;true&#34; d2theme=&#34;flagship-terrastruct&#34; id=&#34;h-rh-cb-kroki-1&#34; src=&#34;../_2209384834123665035.svg&#34;&gt;
&lt;/a&gt;&lt;h2 id=&#34;containers&#34;&gt;Containers&lt;/h2&gt;
&lt;p&gt;VMs use virtualisation to achieve isolation. Containers use &lt;strong&gt;namespaces&lt;/strong&gt; and
&lt;strong&gt;cgroups&lt;/strong&gt;, technologies pioneered in the Linux kernel. By now, though, there
are &lt;a href=&#34;https://learn.microsoft.com/en-us/virtualization/community/team-blog/2017/20170127-introducing-the-host-compute-service-hcs&#34;&gt;equivalents for Windows&lt;/a&gt; and possibly other platforms.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Linux_namespaces&#34;&gt;Linux namespaces&lt;/a&gt;&lt;/strong&gt; partition kernel resources like process IDs, hostnames,
user IDs, directory hierarchies, network access, etc. This prevents one
collection of processes from seeing or gaining access to data regarding another
collection of processes.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Cgroups&#34;&gt;Cgroups&lt;/a&gt;&lt;/strong&gt; limit, track, and isolate the hardware resource use of a
collection of processes. If you tell a cgroup that it&amp;rsquo;s only allowed to spawn
500 child processes and someone executes a fork bomb, the fork bomb will expand
until it hits that limit. The kernel will prevent it from spawning further
children and you&amp;rsquo;ll have to resolve the issue the same way you would with VMs:
delete and re-create it, restore from a good backup, etc. You can also limit CPU
use, the number of CPU cores it can access, RAM, disk use, and so on.&lt;/p&gt;
&lt;h3 id=&#34;application-containers&#34;&gt;Application containers&lt;/h3&gt;
&lt;p&gt;The most well-known example of application container tech is probably
&lt;a href=&#34;https://docker.com/&#34;&gt;Docker.&lt;/a&gt; The goal here is to run a single application as minimally as
possible inside each container. In the case of a single, statically-linked Go
binary, a minimal Docker container might contain nothing more than the binary.
If it&amp;rsquo;s a Python application, you&amp;rsquo;re more likely to use an &lt;a href=&#34;https://hub.docker.com/_/alpine&#34;&gt;Alpine Linux image&lt;/a&gt;
and add your Python dependencies on top of that. If a database is required, that
goes in a separate container. If you&amp;rsquo;ve got a web server to handle TLS
termination and proxy your application, that&amp;rsquo;s a third container. One cohesive
system might require many Docker containers to function as intended.&lt;/p&gt;

&lt;a href=&#34;../_833916185766522767.svg&#34;&gt;
&lt;img alt=&#34;diagram&#34; class=&#34;diagram diagram-kroki diagram-kroki-d2&#34; d2sketch=&#34;true&#34; d2theme=&#34;flagship-terrastruct&#34; id=&#34;h-rh-cb-kroki-2&#34; src=&#34;../_833916185766522767.svg&#34;&gt;
&lt;/a&gt;&lt;h3 id=&#34;system-containers&#34;&gt;System containers&lt;/h3&gt;
&lt;p&gt;One of the most well-known examples of system container tech is the subject of
this post: LXD! Rather than containing a single application or a very small set
of them, system containers are designed to house entire operating systems, like
&lt;a href=&#34;https://debian.org&#34;&gt;Debian&lt;/a&gt; or &lt;a href=&#34;https://rockylinux.org/&#34;&gt;Rocky Linux,&lt;/a&gt; along with everything required for your
application. Using our examples from above, a single statically-linked Go binary
might run in a full Debian container, just like the Python application might.
The database and webserver might go in &lt;em&gt;that same&lt;/em&gt; container.&lt;/p&gt;
&lt;p&gt;You treat each container more like you would a VM, but you get the performance
benefit of &lt;em&gt;not&lt;/em&gt; virtualising everything. Containers tend to be &lt;em&gt;much&lt;/em&gt; lighter
than most VMs.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;

&lt;a href=&#34;../_14572971905269235217.svg&#34;&gt;
&lt;img alt=&#34;diagram&#34; class=&#34;diagram diagram-kroki diagram-kroki-d2&#34; d2sketch=&#34;true&#34; d2theme=&#34;flagship-terrastruct&#34; id=&#34;h-rh-cb-kroki-3&#34; src=&#34;../_14572971905269235217.svg&#34;&gt;
&lt;/a&gt;&lt;h2 id=&#34;when-to-use-which&#34;&gt;When to use which&lt;/h2&gt;
&lt;p&gt;These are personal opinions. Please evaluate each technology and determine for
yourself whether it&amp;rsquo;s a suitable fit for your environment.&lt;/p&gt;
&lt;h3 id=&#34;vms&#34;&gt;VMs&lt;/h3&gt;
&lt;p&gt;As far as I&amp;rsquo;m aware, VMs are your only option when you want to work with
esoteric hardware or hardware you don&amp;rsquo;t physically have on-hand. You can tell
your VM that it&amp;rsquo;s running with RAM that&amp;rsquo;s 20 years old, a still-in-development
RISC-V CPU, and a 420p monitor. That&amp;rsquo;s not possible with containers. VMs are
also your only option when you want to work with foreign operating systems:
running Linux on Windows, Windows on Linux, or OpenBSD on a Mac all require
virtualisation. Another reason to stick with VMs is for compliance purposes.
Containers are still very new and some regulatory bodies require virtualisation
because it&amp;rsquo;s a decades-old and battle-tested isolation technique.&lt;/p&gt;

    &lt;aside class=&#34;admonition note&#34;&gt;
        &lt;p&gt;See Drew DeVault&amp;rsquo;s blog post &lt;a href=&#34;https://drewdevault.com/2022/09/02/2022-09-02-In-praise-of-qemu.html&#34;&gt;&lt;em&gt;In praise of qemu&lt;/em&gt;&lt;/a&gt; for a great use of VMs&lt;/p&gt;
    &lt;/aside&gt;

&lt;h3 id=&#34;application-containers-1&#34;&gt;Application containers&lt;/h3&gt;
&lt;p&gt;Application containers are particularly popular for &lt;a href=&#34;https://en.wikipedia.org/wiki/Microservices&#34;&gt;microservices&lt;/a&gt; and
&lt;a href=&#34;https://en.wikipedia.org/wiki/Reproducible_builds&#34;&gt;reproducible builds,&lt;/a&gt; though I personally think &lt;a href=&#34;https://nixos.org/&#34;&gt;NixOS&lt;/a&gt; is a better fit
for the latter. App containers are also your only option if you want to use
cloud platforms with extreme scaling capabilities like Google Cloud&amp;rsquo;s App Engine
standard environment or AWS&amp;rsquo;s Fargate.&lt;/p&gt;
&lt;p&gt;Application containers also tend to be necessary when the application you want
to self-host is &lt;em&gt;only&lt;/em&gt; distributed as a Docker image and the maintainers
adamantly refuse to support any other deployment method. This is a &lt;em&gt;massive&lt;/em&gt; pet
peeve of mine; yes, Docker can make running self-hosted applications easier for
inexperienced individuals,&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; but an application orchestration system &lt;em&gt;does
not&lt;/em&gt; fit in every single environment. By refusing to provide proper &amp;ldquo;manual&amp;rdquo;
deployment instructions, maintainers of these projects alienate an entire class
of potential users and it pisses me off.&lt;/p&gt;
&lt;p&gt;Just document your shit.&lt;/p&gt;
&lt;h3 id=&#34;system-containers-1&#34;&gt;System containers&lt;/h3&gt;
&lt;p&gt;Personally, I prefer the workflow of system containers and use them for
everything else. Because they contain entire operating systems, you&amp;rsquo;re able to
interact with it in a similar way to VMs or even your PC; you shell into it,
&lt;code&gt;apt install&lt;/code&gt; whatever you need, set up the application, expose it over the
network (for example, on &lt;code&gt;0.0.0.0:8080&lt;/code&gt;), proxy it on the container host, and
that&amp;rsquo;s it! This process can be trivially automated with shell scripts, Ansible
roles, Chef, Puppet, whatever you like. Back the system up using &lt;a href=&#34;https://www.tarsnap.com/&#34;&gt;tarsnap&lt;/a&gt; or
&lt;a href=&#34;https://rsync.net/&#34;&gt;rsync.net&lt;/a&gt; or &lt;a href=&#34;https://www.backblaze.com/&#34;&gt;Backblaze,&lt;/a&gt; Google Drive, and &lt;a href=&#34;https://restic.net/&#34;&gt;restic.&lt;/a&gt; If you use
ZFS for your LXD storage pool, maybe go with &lt;a href=&#34;https://github.com/jimsalterjrs/sanoid&#34;&gt;syncoid and sanoid.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;My point is that using system containers doesn&amp;rsquo;t mean throwing out the last few
decades of systems knowledge and wisdom.&lt;/p&gt;
&lt;p&gt;I wrote &lt;a href=&#34;https://secluded.site/crash-course-to-lxd/&#34;&gt;a follow-up post&lt;/a&gt; with a crash course to actually using LXD in the real
world along with a few configuration tips.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;There&amp;rsquo;s a &lt;a href=&#34;https://dl.acm.org/doi/10.1145/3132747.3132763&#34;&gt;technical
publication&lt;/a&gt; indicating that
specialised VMs with unikernels can be far lighter and more secure than
containers.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Until they need to do &lt;em&gt;anything&lt;/em&gt; more complex than pull a newer image. Then
it&amp;rsquo;s twice as painful as the &amp;ldquo;manual&amp;rdquo; method might have been.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>I co-host some podcasts</title>
      <link>https://secluded.site/i-co-host-some-podcasts/</link>
      <pubDate>Fri, 11 Aug 2023 11:15:44 -0700</pubDate>
      <guid>https://secluded.site/i-co-host-some-podcasts/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been co-hosting &lt;a href=&#34;https://linuxlads.com&#34;&gt;Linux Lads&lt;/a&gt; for a couple years and recently started
co-hosting &lt;a href=&#34;https://linuxdowntime.com&#34;&gt;Linux Downtime.&lt;/a&gt; I mention them on the home page of this site,
but didn&amp;rsquo;t consider that there are potentially many people subscribed to my RSS
feed(s) that never actually look at my home page ^^&#39;&lt;/p&gt;
&lt;p&gt;A couple of weeks ago, someone suggested I write an announcement so RSS
subscribers can see it. This is that announcement: I co-host some podcasts!&lt;/p&gt;
&lt;p&gt;Here are a couple episodes from each that I recommend:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Linux Lads
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;ll108&#34;&gt;Hare under the Willow&lt;/a&gt; — Mike and I talk about my project,
&lt;a href=&#34;https://wiki.secluded.site/hypha/willow&#34;&gt;Willow,&lt;/a&gt; and a new programming language called &lt;a href=&#34;https://harelang.org&#34;&gt;Hare&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxlads.com/episodes/102&#34;&gt;Interview with Chris from the Gio Project&lt;/a&gt; — Chris Waldon from &lt;a href=&#34;https://gioui.org&#34;&gt;the
Gio project&lt;/a&gt; talks about Gio, what makes it unique, and why it&amp;rsquo;s so awesome&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Linux Downtime
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxdowntime.com/linux-downtime-episode-77&#34;&gt;Episode 77&lt;/a&gt; — we discuss how CLAs could actually &lt;em&gt;help&lt;/em&gt; open source
projects and how &lt;em&gt;not&lt;/em&gt; having a CLA has caused serious issues for
&lt;a href=&#34;https://pidgin.im&#34;&gt;Pidgin&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxdowntime.com/linux-downtime-episode-71&#34;&gt;Episode 71&lt;/a&gt; — we talk with &lt;a href=&#34;https://mollywhite.net&#34;&gt;Molly White&lt;/a&gt; from &lt;a href=&#34;https://web3isgoinggreat.com&#34;&gt;Web3 is Going Just
Great&lt;/a&gt; about the issues with cryptocurrencies, Bitcoin, the Lightning
network, blockchain, NFTs, &amp;ldquo;web3&amp;rdquo;, etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Linux Downtime is part of the &lt;a href=&#34;https://latenightlinux.com&#34;&gt;Late Night Linux&lt;/a&gt; family and the free feed &lt;em&gt;is&lt;/em&gt;
ad-supported. If you want to listen, but don&amp;rsquo;t like ads, you can subscribe to
&lt;a href=&#34;https://www.patreon.com/LateNightLinux&#34;&gt;the LNL Patreon.&lt;/a&gt; Linux Downtime can be had on its own for $5/mo or you
can get &lt;em&gt;all&lt;/em&gt; the LNL podcasts ad-free for just $10/mo. That includes…&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://latenightlinux.com/&#34;&gt;Late Night Linux&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxmatters.sh/&#34;&gt;Linux Matters&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://2.5admins.com/&#34;&gt;2.5 Admins&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxafterdark.net/&#34;&gt;Linux After Dark&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://linuxdowntime.com/&#34;&gt;Linux Downtime&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://askthehosts.com/&#34;&gt;Ask The Hosts&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>You must follow my RSS feed :)</title>
      <link>https://secluded.site/you-must-follow-my-rss-feed/</link>
      <category>RSSOnly</category>>
      <pubDate>Sun, 21 May 2023 01:59:31 -0400</pubDate>
      <guid>https://secluded.site/you-must-follow-my-rss-feed/</guid>
      <description>&lt;p&gt;Hello! o/&lt;/p&gt;
&lt;p&gt;You must follow my RSS feed :)&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;ve decided to start publicising some posts exclusively over RSS because I
quite like &lt;a href=&#34;https://daverupert.com/2018/01/welcome-to-rss-club/&#34;&gt;the idea.&lt;/a&gt; Taking a page out of the creator&amp;rsquo;s book,&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;em&gt;It’s my pledge to use this secret communication channel to share a little
more deeply. Maybe it’s something personal, maybe it’s something in progress,
maybe it’s a soft launch. Monthly’ish Easter eggs for those of us who still
use RSS readers.&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;Though this new communication channel is &amp;ldquo;secret&amp;rdquo;, these posts will still be
available on the public website. They simply won&amp;rsquo;t be linked to on &lt;a href=&#34;../posts&#34;&gt;the posts
page.&lt;/a&gt; I have some good ideas for less formal writing to put here, but
we&amp;rsquo;ll see how long I can keep monthly-ish posts going.&lt;/p&gt;
&lt;p&gt;Until next time \o&lt;br&gt;
&lt;em&gt;— Amolith&lt;/em&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pull vs push: intentional notifications</title>
      <link>https://secluded.site/pull-vs-push-intentional-notifications/</link>
      <category>Health/Internet/Mindfulness/Productivity/Web</category>>
      <pubDate>Mon, 20 Mar 2023 12:15:00 -0400</pubDate>
      <guid>https://secluded.site/pull-vs-push-intentional-notifications/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently noticed that many of my peers are sometimes overwhelmed by the
internet; they feel as if they&amp;rsquo;re stretched too thin and that their attention is
constantly shifting between too many different platforms. I think a &lt;em&gt;portion&lt;/em&gt; of
that feeling comes from systems that bombard them with push notifications. In
games, this introduces a sense of urgency because you want make the most of your
time and use your &amp;ldquo;lives&amp;rdquo; or &amp;ldquo;energy&amp;rdquo; or whatever efficiently. With social
media, these reminders tend to incite a fear of missing out (FOMO), making you
feel like you need to open the app to connect with friends and avoid missing
out. With news apps, the notifications are usually click-bait headlines
specifically selected to make you open the app so you can see what&amp;rsquo;s going on.&lt;/p&gt;
&lt;p&gt;But most of that isn&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; necessary. If something on social media is
genuinely that urgent, it should be a call or an instant message. Social media
can be checked at the end of the day. The same goes for news; if a headline is
really that important, it&amp;rsquo;ll still be there in a couple hours. If a game needs
to remind its players that it exists, it&amp;rsquo;s probably not particularly fun or
memorable.&lt;/p&gt;
&lt;p&gt;On Android, when users first open an app, they&amp;rsquo;re often asked to give that app
permission to send notifications. They hit &lt;code&gt;Allow&lt;/code&gt; without thinking because they
just want to use the app, exactly like what happens when asked to agree to a
privacy policy and terms of service. Most of these apps would be able to fill
their purpose just as well &lt;em&gt;without&lt;/em&gt; sending notifications, but we&amp;rsquo;re more
concerned with &lt;em&gt;using&lt;/em&gt; the app so we just don&amp;rsquo;t think about it.&lt;/p&gt;
&lt;p&gt;On their phones, my peers usually have a list of notifications a mile long, full
of new emails and YouTube videos and Slack messages and &amp;ldquo;your lives are
restored!&amp;rdquo; messages from mobile games and so much more. I think reducing that
barrage — on all systems, not just phones — is a great way to start building a
healthier relationship with technology.&lt;/p&gt;
&lt;h2 id=&#34;pushed-based&#34;&gt;Pushed-based&lt;/h2&gt;
&lt;p&gt;Modern internet services heavily rely on push-based systems. YouTubers used to
say &amp;ldquo;smash like and subscribe!&amp;rdquo; at the end of videos because they wanted you to
get a &lt;em&gt;push&lt;/em&gt; notification when they publish a new video. When YouTube stopped
sending notifications for subscriptions and added the bell, YouTubers started
saying &amp;ldquo;smash like, subscribe, and hit that bell!&amp;rdquo; instead. Free Android games
often ask for permission to send notifications because they want to periodically
remind you that &amp;ldquo;hey!! you downloaded me! don&amp;rsquo;t forget about me! come play me,
run out of energy, get annoyed, then buy some extra energy with your hard-earned
money! also, pay a bit more and remove the ads while you&amp;rsquo;re at it! 😃&amp;rdquo;&lt;/p&gt;
&lt;p&gt;E-commerce platforms often ask you to subscribe to their newsletter in exchange
for a small discount on your next purchase because they want to &lt;em&gt;push&lt;/em&gt; their
marketing to your inbox. Some news websites serve massive popups asking you to
subscribe to their newsletters so they can, again, &lt;em&gt;push&lt;/em&gt; their new content in
front of your face. In some cases, this tactic may be perfectly benign; there
are some individuals and companies with newsletters that might be genuinely
interesting and they just want to let you know that the newsletter exists in
case you want to subscribe. But they still result in content being &lt;em&gt;pushed&lt;/em&gt; in
front of their subscriber&amp;rsquo;s faces.&lt;/p&gt;
&lt;p&gt;Similarly, instant messaging is all about push notifications. It&amp;rsquo;s in the name:
&lt;em&gt;instant&lt;/em&gt;. When someone sends you a message, you usually want to know
immediately; maybe it&amp;rsquo;s a family emergency, maybe your food delivery person just
arrived, maybe the sky is falling, etc. Those are all situations where you
genuinely do want notifications pushed in front of your face. But think about
while you&amp;rsquo;re at work. Do you really need to know that there&amp;rsquo;s no more coffee in
the lounge when you&amp;rsquo;re waist-deep in a big code refactor and having to mentally
juggle variables and signatures and business logic and overarching structu— &lt;em&gt;look
at this funny meme!&lt;/em&gt;&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Ah shit. Where was &lt;code&gt;x&lt;/code&gt; set again? &lt;strong&gt;Does&lt;/strong&gt; this function duplicate the logic of
that other function 83 lines above?&lt;/em&gt; You&amp;rsquo;ve lost your train of thought and it&amp;rsquo;s
going to take you about 30 minutes to get it back.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Maybe you&amp;rsquo;re spending time with your family, but that new hire keeps asking for
help with this snippet of code they can&amp;rsquo;t figure out. You genuinely want to help
them, but time with family is incredibly valuable. It can wait until tomorrow.&lt;/p&gt;
&lt;p&gt;There&amp;rsquo;s a time and place for push notifications. Intentionally setting
boundaries and being thoughtful with your time is important.&lt;/p&gt;
&lt;h2 id=&#34;pull-based&#34;&gt;Pull-based&lt;/h2&gt;
&lt;p&gt;With a push-based system, you receive notifications on others&amp;rsquo; schedules, which
might not line up well with your own. In a pull-based system, you receive
&amp;ldquo;notifications&amp;rdquo; on &lt;em&gt;your&lt;/em&gt; schedule. You see what happened on social media when
you log in, you receive emails when you explicitly fetch them, you see chat
messages when you open the app, and so on. This allows you to decide when you&amp;rsquo;re
ready to interact with that system, whether &amp;ldquo;ready&amp;rdquo; is every ten minutes, once
you&amp;rsquo;re in the office, or during breakfast.&lt;/p&gt;
&lt;h2 id=&#34;some-suggestions&#34;&gt;Some suggestions&lt;/h2&gt;
&lt;p&gt;Make heavy and extensive use of Do Not Disturb rules on as many platforms as
possible. On mobile devices, it&amp;rsquo;s often possible to automatically enable DND
during calendar events as well as enable it while you sleep. Mark yourself as
unavailable in Slack (or Teams or XMPP or ____) outside of work hours. On
Android, you can sometimes long-press notifications you don&amp;rsquo;t want to see and
completely disable that category; this allows you to continue receiving push
notifications from other categories but silences the one(s) you don&amp;rsquo;t need.
Disable push notifications for YouTube, Twitter, Reddit, etc. Maybe consider
using alternative clients for those services that are more user-respecting in
general.&lt;/p&gt;
&lt;p&gt;Religiously unsubscribe from everything that clutters your inbox. If you don&amp;rsquo;t
actively want to see it, unsubscribe from it or write a rule that marks it as
read and immediately shoves it in, for example, a Marketing folder. Inboxes are
for pertinent, important information; the latest shoe sale at your preferred
big-box store is neither.&lt;/p&gt;
&lt;p&gt;Get a &lt;a href=&#34;https://wikipedia.org/wiki/News_aggregator&#34;&gt;feed reader!&lt;/a&gt; Please!&lt;/p&gt;
&lt;p&gt;They allow you to subscribe to multiple sources of information — like news
websites, YouTube channels, blogs, etc. — and aggregate that content into one
place. You can read what you want when you want without having anything thrust
in your face. Depending on which feed reader you select, you can also sort
sources into categories or folders that allow you to focus on one thing at a
time, rather than being treated to a firehose of the internet.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re looking for a service, check out &lt;a href=&#34;https://feedbin.com&#34;&gt;Feedbin,&lt;/a&gt; &lt;a href=&#34;https://newsblur.com&#34;&gt;NewsBlur,&lt;/a&gt;
&lt;a href=&#34;https://feeder.co&#34;&gt;Feeder,&lt;/a&gt; &lt;a href=&#34;https://feedly.com&#34;&gt;Feedly,&lt;/a&gt; and &lt;a href=&#34;https://www.inoreader.com&#34;&gt;Inoreader.&lt;/a&gt; Changelog, a
developer-focused podcast, &lt;a href=&#34;https://changelog.com/podcast/240&#34;&gt;interviewed the creator of Feedbin&lt;/a&gt; and I quite
enjoyed the episode. Be thoughtful when enabling push notifications in readers
that support it.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://vore.website&#34;&gt;vore&lt;/a&gt; is another one to look at, but it may be rather off-putting for some. It
has a questionable name, but it&amp;rsquo;s cute, &lt;em&gt;extremely&lt;/em&gt; simple, minimal, and, in my
opinion, quite pleasant.&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re into self-hosting, I highly recommend &lt;a href=&#34;https://github.com/nkanaev/yarr/&#34;&gt;yarr.&lt;/a&gt; At the time of
writing, I&amp;rsquo;ve been using yarr for 6 months and don&amp;rsquo;t see myself switching any
time soon. I only wish it had a maximum content width so reading was more
pleasant on wide screens and that &lt;a href=&#34;https://github.com/nkanaev/yarr/issues/46#issuecomment-798896310&#34;&gt;the theme would switch based on your system
theme.&lt;/a&gt; Also worth a look are &lt;a href=&#34;https://miniflux.app&#34;&gt;miniflux&lt;/a&gt; and &lt;a href=&#34;https://tt-rss.org&#34;&gt;Tiny Tiny RSS.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;There are also desktop feed readers. These do come with a disadvantage though;
some extremely active feeds, such as Slashdot, only retain the most recent
entries. If you open your desktop feed reader once a day, you might end up
missing some entries. Most blogs preserve entries for a &lt;em&gt;lot&lt;/em&gt; longer, though. It
depends on what feeds you&amp;rsquo;re interested in. If you want to go with a desktop
reader, consider &lt;a href=&#34;https://gfeeds.gabmus.org/&#34;&gt;GNOME Feeds&lt;/a&gt; (Linux, GNOME), &lt;a href=&#34;https://apps.kde.org/akregator/&#34;&gt;Akregator&lt;/a&gt; (Linux, KDE),
&lt;a href=&#34;https://newsboat.org/&#34;&gt;Newsboat&lt;/a&gt; (Linux, TUI), and possibly &lt;a href=&#34;https://github.com/martinrotter/rssguard&#34;&gt;RSS Guard&lt;/a&gt; (All). I&amp;rsquo;ve only named a few
options; there are many more across all platforms.&lt;/p&gt;
&lt;p&gt;If you do adopt a feed reader, whichever it is, I strongly recommend migrating
your &lt;em&gt;important&lt;/em&gt; newsletter subscriptions to &lt;a href=&#34;https://kill-the-newsletter.com&#34;&gt;&lt;em&gt;Kill the Newsletter!&lt;/em&gt;&lt;/a&gt; This
free service generates an email address, you subscribe to the newsletter with
that email address, and it appends each email to a unique feed generated just
for you. At the time of writing, I receive 7 newsletters as feeds and it&amp;rsquo;s a
wonderful experience.&lt;/p&gt;
&lt;h2 id=&#34;in-a-nutshell&#34;&gt;In a nutshell&lt;/h2&gt;
&lt;p&gt;Be thoughtful and intentional with your time and attention; they&amp;rsquo;re incredibly
valuable, both to you, to other people, and to companies.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I&amp;rsquo;ve seen and heard 30 minutes cited many times from sources I remember
trusting, but I can&amp;rsquo;t remember exactly which sources they were. After a
quick search, The Muse says &lt;a href=&#34;https://www.themuse.com/advice/this-is-nuts-it-takes-nearly-30-minutes-to-refocus-after-you-get-distracted&#34;&gt;&lt;em&gt;It Takes Nearly 30 Minutes to Refocus After
You Get
Distracted.&lt;/em&gt;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Privacy-respecting analytics</title>
      <link>https://secluded.site/privacy-respecting-analytics/</link>
      <category>Privacy/Web</category>>
      <pubDate>Mon, 06 Mar 2023 12:23:00 -0500</pubDate>
      <guid>https://secluded.site/privacy-respecting-analytics/</guid>
      <description>&lt;p&gt;For a long time, I was so vehemently opposed to analytics on personal websites
that I condemned people using privacy-respecting systems like &lt;a href=&#34;https://plausible.io/&#34;&gt;Plausible&lt;/a&gt; on
their blog, shouting about mUh PrIvAcY and saying that these platforms only
boosted the bloggers&amp;rsquo; ego and they would end up writing for their readers rather
than personal enjoyment. I&amp;rsquo;m realising that I was kinda dumb 🤔&lt;/p&gt;
&lt;p&gt;One of my clients recently asked me to add analytics to the website I created
for them. I said yes and asked whether they had a preference as to which
analytics system. They said no, they just wanted to see how many people were
using the website and whether they were actually looking at the menu and store
pages. I decided to set them up with &lt;a href=&#34;https://umami.is/&#34;&gt;Umami&lt;/a&gt; because it has a very simple UI,
it&amp;rsquo;s not affiliated with Big Tech™ companies, &lt;a href=&#34;umami-gdpr&#34;&gt;it&amp;rsquo;s GDPR-compliant,&lt;/a&gt;
and the script is only 2 KBs.&lt;/p&gt;
&lt;p&gt;Analytics on a business&amp;rsquo;s website is a no-brainer. Business websites should be
pleasant, ergonomic, and useful for their customers and analytics do assist with
that goal. But what about on personal websites? The big reason Google Analytics
is so often condemned is because of Google; you bet your ass they&amp;rsquo;re aggregating
all the data they harvest from their collective properties and associating that
information with your visitors&amp;rsquo; profiles (yes, even if they don&amp;rsquo;t have a Google
account) to improve their advertising engine. Facebook, Reddit, Twitter, etc. do
exactly the same thing with all of their like/share buttons. They&amp;rsquo;re ingesting
as much data as they can to feed their ad systems and I don&amp;rsquo;t want to further
their mass surveillance of the internet.&lt;/p&gt;
&lt;p&gt;The privacy issues with analytics primarily apply to the big providers that
aggregate everything across their customers&amp;rsquo; properties in order to surveil as
many people as possible. Systems like Umami are different. The minimal data
that&amp;rsquo;s collected is anonymised and stays in-house, on your (preferrably)
self-hosted server. When you really give it some thought, there&amp;rsquo;s nothing
inherently wrong with knowing how many visitors your site has, what pages
they&amp;rsquo;re viewing, and what website they came from.&lt;/p&gt;
&lt;p&gt;I enabled Umami on my website shortly after coming to this realisation and &lt;a href=&#34;https://umami.secluded.site/share/7PNXq2e8/Secluded.Site&#34;&gt;made
the analytics page public.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;The referrers section is fascinating when you bump the period from &amp;ldquo;Today&amp;rdquo; to
&amp;ldquo;All time&amp;rdquo;. There are some unusual search engines, a couple onion addresses,
another of my own websites &lt;a href=&#34;https://scratchanitch.dev/&#34;&gt;(scratchanitch.dev)&lt;/a&gt;, and even some personal
ones. After seeing other individuals link to my website, I had the idea to use
GitHub&amp;rsquo;s &lt;a href=&#34;https://github.com/features/code-search/&#34;&gt;Code Search&lt;/a&gt; feature to poke around and see &lt;a href=&#34;https://github.com/search?q=%22secluded.site%22&amp;amp;type=code&#34;&gt;where else it was
mentioned.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;A suprising number of people seem to be referencing my &lt;em&gt;&lt;a href=&#34;https://secluded.site/vim-as-a-markdown-editor/&#34;&gt;Vim as a Markdown
Editor&lt;/a&gt;&lt;/em&gt; post. I haven&amp;rsquo;t thought about that post since I wrote it, much
less updated it. Taking a look at Umami indicates that it&amp;rsquo;s by far my most
popular one. Maybe I should have another look at it and see if there&amp;rsquo;s anything
that needs to be improved &amp;hellip;&lt;/p&gt;
&lt;p&gt;Knowing that there are people visiting my site and that some of the things I&amp;rsquo;ve
written are useful is, frankly, quite encouraging. That&amp;rsquo;s why I&amp;rsquo;m writing this
post. That&amp;rsquo;s part of what inspired my next one and it&amp;rsquo;s why I intend to start
writing more. I do enjoy writing, but the idea of tossing something I&amp;rsquo;ve spent
hours on into the void of the internet isn&amp;rsquo;t exactly motivating.&lt;/p&gt;
&lt;p&gt;As long as it isn&amp;rsquo;t causing problems, I don&amp;rsquo;t believe &amp;ldquo;boosting the blogger&amp;rsquo;s
ego&amp;rdquo; is inherently bad. Encouragement can be quite good 🙂&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>(Ab)using mesh networks for easy remote support</title>
      <link>https://secluded.site/abusing-mesh-networks-for-easy-remote-support/</link>
      <category>Mesh networking/Open source/Remote support</category>>
      <pubDate>Mon, 01 Nov 2021 02:51:00 -0400</pubDate>
      <guid>https://secluded.site/abusing-mesh-networks-for-easy-remote-support/</guid>
      <description>&lt;p&gt;One of the things many of us struggle with when setting friends and
family up with Linux is remote support. Commercial solutions like
&lt;a href=&#34;https://www.realvnc.com/&#34;&gt;RealVNC&lt;/a&gt; and &lt;a href=&#34;https://rustdesk.com/&#34;&gt;RustDesk&lt;/a&gt; do exist and function very well, but are often more
expensive than we would like for answering the odd &amp;ldquo;I can&amp;rsquo;t get Facebook
open!&amp;rdquo; support call. I&amp;rsquo;ve been on the lookout for suitable alternatives
for a couple years but nothing has been satisfying. Because of this, I
have held off on setting others up with any Linux distribution, even the
particularly user-friendly options such as &lt;a href=&#34;https://linuxmint.com/&#34;&gt;Linux Mint&lt;/a&gt; and &lt;a href=&#34;https://elementary.io/&#34;&gt;elementary OS;&lt;/a&gt;
if I&amp;rsquo;m going drop someone in an unfamiliar environment, I want to be
able to help with any issue within a couple hours, not days and
&lt;em&gt;certainly&lt;/em&gt; not weeks.&lt;/p&gt;
&lt;p&gt;&lt;a href=&#34;https://linuxunplugged.com/421&#34;&gt;Episode 421 of LINUX Unplugged&lt;/a&gt; gave me an awesome idea to use &lt;a href=&#34;https://github.com/slackhq/nebula&#34;&gt;Nebula,&lt;/a&gt; a
networking tool created by Slack, &lt;a href=&#34;https://libvnc.github.io/&#34;&gt;X11vnc,&lt;/a&gt; a very minimal VNC server, and
&lt;a href=&#34;https://remmina.org/&#34;&gt;Remmina,&lt;/a&gt; a libre remote access tool available in pretty much every Linux
distribution, to set up a scalable, secure, and simple setup reminiscent
of products like RealVNC.&lt;/p&gt;
&lt;h2 id=&#34;nebula&#34;&gt;Nebula&lt;/h2&gt;
&lt;p&gt;The first part of our stack is Nebula, the tool that creates a network
between all of our devices. With traditional VPNs, you have a client
with a persistent connection to a central VPN server and other clients
can communicate with the first by going through that central server.
This works wonderfully in most situations, but there are a lot of
latency and bandwidth restrictions that would make remote support an
unpleasant experience. Instead of this model, what we want is a &lt;em&gt;mesh&lt;/em&gt;
network, where each client can connect directly to one another &lt;em&gt;without&lt;/em&gt;
going through a central system and slowing things down. This is where
Nebula comes in.&lt;/p&gt;
&lt;p&gt;In Nebula&amp;rsquo;s terminology, clients are referred to as &lt;em&gt;nodes&lt;/em&gt; and central
servers are referred to as &lt;em&gt;lighthouses&lt;/em&gt;, so those are the terms I&amp;rsquo;ll use
going forward.&lt;/p&gt;
&lt;p&gt;Mesh networks are usually only possible when dealing with devices that
have static IP addresses. Each node has to know &lt;em&gt;how&lt;/em&gt; to connect with the
other nodes; John can&amp;rsquo;t meet up with Bob when Bob moves every other day
without notifying anyone of his new address. This wouldn&amp;rsquo;t be a problem
if Bob phoned Jill and told her where he was moving; John would call
Jill, Jill would tell him where Bob is, and the two would be able to
find each other&lt;/p&gt;
&lt;p&gt;With Nebula, nodes are Bob and John and Jill is a lighthouse. Each node
connects to a lighthouse and the lighthouse tells the nodes how to
connect with one another when they ask. It &lt;em&gt;facilitates&lt;/em&gt; the P2P
connection then &lt;em&gt;backs out of the way&lt;/em&gt; so the two nodes can communicate
directly with each other.&lt;/p&gt;
&lt;p&gt;It allows any node to connect with any other node on any network from
anywhere in the world, as long as one lighthouse is accessible that
knows the connection details for both peers.&lt;/p&gt;
&lt;h3 id=&#34;getting-started&#34;&gt;Getting started&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;best&lt;/em&gt; resource is &lt;a href=&#34;https://github.com/slackhq/nebula&#34;&gt;the official documentation,&lt;/a&gt; but I&amp;rsquo;ll describe the
process here as well.&lt;/p&gt;
&lt;p&gt;After &lt;a href=&#34;https://github.com/slackhq/nebula#1-the-nebula-binaries-or-distribution-packages-for-your-specific-platform-specifically-youll-need-nebula-cert-and-the-specific-nebula-binary-for-each-platform-you-use&#34;&gt;installing the required packages,&lt;/a&gt; make sure you have a VPS with a
static IP address to use as a lighthouse. If you want something dirt
cheap, I would recommend one of the small plans from &lt;a href=&#34;https://buyvm.net&#34;&gt;BuyVM.&lt;/a&gt; I do have a
&lt;a href=&#34;https://my.frantech.ca/aff.php?aff=3783&#34;&gt;referral link&lt;/a&gt; if you want them to kick me a few dollars for your
purchase. &lt;a href=&#34;https://www.hetzner.com/cloud&#34;&gt;Hetzner&lt;/a&gt; (referral: &lt;code&gt;ckGrk4J45WdN&lt;/code&gt;) or &lt;a href=&#34;https://www.netcup.eu/&#34;&gt;netcup&lt;/a&gt; (referral:
&lt;code&gt;36nc15758387844&lt;/code&gt;) would also be very good options; I&amp;rsquo;ve used them all and
am very comfortable recommending them.&lt;/p&gt;
&lt;h3 id=&#34;creating-a-certificate-authority&#34;&gt;Creating a Certificate Authority&lt;/h3&gt;
&lt;p&gt;After picking a device with a static IP address, it needs to be set up
as a lighthouse. This is done by first creating a Certificate Authority
(CA) that will be used for signing keys and certificates that allow our
other devices into the network. The &lt;code&gt;.key&lt;/code&gt; file produced by the following
command is incredibly sensitive; with it, anyone can authorise a new
device and give it access to your network. Store it in a safe,
preferably encrypted location.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nebula-cert ca -name &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;nebula.example.com&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ll explain why we used a Fully-Qualified Domain Name (FQDN) as the
CA&amp;rsquo;s name in a later section. If you have your own domain, feel free to
use that instead; it doesn&amp;rsquo;t really matter what domain is used as long
as the format is valid.&lt;/p&gt;
&lt;h3 id=&#34;generating-lighthouse-credentials&#34;&gt;Generating lighthouse credentials&lt;/h3&gt;
&lt;p&gt;Now that we have the CA&amp;rsquo;s &lt;code&gt;.crt&lt;/code&gt; and &lt;code&gt;.key&lt;/code&gt; files, we can create and sign
keys and certificates for the lighthouse.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nebula-cert sign -name &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;buyvm.lh.nebula.example.com&amp;#34;&lt;/span&gt; -ip &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;192.168.100.1/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here, we&amp;rsquo;re using a FQDN for the same reason as we did in the CA. You
can use whatever naming scheme you like, I just prefer
&lt;code&gt;&amp;lt;vps-host&amp;gt;.lh.nebula...&lt;/code&gt; for my lighthouses. The IP address can be on any
of the following private IP ranges, I just happened to use &lt;code&gt;192.168.100.X&lt;/code&gt;
for my network.&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;IP Range&lt;/th&gt;
          &lt;th&gt;Number of addresses&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;10.0.0.0 – 10.255.255.255&lt;/td&gt;
          &lt;td&gt;16 777 216&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;172.16.0.0 – 172.31.255.255&lt;/td&gt;
          &lt;td&gt;10 48 576&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;192.168.0.0 – 192.168.255.255&lt;/td&gt;
          &lt;td&gt;65 536&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h3 id=&#34;creating-a-config-file&#34;&gt;Creating a config file&lt;/h3&gt;
&lt;p&gt;The next step is creating our lighthouse&amp;rsquo;s config file. The reference
config can be found in &lt;a href=&#34;https://github.com/slackhq/nebula/blob/master/examples/config.yml&#34;&gt;Nebula&amp;rsquo;s repo.&lt;/a&gt; We only need to change a few of
the lines for the lighthouse to work properly. If I don&amp;rsquo;t mention a
specific section here, I&amp;rsquo;ve left the default values.&lt;/p&gt;
&lt;p&gt;The section below is where we&amp;rsquo;ll define certificates and keys. &lt;code&gt;ca.crt&lt;/code&gt;
will remain &lt;code&gt;ca.crt&lt;/code&gt; when we copy it over but I like to leave the node&amp;rsquo;s
cert and key files named as they were when generated; this makes it easy
to identify nodes by their configs. Once we copy everything over to the
server, we&amp;rsquo;ll add the proper paths to the &lt;code&gt;cert&lt;/code&gt; and &lt;code&gt;key&lt;/code&gt; fields.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pki:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ca: /etc/nebula/ca.crt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cert: /etc/nebula/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  key: /etc/nebula/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The next section is for identifying and mapping your lighthouses. This
needs to be present in &lt;em&gt;all&lt;/em&gt; of the configs on &lt;em&gt;all&lt;/em&gt; nodes, otherwise they
won&amp;rsquo;t know how to reach the lighthouses and will never actually join the
network. Make sure you replace &lt;code&gt;XX.XX.XX.XX&lt;/code&gt; with whatever your VPS&amp;rsquo;s
public IP address is. If you&amp;rsquo;ve used a different private network range,
those changes need to be reflected here as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;static_host_map:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;#34;192.168.100.1&amp;#34;: [&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;XX.XX.XX.XX:4242&amp;#34;&lt;/span&gt;]
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Below, we&amp;rsquo;re specifying how the node should behave. It is a lighthouse,
it should answer DNS requests, the DNS server should listen on all
interfaces on port 53, it sends its IP address to lighthouses every 60
seconds (this option doesn&amp;rsquo;t actually have any effect when &lt;code&gt;am_lighthouse&lt;/code&gt;
is set to &lt;code&gt;true&lt;/code&gt; though), and this lighthouse should not send reports to
other lighthouses. The bit about DNS will be discussed later.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lighthouse:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  am_lighthouse: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  serve_dns: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  dns:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    host: 0.0.0.0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    port: 53
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  interval: 60
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hosts:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The next bit is about &lt;a href=&#34;https://en.wikipedia.org/wiki/Hole_punching_%28networking%29&#34;&gt;hole punching&lt;/a&gt;, also called &lt;em&gt;NAT punching&lt;/em&gt;, &lt;em&gt;NAT
busting&lt;/em&gt;, and a few other variations. Make sure you read the comments for
better explanations than I&amp;rsquo;ll give here. &lt;code&gt;punch: true&lt;/code&gt; enables hole
punching. I also like to enable &lt;code&gt;respond&lt;/code&gt; just in case nodes are on
particularly troublesome networks; because we&amp;rsquo;re using this as a support
system, we have no idea what networks our nodes will actually be
connected to. We want to make sure devices are available no matter where
they are.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;punchy:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  punch: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  respond: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  delay: 1s
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;cipher&lt;/code&gt; is a big one. The value &lt;em&gt;must&lt;/em&gt; be identical on &lt;em&gt;all&lt;/em&gt; nodes &lt;em&gt;and&lt;/em&gt;
lighthouses. &lt;code&gt;chachapoly&lt;/code&gt; is more compatible so it&amp;rsquo;s used by default. The
devices &lt;em&gt;I&lt;/em&gt; want to connect to are all x86 Linux, so I can switch to &lt;code&gt;aes&lt;/code&gt;
and benefit from &lt;a href=&#34;https://www.reddit.com/r/networking/comments/iksyuu/comment/g3ra5cv/?utm_source=share&amp;amp;utm_medium=web2x&amp;amp;context=3&#34;&gt;a small performance boost.&lt;/a&gt; Unless you know &lt;em&gt;for sure&lt;/em&gt;
that you won&amp;rsquo;t need to work with &lt;em&gt;anything&lt;/em&gt; else, I recommend leaving it
set to &lt;code&gt;chachapoly&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;cipher: chachapoly
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The last bit I modify is the firewall section. I leave most everything
default but &lt;em&gt;remove&lt;/em&gt; the bits after &lt;code&gt;port: 443&lt;/code&gt;. I don&amp;rsquo;t &lt;em&gt;need&lt;/em&gt; the &lt;code&gt;laptop&lt;/code&gt; and
&lt;code&gt;home&lt;/code&gt; groups (groups will be explained later) to access port &lt;code&gt;443&lt;/code&gt; on this
node, so I shouldn&amp;rsquo;t include the statement. If you have different needs,
take a look at the comment explaining how the firewall portion works and
make those changes.&lt;/p&gt;
&lt;p&gt;Again, I &lt;em&gt;remove&lt;/em&gt; the following bit from the config.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- port: 443
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  proto: tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  groups:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - laptop
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - home
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;setting-the-lighthouse-up&#34;&gt;Setting the lighthouse up&lt;/h3&gt;
&lt;p&gt;We&amp;rsquo;ve got the config, the certificates, and the keys. Now we&amp;rsquo;re ready to
actually set it up. After SSHing into the server, grab the &lt;a href=&#34;https://github.com/slackhq/nebula/releases/latest&#34;&gt;latest
release of Nebula for your platform,&lt;/a&gt; unpack it, make the &lt;code&gt;nebula&lt;/code&gt; binary
executable, then move it to &lt;code&gt;/usr/local/bin&lt;/code&gt; (or some other location
fitting for your platform).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wget https://github.com/slackhq/nebula/releases/download/vX.X.X/nebula-PLATFORM-ARCH.tar.gz
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tar -xvf nebula-*
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;chmod +x nebula
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv nebula /usr/local/bin/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rm nebula-*
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we need a place to store our config file, keys, and certificates.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir /etc/nebula/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The next step is copying the config, keys, and certificates to the
server. I use &lt;code&gt;rsync&lt;/code&gt; but you can use whatever you&amp;rsquo;re comfortable with.
The following four files need to be uploaded to the server.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;config.yml&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;ca.crt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buyvm.lh.nebula.example.com.crt&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;&lt;code&gt;buyvm.lh.nebula.example.com.key&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;With &lt;code&gt;rsync&lt;/code&gt;, that would look something like this. Make sure &lt;code&gt;rsync&lt;/code&gt; is also
installed on the VPS before attempting to run the commands though;
you&amp;rsquo;ll get an error otherwise.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rsync -avmzz ca.crt user@example.com:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rsync -avmzz config.yml user@example.com:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rsync -avmzz buyvm.lh.* user@example.com:
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;SSH back into the server and move everything to &lt;code&gt;/etc/nebula/&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv ca.crt /etc/nebula/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv config.yml /etc/nebula/
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mv buyvm.lh* /etc/nebula/
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Edit the config file and ensure the &lt;code&gt;pki:&lt;/code&gt; section looks something like
this, modified to match your hostnames of course.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;pki:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  ca: /etc/nebula/ca.crt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  cert: /etc/nebula/buyvm.lh.nebula.example.com.crt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  key: /etc/nebula/buyvm.lh.nebula.example.com.key
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the following command to make sure everything works properly.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nebula -config /etc/nebula/config.yml
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The last step is daemonizing Nebula so it runs every time the server
boots. If you&amp;rsquo;re on a machine using systemd, dropping the following
snippet into &lt;code&gt;/etc/systemd/system/nebula.service&lt;/code&gt; should be sufficient. If
you&amp;rsquo;re using something else, check the &lt;a href=&#34;https://github.com/slackhq/nebula/tree/master/examples/&#34;&gt;the examples directory&lt;/a&gt; for more
options.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Unit]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description=nebula
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wants=basic.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After=basic.target network.target
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Before=sshd.service
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Service]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;SyslogIdentifier=nebula
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecReload=/bin/kill -HUP $MAINPID
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStart=/usr/local/bin/nebula -config /etc/nebula/config.yml
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Restart=always
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;[Install]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WantedBy=multi-user.target
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;We&amp;rsquo;re almost done!&lt;/p&gt;
&lt;h3 id=&#34;setting-individual-nodes-up&#34;&gt;Setting individual nodes up&lt;/h3&gt;
&lt;p&gt;This process is almost exactly the same as setting lighthouses up. All
you&amp;rsquo;ll need to do is generate a couple of certs and keys then tweak the
configs a bit.&lt;/p&gt;
&lt;p&gt;The following command creates a new cert/key for USER&amp;rsquo;s node with the IP
address &lt;code&gt;192.168.100.2&lt;/code&gt;. The resulting files would go on the &lt;em&gt;remote&lt;/em&gt; node
not yours. Replace &lt;code&gt;HOST&lt;/code&gt; and &lt;code&gt;USER&lt;/code&gt; with fitting values.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nebula-cert sign -name &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;HOST.USER.nebula.example.com&amp;#34;&lt;/span&gt; -ip &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;192.168.100.2/24&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The following command will create a &lt;em&gt;similar&lt;/em&gt; cert/key but it will be part
of the &lt;code&gt;support&lt;/code&gt; group. The files resulting from this should go on &lt;em&gt;your&lt;/em&gt;
nodes. With the config we&amp;rsquo;ll create next, nodes in the &lt;code&gt;support&lt;/code&gt; group
will be able to VNC and SSH into other nodes. Your nodes need to be in
the &lt;code&gt;support&lt;/code&gt; group so you&amp;rsquo;ll have access to the others.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nebula-cert sign -name &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;HOST.USER.nebula.example.com&amp;#34;&lt;/span&gt; -ip &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;192.168.100.2/24&amp;#34;&lt;/span&gt; -groups &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;support&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;On to the config now. This tells the node that it is &lt;em&gt;not&lt;/em&gt; a lighthouse,
it should &lt;em&gt;not&lt;/em&gt; resolve DNS requests, it &lt;em&gt;should&lt;/em&gt; ping the lighthouses and
tell them its IP address every 60 seconds, and the node at &lt;code&gt;192.168.100.1&lt;/code&gt;
is one of the lighthouses it should report to and query from. If you
have more than one lighthouse, add them to the list as well.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;lighthouse:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  am_lighthouse: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;#serve_dns: false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;#dns:&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;#host: 0.0.0.0&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;#port: 53&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  interval: 60
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  hosts:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;192.168.100.1&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The other bit that should be modified is the &lt;code&gt;firewall:&lt;/code&gt; section and this
is where the groups we created earlier are important. Review its
comments and make sure you understand how it works before proceeding.&lt;/p&gt;
&lt;p&gt;We want to allow inbound connections on ports 5900, the standard port
for VNC, and 22, the standard for SSH. Additionally, we &lt;em&gt;only&lt;/em&gt; want to
allow connections from nodes in the &lt;code&gt;support&lt;/code&gt; group. Any &lt;em&gt;other&lt;/em&gt; nodes
should be denied access.&lt;/p&gt;
&lt;p&gt;Note that including this section is not necessary on &lt;em&gt;your&lt;/em&gt; nodes, those
in the &lt;code&gt;support&lt;/code&gt; group. It&amp;rsquo;s only necessary on the remote nodes that
you&amp;rsquo;ll be connecting to. As long as the &lt;code&gt;outbound:&lt;/code&gt; section in the config
on &lt;em&gt;your&lt;/em&gt; node allows any outbound connection, you&amp;rsquo;ll be able to access
other nodes.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-yaml&#34; data-lang=&#34;yaml&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- port: 5900
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  proto: tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  groups:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - support
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;- port: 22
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  proto: tcp
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  groups:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    - support
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The certs, key, config, binary, and systemd service should all be copied
to the same places on all of these nodes as on the lighthouse.&lt;/p&gt;
&lt;h2 id=&#34;x11vnc&#34;&gt;X11vnc&lt;/h2&gt;
&lt;p&gt;&lt;em&gt;Alright.&lt;/em&gt; The hardest part is finished. Now on to setting &lt;code&gt;x11vnc&lt;/code&gt; up on
the nodes you&amp;rsquo;ll be supporting.&lt;/p&gt;
&lt;p&gt;All you should need to do is install &lt;code&gt;x11vnc&lt;/code&gt; using the package manager
your distro ships with, generate a 20 character password with &lt;code&gt;pwgen -s 20 1&lt;/code&gt;, run the following command, paste the password, wait for &lt;code&gt;x11vnc&lt;/code&gt; to
start up, make sure it&amp;rsquo;s running correctly, press &lt;code&gt;Ctrl&lt;/code&gt; + &lt;code&gt;C&lt;/code&gt;, then add the
command to the DE&amp;rsquo;s startup applications!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;x11vnc --loop -usepw -listen &amp;lt;nebula-ip&amp;gt; -display :0
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;--loop&lt;/code&gt; tells &lt;code&gt;x11vnc&lt;/code&gt; to restart once you disconnect from the session.
&lt;code&gt;-usepw&lt;/code&gt; is pretty self-explanatory. &lt;code&gt;-listen &amp;lt;nebula-ip&amp;gt;&lt;/code&gt; is important; it
tells &lt;code&gt;x11vnc&lt;/code&gt; to only listen on the node&amp;rsquo;s Nebula IP address. This
prevents randos in a coffee shop from seeing an open VNC port and trying
to brute-force the credentials. &lt;code&gt;-display :0&lt;/code&gt; just defines which X11
server display to connect to.&lt;/p&gt;
&lt;p&gt;Some distributions like elementaryOS and those that use KDE and GNOME
will surface a dialogue for managing startup applications if you just
press the Windows (Super) key and type &lt;code&gt;startup&lt;/code&gt;. If that doesn&amp;rsquo;t work,
you&amp;rsquo;ll have to root around in the settings menus, consult the
distribution&amp;rsquo;s documentation, or ask someone else that might know.&lt;/p&gt;
&lt;p&gt;After adding it to the startup application, log out and back in to make
sure it&amp;rsquo;s running in the background.&lt;/p&gt;
&lt;h2 id=&#34;remmina&#34;&gt;Remmina&lt;/h2&gt;
&lt;p&gt;Now that our network is functioning properly and the VNC server is set
up, we need something that connects to the VNC server over the fancy
mesh network. Enter &lt;a href=&#34;https://remmina.org/&#34;&gt;Remmina.&lt;/a&gt; This one goes on &lt;em&gt;your&lt;/em&gt; nodes.&lt;/p&gt;
&lt;p&gt;Remmina is a multi-protocol remote access tool available in pretty much
ever distribution&amp;rsquo;s package archive as &lt;code&gt;remmina&lt;/code&gt;. Install it, launch it,
add a new connection profile in the top left, give the profile a
friendly name (I like to use the name of the person I&amp;rsquo;ll be supporting),
assign it to a group, such as &lt;code&gt;Family&lt;/code&gt; or &lt;code&gt;Friends&lt;/code&gt;, set the Protocol to
&lt;code&gt;Remmina VNC Plugin&lt;/code&gt;, enter the node&amp;rsquo;s Nebula IP address in the Server
field, then enter their username and the 20 character password you
generated earlier. I recommend setting the quality to Poor, but Nebula
is generally performant enough that any of the options are suitable. I
just don&amp;rsquo;t want to have to disconnect and reconnect with a lower quality
if the other person happens to be on a slow network.&lt;/p&gt;
&lt;p&gt;Save and test the connection!&lt;/p&gt;
&lt;p&gt;If all goes well and you see the other device&amp;rsquo;s desktop, you&amp;rsquo;re done
with the VNC section! Now on to SSH.&lt;/p&gt;
&lt;h2 id=&#34;ssh&#34;&gt;SSH&lt;/h2&gt;
&lt;p&gt;First off, make sure &lt;code&gt;openssh-server&lt;/code&gt; is installed on the remote node;
&lt;code&gt;openssh-client&lt;/code&gt; would also be good to have, but from what I can tell,
it&amp;rsquo;s not strictly necessary. You &lt;em&gt;will&lt;/em&gt; need &lt;code&gt;openssh-client&lt;/code&gt; on &lt;em&gt;your&lt;/em&gt; node,
however. If you already have an SSH key, copy it over to
&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; on the remote node. If you don&amp;rsquo;t, generate one
with &lt;code&gt;ssh-keygen -t ed25519&lt;/code&gt;. This will create an Ed25519 SSH key pair.
Ed25519 keys are shorter and faster than RSA and more secure than ECDSA
or DSA. If that means nothing to you, don&amp;rsquo;t worry about it. Just note
than this key might not interact well with older SSH servers; you&amp;rsquo;ll
know if you need to stick with the default RSA. Otherwise, Ed25519 is
the better option. After key generation has finished, copy
&lt;code&gt;~/.ssh/id_ed25519.pub&lt;/code&gt; (note the &lt;code&gt;.pub&lt;/code&gt; extension) from your node to
&lt;code&gt;~/.ssh/authorized_keys&lt;/code&gt; on the remote node. The file &lt;em&gt;without&lt;/em&gt; &lt;code&gt;.pub&lt;/code&gt; is your
&lt;em&gt;private&lt;/em&gt; key. Like the Nebula CA certificate we generated earlier, this
is extremely sensitive and should never be shared with anyone else.&lt;/p&gt;
&lt;p&gt;Next is configuring SSH to only listen on Nebula&amp;rsquo;s interface; as with
&lt;code&gt;x11vnc&lt;/code&gt;, this prevents randos in a coffee shop from seeing an open SSH
port and trying to brute-force their way in. Set the &lt;code&gt;ListenAddress&lt;/code&gt;
option in &lt;code&gt;/etc/ssh/sshd_config&lt;/code&gt; to the remote node&amp;rsquo;s Nebula IP address.
If you want to take security a step further, search for
&lt;code&gt;PasswordAuthentication&lt;/code&gt; and set it to &lt;code&gt;no&lt;/code&gt;. This means your SSH key is
&lt;em&gt;required&lt;/em&gt; for gaining access via SSH. If you mess up Nebula&amp;rsquo;s firewall
rules and accidentally give other Nebula devices access to this machine,
they still won&amp;rsquo;t be able to get in unless they have your SSH key. I
&lt;em&gt;personally&lt;/em&gt; recommend disabling password authentication, but it&amp;rsquo;s not
absolutely necessary. After making these changes, run &lt;code&gt;systemctl restart sshd&lt;/code&gt; to apply them.&lt;/p&gt;
&lt;p&gt;Now that the SSH server is listening on Nebula&amp;rsquo;s interface, it will
actually fail to start when the machine (re)boots. The SSH server starts
faster than Nebula does, so it will look for the interface before Nebula
has even had a chance to connect. We need to make sure systemd waits for
Nebula to start up and connect before it tells SSH to start; run
&lt;code&gt;systemctl edit --full sshd&lt;/code&gt; and add the following line in the &lt;code&gt;[Unit]&lt;/code&gt;
section, above &lt;code&gt;[Service]&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After=nebula.service
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Even now, there&amp;rsquo;s still a bit of a hiccup. Systemd won&amp;rsquo;t start SSH until
Nebula is up and running, which is good. Unfortunately, even after
Nebula has started, it still takes a minute to bring the interface up,
causing SSH to crash. To fix &lt;em&gt;this&lt;/em&gt;, add the following line directly below
&lt;code&gt;[Service]&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStartPre=/usr/bin/sleep 30
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If the &lt;code&gt;sleep&lt;/code&gt; executable is stored in a different location, make sure you
use that path instead. You can check by running &lt;code&gt;which sleep&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;When the SSH &lt;em&gt;service&lt;/em&gt; starts up, it will now wait an additional 30
seconds before actually starting the SSH &lt;em&gt;daemon&lt;/em&gt;. It&amp;rsquo;s a bit of a hacky
solution but it works™. If you come up with something better, please
send it to me and I&amp;rsquo;ll include it in the post! My contact information is
at the bottom of &lt;a href=&#34;../&#34;&gt;this site&amp;rsquo;s home page.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After you&amp;rsquo;ve made these changes, run &lt;code&gt;systemctl daemon-reload&lt;/code&gt; to make
sure systemd picks up on the modified service file, then run &lt;code&gt;systemctl restart sshd&lt;/code&gt;. You should be able to connect to the remote node from your
node using the following command.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh USER@&amp;lt;nebula-ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you want to make the command a little simpler so you don&amp;rsquo;t have to
remember the IP every time, create &lt;code&gt;~/.ssh/config&lt;/code&gt; on your node and add
these lines to it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Host USER
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  Hostname &amp;lt;nebula-ip&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  User USER
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now you can just run &lt;code&gt;ssh USER&lt;/code&gt; to get in. If you duplicate the above
block for all of the remote nodes you need to support, you&amp;rsquo;ll only have
to remember the person&amp;rsquo;s username to SSH into their machine.&lt;/p&gt;
&lt;h2 id=&#34;going-further-with-nebula&#34;&gt;Going further with Nebula&lt;/h2&gt;
&lt;p&gt;This section explains why we used FQDNs in the certs and why the DNS
resolver is enabled on the lighthouse.&lt;/p&gt;
&lt;p&gt;Nebula ships with a built-in resolver meant specifically for mapping
Nebula node hostnames to their Nebula IP addresses. Running a public DNS
resolver is very much discouraged because it can be abused in terrible
ways. However, the Nebula resolver mitigates this risk because it &lt;em&gt;only&lt;/em&gt;
answers queries for Nebula nodes. It doesn&amp;rsquo;t forward requests to any
other servers nor does it attempt to resolve any domain other than what
was defined in its certificate. If you use the example I gave above,
that would be &lt;code&gt;nebula.example.com&lt;/code&gt;; the lighthouse will attempt to resolve
any subdomain of &lt;code&gt;nebula.example.com&lt;/code&gt; but it will just ignore &lt;code&gt;example.com&lt;/code&gt;,
&lt;code&gt;nebula.duckduckgo.com&lt;/code&gt;, &lt;code&gt;live.secluded.site&lt;/code&gt;, etc.&lt;/p&gt;
&lt;p&gt;Taking advantage of this resolver requires setting it as your secondary
resolver on any device you want to be able to resolve hostnames from.
If you were to add the lighthouse&amp;rsquo;s IP address as your secondary
resolver on your PC, you could enter &lt;code&gt;host.user.nebula.example.com&lt;/code&gt; in
Remmina&amp;rsquo;s server settings &lt;em&gt;instead of&lt;/em&gt; &lt;code&gt;192.168.1.2&lt;/code&gt;.&lt;/p&gt;
&lt;p&gt;But how you do so is beyond the scope of this post!&lt;/p&gt;
&lt;p&gt;If you&amp;rsquo;re up for some &lt;em&gt;more&lt;/em&gt; shenanigans later on down the line, you could
set up a Pi-Hole instance backed by Unbound and configure Nebula as
Unbound&amp;rsquo;s secondary resolver. With this setup, you&amp;rsquo;d get DNS-level ad
blocking &lt;em&gt;and&lt;/em&gt; the ability to resolve Nebula hostname. Pi-Hole would query
Unbound for &lt;code&gt;host.user.nebula.example.com&lt;/code&gt;, Unbound would receive no
answer from the root servers because the domain doesn&amp;rsquo;t exist outside of
your VPN, Unbound would fall back to Nebula, Nebula would give it an
answer, Unbound would cache the answer, tell Pi-Hole, Pi-Hole would
cache the answer, tell your device, then your device would cache the
answer, and you can now resolve any Nebula host!&lt;/p&gt;
&lt;p&gt;Exactly how you do &lt;em&gt;that&lt;/em&gt; is &lt;strong&gt;&lt;em&gt;definitely&lt;/em&gt;&lt;/strong&gt; beyond the scope of this post :P&lt;/p&gt;
&lt;p&gt;If you set any of this up, I would be interested to hear how it goes! As
stated earlier, my contact information is at the bottom of the site&amp;rsquo;s
home page :)&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Running an IRC server</title>
      <link>https://secluded.site/running-an-irc-server/</link>
      <category>IRC/Chat/Oragono/Sysadmin</category>>
      <pubDate>Sat, 05 Dec 2020 16:55:00 -0400</pubDate>
      <guid>https://secluded.site/running-an-irc-server/</guid>
      <description>&lt;p&gt;Many people will disagree but I think IRC is still one of the best chat
platforms there is for a &lt;a href=&#34;https://drewdevault.com/2019/07/01/Absence-of-features-in-IRC.html&#34;&gt;number of
reasons.&lt;/a&gt;
However, the documentation surrounding it is sometimes lacking, commands
are esoteric and can differ from server to server, some networks have
stupid requirements/defaults, etc. But who says you have to join them?
IRC is very easy to set up, use, and maintain and this post should be a
decent guide on doing just that.&lt;/p&gt;
&lt;h2 id=&#34;picking-an-ircd&#34;&gt;Picking an IRCd&lt;/h2&gt;
&lt;p&gt;First, &lt;code&gt;ircd&lt;/code&gt; is short for &lt;em&gt;IRC daemon&lt;/em&gt;; it&amp;rsquo;s just a server running in
the background. Second, there are a &lt;em&gt;ton&lt;/em&gt; of choices, from
&lt;a href=&#34;https://github.com/charybdis-ircd/charybdis&#34;&gt;charybdis&lt;/a&gt; and
&lt;a href=&#34;https://github.com/ngircd/ngircd/&#34;&gt;ngIRCd&lt;/a&gt; to
&lt;a href=&#34;https://www.unrealircd.org/&#34;&gt;UnrealIRCd,&lt;/a&gt;
&lt;a href=&#34;https://www.inspircd.org/&#34;&gt;InspIRCd,&lt;/a&gt; and many others. The ircd this
guide will focus on is &lt;a href=&#34;https://oragono.io/&#34;&gt;Oragono&lt;/a&gt; because it&amp;rsquo;s one
of the simpler options yet has support for &lt;a href=&#34;https://ircv3.net/&#34;&gt;IRCv3&lt;/a&gt;
and comes with &lt;a href=&#34;https://en.wikipedia.org/wiki/IRC_services&#34;&gt;services&lt;/a&gt;
out of the box.&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;p&gt;While we could run Oragono as root or under whatever account you use,
that&amp;rsquo;s a stupid idea. We&amp;rsquo;re going to create an &lt;code&gt;oragono&lt;/code&gt; user to make
sure things are properly separated.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;adduser --disabled-login oragono
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Press the enter key a bunch of times and you&amp;rsquo;re good. After that, run
&lt;code&gt;sudo su - oragono&lt;/code&gt; to log into that user account then head to the
&lt;a href=&#34;https://github.com/oragono/oragono/releases/latest&#34;&gt;GitHub releases
page&lt;/a&gt; and download
the latest gzipped tarball&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; for your architecture. Decompress it with
&lt;code&gt;tar xvf oragono-*.tar.gz&lt;/code&gt;. I &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; recommend renaming the folder to
something else; having the version name right there will make it easy to
figure out when you need to upgrade in the future.&lt;/p&gt;
&lt;p&gt;Copy the default config to the production config with &lt;code&gt;cp default.yaml ircd.yaml&lt;/code&gt;, open it in your favourite TUI editor, and start exploring
the options! The file is commented very well but I&amp;rsquo;ll list a few
specific options and values I recommend.&lt;/p&gt;
&lt;h2 id=&#34;configuration&#34;&gt;Configuration&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Obtain a TLS cert from &lt;a href=&#34;https://letsencrypt.org/&#34;&gt;Let&amp;rsquo;s Encrypt&lt;/a&gt; and
use it if possible. If not, use Oragono&amp;rsquo;s self-signed certificates.
Don&amp;rsquo;t enable plaintext use.&lt;/li&gt;
&lt;li&gt;Consider setting &lt;a href=&#34;https://community.torproject.org/onion-services/&#34;&gt;Tor&lt;/a&gt; up
and allowing users to connect through it.&lt;/li&gt;
&lt;li&gt;If you&amp;rsquo;re using a TLS cert from Let&amp;rsquo;s Encrypt (like you should be),
set &lt;code&gt;sts.enabled&lt;/code&gt; and &lt;code&gt;sts.preload&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Unless you specifically want &lt;a href=&#34;https://meta.wikimedia.org/wiki/IRC/Cloaks&#34;&gt;IRC
cloaks&lt;/a&gt; to indicate
position, status, or affiliation, set &lt;code&gt;lookup-hostnames: true&lt;/code&gt; and
&lt;code&gt;forward-confirm-hostnames: false&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;Always make a cool MoTD. It&amp;rsquo;s essential for any IRC server.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; I
recommend using something like
&lt;a href=&#34;https://www.patorjk.com/software/taag/&#34;&gt;TAAG&lt;/a&gt; to come up with it.&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;may&lt;/em&gt; want to enable email authentication but it&amp;rsquo;s a pain to set
up properly. I haven&amp;rsquo;t bothered.&lt;/li&gt;
&lt;li&gt;I recommend setting &lt;code&gt;channels.default-modes&lt;/code&gt; to &lt;code&gt;+nts&lt;/code&gt;. The &lt;code&gt;+s&lt;/code&gt; flag
just indicates that it&amp;rsquo;s a secret channel and won&amp;rsquo;t show up in the
global list when someone runs &lt;code&gt;/list&lt;/code&gt;. After creating a channel, if
you want it publicly listed, just run &lt;code&gt;/mode -s&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;may&lt;/em&gt; want to uncomment &lt;code&gt;opers.admin.modes&lt;/code&gt; but it can get very
spammy when there are a lot of people on your server.&lt;/li&gt;
&lt;li&gt;If you plan to leave &lt;code&gt;history.enabled: true&lt;/code&gt; and store channel message
history server-side, I highly recommend setting
&lt;code&gt;datastore.mysql.enabled&lt;/code&gt; to &lt;code&gt;true&lt;/code&gt; and going through that
configuration.&lt;/li&gt;
&lt;li&gt;Roleplay can be fun so it&amp;rsquo;s a good idea to look through that section.&lt;/li&gt;
&lt;li&gt;If you enabled &lt;code&gt;datastore.mysql&lt;/code&gt;, also enable &lt;code&gt;history.persistent&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;For privacy reasons, I &lt;em&gt;highly&lt;/em&gt; recommend setting
&lt;code&gt;history.persistent.registered-channels&lt;/code&gt; to &lt;code&gt;&amp;quot;opt-out&amp;quot;&lt;/code&gt;. Message
history will not be stored by default but the channel owner can decide
to enable it if they wish. Same goes for
&lt;code&gt;history.persistent.direct-messages&lt;/code&gt;.&lt;/li&gt;
&lt;li&gt;I recommend enabling both of the options under &lt;code&gt;history.retention&lt;/code&gt;.&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;running-the-server&#34;&gt;Running the server&lt;/h2&gt;
&lt;p&gt;If you&amp;rsquo;re using self-signed certs, run &lt;code&gt;./oragono mkcerts&lt;/code&gt; and make sure
the paths are correct in your &lt;code&gt;ircd.yaml&lt;/code&gt;. Assuming your config is
valid, you should be able to run &lt;code&gt;./oragono run&lt;/code&gt; and connect to it. If
you can&amp;rsquo;t, make sure port 6697 is open, your credentials are correct,
and nothing is wrong in the config.&lt;/p&gt;
&lt;p&gt;You can always run Oragono in &lt;a href=&#34;https://en.wikipedia.org/wiki/Tmux&#34;&gt;tmux&lt;/a&gt;
or something but it would be much better to do it with
&lt;a href=&#34;https://en.wikipedia.org/wiki/Systemd&#34;&gt;systemd,&lt;/a&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/OpenRC&#34;&gt;OpenRC,&lt;/a&gt;
&lt;a href=&#34;https://en.wikipedia.org/wiki/Runit&#34;&gt;runit,&lt;/a&gt; etc. I personally use
systemd and this service file should go in
&lt;code&gt;/etc/systemd/system/oragono.service&lt;/code&gt; or something similar.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[Unit]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Description=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;oragono&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;network.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Wants=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;mysql.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;After=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;network.target mysql.service&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[Service]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Type=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;simple&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;User=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;oragono&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WorkingDirectory=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/home/oragono/oragono&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecStart=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/home/oragono/oragono/oragono run --conf /home/oragono/oragono/ircd.yaml&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ExecReload=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/bin/kill -HUP $MAINPID&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;Restart=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;on-failure&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;LimitNOFILE=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;1048576&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[Install]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;WantedBy=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;multi-user.target&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Run the following commands to ensure Oragono starts when your server boots.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl daemon-reload
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;systemctl &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;enable&lt;/span&gt; --now oragono
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;commands&#34;&gt;Commands&lt;/h2&gt;
&lt;p&gt;As I said in the first section, IRC has a lot of commands and they can
be confusing to work with. I still don&amp;rsquo;t know everything I should. That
said, here are a (very) few of the essentials:&lt;/p&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Command&lt;/th&gt;
          &lt;th&gt;Example&lt;/th&gt;
          &lt;th&gt;Operation&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/quote&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/quote helpop&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Send argument as a command to the server&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/join&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/join #channel&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Join a channel&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/leave&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/leave&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Leave a channel&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/me&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/me yawns&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Result will look like &lt;code&gt;* Amolith yawns&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/query&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/query amolith&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Open a direct message buffer with amolith&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/mode&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/mode -s&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Add/remove flags from a channel&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/op&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/op amolith&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Make amolith a channel operator&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;&lt;code&gt;/voice&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;/voice amolith&lt;/code&gt;&lt;/td&gt;
          &lt;td&gt;Let amolith speak when channel set to &lt;code&gt;+M&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;The one command &lt;em&gt;every&lt;/em&gt; Oragono oper&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; should know is &lt;code&gt;/quote helpop index&lt;/code&gt;. It will list all the available commands so you can read through
them and discover what each does.&lt;/p&gt;
&lt;p&gt;You&amp;rsquo;ve reached the end of the post. You are now disallowed from telling anyone
that IRC is too complicated. If you want to test a server you&amp;rsquo;re setting up,
feel free to use my instance of &lt;a href=&#34;https://thelounge.chat/&#34;&gt;The Lounge;&lt;/a&gt; it&amp;rsquo;s at
irc.nixnet.services and any IRCd details can be entered but mine are default.
Speaking of my IRC server, you should &lt;a href=&#34;ircs://irc.nixnet.services:6697/secluded&#34;&gt;join
#secluded&lt;/a&gt; and mention this post :D&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;A &lt;em&gt;gzipped tarball&lt;/em&gt; is just a compressed archive like a zip file&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;You should definitely &lt;a href=&#34;https://docs.nixnet.services/IRC&#34;&gt;join
mine&lt;/a&gt; and look at our awesome MoTD&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;See &lt;code&gt;/quote help cmodes&lt;/code&gt; for all the flag options&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Short for &lt;a href=&#34;https://en.wikipedia.org/wiki/IRC_operator&#34;&gt;IRC operator&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Replacing YouTube &amp; Invidious</title>
      <link>https://secluded.site/replacing-youtube-invidious/</link>
      <category>YouTube/Invidious/youtube-dl/Media/Automation</category>>
      <pubDate>Mon, 03 Aug 2020 05:43:37 -0400</pubDate>
      <guid>https://secluded.site/replacing-youtube-invidious/</guid>
      <description>&lt;p&gt;Omar Roth, the developer of Invidious, recently wrote a blog post about
&lt;em&gt;&lt;a href=&#34;https://omar.yt/posts/stepping-away-from-open-source&#34;&gt;Stepping away from open
source.&lt;/a&gt;&lt;/em&gt; While I
never used the official instance, I thought this was a good opportunity
to create a tool that downloads videos from YouTubers I&amp;rsquo;m subscribed to
so I can watch them offline in whatever manner I prefer.&lt;/p&gt;
&lt;p&gt;To that end, &lt;a href=&#34;https://github.com/ytdl-org/youtube-dl&#34;&gt;youtube-dl&lt;/a&gt; is by
far the most reliable and versatile option. Having been around since
before 2008&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;, I don&amp;rsquo;t think the project is going anywhere.
&lt;a href=&#34;https://mpv.io/&#34;&gt;MPV&lt;/a&gt; is my media player of choice and it relies on
youtube-dl for watching online content from Twitch to YouTube to PornHub
to &lt;a href=&#34;https://ytdl-org.github.io/youtube-dl/supportedsites.html&#34;&gt;much
more.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Conveniently, youtube-dl comes with all of the tools and flags needed
for exactly this purpose so scripting and automating it is incredibly
easy. Taking a look at &lt;code&gt;man youtube-dl&lt;/code&gt; reveals a &lt;em&gt;plethora&lt;/em&gt; of options
but only a few are necessary.&lt;/p&gt;
&lt;h2 id=&#34;preventing-duplicates&#34;&gt;Preventing duplicates&lt;/h2&gt;
&lt;p&gt;The main thing when downloading an entire channel is ensuring the same
video isn&amp;rsquo;t downloaded more than once. &lt;code&gt;--download-archive&lt;/code&gt; will save the
IDs of all the videos downloaded to prevent them from being downloaded
again. All that&amp;rsquo;s required is a file path at which to store the list.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--download-archive .archives/&amp;lt;channel&amp;gt;.txt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;selecting-quality&#34;&gt;Selecting quality&lt;/h2&gt;
&lt;p&gt;By default, youtube-dl downloads the &lt;em&gt;single&lt;/em&gt; file with the best quality
audio and video so it doesn&amp;rsquo;t need to mux&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; them together after.
However, I prefer to have the highest possibly quality and don&amp;rsquo;t mind
waiting a few seconds longer for FFmpeg to combine audio and video
files. &lt;code&gt;--format&lt;/code&gt; lets the user decide which format they prefer and
whether they want to focus on storage efficiency or quality. The basic
options are &lt;code&gt;best&lt;/code&gt;, &lt;code&gt;worst&lt;/code&gt;, &lt;code&gt;bestvideo&lt;/code&gt;, and &lt;code&gt;bestaudio&lt;/code&gt;. These will
download a &lt;em&gt;single&lt;/em&gt; file that is the highest or lowest quality of both
video/audio or video-only/audio-only. There are a lot of other options
for more fine-grained control over what to look for but, as I mentioned,
I want the highest video and the highest quality audio so I use
&lt;code&gt;bestvideo+bestaudio&lt;/code&gt;. After downloading both of those files, they will
be muxed together.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--format bestvideo+bestaudio
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;embedding-subtitles&#34;&gt;Embedding subtitles&lt;/h2&gt;
&lt;p&gt;I enjoy subtitles but I know many people don&amp;rsquo;t so this section can
certainly be ignored.&lt;/p&gt;
&lt;p&gt;There are a few options for fetching and embedding subtitles. To get
&amp;ldquo;real&amp;rdquo; subtitles that someone transcribed manually, use &lt;code&gt;--write-sub&lt;/code&gt;.
For YouTube&amp;rsquo;s auto-generated subtitles that may or may not be horribly
inaccurate, use &lt;code&gt;--write-auto-sub&lt;/code&gt;. For selecting the language,
&lt;code&gt;--sub-lang &amp;lt;language-code&amp;gt;&lt;/code&gt;, for embedding them, &lt;code&gt;--embed-subs&lt;/code&gt;, and
for selecting the format, &lt;code&gt;--sub-format &amp;lt;desired-format&amp;gt;&lt;/code&gt;. I like using
SRT files so I have that first with &lt;code&gt;best&lt;/code&gt; beside it like so:
&lt;code&gt;--sub-format srt/best&lt;/code&gt;. SRT is preferred but, if unavailable, whatever
other highest-quality format will be used and embedded instead.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--write-sub --write-auto-sub --sub-format srt/best --sub-lang en --embed-subs
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;limiting-downloads&#34;&gt;Limiting downloads&lt;/h2&gt;
&lt;p&gt;When switching to this method, the initial download will pull &lt;em&gt;all&lt;/em&gt; of a
channel&amp;rsquo;s videos. I certainly don&amp;rsquo;t want this so they should be limited
in some way. &lt;code&gt;--dateafter&lt;/code&gt; and &lt;code&gt;--playlist-end&lt;/code&gt; serve very nicely. The
former will only download videos published &lt;em&gt;after&lt;/em&gt; a certain date and
the latter will only download X number of videos.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--dateafter 20200801 --playlist-end 5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; A reader sent me an email with this improvement to the archive
functionality. Rather than checking the last five days of videos to see
if they&amp;rsquo;ve already been downloaded, this snippet will check when the
archive file was last edited and use that as the &lt;code&gt;--dateafter&lt;/code&gt;
parameter, making the script a bit more efficient.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;AFTER&lt;/span&gt;=&lt;span style=&#34;font-weight:bold&#34;&gt;$(&lt;/span&gt;date -r .archives/&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;.txt +%Y%m%d 2&amp;gt;/dev/null || date +%Y%m%d&lt;span style=&#34;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--dateafter &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$AFTER&lt;/span&gt; --playlist-end 5
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;naming-format&#34;&gt;Naming format&lt;/h2&gt;
&lt;p&gt;The final parameter to look at is how to name the files once they&amp;rsquo;re
downloaded. &lt;code&gt;--output&lt;/code&gt; provides templating functionality and there are a
&lt;em&gt;lot&lt;/em&gt; of options. For this use, an acceptable template might be
something like &lt;code&gt;Channel/Title.ext&lt;/code&gt;. In youtube-dl&amp;rsquo;s templating format,
that&amp;rsquo;s &lt;code&gt;&amp;quot;%(uploader)s/%(title)s.%(ext)s&amp;quot;&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;--output &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%(uploader)s/%(title)s.%(ext)s&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;getting-notifications&#34;&gt;Getting notifications&lt;/h2&gt;
&lt;p&gt;I don&amp;rsquo;t yet have a good method for getting notifications when there are
&lt;em&gt;new&lt;/em&gt; videos but there is a simple way to get notified when the script
is finished running. &lt;code&gt;notify-send&lt;/code&gt; is one of the easiest and has pretty
simple syntax as well: the first string is the notification summary and
the second is a longer description. You can optionally pass an icon name
to make it look a little better.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;notify-send -i video-x-generic &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Downloads finished&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Check the YouTube folder for new videos&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For some reason, I don&amp;rsquo;t get icons when the generic name is specified
but I know the command will work on most systems. On mine, I have to
pass the path to the icon file I want: &lt;code&gt;-i /usr/share/icons/Suru++-Dark/apps/64/video.svg&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;writing-the-script&#34;&gt;Writing the script&lt;/h2&gt;
&lt;p&gt;I want to store the videos in &lt;code&gt;~/Videos/YouTube&lt;/code&gt; and I want the archive
records stored in &lt;code&gt;.archives&lt;/code&gt; so the first line (after the shebang&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;)
creates those directories if they don&amp;rsquo;t already exist and the second
enters the &lt;code&gt;YouTube&lt;/code&gt; folder.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/Videos/YouTube/.archives&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/Videos/YouTube&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;From here, a way to reuse the youtube-dl command is necessary so
parameters can be changed in one place and they&amp;rsquo;ll apply to all
channels. Functions are intended for exactly this purpose and are
formatted like so:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;functionName () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# Code here&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I&amp;rsquo;ve named the function &lt;code&gt;dl&lt;/code&gt; so mine looks like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;AFTER&lt;/span&gt;=&lt;span style=&#34;font-weight:bold&#34;&gt;$(&lt;/span&gt;date -r .archives/&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;.txt +%Y%m%d 2&amp;gt;/dev/null ||   &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        date +%Y%m%d&lt;span style=&#34;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    youtube-dl --download-archive .archives/&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;.txt -f         &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        bestvideo+bestaudio --dateafter 20200801 --write-sub    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        --write-auto-sub --sub-format srt/best --sub-lang en    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        --embed-subs -o &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%(uploader)s/%(title)s.%(ext)s&amp;#34;&lt;/span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        --playlist-end 5 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$2&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sleep 5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Because it&amp;rsquo;s in a function that&amp;rsquo;s called repeatedly, the &lt;code&gt;AFTER&lt;/code&gt;
variable will be reevaluated each time using a different archive file to
ensure no videos are missed. The backslashes at the end (&lt;code&gt;\&lt;/code&gt;) tell bash
that it&amp;rsquo;s a single command spanning multiple lines. At the bottom,
&lt;code&gt;sleep&lt;/code&gt; just waits 5 seconds before downloading the next channel. It&amp;rsquo;s
unlikely that YouTube will ratelimit a residential address for this but
it is still possible. Waiting a bit before continuing reduces the
likelihood further.&lt;/p&gt;
&lt;p&gt;Note the use of &lt;code&gt;&amp;quot;$1&amp;quot;&lt;/code&gt; and &lt;code&gt;&amp;quot;$2&amp;quot;&lt;/code&gt; in the archive path and at the very
end of the youtube-dl command. This lets the user define what the
archive file should be named and what channel to download videos from. A
line using the function would be something like:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl linustechtips https://www.youtube.com/user/LinusTechTips
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The result would be this directory structure:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;YouTube
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|-- .archives
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   \-- linustechtips.txt
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;\-- Linus Tech Tips
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    \-- They still make MP3 players.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The last line is the notification command:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;notify-send -i video-x-generic &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Downloads finished&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Check the YouTube folder for new videos&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;finished-script&#34;&gt;Finished script&lt;/h2&gt;
&lt;p&gt;This the script I have in use right now.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;#!/bin/bash
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-weight:bold&#34;&gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mkdir -p &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/Videos/YouTube/.archives&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;cd&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$HOME&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/Videos/YouTube&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl () {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;AFTER&lt;/span&gt;=&lt;span style=&#34;font-weight:bold&#34;&gt;$(&lt;/span&gt;date -r .archives/&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;.txt +%Y%m%d 2&amp;gt;/dev/null ||   &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        date +%Y%m%d&lt;span style=&#34;font-weight:bold&#34;&gt;)&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    youtube-dl --download-archive .archives/&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$1&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;.txt -f         &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        bestvideo+bestaudio --dateafter &lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$AFTER&lt;/span&gt; --write-sub      &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        --write-auto-sub --sub-format srt/best --sub-lang en    &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        --embed-subs -o &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%(uploader)s/%(title)s.%(ext)s&amp;#34;&lt;/span&gt;        &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&lt;/span&gt;        --playlist-end 5 &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$2&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    sleep 5
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl vsauce               https://www.youtube.com/user/Vsauce
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl avikaplan            https://www.youtube.com/user/AviKaplanMusic
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl robscallon           https://www.youtube.com/user/robs70986987
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl logosbynick          https://www.youtube.com/channel/UCEQXp_fcqwPcqrzNtWJ1w9w
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl andrewhuang          https://www.youtube.com/user/songstowearpantsto
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl brandonacker         https://www.youtube.com/user/brandonacker
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl lastweektonight      https://www.youtube.com/user/LastWeekTonight
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;dl bingingwithbabish    https://www.youtube.com/user/bgfilms
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;notify-send --icon /usr/share/icons/Suru++-Dark/apps/64/video.svg &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Downloads finished&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Check the YouTube folder for new videos&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;automation&#34;&gt;Automation&lt;/h2&gt;
&lt;p&gt;This is a very simple process.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Store your script wherever you want but take note of the directory.&lt;/li&gt;
&lt;li&gt;Run &lt;code&gt;crontab -e&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;If you don&amp;rsquo;t already have a cron utility installed, try &lt;code&gt;cronie&lt;/code&gt;.
It should be in most repos.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;Paste and edit: &lt;code&gt;0 */6 * * * /home/user/path/to/script.sh&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Save&lt;/li&gt;
&lt;li&gt;Exit&lt;/li&gt;
&lt;li&gt;???&lt;/li&gt;
&lt;li&gt;Profit&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The pasted line runs the script every 6th hour of every day, every week,
every month, and every year. To change the frequency just run &lt;code&gt;crontab -e&lt;/code&gt;, edit the line, and save. &lt;a href=&#34;https://crontab-generator.org/&#34;&gt;Crontab
Generator&lt;/a&gt; or &lt;a href=&#34;https://crontab.guru/&#34;&gt;Crontab
Guru&lt;/a&gt; might be useful if the syntax is confusing.&lt;/p&gt;
&lt;p&gt;Have fun!&lt;/p&gt;
&lt;h2 id=&#34;edits&#34;&gt;Edits&lt;/h2&gt;
&lt;ol&gt;
&lt;li&gt;Synchronised &lt;code&gt;--dateafter&lt;/code&gt; parameter with last modified timestamp of the
archive file — thank you Dominic!&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The &lt;a href=&#34;https://github.com/ytdl-org/youtube-dl/commit/4fa74b5252a23c2890ddee52b8ee5811b5bb2987&#34;&gt;first commit&lt;/a&gt; for the current youtube-dl repository was made on
21 July 2008 and it references &amp;ldquo;the new youtube-dl&amp;rdquo;, which suggests
versions prior.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;In the digital media world, muxing is process of combining two or
more files into one. This might be a video track, multiple audio tracks,
and/or subtitle tracks.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;A &lt;em&gt;shebang&lt;/em&gt; is a sequence of characters that tell your program
loader what interpreter to use. &lt;code&gt;#!/bin/bash&lt;/code&gt; is what you would use if
it&amp;rsquo;s a bash script. To use a Python interpreter, &lt;code&gt;#!/usr/bin/env python&lt;/code&gt;
will use the program search path to find the appropriate executable.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>100 Days To Read</title>
      <link>https://secluded.site/100-days-to-read/</link>
      <category>100 Days to Read/100 Days to Offload</category>>
      <pubDate>Thu, 23 Jul 2020 00:48:16 -0400</pubDate>
      <guid>https://secluded.site/100-days-to-read/</guid>
      <description>&lt;h2 id=&#34;the-idea&#34;&gt;The idea&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;ve found it very difficult to stick to a regular schedule for
#100DaysToOffload for various reasons. Chief among them is simply
that I don&amp;rsquo;t have enough time with everything else I have going on; what I want
to write and the ideas I&amp;rsquo;ve had take longer to get on paper (or screen) than I&amp;rsquo;m
able to dedicate at the moment.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; However, I love the intent behind it and
want to continue in a somewhat less involved manner. Enter
#100DaysToRead (dead link to hashtag on fedi instance).&lt;/p&gt;
&lt;h2 id=&#34;the-rules&#34;&gt;The &amp;ldquo;rules&amp;rdquo;&lt;/h2&gt;
&lt;p&gt;Quotes are used because they&amp;rsquo;re not solid rules; it can be hard to learn
something significant from fiction, you might miss a day here and there, what
you learned could be a bit personal and not really suitable for social media,
any number of things might result in &amp;ldquo;breaking&amp;rdquo; one or all of them. Just do your
best. :simple_smile:&lt;/p&gt;
&lt;h3 id=&#34;read-for-an-hour-a-day&#34;&gt;Read for an hour a day&lt;/h3&gt;
&lt;p&gt;I recommend using some kind of timer or stopwatch to track how long
you&amp;rsquo;ve been reading. A stopwatch would be best as it allows you to get
sucked in without ringing and making you feel as if you &lt;em&gt;need&lt;/em&gt; to stop;
the pull of real life is great and audible reminders only serve to
exacerbate the urgency of rejoining the rest of the world. Part of the
idea behind this is not only to learn something but to &lt;em&gt;enjoy&lt;/em&gt; it and
that&amp;rsquo;s difficult when you&amp;rsquo;re anxiously waiting for a timer to ding so
you can get back to watching a show. I spent a &lt;em&gt;lot&lt;/em&gt; of time with books
when I was younger then fell completely out of the practise once I got
more involved with school and want to make it a habit once more.&lt;/p&gt;
&lt;h3 id=&#34;take-notes&#34;&gt;Take notes&lt;/h3&gt;
&lt;p&gt;The &lt;em&gt;main&lt;/em&gt; goal of this challenge is to learn things and the effects of
this rule are twofold; you&amp;rsquo;ll certainly be learning a lot but it will
also provide material to write about in the future.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; Take notes in
whatever manner you prefer, from writing in the margins&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; to writing
on the wall, though the latter might not be the greatest idea. I
personally plan to put my notes in &lt;a href=&#34;https://zettelkasten.de/&#34;&gt;a
Zettelkasten&lt;/a&gt; created with
&lt;a href=&#34;https://github.com/vimwiki/vimwiki/&#34;&gt;vimwiki&lt;/a&gt; along with the rest of my
notes.&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; I will first write down whatever thoughts I have in my
&lt;a href=&#34;https://www.walmart.com/ip/Moleskine-Classic-Notebook-Hard-Cover-Pocket-3-5-x-5-5-Plain-Blank-Black-192-Pages-9788883701030-Hardcover-Ntb/8402217&#34;&gt;pocket
notebook&lt;/a&gt;
(these will likely just be a short summary with the page/paragraph as
reference&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;) then, directly after I&amp;rsquo;ve finished the session or later
that day—the same day!—I&amp;rsquo;ll go through the notes and expand them a bit.
I want the &lt;em&gt;full&lt;/em&gt; thought stored in my Zettelkasten for use in the
future; whenever I read another book and have a related thought, I&amp;rsquo;ll
return to this note and add links between them.&lt;/p&gt;
&lt;h3 id=&#34;post-a-short-summary&#34;&gt;Post a short summary&lt;/h3&gt;
&lt;p&gt;Whatever you&amp;rsquo;ve learned that day, post a condensed version along with the
book/page/paragraph on social media using the #100DaysToRead tag! Expanding a
short summary then condensing it again with different wording helps to ensure
you understand the material and will aid in recollection. Posting about it will
give others the same information and might even pique their interest about what
you&amp;rsquo;re reading.&lt;/p&gt;
&lt;h2 id=&#34;thoughts&#34;&gt;Thoughts&lt;/h2&gt;
&lt;p&gt;Inspiration for this comes partly from &lt;a href=&#34;https://www.social-engineer.org/podcast/ep-112-catching-spies-and-paying-parking-tickets-with-joe-navarro/&#34;&gt;episode
112&lt;/a&gt;
of &lt;a href=&#34;https://www.social-engineer.org/podcast/&#34;&gt;The Social-Engineer
Podcast,&lt;/a&gt; partly from me
wanting to learn more, and partly from me wanting more material to write
about. There is so much knowledge in books but it takes a great deal of
discipline to sit down every day and read for an hour when there are
upgrades to perform, emails waiting for replies, games to play, shows to
watch, and so much else. Another small aspect of this is partly to
alleviate those concerns and stresses; it&amp;rsquo;s a time to sit down, lose
yourself in a book, and forget about the outside world.&lt;/p&gt;
&lt;h2 id=&#34;what-im-starting-with&#34;&gt;What I&amp;rsquo;m starting with&lt;/h2&gt;
&lt;p&gt;Fittingly, I plan to begin with &lt;em&gt;&lt;a href=&#34;https://wikipedia.org/wiki/How_to_Read_a_Book&#34;&gt;How to Read a
Book&lt;/a&gt;&lt;/em&gt; by &lt;a href=&#34;https://wikipedia.org/wiki/Mortimer_J._Adler&#34;&gt;Mortimer J.
Adler.&lt;/a&gt; It provides an
in-depth discussion on reading critically and learning as much as
possible from a given book. Adler doesn&amp;rsquo;t push a &amp;ldquo;one-strategy-fits-all&amp;rdquo;
method either. He goes through a variety of approaches for different
genres and encourages a deep level of thinking for all, fiction
included. I&amp;rsquo;m looking forward to starting it tomorrow!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;With finding links, proofreading, revising, expanding, and
shortening various sections, this short post took me over two hours
to write.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Maybe a #100DaysToOffload Take 2!&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;I physically can&amp;rsquo;t bring myself to do this but some people love
&lt;a href=&#34;https://wikipedia.org/wiki/Marginalia&#34;&gt;marginalia&lt;/a&gt; and actively
seek books with them. However, it&amp;rsquo;s a very effective technique and
might be fun to follow your thought trail when re-reading a book.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;I am currently evaluating &lt;a href=&#34;https://anytype.io/&#34;&gt;Anytype&lt;/a&gt; as a tool
for creating and maintaining a Zettelkasten as well as storing other
types on information. At the moment, I can only use it on Windows so
it&amp;rsquo;s inaccessible when I &lt;em&gt;really&lt;/em&gt; need it but the developers say a
Linux build will be ready soon™&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;I plan to format these like &lt;code&gt;p20 ¶2&lt;/code&gt;. The second symbol is a
&lt;em&gt;pilcrow&lt;/em&gt; or, more commonly, a paragraph mark. Usage of that and the
section mark (§) are detailed in Matthew Butterick&amp;rsquo;s &lt;em&gt;&lt;a href=&#34;https://practicaltypography.com/paragraph-and-section-marks.html&#34;&gt;Practical
Typography.&lt;/a&gt;&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>New fonts &amp; site changes</title>
      <link>https://secluded.site/new-fonts-site-changes/</link>
      <category>Fonts/Typography</category>>
      <pubDate>Sun, 19 Jul 2020 01:43:11 -0400</pubDate>
      <guid>https://secluded.site/new-fonts-site-changes/</guid>
      <description>&lt;p&gt;I just got a couple of new (and rather expensive) fonts. So far, I&amp;rsquo;m
incredibly happy with them and think it was money well-spent for a few
reasons. Created by &lt;a href=&#34;https://en.wikipedia.org/wiki/Matthew_Butterick&#34;&gt;Matthew
Butterick,&lt;/a&gt;
&lt;a href=&#34;https://mbtype.com/fonts/valkyrie/&#34;&gt;Valkyrie&lt;/a&gt; and
&lt;a href=&#34;https://mbtype.com/fonts/concourse/&#34;&gt;Concourse&lt;/a&gt; are simply beautiful. I
don&amp;rsquo;t know which I like more but they both have their places on this
website and will find their way onto others in the future. Because
Concourse is a &lt;a href=&#34;https://en.wikipedia.org/wiki/Sans-serif&#34;&gt;sans-serif,&lt;/a&gt;
it will be the default used all across Secluded.Site. Valkyrie is a
&lt;a href=&#34;https://en.wikipedia.org/wiki/Serif&#34;&gt;serif font&lt;/a&gt; and, though the type
seems to be losing its place on the web, I think it adds a lot when
reading content that&amp;rsquo;s focused on a narrative rather than simply being
informative. Because of that, it will be used for my posts about &lt;a href=&#34;../categories/pipe-smoking/&#34;&gt;pipe
smoking&lt;/a&gt; and &lt;a href=&#34;../categories/dungeons-dragons/&#34;&gt;Dungeons &amp;amp;
Dragons.&lt;/a&gt; I might come up with other
categories where Valkyrie fits as well but it will likely remain limited
to those two.&lt;/p&gt;
&lt;p&gt;In addition to simply changing the fonts, I&amp;rsquo;ve also modified some styles
on the site. Headers (such as the title of this post) are now in proper
small caps&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; and I did some work to improve font size relative to the
content width. Previously, the text was smaller than I would have liked
which meant longer lines; there are some studies&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; indicating that
lines with a lower character count, while decreasing reading speed,&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;
are generally more comfortable and hold the reader&amp;rsquo;s attention more
effectively. The width hasn&amp;rsquo;t changed but the size has increased and
thus decreased the number of characters per line.&lt;/p&gt;
&lt;p&gt;One of the reasons I decided to buy the fonts was simply that I love the
way they look and they have a lot of
&lt;a href=&#34;https://mbtype.com/fonts/concourse/features.html&#34;&gt;features&lt;/a&gt; I wanted.
In addition to that, however, I also wanted to support Matthew. His
book, &lt;em&gt;&lt;a href=&#34;https://practicaltypography.com/&#34;&gt;Practical Typography&lt;/a&gt;&lt;/em&gt; is an
amazing resource for anyone that does anything with text. He has put a
massive amount of work into it and simply &lt;a href=&#34;https://practicaltypography.com/why-you-should-pay.html&#34;&gt;asks readers to
pay.&lt;/a&gt; There is
no pay&lt;em&gt;wall&lt;/em&gt; and no ads either; it&amp;rsquo;s completely supported by readers.
There are a few &lt;a href=&#34;https://practicaltypography.com/how-to-pay-for-this-book.html&#34;&gt;ways to
contribute&lt;/a&gt;
and one of them is buying his fonts. Interestingly enough, if you read
his &lt;a href=&#34;https://practicaltypography.com/economics-year-one.html&#34;&gt;first,&lt;/a&gt;
&lt;a href=&#34;https://practicaltypography.com/effluents-influence-affluence.html&#34;&gt;second,&lt;/a&gt;
and &lt;a href=&#34;https://practicaltypography.com/to-pay-or-not-to-pay.html&#34;&gt;third&lt;/a&gt;
year summaries, more people bought his fonts for a higher price than
simply paid him directly:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;What’s most interesting to me, however, is that so many more readers
were willing to buy a font license (at $59–299) than to make a direct
payment (at $5–10). Don’t get me wrong—I’m utterly grateful. But it’s
counterintuitive: I never expected that the cheaper option would be so
much less popular. Economists, I invite your explanations.&lt;/p&gt;
&lt;p&gt;— &lt;em&gt;&lt;a href=&#34;https://practicaltypography.com/economics-year-one.html&#34;&gt;The Economics of a Web-based Book: Year
One&lt;/a&gt;&lt;/em&gt;&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;I won&amp;rsquo;t speculate as to why but it is thought-provoking. Regardless, his
approach is very similar to that of any developer who creates open
source software. They pour their time and energy into projects they
might get no compensation for and rely on the community to fund their
efforts. I have a &lt;em&gt;great&lt;/em&gt; deal of respect for these people and try to
support them whenever I&amp;rsquo;m able. $200 is a small price for two incredible
fonts in addition to &lt;em&gt;Practical Typography&lt;/em&gt;!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Small caps are a font style where the letters that would otherwise
be lower case are a shorter version of the upper case form. Many
people simulate small caps by reducing the font size of regular
capital letters to that of lower case characters but the results are
too tall and their vertical lines too thin; they&amp;rsquo;ve only been scaled
down. &lt;em&gt;Proper&lt;/em&gt; small caps are an additional set of letters added to
a font file as &lt;a href=&#34;https://practicaltypography.com/opentype-features.html&#34;&gt;OpenType
features.&lt;/a&gt;
For a comparison, see the related page on &lt;em&gt;&lt;a href=&#34;https://practicaltypography.com/small-caps.html&#34;&gt;Practical
Typography.&lt;/a&gt;&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;I took mental note when reading an article about it but have since
forgotten what it was and can&amp;rsquo;t find it again. There are, however,
various other sources, such as &lt;em&gt;&lt;a href=&#34;http://webtypography.net/2.1.2&#34;&gt;The Elements of Typographic Style
Applied to the Web&lt;/a&gt;&lt;/em&gt; and
&lt;em&gt;&lt;a href=&#34;https://baymard.com/blog/line-length-readability&#34;&gt;Readability: the Optimal Line
Length.&lt;/a&gt;&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;A &lt;a href=&#34;https://web.archive.org/web/20170918212943/http://psychology.wichita.edu/surl/usabilitynews/72/LineLength.asp&#34;&gt;rather short
study&lt;/a&gt;
from Wichita State University found that increased line length
resulted in greater reading efficiency. However, there were no
significant effects on comprehension and the preference for longer
or shorter lines was fairly evenly distributed.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>LWN Theming</title>
      <link>https://secluded.site/lwn-theming/</link>
      <category>LWN/News/Theming/100 Days To Offload</category>>
      <pubDate>Fri, 19 Jun 2020 16:41:16 -0400</pubDate>
      <guid>https://secluded.site/lwn-theming/</guid>
      <description>&lt;p&gt;After &lt;a href=&#34;https://fosstodon.org/@karan/104368387973787714&#34;&gt;a poll by @karan&lt;/a&gt;, I started thinking about where I get my news and decided to subscribe to &lt;a href=&#34;https://lwn.net&#34;&gt;LWN&lt;/a&gt;. Their content is really good, they&amp;rsquo;ve been running for a long time, and I want to support their work. However, I think the default theme is quite terrible. I spent about an hour last night messing with it and I think I improved it significantly; it&amp;rsquo;s based on the theme of this site.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/pngs/lwn-themed.png&#34; alt=&#34;The theme has a dark background, vibrant pink links, and light text&#34;&gt;&lt;/p&gt;
&lt;center&gt;&lt;p&gt;Screenshot of my LWN theme&lt;/p&gt;&lt;/center&gt;
&lt;p&gt;After &lt;a href=&#34;https://lwn.net/subscribe/&#34;&gt;subscribing&lt;/a&gt;, navigate to &lt;a href=&#34;https://lwn.net/MyAccount/&#34;&gt;your account page&lt;/a&gt; then click the link under &lt;code&gt;Customization&lt;/code&gt;. The following tables are the options and values I&amp;rsquo;ve set for my theme but note that I have &lt;em&gt;not&lt;/em&gt; changed the &lt;code&gt;Old (seen) comment background color&lt;/code&gt; as I haven&amp;rsquo;t had an opportunity to experience what that looks like yet. Once I do, I&amp;rsquo;ll update my theme and this post accordingly.&lt;/p&gt;
&lt;h2 id=&#34;display-preferences&#34;&gt;Display preferences&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Option&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Page background colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Left column background&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Middle column background&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Headline background&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#3b3d42&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Form/byline background&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Sidebar background&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Text colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#f5f4f7&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Link colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#fe5186&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Visited link colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#d0738f&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Quoted text (in email) colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#7ec699&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Old (seen) comment background colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#cccccc&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Navigation box on printable page&lt;/td&gt;
          &lt;td&gt;&amp;#x2705;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Minimum width of main text column (em)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;40&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Maximum width of main text column (em)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;50&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Display old parent in unread comments screen&lt;/td&gt;
          &lt;td&gt;:large-green-square: (unchecked)&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;new-page-engine-preferences&#34;&gt;New page engine preferences&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Option&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Use the new page engine&lt;/td&gt;
          &lt;td&gt;&amp;#x2705;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Left column color&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Maximum width for handset presentation (em)&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;48&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Fixed navigation menu on small screens&lt;/td&gt;
          &lt;td&gt;&amp;#x2705;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Font family to use&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;:white_check_mark: sans-serif&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;h2 id=&#34;quoted-text-preferences&#34;&gt;Quoted text preferences&lt;/h2&gt;
&lt;table&gt;
  &lt;thead&gt;
      &lt;tr&gt;
          &lt;th&gt;Option&lt;/th&gt;
          &lt;th&gt;Value&lt;/th&gt;
      &lt;/tr&gt;
  &lt;/thead&gt;
  &lt;tbody&gt;
      &lt;tr&gt;
          &lt;td&gt;Quoted text style&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;:white_check_mark: normal&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Quoted text weight&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;:white_check_mark: bolder&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Quoted text colour&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#a9a9b3&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
      &lt;tr&gt;
          &lt;td&gt;Quoted text background&lt;/td&gt;
          &lt;td&gt;&lt;code&gt;#292a2d&lt;/code&gt;&lt;/td&gt;
      &lt;/tr&gt;
  &lt;/tbody&gt;
&lt;/table&gt;
&lt;p&gt;After applying the changes, this is what comments look like:&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/pngs/lwn-comments.png&#34; alt=&#34;The theme is basically the same as above with slightly lighter headers and a soft green for the quotes&#34;&gt;&lt;/p&gt;
&lt;center&gt;&lt;p&gt;Screenshot of LWN comments&lt;/p&gt;&lt;/center&gt;
&lt;h2 id=&#34;conclusion&#34;&gt;Conclusion&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m already happy with my LWN subscription and plan to remain subscribed for a long time. The recent post about &lt;a href=&#34;https://lwn.net/SubscriberLink/822969/76cf4f582a5a1e15/&#34;&gt;&lt;em&gt;Tools to improve English text&lt;/em&gt;&lt;/a&gt; looks especially interesting and something I&amp;rsquo;m already looking into for &lt;a href=&#34;https://man.sr.ht/~whereswaldon/arborchat/&#34;&gt;Arbor&amp;rsquo;s documentation&lt;/a&gt; (big blog post about the project coming soon™). If you have an extra $3.50/mo, I really encourage you to subscribe to LWN. News is important and high-quality news especially so. Blinding though the default theme may be, LWN is, bar none, the best news site I&amp;rsquo;ve ever seen and I want to ensure they stick around.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was day 12 of #100DaysToOffload, an awesome idea (dead link to fedi post)
from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk&lt;/a&gt;. If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Documenting With MediaWiki</title>
      <link>https://secluded.site/documenting-with-mediawiki/</link>
      <category>MediaWiki/Documentation/Writing/Efficiency/100 Days To Offload</category>>
      <pubDate>Thu, 04 Jun 2020 12:23:34 -0400</pubDate>
      <guid>https://secluded.site/documenting-with-mediawiki/</guid>
      <description>&lt;p&gt;Much to my chagrin, I&amp;rsquo;ve hardly posted anything at all the past couple
of weeks. This is partly due to university summer classes starting and
partly due to me putting some work into &lt;a href=&#34;https://docs.nixnet.services&#34;&gt;NixNet&amp;rsquo;s
documentation.&lt;/a&gt; After listening to
&lt;a href=&#34;https://2.5admins.com/2-5-admins-04/&#34;&gt;Episode 4 of 2.5 Admins,&lt;/a&gt; I
decided to change some things up with my infrastructure planning and,
instead of automating all the things, document it first. Only after
writing extensive documentation will I look into automating &lt;em&gt;portions&lt;/em&gt;
my setup, like hardening a server directly following installation. To
that end, I&amp;rsquo;ve decided to use
&lt;a href=&#34;https://www.mediawiki.org/wiki/MediaWiki&#34;&gt;MediaWiki.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;After &lt;a href=&#34;https://www.mediawiki.org/wiki/Download&#34;&gt;downloading&lt;/a&gt; and
&lt;a href=&#34;https://www.mediawiki.org/wiki/Manual:Installation_guide&#34;&gt;installing&lt;/a&gt;
MediaWiki, a very straightforward process,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; the next step is
configuring it. There is of course &lt;a href=&#34;https://www.mediawiki.org/wiki/Manual:System_administration&#34;&gt;a
guide&lt;/a&gt; but
I think it can be useful to see someone else&amp;rsquo;s configuration to get
ideas from as well, especially considering how many extensions there
are. I won&amp;rsquo;t go through &lt;em&gt;all&lt;/em&gt; of the settings, just the maybe less
obvious ones.&lt;/p&gt;
&lt;h2 id=&#34;urls&#34;&gt;URLs&lt;/h2&gt;
&lt;p&gt;The first thing in &lt;code&gt;LocalSettings.php&lt;/code&gt; is &lt;code&gt;$wgScriptPath&lt;/code&gt;. Different wikis take vastly different approaches for this. Some fill that variable with &lt;code&gt;&amp;quot;/w&amp;quot;&lt;/code&gt; (default), some with &lt;code&gt;&amp;quot;/view&amp;quot;&lt;/code&gt;, and some with something entirely different. &lt;a href=&#34;https://wikipedia.org/wiki/MediaWiki&#34;&gt;Wikipedia&lt;/a&gt; and all of its children use &lt;code&gt;&amp;quot;/wiki&amp;quot;&lt;/code&gt;. While well and good, the default configuration will have your URLs appearing as &lt;code&gt;example.com/wiki/index.php?title=&amp;lt;page&amp;gt;&lt;/code&gt; and this is bad practise for SEO; if you want your pages easily discoverable, the URLs need to be a bit shorter. The easiest way I&amp;rsquo;ve found to do this is add all of six lines to my NGINX config and set &lt;code&gt;$wgScriptPath&lt;/code&gt; to &lt;code&gt;&amp;quot;&amp;quot;&lt;/code&gt; (an empty string).&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;location / {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    try_files $uri $uri/ @rewrite;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;location @rewrite {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    rewrite ^/(.*)$ /index.php?title=$1&amp;amp;$args;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The snippet above tells NGINX to rewrite all of your site&amp;rsquo;s base URLs
and remove &lt;code&gt;index.php?title=&lt;/code&gt; from them. This is a similar approach to
what &lt;a href=&#34;https://wiki.mozilla.org/Main_Page&#34;&gt;Mozilla&lt;/a&gt; has done. The result
is cleaner URLs that comply with SEO best practises and a setup that
avoids &lt;a href=&#34;https://www.mediawiki.org/wiki/Manual:Wiki_in_site_root_directory&#34;&gt;moving MediaWiki to the site&amp;rsquo;s
root.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;mobile-view&#34;&gt;Mobile view&lt;/h2&gt;
&lt;p&gt;I see a &lt;em&gt;lot&lt;/em&gt; of MediaWiki instances without a good mobile version and,
other than keeping the number of extensions down, I don&amp;rsquo;t really
understand why. Setting it up is incredibly easy and gives everyone a
&lt;em&gt;much&lt;/em&gt; better experience. The &lt;a href=&#34;https://www.mediawiki.org/wiki/Special:MyLanguage/Skin:Minerva_Neue&#34;&gt;Minerva
Neue&lt;/a&gt;
skin is designed specifically for use on mobile devices and is also much
more aggressive about optimisation. Though editing is a terrible
experience, it also looks great on desktop. The
&lt;a href=&#34;https://www.mediawiki.org/wiki/Extension:MobileFrontend&#34;&gt;MobileFrontend&lt;/a&gt;
extension is used to detect the reader&amp;rsquo;s device and serve them either
the configured desktop skin or Minerva Neue. You &lt;em&gt;could&lt;/em&gt; serve a
different skin on mobile but I&amp;rsquo;ve found that Minerva Neue looks the best
by far.&lt;/p&gt;
&lt;p&gt;To set them up, you&amp;rsquo;ll need to download &lt;a href=&#34;https://www.mediawiki.org/wiki/Special:SkinDistributor/MinervaNeue&#34;&gt;the
skin&lt;/a&gt;
and &lt;a href=&#34;https://www.mediawiki.org/wiki/Special:ExtensionDistributor/MobileFrontend&#34;&gt;the
extension.&lt;/a&gt;
From there, you&amp;rsquo;ll need to add a few lines to your config file. On a
side note, I love how dynamic MediaWiki can be, especially with
downloads; providing a copy/paste extraction command that doesn&amp;rsquo;t use
wildcards and puts it in the correct directory is &lt;em&gt;awesome&lt;/em&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# I recommend putting this with the rest of your extensions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;wfLoadExtension( &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;MobileFrontend&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# These can go wherever you want but together is better
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$wgMFDefaultSkinClass&lt;/span&gt; = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;SkinMinerva&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$wgMFAutodetectMobileView&lt;/span&gt; = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;With the skin and extension in place and those lines in your config,
save and reload and there should be a link at the bottom of your wiki
called &lt;code&gt;Mobile view&lt;/code&gt;. Click it and you&amp;rsquo;ll see Minerva! On a phone,
MobileFrontend will automatically serve it but you can force your
default theme by clicking &lt;code&gt;Desktop view&lt;/code&gt; in the same location.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/pngs/mediawiki-skins.png&#34; alt=&#34;Screenshot of the mobile versions of my MediaWiki instance. The left
uses Minerva Neue and the right uses Vector. The left has buttons and
icons that are much larger and easier to tap making for better
accessibility. Though the text is readable, the touch targets are much
too small navigation is hell&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;discussion-pages&#34;&gt;Discussion pages&lt;/h2&gt;
&lt;p&gt;The default discussion page for MediaWiki works but, unless you&amp;rsquo;re
already used to it, it can be quite odd for new people. That&amp;rsquo;s where the
&lt;a href=&#34;https://www.mediawiki.org/wiki/Structured_Discussions&#34;&gt;StructuredDiscussions&lt;/a&gt;
extension comes in. Here&amp;rsquo;s a comparison of before and after enabling it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/pngs/talk-before-after.png&#34; alt=&#34;side-by-side screenshot of my wiki before and after enabling the
extension. the left really is just the default content editor. it&amp;rsquo;s like
giving someone a text editor on a server and asking them to have a
conversation with someone else by editing the same file and saving it to
see replies. the right side is with the extension enabled and gives
buttons to browse by topic and a field to create a new topic. it&amp;rsquo;s very
similar to github&amp;rsquo;s issue tracker, for example, but without the ability
to sort by tags&#34;&gt;&lt;/p&gt;
&lt;p&gt;As I said, the left works but most people wouldn&amp;rsquo;t know what to do when
given the default MediaWiki editor and it raises the barrier for entry.
The right is &lt;em&gt;much&lt;/em&gt; more user-friendly and works exactly how one would
expect. StructuredDiscussions does have a few dependencies but they&amp;rsquo;re
easy to add. &lt;a href=&#34;https://www.mediawiki.org/wiki/Extension:Echo&#34;&gt;Echo&lt;/a&gt; is
for notifications and the others are included by default. After
&lt;a href=&#34;https://www.mediawiki.org/wiki/Special:ExtensionDistributor/Echo&#34;&gt;installing
it,&lt;/a&gt;
and
&lt;a href=&#34;https://www.mediawiki.org/wiki/Special:ExtensionDistributor/Flow&#34;&gt;StructuredDiscussions,&lt;/a&gt;
add the following lines to your &lt;code&gt;LocalSettings.php&lt;/code&gt;.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# With the rest of your extensions
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;wfLoadExtension( &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;Echo&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;wfLoadExtension( &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;Flow&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Running the following commands is necessary because MediaWiki&amp;rsquo;s database
needs modification to support the extension. General talk pages are
&lt;code&gt;--ns=1&lt;/code&gt; and &lt;code&gt;User:Talk&lt;/code&gt; pages are &lt;code&gt;--ns=3&lt;/code&gt;. If you only want Structured
Discussions enabled for one of them, only run that one. I personally
recommend doing it for all.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php maintenance/populateContentModel.php --wiki=somewiki --ns=1 --table=revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php maintenance/populateContentModel.php --wiki=somewiki --ns=1 --table=archive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php maintenance/populateContentModel.php --wiki=somewiki --ns=1 --table=page
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php maintenance/populateContentModel.php --wiki=somewiki --ns=3 --table=revision
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php maintenance/populateContentModel.php --wiki=somewiki --ns=3 --table=archive
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;php maintenance/populateContentModel.php --wiki=somewiki --ns=3 --table=page
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;After that, add these to actually enable the extension. To temporarily
disable it, you can comment them out but I don&amp;rsquo;t know how that will
affect talk pages that already exist.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# Flow (discussions) configuration
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$wgNamespaceContentModels&lt;/span&gt;[NS_TALK] = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;flow-board&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$wgNamespaceContentModels&lt;/span&gt;[NS_USER_TALK] = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;flow-board&amp;#39;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;subpages&#34;&gt;Subpages&lt;/h2&gt;
&lt;p&gt;One of the features I&amp;rsquo;ll be making heavy use of for my &lt;a href=&#34;https://docs.nixnet.services/Category:Privacy_policies&#34;&gt;Privacy
Policies&lt;/a&gt; and
&lt;a href=&#34;https://docs.nixnet.services/Category:Terms_of_Service&#34;&gt;Terms of
Service&lt;/a&gt; pages
is &lt;a href=&#34;https://www.mediawiki.org/wiki/Help:Subpages&#34;&gt;Subpages.&lt;/a&gt; This allows
you to create pages entitled &lt;code&gt;Parent/Child&lt;/code&gt; and the child automatically
links back to the parent at the top. This can be seen in
&lt;a href=&#34;https://wiki.mozilla.org/Apps/Security/Other&#34;&gt;Mozilla&lt;/a&gt; and &lt;a href=&#34;https://wiki.archlinux.org/index.php/Firefox/Privacy&#34;&gt;Arch
Linux&amp;rsquo;s&lt;/a&gt; wikis
right under the header and &lt;a href=&#34;https://docs.nixnet.services/DNS/Privacy&#34;&gt;in mine as
well.&lt;/a&gt; Enabling it is quite
simple; just add the following line to your config.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;## Enable subpages for all namespaces
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$wgNamespacesWithSubpages&lt;/span&gt;[NS_MAIN] = &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;syntax-highlighting&#34;&gt;Syntax highlighting&lt;/h2&gt;
&lt;p&gt;The final configuration change I&amp;rsquo;ve made (so far) has been to enable
syntax highlighting in the default editor with
&lt;a href=&#34;https://www.mediawiki.org/wiki/Extension:CodeMirror&#34;&gt;CodeMirror.&lt;/a&gt; After
&lt;a href=&#34;https://www.mediawiki.org/wiki/Special:ExtensionDistributor/CodeMirror&#34;&gt;installing
it,&lt;/a&gt;
add these lines to your config and you&amp;rsquo;re done!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-php&#34; data-lang=&#34;php&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# Place with the other extensions as always
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;wfLoadExtension( &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;CodeMirror&amp;#39;&lt;/span&gt; );
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;# Enables it by default but allows users to disable it
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$wgDefaultUserOptions&lt;/span&gt;[&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;usecodemirror&amp;#39;&lt;/span&gt;] = 1;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;../assets/pngs/mediawiki-highlight.png&#34; alt=&#34;screenshot of the mediawiki editor. headers are larger, code blocks
are highlighted, links blue with link text black so it&amp;rsquo;s easy to pick
out, etc. In all, it&amp;rsquo;s a much nicer
experience.&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;editing-in-vim&#34;&gt;Editing in Vim&lt;/h2&gt;
&lt;p&gt;The final tip I have is that you can edit pretty much &lt;em&gt;any&lt;/em&gt; MediaWiki
instance in Vim, including Wikipedia itself, with &lt;a href=&#34;https://github.com/aquach/vim-mediawiki-editor&#34;&gt;a simple
plugin.&lt;/a&gt; The only
drawback I&amp;rsquo;ve found is that, unless you store your password in your
config, you&amp;rsquo;ll have to enter it every time you close and reopen Vim. You
can also give Vim &lt;a href=&#34;https://en.wikipedia.org/wiki/Help:Text_editor_support#Vim&#34;&gt;Wikitext syntax
highlighting&lt;/a&gt;
for creating MediaWiki pages when offline. A few days ago, my wiki was
completely offline while taking a disk image backup but I still wrote
the majority of the &lt;a href=&#34;https://docs.nixnet.services/Libvirt&#34;&gt;libvirt&lt;/a&gt; and
&lt;a href=&#34;https://docs.nixnet.services/Debian&#34;&gt;Debian&lt;/a&gt; pages while I waited and
the highlighting was really nice.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk.&lt;/a&gt; If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;If you&amp;rsquo;re having issues, feel free to contact me and I&amp;rsquo;ll help
where I can.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>A (Mostly) Google-Free Android</title>
      <link>https://secluded.site/a-mostly-google-free-android/</link>
      <category>FLOSS/Android/Google/Mobile/100 Days To Offload</category>>
      <pubDate>Mon, 18 May 2020 15:28:02 -0400</pubDate>
      <guid>https://secluded.site/a-mostly-google-free-android/</guid>
      <description>&lt;p&gt;Let me put a little disclaimer right here at the beginning: I don&amp;rsquo;t use
my mobile phone how a lot of people do so your mileage will vary. I also
say &amp;ldquo;Mostly&amp;rdquo; in the title because it&amp;rsquo;s incredibly difficult to
&lt;em&gt;completely&lt;/em&gt; remove Google from Android though &lt;a href=&#34;https://www.replicant.us/&#34;&gt;some
projects&lt;/a&gt; have done a very good job of it.&lt;/p&gt;
&lt;h2 id=&#34;my-motivation&#34;&gt;My motivation&lt;/h2&gt;
&lt;p&gt;In short, I value my privacy and Google is about as far from
privacy-friendly as you can get. What information algorithms are capable
of extrapolating given enough data is downright &lt;em&gt;scary&lt;/em&gt; and &lt;strong&gt;&lt;a href=&#34;https://www.eff.org/deeplinks/2020/03/google-says-it-doesnt-sell-your-data-heres-how-company-shares-monetizes-and&#34;&gt;that is
Google&amp;rsquo;s entire business
model.&lt;/a&gt;&lt;/strong&gt;
In addition, the company itself is &lt;a href=&#34;https://www.alphabetworkers.org/resignation-letter/&#34;&gt;really quite
terrible,&lt;/a&gt; from
&lt;a href=&#34;https://theintercept.com/2018/08/01/google-china-search-engine-censorship/&#34;&gt;launching a censored search engine in
China&lt;/a&gt;
and &lt;a href=&#34;https://gizmodo.com/google-employees-resign-in-protest-against-pentagon-con-1825729300&#34;&gt;selling AI tech to the US
military&lt;/a&gt;
to &lt;a href=&#34;https://gizmodo.com/massive-google-walkout-over-sexual-misconduct-marks-tec-1830157276&#34;&gt;mishandling sexual assault
cases&lt;/a&gt;
and &lt;a href=&#34;https://www.cnbc.com/2018/07/10/eu-hits-alphabet-google-with-android-antitrust-fine.html&#34;&gt;forcing people onto Google services with sheer market
dominance.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;I do not like Google and I do not want it on my phone.&lt;/p&gt;
&lt;h2 id=&#34;what-im-using&#34;&gt;What I&amp;rsquo;m using&lt;/h2&gt;
&lt;p&gt;I have the &lt;a href=&#34;https://www.mi.com/in/redmi-note-5-pro/&#34;&gt;Redmi Note 5 Pro&lt;/a&gt;
and love it. Specifically, one of the things I like is Xiaomi&amp;rsquo;s business
model. It&amp;rsquo;s exactly the same as Google&amp;rsquo;s—data collection and
advertising—but it&amp;rsquo;s incredibly easy to circumvent. Xiaomi not only uses
its &lt;a href=&#34;https://en.miui.com/&#34;&gt;MIUI&lt;/a&gt; (&lt;em&gt;me-you-eye&lt;/em&gt;) for user tracking and
profiling but it also displays ads on the lock screen and elsewhere.
Because of all that, they&amp;rsquo;re able to &lt;em&gt;seriously&lt;/em&gt; drop the price on their
phones and almost sell them at no more than the hardware and
manufacturing cost.&lt;/p&gt;
&lt;p&gt;Circumventing the data collection is as easy as flashing your own ROM; I
prefer &lt;a href=&#34;https://aospextended.com/&#34;&gt;AospExtended&lt;/a&gt; though
&lt;a href=&#34;https://lineageos.org/&#34;&gt;LineageOS&lt;/a&gt; is a much simpler and &amp;ldquo;cleaner&amp;rdquo;
Android experience. Many of the installation guide will tell you to
flash some &lt;a href=&#34;https://opengapps.org/&#34;&gt;Open GApps&lt;/a&gt; package but I don&amp;rsquo;t.
Others will say to use &lt;a href=&#34;https://microg.org/&#34;&gt;microG,&lt;/a&gt; which is much
better but I decided to even omit that the last time I flashed my phone.
Thus, I have absolutely no compatibility with Google Services and apps
that break without it, well, break.&lt;/p&gt;
&lt;p&gt;I also have the &lt;a href=&#34;https://www.mi.com/global/mi-smart-band-4&#34;&gt;Mi Band 4&lt;/a&gt;
which does give Xiaomi the ability to collect a plethora of biometric
data as well … if I use their app. Instead, I like
&lt;a href=&#34;https://codeberg.org/Freeyourgadget/Gadgetbridge/&#34;&gt;Gadgetbridge&lt;/a&gt; from
&lt;a href=&#34;https://f-droid.org/en/packages/nodomain.freeyourgadget.gadgetbridge/&#34;&gt;F-Droid.&lt;/a&gt;
I do occasionally want proprietary apps such as
&lt;a href=&#34;https://www.linguee.com/&#34;&gt;Linguee&lt;/a&gt; for English/German translation and I
get those through &lt;a href=&#34;https://auroraoss.com/&#34;&gt;Aurora&lt;/a&gt; rather than Google
Play.&lt;/p&gt;
&lt;h2 id=&#34;what-its-like&#34;&gt;What it&amp;rsquo;s like&lt;/h2&gt;
&lt;p&gt;I mentioned that some apps will break without Google Services, however,
I find that they are solidly in the minority; most proprietary
applications will work perfectly fine without Google Services or microG
though you won&amp;rsquo;t get push notifications. That&amp;rsquo;s really not a big deal
for me because I&amp;rsquo;ve been moving to a more minimal mobile experience and
do most things on my desktop anyway. This is closely related to the
disclaimer at the top. I rarely use my phone for anything other than
communication through open source apps and listening to podcasts; I
don&amp;rsquo;t even have an email client installed (but if I did, it would be
&lt;a href=&#34;https://k9mail.app/&#34;&gt;K-9 Mail.&lt;/a&gt;) In all, it&amp;rsquo;s perfectly useable but
don&amp;rsquo;t expect your banking application to work.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk&lt;/a&gt;. If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Why would you bank on mobile anyway? Mobile platforms are some of
the most insecure and something that sensitive should be kept far
away.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>The House of San Balay</title>
      <link>https://secluded.site/the-house-of-san-balay/</link>
      <pubDate>Thu, 14 May 2020 16:04:05 -0400</pubDate>
      <guid>https://secluded.site/the-house-of-san-balay/</guid>
      <description>&lt;p&gt;Today, our primary purpose was to gather information. We rose, ate a quick breakfast, and then headed into the city. Saltmarsh is a very busy, bustling little town. Ships were loading and unloading at the docks, there were taverns, historical centres, statues, restaurants, people going about their day and hurrying off in this direction or that, etc. In the distance and to the right, we noticed a little house on a cliff overlooking the ocean. That was the house we were to inspect.&lt;/p&gt;
&lt;p&gt;As a sage, I&amp;rsquo;m generally knowledgeable about academic locations. That includes museums and there was just such a place in Saltmarsh. It&amp;rsquo;s run by a few of the more … experienced village elders who have been around for some time. I headed in that direction with Iliris and Doctor Reed following further behind. However, Doctor Reed focused more on finding other villagers he could glean some information from. As we ventured closer to the Historical Society, he did find one and asked about the &amp;ldquo;fancy house on the hill&amp;rdquo;. The man&amp;rsquo;s response was that it would soon be torn down; the council spent quite a lot of money to commission some warships and that cliff was where they planned to provision them with weaponry. After cautioning us to avoid it, he bade us farewell and continued on his way.&lt;/p&gt;
&lt;p&gt;At the historical society, I inquired about the house on the hill as well. One of the elders said that the former owner of the residence, San Balay, was haunting it and most people wouldn&amp;rsquo;t go near the house anyway; there were monsters living in the garden who attacked anyone that attempted entry. Another said that it was a relatively small troll and that she had seen it with her own eyes. Yet another said it was not a troll, just a rather large rodent. The last elder dismissed the others with a wave of his hand saying it was just the town bum rummaging in the trash and he didn&amp;rsquo;t even live near the house. The conflicting reports in mind, I turned to Iliris to see if he had anything further to add.&lt;/p&gt;
&lt;p&gt;He walked up to the oldest man and asked if he could point him to someone able to sell him an estate in town. The old man said that Iliris wanted the Dock Master, Anders Solnar, as he was in charge of most things. At that, Iliris simply left and waited by the building entry.&lt;/p&gt;
&lt;p&gt;I was unsatisfied with the information we had been given so I stayed and asked a few more questions about San Balay himself. He came into the town and took up residence in an apartment for a &lt;em&gt;long&lt;/em&gt; time. No one knew anything about him, he never talked to anyone, and no one could figure out what he did for a living. One day, he plopped down a ton of money to buy the house in the hill, moved in, and no one ever heard from him after. He occasionally came into town for food but nothing else. He hadn&amp;rsquo;t been seen in five years so everyone assumes he is dead. Thanking the old ones for their help Dr. Reed and I join Iliris outside the building.&lt;/p&gt;
&lt;p&gt;By that time, it was midday and the town was still busy. Iliris suggested that Dr Reed hide his armour and I hide my quarterstaff. After doing so, he cryptically bade us follow him, fluffing up his coat and donning an air of importance. He took off in the direction of the dock where we were directed to a fancy, very ornamental ship that looked as if it had been repurposed for an office.&lt;/p&gt;
&lt;p&gt;Remaining puffed up, Iliris approached Solnar saying that he wanted to buy property here and he already owned estates in Neverwinter, Waterdeep, and a number of other cities. The Dockmaster stroked his beard, eyed Iliris&amp;rsquo;s gilded coat, and said that they had previously planned to demolish it but they were open for negotiation. Iliris replied by saying that his company was looking to expand their business to the city, to which said that things can be negotiated and that the house is available for a price; they could part with it for 30,000 gold pieces. Iliris asked if there was anything he should know about it before making his counteroffer. Solnar replied saying that there were local children&amp;rsquo;s stories about it but brushed the question off. Negotiations continued as they discussed prices, local opinion, what would be required for it to be liveable, and so on. Iliris concluded the discussion by saying that he and his two associates (Dr. Reed and I) would go by the estate to determine its value for themselves. In the ensuing discussion, the dock master said that there was a back door and that we should be wary of the garden; a group of weasels had taken up residence in the vicinity. Thanking him for his time, we took our leave.&lt;/p&gt;
&lt;p&gt;We set off for the residence and, on the way, came upon another house inhabited by a Minotaur. Dr. Reed and I entered, intending to inquire a bit more about the house; he lived closer than anyone else so he surely must have had some good information. As we went to walk through the doorway, an old friend of mine, Arrod the Silent, appeared beside me. There was no sound so, having already turned back inside, the Minotaur didn&amp;rsquo;t notice. The rest of us, however, were startled but we didn&amp;rsquo;t want to alarm our host and acted as if he had been with us the whole time. The whole encounter was rather awkward and we didn&amp;rsquo;t learn much. After leaving, Iliris roughly confronted Arrod and demanded to know who he was. I hadn&amp;rsquo;t seen him for many years and wasn&amp;rsquo;t sure myself so I did my best to explain.&lt;/p&gt;
&lt;p&gt;Arrod hailed from the Town of Old Host, a hub for adventurers in the Kingdom of Dugall. He and his friends grew up seeing brave men and women set out on their journeys and witnessed them returning to a comfortable life of wealth and fame. Fuelled by these tales of renown, they made a pact to do the same once they came of age. As the oldest, Arrod set off as soon as he turned 16, promising to return with enough experience to show the rest how things were done and keep them same. It was during these early adventures that he and I met and we quickly formed a bond. The others slowly joined Arrod and I as they grew and, on the day the youngest turned 16, we parted ways. I continued on my way and Arrod and his friends on theirs. The rest of what I know is simply hearsay; Arrod hasn&amp;rsquo;t spoken a word in many years.&lt;/p&gt;
&lt;p&gt;The party now complete, he was unanimously appointed leader. Confident in his own skill and that of his companions, they set out to slay a strange beast. Rumours were that is was either a giant with dwarf-ism or a dwarf with giant-ism and that it was terrorizing a village to the north. They travelled several days until they came to said village. As they were making camp, the creature came back into the village and, immediately seeing them, charged. They thought it would be an easy fight but it turned out to be exactly the opposite; the beast was a &lt;em&gt;towering&lt;/em&gt; goliath. Arrod was forced to watch as it slaughtered every member of the party. Before it had the chance to turn its attention to him, the young man fled. He spent the next few years seeking a way to bring them back and ended up finding a necromancer that agreed to assist him. Unfortunately, that assistance took a malicious form; at random times, Arrod was teleported to the Underworld where he would sift through the dead, searching for his friends. The necromancer also took his voice and that&amp;rsquo;s when he became known as Arrod the Silent.&lt;/p&gt;
&lt;p&gt;That&amp;rsquo;s all I have time to write this evening. Hopefully, tomorrow will be a bit more calm and I&amp;rsquo;ll be able to finish recording everything that has transpired.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Calcurse Notifications</title>
      <link>https://secluded.site/calcurse-notifications/</link>
      <category>Calcurse/CLI/Notifications/100 Days To Offload</category>>
      <pubDate>Wed, 13 May 2020 22:23:25 -0400</pubDate>
      <guid>https://secluded.site/calcurse-notifications/</guid>
      <description>&lt;p&gt;I recently started using &lt;a href=&#34;https://github.com/lfos/calcurse&#34;&gt;calcurse&lt;/a&gt;
for my calendar and one of its limitations is good notification support
in the generally accepted meaning of the word. The developer has &lt;a href=&#34;https://github.com/lfos/calcurse/issues/285#issuecomment-620841221&#34;&gt;a
different
opinion&lt;/a&gt;
and that&amp;rsquo;s perfectly alright but traditional notifications are a feature
I heavily rely on and calcurse doesn&amp;rsquo;t handle handle them very well; it
leaves the user to figure something out on their own. Inspired by &lt;a href=&#34;https://github.com/lfos/calcurse/issues/286#issue-608118188&#34;&gt;one
individual&amp;rsquo;s
issue,&lt;/a&gt; I
did just that.&lt;/p&gt;
&lt;p&gt;A quick glance at &lt;code&gt;man calcurse&lt;/code&gt; reveals this section:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-n, --next
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Print the first appointment within the next 24 hours. The
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    printed time is the number of hours and minutes left before
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    this appointment.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The output of running &lt;code&gt;calcurse -n&lt;/code&gt;, for me and at the moment, looks
like this:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;$ calcurse -n
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;next appointment:
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;   [17:25] DnD on Mumble
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s all well and good but not really something you&amp;rsquo;d want in a
notification; it needs to be filtered down so it only shows the name of
the event, &lt;code&gt;DnD on Mumble&lt;/code&gt;. To do this, I turned to the man pages of
standard CLI utilities &lt;code&gt;tail&lt;/code&gt; and &lt;code&gt;cut&lt;/code&gt;. &lt;code&gt;tail&lt;/code&gt; allows us to filter the
output to only the last line&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; with &lt;code&gt;tail -1&lt;/code&gt;. &lt;code&gt;cut&lt;/code&gt; is a little more
complicated but will allow us to remove the first few columns of text.
&lt;code&gt;cut -d &#39; &#39; -f 5-&lt;/code&gt; is the next snippet in this one-liner. &lt;code&gt;-d &#39; &#39;&lt;/code&gt; tells
cut to use a single space as the delimiter, &lt;code&gt;-f&lt;/code&gt; specifies the fields to
keep, and &lt;code&gt;-5&lt;/code&gt; says to use all fields starting with the 5th because
there are a few spaces preceding the content we want. Chain all of this
mess together with pipes and we get:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;calcurse -n | tail -1 | cut -d &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 5-
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Great. Now we need to actually get a notification containing the
resulting string. This can be achieved by storing it in a variable then
using it with &lt;code&gt;notify-send&lt;/code&gt;. You likely already have &lt;code&gt;notify-send&lt;/code&gt;
installed if you&amp;rsquo;re using Linux but, if you don&amp;rsquo;t, I would recommend
looking around to see what&amp;rsquo;s default and using that instead.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;CONT&lt;/span&gt;=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;$(&lt;/span&gt;calcurse -n | tail -1 | cut -d &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 5- -&lt;span style=&#34;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt; &amp;amp;&amp;amp; notify-send &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Calcurse Event&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$CONT&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now we&amp;rsquo;re actually getting somewhere. With my setup, the notification
looks like this: &lt;img src=&#34;../assets/jpgs/notification.jpg&#34; alt=&#34;It&amp;rsquo;s a screenshot of my desktop with a notification
in the top right corner. The title is &amp;ldquo;Calcurse Event&amp;rdquo; and the text
below is &amp;ldquo;DnD on Mumble&amp;rdquo;. Surrounding the text is a solid border. Its
position and the border are all that designate it as a notification: the
background and text colour match the rest of my desktop which is themed
with the base16-unikitty-dark scheme&#34;&gt;&lt;/p&gt;
&lt;p&gt;It&amp;rsquo;s certainly passable and sufficient for some but I&amp;rsquo;d like an icon so
I can see what the notification is for out of the corner of my eye and
decide whether or not to glance over. Thankfully, &lt;code&gt;notify-send&lt;/code&gt; has this
built in with the &lt;code&gt;-i&lt;/code&gt; flag.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;-i, --icon=ICON[,ICON...]
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    Specifies an icon filename or stock icon to display.
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Now it&amp;rsquo;s just a matter of figuring out what icon to use. You can
certainly pass the path of whatever image you want to it, such as
&lt;code&gt;~/Pictures/calendar-icon.png&lt;/code&gt;, but I want something that fits in with
the rest of my icons. These are found in:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/share/icons/&amp;lt;theme&amp;gt;/it/depends/on/theme
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I use &lt;a href=&#34;https://github.com/gusbemacbe/suru-plus-dark&#34;&gt;Suru++ Dark&lt;/a&gt; and
the icon I&amp;rsquo;m using can be found at:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;/usr/share/icons/Suru++-Dark/apps/32@2x/calendar.svg
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It&amp;rsquo;s different for Adwaita and all the rest though; you&amp;rsquo;ll have to do
some digging. It&amp;rsquo;s also worth noting that, if you don&amp;rsquo;t have this theme
installed on another device, the icon won&amp;rsquo;t show up.&lt;/p&gt;
&lt;p&gt;After all that, here&amp;rsquo;s my notification command and a screenshot.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;CONT&lt;/span&gt;=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;$(&lt;/span&gt;calcurse -n | tail -1 | cut -d &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39; &amp;#39;&lt;/span&gt; -f 5-&lt;span style=&#34;font-weight:bold&#34;&gt;)&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt; &amp;amp;&amp;amp; notify-send -i /usr/share/icons/Suru++-Dark/apps/32@2x/calendar.svg &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Calcurse Event&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;$CONT&lt;/span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;../assets/jpgs/notification-icon.jpg&#34; alt=&#34;This is a screenshot like the last one but with an attractive icon to
the left of the text&#34;&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk.&lt;/a&gt; If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The opposite of &lt;code&gt;tail&lt;/code&gt; is &lt;code&gt;head&lt;/code&gt; and allows for exactly the same
thing in reverse: &lt;code&gt;head -1&lt;/code&gt; will return the first line of whatever
input it&amp;rsquo;s given.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Adding A (Better) Scroll To Top Button Without JavaScript</title>
      <link>https://secluded.site/adding-a-better-scroll-to-top-button-without-javascript/</link>
      <category>100 Days To Offload/HTML/CSS/Websites</category>>
      <pubDate>Mon, 11 May 2020 20:39:00 -0400</pubDate>
      <guid>https://secluded.site/adding-a-better-scroll-to-top-button-without-javascript/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m a fan of using as little JavaScript as feasible on a website and
implementing a scroll-to-top button in JS is just ridiculous.
Nevertheless, there seems to be a plethora of copypasta for it so I
thought I would write about implementing one in pure HTML and CSS. The
title is just a playful poke at &lt;a href=&#34;https://kevq.uk&#34;&gt;Kev Quirk&lt;/a&gt; who
recently posted about &lt;a href=&#34;https://kevq.uk/adding-a-scroll-to-top-button-without-javascript/&#34;&gt;exactly the same
thing&lt;/a&gt;
but with different styling &amp;#x1f609;&lt;/p&gt;
&lt;h2 id=&#34;html&#34;&gt;HTML&lt;/h2&gt;
&lt;p&gt;There&amp;rsquo;s only one attribute to add to an existing HTML tag near the top
of your page and a single line for the button itself.&lt;/p&gt;
&lt;p&gt;For the attribute, you&amp;rsquo;ll need to use an
&lt;a href=&#34;https://www.w3schools.com/hTML/html_id.asp&#34;&gt;ID.&lt;/a&gt; When the button is
clicked, the user will be taken to whatever element has this attribute.
For my site, I simply added it to the header at the very top.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;header class=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;header&amp;#34;&lt;/span&gt; id=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;All that&amp;rsquo;s required for the button is:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;a href=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#top&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;button class=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;top&amp;#34;&lt;/span&gt;&amp;gt;Top&amp;lt;/button&amp;gt;&amp;lt;/a&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;css&#34;&gt;CSS&lt;/h2&gt;
&lt;p&gt;The basic HTML above is exactly the same as what Kev&amp;rsquo;s article has. The
CSS is where ours will diverge. Having a button at the very bottom of
the page is perfectly fine but I use my site as more than a blog; it&amp;rsquo;s
reasonable to expect visitors to simply search for a link or whatever
else and move on. Having a floating button that stays in the same place
as the user scrolls is a good way to facilitate this.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-css&#34; data-lang=&#34;css&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.&lt;span style=&#34;color:#666;font-weight:bold;font-style:italic&#34;&gt;top&lt;/span&gt; {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;position&lt;/span&gt;: &lt;span style=&#34;font-weight:bold&#34;&gt;fixed&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;bottom&lt;/span&gt;: 10&lt;span style=&#34;font-weight:bold&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;right&lt;/span&gt;: 10&lt;span style=&#34;font-weight:bold&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;max-width&lt;/span&gt;: 50&lt;span style=&#34;font-weight:bold&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;max-height&lt;/span&gt;: 50&lt;span style=&#34;font-weight:bold&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;width&lt;/span&gt;: 100&lt;span style=&#34;font-weight:bold&#34;&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;height&lt;/span&gt;: 100&lt;span style=&#34;font-weight:bold&#34;&gt;%&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;padding&lt;/span&gt;: .5&lt;span style=&#34;font-weight:bold&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;border-radius&lt;/span&gt;: 8&lt;span style=&#34;font-weight:bold&#34;&gt;px&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;justify-content&lt;/span&gt;: &lt;span style=&#34;font-weight:bold&#34;&gt;center&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;background&lt;/span&gt;: #3b3d42;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;font-size&lt;/span&gt;: 1&lt;span style=&#34;font-weight:bold&#34;&gt;rem&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;font-weight&lt;/span&gt;: 800;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;text-decoration&lt;/span&gt;: &lt;span style=&#34;font-weight:bold&#34;&gt;none&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;font-weight:bold&#34;&gt;cursor&lt;/span&gt;: &lt;span style=&#34;font-weight:bold&#34;&gt;pointer&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The &lt;code&gt;position&lt;/code&gt;, &lt;code&gt;bottom&lt;/code&gt;, and &lt;code&gt;right&lt;/code&gt; lines are what tell your browser
to render the item in the bottom right. The position is &lt;code&gt;fixed&lt;/code&gt; so that
means we can put it wherever on the page we want and it will stay there
as the user scrolls. &lt;code&gt;right&lt;/code&gt; and &lt;code&gt;bottom&lt;/code&gt; say that the element is to be
positioned 10 pixels above the bottom of the page and 10 pixels from the
right. It&amp;rsquo;s rather hidden on desktop but I&amp;rsquo;m not expecting desktop users
to click it very often; that&amp;rsquo;s what the &lt;code&gt;Home&lt;/code&gt; key is for, after all,
and it works across every website. I&amp;rsquo;m expecting mobile users to make
use of it the most.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk&lt;/a&gt;. If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Pausing 100 Days to Offload</title>
      <link>https://secluded.site/pausing-100-days-to-offload/</link>
      <category>School/100 Days To Offload</category>>
      <pubDate>Mon, 04 May 2020 21:57:27 -0400</pubDate>
      <guid>https://secluded.site/pausing-100-days-to-offload/</guid>
      <description>&lt;p&gt;I&amp;rsquo;m only 8 days into 100 Days To Offload and I&amp;rsquo;ve already missed two. The
biggest reason is that this is finals week and all my time right now is taken up
by studying for exams. As I said on the Fediverse (dead link to post), I have
been exhausted the past little while and I&amp;rsquo;m not getting nearly as much sleep as
I really need. I&amp;rsquo;ve enjoyed it so far but I&amp;rsquo;m going to take a break until finals
are over; I&amp;rsquo;ll still be coming up with post ideas, however, I just won&amp;rsquo;t
actually write or publish them.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Day 6 Updates</title>
      <link>https://secluded.site/day-6-updates/</link>
      <category>Zettelkasten/Doom Emacs/Emacs/NixNet/100 Days To Offload</category>>
      <pubDate>Sun, 03 May 2020 01:57:03 -0400</pubDate>
      <guid>https://secluded.site/day-6-updates/</guid>
      <description>&lt;p&gt;I haven&amp;rsquo;t been able to come up with a specific topic for today so this
is just a kind of generic update about me.&lt;/p&gt;
&lt;h2 id=&#34;zettelkasten&#34;&gt;Zettelkasten&lt;/h2&gt;
&lt;p&gt;In my &lt;a href=&#34;../vim-as-a-markdown-editor/&#34;&gt;previous post about Vim,&lt;/a&gt; I briefly
mentioned being inspired to create a Zettelkasten by Daryl Sun in &lt;a href=&#34;https://write.privacytools.io/darylsun/100-days-to-offload-day-4&#34;&gt;his
fourth 100 Days To Offload
post.&lt;/a&gt;
A Zettelkasten is a personal knowledge management tool that allows one
to quickly retrieve useful information about a subject, relearn
forgotten concepts, and discover connections between those concepts to
form entirely new ideas. There are different processes recommended by
different people but I think it&amp;rsquo;s a very personal choice and depends on
what your workflow will look like. Mine will be as follows.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Take &lt;em&gt;very&lt;/em&gt; concise notes on something I learned in a &lt;em&gt;physical&lt;/em&gt;
notebook&lt;/li&gt;
&lt;li&gt;When I&amp;rsquo;m able, go through those notes and add them to my &lt;a href=&#34;https://git.nixnet.services/Amolith/zettelkasten&#34;&gt;digital
Zettelkasten,&lt;/a&gt; expanding
them a little and fleshing the thought out more&lt;/li&gt;
&lt;/ol&gt;
&lt;p&gt;The last step is &lt;em&gt;the most important&lt;/em&gt; as this is the one where you sit
down and think about what you&amp;rsquo;re adding and try to draw connections
between it and what you already know. The goal is not to make the
longest and most complete notes in the world but to add value to each
&lt;em&gt;concise&lt;/em&gt; thought by linking it with others and build a web for you to
explore later. You might not see immediate benefits but a mature
Zettelkasten with hundreds of entries will constantly surprise you as
you tumble into your own store of knowledge and rediscover things. That
surprise is actually one of the greatest benefits to this kind of
knowledge management system; when something is surprising, we tend to
remember it better.&lt;/p&gt;
&lt;h2 id=&#34;doom-emacs&#34;&gt;Doom Emacs&lt;/h2&gt;
&lt;p&gt;A friend of mine convinced my to try &lt;a href=&#34;https://github.com/hlissner/doom-emacs&#34;&gt;Doom
Emacs&lt;/a&gt; and, so far, I am very
impressed. Emacs itself is very powerful but, from what I can tell, this
configuration adds a &lt;em&gt;lot&lt;/em&gt; of value. The main one being Vim keybindings
&amp;#x1f609; I&amp;rsquo;m looking forward to learning &lt;a href=&#34;https://orgmode.org/&#34;&gt;org-mode&lt;/a&gt; and
seeing what it can do for my productivity. As a text editor and
programming tool, I plan to stick with &lt;a href=&#34;https://neovim.io/&#34;&gt;Neovim&lt;/a&gt; on
desktop/laptop, &lt;a href=&#34;https://www.vim.org/&#34;&gt;Vim&lt;/a&gt; on Debian-based systems,
&lt;a href=&#34;https://wikipedia.org/wiki/Vi&#34;&gt;vi&lt;/a&gt; wherever else.&lt;/p&gt;
&lt;h2 id=&#34;nixnet-plans&#34;&gt;NixNet plans&lt;/h2&gt;
&lt;p&gt;Today, I fleshed out some of my thoughts on reprovisioning all of my over the
summer. I&amp;rsquo;m going to have &lt;a href=&#34;https://docs.ansible.com/&#34;&gt;Ansible&lt;/a&gt; or
&lt;a href=&#34;https://docs.saltstack.com/en/latest/&#34;&gt;Salt&lt;/a&gt; build and deploy
&lt;a href=&#34;https://linuxcontainers.org/lxc/introduction/&#34;&gt;LXC&lt;/a&gt; containers to a baremetal
server from &lt;a href=&#34;https://www.hetzner.com/sb&#34;&gt;Hetzner&lt;/a&gt; running a &lt;em&gt;very&lt;/em&gt; minimal
&lt;a href=&#34;https://alpinelinux.org/&#34;&gt;Alpine Linux&lt;/a&gt; installation. Whatever setup I have for
those will of course be available on
&lt;a href=&#34;https://git.nixnet.services/NixNet&#34;&gt;Gitea.&lt;/a&gt; From there, my local NAS will use
something like &lt;a href=&#34;https://torsion.org/borgmatic/&#34;&gt;borgmatic&lt;/a&gt; to back up files and
databases from all of my servers and
&lt;a href=&#34;https://linuxcontainers.org/lxd/introduction/&#34;&gt;LXD&lt;/a&gt; to create container
snapshots&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;. All of that will be mirrored to
&lt;a href=&#34;https://www.backblaze.com/&#34;&gt;BackBlaze&lt;/a&gt; likely using their B2 model as paying
per GB per month is generally the most reliable option. Under one of the others,
there&amp;rsquo;s always the possibility that I might upload more than they think is
reasonable and start limiting me in some way.&lt;/p&gt;
&lt;p&gt;Short-term, I&amp;rsquo;m going to consolidate some of my servers to a single
baremetal machine from Hetzner. Long-term, I&amp;rsquo;m going to look into
building and racking my own servers in a datacenter in Germany, likely
one of Hetzner&amp;rsquo;s. This comes with a plethora of benefits but a pretty
major detriment: the up-front cost will be absolutely &lt;em&gt;massive&lt;/em&gt;.
Building a rack server worth putting in a datacenter will be incredibly
expensive at the start. Following that, all I have to pay is a monthly
fee for however much space it uses in the rack and it won&amp;rsquo;t be too much.
Before any of that is even considered, I&amp;rsquo;m going to be spending a lot of
time discussing things with my father; he did a lot of racking before he
got his current sysadmin job and has a ton of advice to give, from using
VoIP to powercycle the server to what networking gear to look at and how
to organise everything within the rack.&lt;/p&gt;
&lt;p&gt;I have a lot of really big plans.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;This one isn&amp;rsquo;t &lt;em&gt;really&lt;/em&gt; necessary as building the containers with
Ansible/Salt is automated and it&amp;rsquo;s a simple process to rebuild them.
Snapshots might just take less time to redeploy should something go
wrong.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Vim as a Markdown Editor</title>
      <link>https://secluded.site/vim-as-a-markdown-editor/</link>
      <category>Vim/Markdown/Zettelkasten/100 Days To Offload</category>>
      <pubDate>Thu, 30 Apr 2020 23:06:59 -0400</pubDate>
      <guid>https://secluded.site/vim-as-a-markdown-editor/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve recently decided to attempt to keep all of my notes and everything
I&amp;rsquo;ve learned in a &lt;a href=&#34;https://zettelkasten.de/&#34;&gt;Zettelkasten.&lt;/a&gt; After
reading &lt;a href=&#34;https://write.privacytools.io/darylsun/100-days-to-offload-day-4&#34;&gt;Daryl Sun&amp;rsquo;s blog
post,&lt;/a&gt;
I started looking more into the method and found it &lt;em&gt;incredibly&lt;/em&gt;
intriguing. I&amp;rsquo;ve tried the &amp;ldquo;Evernote way&amp;rdquo; of throwing everything I come
across in a single place but it inevitable gets lost. I don&amp;rsquo;t remember
what it was called but I tried another app that actually tags your files
and organises them in a nice manner. This worked well for the most part
but the graphical client was badly optimised Electron and &lt;em&gt;very&lt;/em&gt; heavy.
I&amp;rsquo;ve also tried keeping notes in books but I was never really able to
keep up with any of it. The thing that is especially compelling about a
Zettelkasten is that I put &lt;em&gt;everything&lt;/em&gt; I learn in a single text file
but link around to as many different ideas as I can, drawing my &lt;em&gt;own&lt;/em&gt;
connections for me to rediscover later on.&lt;/p&gt;
&lt;p&gt;Because it&amp;rsquo;s all in a simple text file, I&amp;rsquo;m also able to create a
keybinding in &lt;a href=&#34;https://github.com/swaywm/sway/&#34;&gt;Sway&lt;/a&gt; that will open it
in Vim, jump to the bottom, and have a nice markdown environment ready
for me to write in. It did take a bit of configuration and looking
around for different plugins but I&amp;rsquo;m very happy with what I have so far.&lt;/p&gt;
&lt;p&gt;The first thing is telling Vim to treat all &lt;code&gt;.md&lt;/code&gt; files as Markdown&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Treat all .md files as markdown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; BufNewFile,BufRead *.md &lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; &lt;span style=&#34;font-weight:bold&#34;&gt;filetype&lt;/span&gt;=markdown
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;visuals&#34;&gt;Visuals&lt;/h2&gt;
&lt;p&gt;In a long text file with a great many lines, it can be useful to find
your cursor quickly without having to search around the screen for it.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Highlight the line the cursor is on&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown &lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; cursorline
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;It can also be nice to not see a ton of [links](https://example.com)
and **bold** or *italic* text everywhere. Sure, my eye has gotten
used to it but still. I&amp;rsquo;d rather have my terminal actually render bold
text as bold.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Hide and format markdown elements like **bold**&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown &lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; conceallevel=2
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you use the &lt;code&gt;vim-markdown&lt;/code&gt; plugin mentioned further on, I recommend using its option for concealing rather than Vim&amp;rsquo;s.&lt;/p&gt;
&lt;h2 id=&#34;spell-check&#34;&gt;Spell check&lt;/h2&gt;
&lt;p&gt;One of the things every good editor needs is spell check and Vim is no
exception. This line enables spell check with British English for all
markdown files.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Set spell check to British English&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown setlocal spell spelllang=en_gb
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Here&amp;rsquo;s a short crash course in Vim spelling commands:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;[s&lt;/code&gt; to search for misspelled words above the cursor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;]s&lt;/code&gt; to search for misspelled words below the cursor&lt;/li&gt;
&lt;li&gt;&lt;code&gt;z=&lt;/code&gt; to see replacement suggestions&lt;/li&gt;
&lt;li&gt;&lt;code&gt;zg&lt;/code&gt; to add the word to your dictionary&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;goyo&#34;&gt;Goyo&lt;/h2&gt;
&lt;p&gt;The very first component is something I use across &lt;em&gt;all&lt;/em&gt; markdown files.
&lt;a href=&#34;https://github.com/junegunn/goyo.vim&#34;&gt;Goyo&lt;/a&gt; is one of the first plugins
I install on any machine I&amp;rsquo;ll be writing with. It enables a
&amp;ldquo;distraction-free writing environment&amp;rdquo; and I absolutely love it. It
disables pretty much all visual elements in Vim except for what mode
you&amp;rsquo;re in: visual, command, insert, etc. I have a keybinding set to
quickly open/close Goyo because there is an odd issue when I switch
workspaces to and away from Vim. With two taps of &lt;code&gt;Ctrl+g&lt;/code&gt;, it&amp;rsquo;s back to
normal.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nnoremap &amp;lt;C-g&amp;gt; :Goyo&amp;lt;CR&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Another line in my Vim config automatically opens Goyo for all markdown
files:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown Goyo
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;vim-markdown&#34;&gt;vim-markdown&lt;/h2&gt;
&lt;p&gt;That latest plugin I installed is
&lt;a href=&#34;https://github.com/plasticboy/vim-markdown&#34;&gt;vim-markdown&lt;/a&gt; and it is
&lt;em&gt;wonderful&lt;/em&gt;. I really recommend reading about all of the options but
here&amp;rsquo;s what I have set.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Configuration for vim-markdown&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_conceal = 2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_conceal_code_blocks = 0
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_math = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_toml_frontmatter = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_frontmatter = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_strikethrough = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_autowrite = 1
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_edit_url_in = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;tab&amp;#39;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;let&lt;/span&gt; g:vim_markdown_follow_anchor = 1
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;In addition to the rest of the awesome features, the main one I wanted
is the last: &lt;code&gt;follow_anchor&lt;/code&gt;. With this, I can create internal links
within the same markdown document and jump between them with &lt;code&gt;ge&lt;/code&gt;. It
also lets me open both files and URLs from within Vim and without ever
having to reach for the mouse.&lt;/p&gt;
&lt;h2 id=&#34;general-vim-things&#34;&gt;General Vim things&lt;/h2&gt;
&lt;p&gt;Other, more general Vim settings that I use globally but might also be
nice for editing markdown&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Have lines wrap instead of continue off-screen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; linebreak
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Gives Vim access to a broader range of colours&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; termguicolors
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Converts tabs to spaces&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; expandtab
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Use two spaces instead of tabs&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; tabstop=2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; The same but for indents&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; shiftwidth=2
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Keep cursor in approximately the middle of the screen&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; scrolloff=12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Disable mouse support&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; mouse=
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;hr&gt;
&lt;p&gt;In all, I&amp;rsquo;m hoping that the work I&amp;rsquo;ve done today for improving my markdown
workflow will help me create a more effective Zettelkasten. The &lt;em&gt;big&lt;/em&gt; thing was
really being able to follow internal links around because that&amp;rsquo;s the main thing
with keeping a Zettelkasten: following your ideas to see where they lead and
discovering what connections you can make to form entirely new ideas. Mine will
be stored in &lt;a href=&#34;https://git.nixnet.services/Amolith/zettelkasten&#34;&gt;Gitea&lt;/a&gt; for now
but I&amp;rsquo;m thinking about putting it here at some point. It would be cool to have a
map of my own mind very easily accessible from anywhere.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/zettelkasten.jpg&#34; alt=&#34;screenshot of my setup&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;edit&#34;&gt;Edit&lt;/h2&gt;
&lt;h3 id=&#34;time-stamps&#34;&gt;Time stamps&lt;/h3&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Insert timestamp at the end of the line in this format: 20200527T113245&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;nnoremap &amp;lt;C-t&amp;gt;&amp;lt;C-s&amp;gt; m&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#39;A&amp;lt;C-R&amp;gt;=strftime(&amp;#39;&lt;/span&gt;%Y%m%dT%H%M%S&amp;#39;)&amp;lt;CR&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h3 id=&#34;portable-autocmds&#34;&gt;Portable &lt;code&gt;autocmd&lt;/code&gt;s&lt;/h3&gt;
&lt;p&gt;Put all the &lt;code&gt;autocmd&lt;/code&gt; lines in the &lt;code&gt;if&lt;/code&gt; statement so they don&amp;rsquo;t throw
errors when the config is added to a version of vim without &lt;code&gt;autocmd&lt;/code&gt;
support&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-vim&#34; data-lang=&#34;vim&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;&amp;#34; Only enable autocommands when Vim supports them&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;if&lt;/span&gt; has(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;autocmd&amp;#34;&lt;/span&gt;)
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34; Markdown Configuration&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34; Spellcheck in British English&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown setlocal spell spelllang=en_gb
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34; Automatically open Goyo&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown Goyo
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34; Hide plaintext formatting and use color instead&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown &lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; conceallevel=3
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#888;font-style:italic&#34;&gt;	&amp;#34; Disable cursor line and column highlight&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown &lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; nocursorline
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&lt;span style=&#34;font-weight:bold&#34;&gt;autocmd&lt;/span&gt; FileType markdown &lt;span style=&#34;font-weight:bold&#34;&gt;set&lt;/span&gt; nocursorcolumn
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;endif&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I won&amp;rsquo;t keep editing this post to provide updates on my config. Instead, I
recommend looking at my &lt;a href=&#34;https://git.nixnet.services/Amolith/dotfiles/src/branch/master/dotfiles/pc/.config/nvim/init.vim&#34;&gt;&amp;ldquo;production&amp;rdquo; version on
Gitea.&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk.&lt;/a&gt; If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Bluegrass Music</title>
      <link>https://secluded.site/bluegrass-music/</link>
      <category>Music/Bluegrass/Old time/100 Days To Offload</category>>
      <pubDate>Tue, 28 Apr 2020 02:13:16 -0400</pubDate>
      <guid>https://secluded.site/bluegrass-music/</guid>
      <description>&lt;p&gt;When I was younger, I prided myself on being a classical musician. I
played piano and organ, I was in a nearby fine arts university&amp;rsquo;s choir
(singing soprano of course), and, quite honestly, I was rather stuck up
about it. I didn&amp;rsquo;t know any bluegrass musicians so I had never really
interacted with them or gotten &amp;ldquo;into&amp;rdquo; the genre but, whenever my mother
would show me a group of people with a double bass, a banjo, a mandolin,
and a fiddle, I would listen for a few seconds and write it off as
&amp;ldquo;boring country&amp;rdquo;. It wasn&amp;rsquo;t until I started taking lessons that I grew
fond of genre.&lt;/p&gt;
&lt;p&gt;One of the things I had always wanted to play was double bass. However,
lessons were &lt;em&gt;extremely&lt;/em&gt; expensive and the instrument was even more so.
Coming from a rather poor family of just me and my mother, classical
lessons were completely out of the question. She did end up finding a
way for me to take bluegrass lessons at an incredibly cheap rate; I
won&amp;rsquo;t say what the program is called because my name is plastered all
over the internet for the branch in this area but it allows student to
take lessons at a greatly reduced cost. Pricing was based on school
lunch status and, with this particular branch, I was able to take free
lessons and rent a bass for something like $30/semester. I picked it up
quickly and started to really enjoy it, learning some classical pieces
on the side and playing with a violin bow rather than the expensive bass
bows. Throughout the lessons, my main goal was not to get &amp;ldquo;roped into&amp;rdquo;
doing bluegrass for the rest of my life because I was entirely
uninterested in that; I wanted to keep bluegrass in the back and
classical in front.&lt;/p&gt;
&lt;p&gt;Because I picked it up so quickly, the style is very common in this
area, and bass players in something of a shortage, I ended up playing
for a number of different groups at different levels. In one of them,
the youngest member was 12 and, in another, I was the youngest with the
next being 30 years older. With all of these groups, I ended up meeting
&lt;em&gt;many&lt;/em&gt; amazing and wonderful people, playing &lt;em&gt;so much music&lt;/em&gt;, and
getting to travel quite a lot. It was very slow but, about three years
after first picking up a bass, I&amp;rsquo;m actively seeking out more bluegrass
to learn, recently picking up fingerstyle guitar, banjo, and maybe
mandolin in the future.&lt;/p&gt;
&lt;p&gt;In opening my mind to the genre, I also discovered a lot of beautiful
music that&amp;rsquo;s&amp;hellip;not quite bluegrass but&amp;hellip;not quite anything else I&amp;rsquo;ve
heard either. I absolutely &lt;em&gt;love&lt;/em&gt; the style and can&amp;rsquo;t wait to meet up
with a friend of mine and put some pieces together. The main band I&amp;rsquo;ve
been following is &lt;a href=&#34;https://www.punchbrothers.com/&#34;&gt;The Punch Brothers.&lt;/a&gt;
&lt;a href=&#34;https://wikipedia.org/wiki/Chris_Thile&#34;&gt;Chris Thile&lt;/a&gt;, the leader&amp;hellip;holy
shit he&amp;rsquo;s a &lt;em&gt;musician&lt;/em&gt;. From classical to bluegrass to jazz, he&amp;rsquo;s an
absolute madman. A couple of my favourite songs that The Punch Brothers
do are written by him: &lt;em&gt;&lt;a href=&#34;https://invidio.us/watch?v=staHSMEE1pw&#34;&gt;My Oh
My,&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href=&#34;https://invidio.us/watch?v=lLdtEiUKDig&#34;&gt;Julep,&lt;/a&gt;&lt;/em&gt; &lt;em&gt;&lt;a href=&#34;https://invidio.us/watch?v=CMtyWB_Pzic&#34;&gt;Patchwork
Girlfriend,&lt;/a&gt;&lt;/em&gt; and &lt;em&gt;&lt;a href=&#34;https://invidio.us/watch?v=2hsXcl4X5vQ&#34;&gt;Between 1st
and A.&lt;/a&gt;&lt;/em&gt; The style is just so
unique and different yet has those evident bluegrass roots underpinning
it all.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk.&lt;/a&gt; If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Day 3</title>
      <link>https://secluded.site/day-3/</link>
      <category>Inkscape/Graphics/100 Days To Offload</category>>
      <pubDate>Mon, 27 Apr 2020 23:15:04 -0400</pubDate>
      <guid>https://secluded.site/day-3/</guid>
      <description>&lt;p&gt;Well I had planned to write a post about music this evening but I just
spend two hours making the post&amp;rsquo;s cover image, a guitar. Lately, I&amp;rsquo;ve
been &lt;em&gt;basing&lt;/em&gt; my images on &lt;a href=&#34;https://feathericons.com/&#34;&gt;Feather Icons&lt;/a&gt; or
&lt;a href=&#34;https://fontawesome.com/&#34;&gt;Font Awesome.&lt;/a&gt; I might download one to use as
a reference, download and modify, etc. but I&amp;rsquo;ve stopped using the icons
as they are. This guitar, however, is an exception; I used the &lt;a href=&#34;https://www.tutorviacomputer.com/inkscape/the-bezier-tool/&#34;&gt;Bezier
Pen&lt;/a&gt; and
created it completely from scratch. It&amp;rsquo;s still just a silhouette but
I&amp;rsquo;ve always avoided this tool because it&amp;rsquo;s so hard to use. You can view
it on &lt;a href=&#34;https://git.nixnet.services/Amolith/secluded/src/branch/master/content/assets/pngs/guitar.png&#34;&gt;my Gitea
instance.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;Anyway, this is my anti-climactic third day out of 100! Prepare for some
music tomorrow &amp;#x1f609;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk.&lt;/a&gt; If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Custom Streaming Setup</title>
      <link>https://secluded.site/custom-streaming-setup/</link>
      <category>Gaming/Streaming/NGINX/OBS/100 Days To Offload</category>>
      <pubDate>Sun, 26 Apr 2020 20:24:38 -0400</pubDate>
      <guid>https://secluded.site/custom-streaming-setup/</guid>
      <description>&lt;p&gt;The other day, I decided that I wanted to start streaming. I&amp;rsquo;ll
definitely be playing some games but I might also stream some other
things like me playing music. We&amp;rsquo;ll see where that goes. In any case, I
don&amp;rsquo;t like relying on third parties for things and didn&amp;rsquo;t want to use
Twitch so I started figuring out how to build my own open source and
privacy-friendly &amp;ldquo;platform&amp;rdquo; (which is really just a &lt;a href=&#34;../live&#34;&gt;page.&lt;/a&gt;)&lt;/p&gt;
&lt;h2 id=&#34;the-search-for-a-platform&#34;&gt;The search for a platform&lt;/h2&gt;
&lt;p&gt;Before settling on my own custom thing, I did some digging into
ready-made platforms I could just throw on one of my servers and run.
Two of the ones I found were
&lt;a href=&#34;https://openstreamingplatform.com/&#34;&gt;OpenStreamingPlatform&lt;/a&gt; and
&lt;a href=&#34;https://datarhei.github.io/restreamer/&#34;&gt;Restreamer.&lt;/a&gt; The latter isn&amp;rsquo;t
exactly what I was looking for but it could have worked quite well. The
former, at first glance, was absolutely &lt;em&gt;perfect&lt;/em&gt;. On a functional
level, it still is. However, take a look at &lt;a href=&#34;https://wiki.openstreamingplatform.com/Install/Manual&#34;&gt;the installation
guide.&lt;/a&gt;&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;rant&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;p&gt;Steps 3 and 7 are unnecessary unless you feel like manually compiling
your web server; it&amp;rsquo;s already available in the &lt;a href=&#34;https://packages.debian.org/buster/libnginx-mod-rtmp&#34;&gt;Debian
repos&lt;/a&gt; and, by
extension, Ubuntu&amp;rsquo;s. It&amp;rsquo;s even been backported to Stretch. In step 4, he
has &lt;code&gt;sed -i &#39;s/appendfsync everysec/appendfsync no/&#39;&lt;/code&gt;. Like so many
application developers, he&amp;rsquo;s assuming that this is the only project that
will be installed on the system. If someone is already using redis in
production and they have a different value there, that command will
fail. In step 9, the commands are copying the SystemD service files to
&lt;code&gt;/lib/systemd/&lt;/code&gt; but this is where the package manager, &lt;code&gt;apt&lt;/code&gt;, stores its
services. When you have your own that you&amp;rsquo;re writing or copying from
somewhere else, best practise is to put them in &lt;code&gt;/etc/systemd/system&lt;/code&gt;.
In addition, all of this is scripted for the &amp;ldquo;standard&amp;rdquo; install. Yes,
you&amp;rsquo;re always supposed to review scripts before running them but who
really does that? When I see a project whose only supported installation
method is a script, I nope right on out of there for exactly this
reason. I know how my system &lt;em&gt;is&lt;/em&gt; set up and I know how I &lt;em&gt;want&lt;/em&gt; it set
up. I can&amp;rsquo;t stand it when they assume they know what&amp;rsquo;s best. Just tell
me what you &lt;em&gt;recommend&lt;/em&gt; and I&amp;rsquo;ll make decisions from there.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;&amp;lt;/rant&amp;gt;&lt;/code&gt;&lt;/p&gt;
&lt;h2 id=&#34;nginx--rtmp&#34;&gt;NGINX &amp;amp; RTMP&lt;/h2&gt;
&lt;p&gt;RTMP stands for &lt;a href=&#34;https://wikipedia.org/wiki/Real-Time_Messaging_Protocol&#34;&gt;Real-Time Messaging
Protocol&lt;/a&gt; and
facilitates streaming audio, video, and other data over the internet in
real-time. The NGINX module mentioned above adds functionality to NGINX
that allows it to handle RTMP streams and turn them into something a
browser or media streaming client can use. Connecting directly via
&lt;code&gt;rtmp://example.com/live/stream&lt;/code&gt; is not very widely supported so
protocols such as
&lt;a href=&#34;https://wikipedia.org/wiki/Dynamic_Adaptive_Streaming_over_HTTP&#34;&gt;MPEG-DASH&lt;/a&gt;
and &lt;a href=&#34;https://wikipedia.org/wiki/HTTP_Live_Streaming&#34;&gt;HLS&lt;/a&gt; are used
instead.&lt;/p&gt;
&lt;p&gt;On Debian-based systems, adding RTMP functionality to NGINX is as simple
as &lt;code&gt;apt install libnginx-mod-rtmp&lt;/code&gt;. After that, you&amp;rsquo;ll need to add some
things to your &lt;code&gt;nginx.conf&lt;/code&gt; and whatever host file you&amp;rsquo;re using for your
website.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;rtmp {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  server {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    listen 1935;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    application live {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      deny publish all;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      allow publish 127.0.0.1;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      live on;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      interleave on;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      hls on;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      hls_path /tmp/hls;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      hls_fragment 15s;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dash on;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dash_path /tmp/dash;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dash_fragment 15s;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;1935&lt;/code&gt; is the default RTMP port. &lt;code&gt;deny publish all&lt;/code&gt; means you are
denying &lt;em&gt;anyone&lt;/em&gt; from publishing a stream (that includes you. &lt;code&gt;allow publish 127.0.0.1&lt;/code&gt; allows &lt;em&gt;local&lt;/em&gt; connections to publish content. I&amp;rsquo;m
using this as a form of authentication&amp;mdash;before streaming anything, I
have to tunnel my connection to my server via SSH or a VPN. At the
moment, I&amp;rsquo;m using SSH:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ssh -L 1935:localhost:1935 user@example.com
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The other options are just the basics needed to get DASH and HLS to
work. The only other thing to do is use NGINX as a reverse proxy (sort
of) to serve the streams. Add this to your site&amp;rsquo;s virtual host.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-c&#34; data-lang=&#34;c&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;location /dash {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  root /tmp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;location /hls {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  root /tmp;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;That&amp;rsquo;s it! Now you&amp;rsquo;ll need to test your stream and verify that it
actually works.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ffmpeg -re -i video.mp4 -vcodec copy -loop -1 -c:a aac -b:a 160k -ar 44100 -strict -2 -f flv rtmp://example.com/live/stream
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;This command has FFmpeg play the video and stream it to the server. You
should then be able to open the stream in something like
&lt;a href=&#34;https://www.videolan.org/&#34;&gt;VLC&lt;/a&gt; or &lt;a href=&#34;https://mpv.io/&#34;&gt;MPV&lt;/a&gt; and watch it
from anywhere.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;mpv https://example.com/dash/stream.mpd
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;However, I also wanted to embed it in a website and this is where it
gets a little unstable.&lt;/p&gt;
&lt;h2 id=&#34;browser-playback&#34;&gt;Browser playback&lt;/h2&gt;
&lt;p&gt;&lt;code&gt;dash.js&lt;/code&gt; is currently one of the best ways to play a live stream in a
browser plus it&amp;rsquo;s pretty easy to work with. The code can be found &lt;a href=&#34;https://github.com/Dash-Industry-Forum/dash.js&#34;&gt;on
GitHub.&lt;/a&gt; Using the setup
with NGINX I detailed above, this should work perfectly fine out of the
box.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-js&#34; data-lang=&#34;js&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;div&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;video id=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;videoPlayer&amp;#34;&lt;/span&gt; poster=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;/assets/jpgs/stream.jpg&amp;#34;&lt;/span&gt; controls&amp;gt;&amp;lt;&lt;span style=&#34;&#34;&gt;/video&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;&#34;&gt;/div&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script src=&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;/assets/js/dash.all.min.js&amp;#34;&lt;/span&gt;&amp;gt;&amp;lt;&lt;span style=&#34;&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;script&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;function&lt;/span&gt;(){
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;var&lt;/span&gt; url = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;/dash/stream.mpd&amp;#34;&lt;/span&gt;;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;var&lt;/span&gt; player = dashjs.MediaPlayer().create();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    player.initialize(&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;document&lt;/span&gt;.querySelector(&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#videoPlayer&amp;#34;&lt;/span&gt;), url, &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;);
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;})();
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;&#34;&gt;/script&amp;gt;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;web-chat&#34;&gt;Web chat&lt;/h2&gt;
&lt;p&gt;The last thing every stream needs is something for web chat. I tried a few
different solutions and had mixed results. The first was
&lt;a href=&#34;https://kiwiirc.com/&#34;&gt;KiwiIRC&lt;/a&gt; but the iframe wouldn&amp;rsquo;t even finish loading
because it connected to so many third parties with a lot of tracking. It
functions very well and I might set it up on my own site eventually but it was a
bit much to go through at the time. As an intermediate solution, I embedded my
instance of &lt;a href=&#34;https://thelounge.chat&#34;&gt;The Lounge,&lt;/a&gt; a fully-functional web-based
IRC client. This loaded perfectly right out of the box but it wasn&amp;rsquo;t quite what
I wanted; there were &lt;em&gt;too&lt;/em&gt; many options and the friends of mine who tested it
got frustrated because some of the essential UI elements were hidden due to the
small viewport. It&amp;rsquo;s just not quite suitable for embedded webchat.&lt;/p&gt;
&lt;p&gt;Finally, I landed on &lt;a href=&#34;https://qwebirc.org/&#34;&gt;qwebirc&lt;/a&gt; and it was pretty
much &lt;em&gt;exactly&lt;/em&gt; what I wanted. When the iframe loads, you&amp;rsquo;re prompted to
enter a nick, you click connect, wait a minute, and done! My one
complaint is that the theme is very bright but I&amp;rsquo;ll work on that later
on. It&amp;rsquo;s good enough for now &amp;#x1f609;&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;EDIT:&lt;/strong&gt; Since the time of writing, I have switched to self-hosting
&lt;a href=&#34;https://kiwiirc.com/&#34;&gt;KiwiIRC&lt;/a&gt; so all of the trackers and third parties aren&amp;rsquo;t
in use. My configs are below but I recommend going through &lt;a href=&#34;https://github.com/kiwiirc/kiwiirc/wiki/Configuration-Options&#34;&gt;the
wiki&lt;/a&gt; and making
your own decisions.&lt;/p&gt;
&lt;p&gt;&lt;code&gt;/etc/kiwiirc/config.conf&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-ini&#34; data-lang=&#34;ini&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;logLevel = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;3&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;identd = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;false&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;gateway_name = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;webircgateway&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;secret = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;changeme&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[verify]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;recaptcha_secret = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;recaptcha_key = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[clients]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;username = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;%i&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;realname = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;KiwiIRC on secluded.site&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[server.1]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;bind = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;0.0.0.0&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;7264&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[fileserving]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;enabled = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;webroot = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;/usr/share/kiwiirc/&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[transports]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;websocket
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;sockjs
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;kiwiirc
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[reverse_proxies]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;127.0.0.0/8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;10.0.0.0/8
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;172.16.0.0/12
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;192.168.0.0/16
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;::1/128&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;#34;fd00::/8&amp;#34;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold&#34;&gt;[upstream.1]&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;hostname = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;irc.nixnet.services&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;port = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;6697&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;tls = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;true&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;timeout = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;5&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;throttle = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;2&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;webirc = &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;code&gt;/etc/kiwiirc/client.json&lt;/code&gt;&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-json&#34; data-lang=&#34;json&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;{
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;windowTitle&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Secluded.Site Chat&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;startupScreen&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;welcome&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;kiwiServer&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;/webirc/kiwiirc/&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;restricted&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;hideAdvanced&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;showAutoComplete&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;showSendButton&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;sidebarDefault&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;nicklist&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;theme&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;dark&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;themes&amp;#34;: [
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Default&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/default&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Dark&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/dark&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Coffee&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/coffee&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;GrayFox&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/grayfox&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Nightswatch&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/nightswatch&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Osprey&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/osprey&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Radioactive&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/radioactive&amp;#34;&lt;/span&gt; },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		{ &amp;#34;name&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Sky&amp;#34;&lt;/span&gt;, &amp;#34;url&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;static/themes/sky&amp;#34;&lt;/span&gt; }
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	],
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;#34;buffers&amp;#34; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;messageLayout&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;compact&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_timestamps&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_hostnames&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_joinparts&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_topics&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_nick_changes&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_mode_changes&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;traffic_as_activity&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;coloured_nicklist&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;colour_nicknames_in_messages&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;block_pms&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_emoticons&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;extra_formatting&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;mute_sound&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;hide_message_counts&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_realnames&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;default_kick_reason&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Your behaviour is not conducive to this environment.&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;shared_input&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_message_info&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;share_typing&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;flash_title&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;off&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;nicklist_avatars&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;show_link_previews&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;inline_link_previews&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;inline_link_auto_preview_whitelist&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;secluded.site|nixnet.services&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;#34;channel&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#secluded&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  },
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	&amp;#34;startupOptions&amp;#34; : {
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;server&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;irc.nixnet.services&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;port&amp;#34;: 6697,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;tls&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;true&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;direct&amp;#34;: &lt;span style=&#34;font-weight:bold&#34;&gt;false&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;channel&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;#secluded&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;nick&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;viewer?&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;greetingText&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;Welcome!&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;infoBackground&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;,
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;		&amp;#34;infoContent&amp;#34;: &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;	}
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;}
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;h2 id=&#34;actually-streaming&#34;&gt;Actually streaming&lt;/h2&gt;
&lt;p&gt;Once you&amp;rsquo;re ready to start streaming content, I recommend using &lt;a href=&#34;https://github.com/obsproject/obs-studio/&#34;&gt;OBS
Studio.&lt;/a&gt; If you&amp;rsquo;re noticing
issues with stream performance, play around with your output resolution
and FPS&amp;mdash;those are the biggest factors. To use OBS with NGINX, you&amp;rsquo;ll
need to go to &lt;code&gt;Settings&lt;/code&gt;, &lt;code&gt;Stream&lt;/code&gt;, and set &lt;code&gt;Server&lt;/code&gt; to
&lt;code&gt;rtmp://localhost/live/&lt;/code&gt;. If you&amp;rsquo;re using my configs as they are, the
key will need to be &lt;code&gt;stream&lt;/code&gt;. Literally every component requires
specific paths so, unless you&amp;rsquo;re careful, things will break and you&amp;rsquo;ll
spend hours trying figure it out like I did. Also don&amp;rsquo;t forget that the
connection &lt;em&gt;has&lt;/em&gt; to be tunnelled if you want authentication as I
mentioned above. If you don&amp;rsquo;t have &lt;code&gt;localhost:1935&lt;/code&gt; on your streaming
machine tunnelled to port 1935 on your server, OBS is going to throw
errors about not being able to connect.&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;I&amp;rsquo;m pretty proud of &lt;a href=&#34;../live&#34;&gt;the set up&lt;/a&gt; I have now but it could still do
with some improvements. For example, I plan to mess with the CSS and
make both the video and chat panes &lt;em&gt;much&lt;/em&gt; wider as well as side-by-side
rather than on top of each other. Everything is crammed together and
it&amp;rsquo;s not a very good experience.&lt;/p&gt;
&lt;h2 id=&#34;references&#34;&gt;References&lt;/h2&gt;
&lt;p&gt;This post has pieces taken from a few other articles and sites that also
deserve a mention as well as a read. NGINX actually has an &lt;a href=&#34;https://www.nginx.com/blog/video-streaming-for-remote-learning-with-nginx/&#34;&gt;official
blog
post&lt;/a&gt;
on setting up RTMP streaming (though they compile NGINX from source as
well) that was a &lt;em&gt;massive&lt;/em&gt; help. I also found another post that is very
similar to this one about &lt;a href=&#34;https://www.isrv.pw/html5-live-streaming-with-mpeg-dash&#34;&gt;HTML5 Live Streaming with
MPEG-DASH.&lt;/a&gt; A
good number of the parts are the same but I used the NGINX module in
Debian repos and they used a fork of it with additional features. My
NGINX setup was mostly from the NGINX blog post and the embedded stream
was primarily from Inanity&amp;rsquo;s. I figured out some of the components I
could use for all of this from &lt;a href=&#34;https://live.drewdevault.com/&#34;&gt;Drew
DeVault.&lt;/a&gt;&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This was posted as part of #100DaysToOffload, an awesome idea (dead link to fedi
post) from &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk.&lt;/a&gt; If you want to participate, just write
something every day for 100 days and post a link on social media with the
hashtag!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>School...</title>
      <link>https://secluded.site/school.../</link>
      <category>Personal/School/100 Days To Offload</category>>
      <pubDate>Sat, 25 Apr 2020 22:12:40 -0400</pubDate>
      <guid>https://secluded.site/school.../</guid>
      <description>&lt;p&gt;A fedizen, &lt;a href=&#34;https://kevq.uk/&#34;&gt;Kev Quirk,&lt;/a&gt; issued a challenge (dead link to fedi
post) yesterday and I decided to take him up on it. In the time between then and
now, he&amp;rsquo;s actually set up a website for participants to submit their posts; it&amp;rsquo;s
called (quite fittingly) &lt;em&gt;100 Days To Offload&lt;/em&gt; (dead link to website). I&amp;rsquo;m going
to attempt to keep up with it for the next 100 days and see where it takes me.
Because I&amp;rsquo;ll be using this blog every day, expect a lot of changes and
improvements. With that out of the way, here goes!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;Part of this challenge is &amp;ldquo;offloading&amp;rdquo; and one of the ways that word can
be meant is to lay out everything that&amp;rsquo;s on your mind. Today, that&amp;rsquo;s
school. I&amp;rsquo;m generally an &lt;em&gt;incredibly&lt;/em&gt; laid-back person; I don&amp;rsquo;t really
ever get stressed about anything. That is simultaneously a good thing
and a very bad thing. Because I don&amp;rsquo;t really get stressed, I don&amp;rsquo;t feel
the urgency of getting homework done, communicating with professors
about late assignments, studying, the works. In the past, I&amp;rsquo;ve enjoyed
the content I was learning so the fear of making a bad grade was never a
motivator&amp;mdash;it was interest in the subject and a natural curiosity.
Right now, I&amp;rsquo;m not interested in any of my subjects except for German.
It&amp;rsquo;s very unlikely that I will be dealing with Java in the workforce,
Discrete Math is boring, and Calculus II is &lt;em&gt;killing&lt;/em&gt; me.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; I don&amp;rsquo;t
even know if I&amp;rsquo;ll pass it this semester.&lt;/p&gt;
&lt;p&gt;And yet&amp;hellip;I&amp;rsquo;m still not stressed. My university implemented an optional
pass-fail grading system in light of the pandemic and the physical
campus shutting down. If a student is making an A, they will definitely
opt out. If a student is making a C, the minimum required to move on,
they will opt in. This mean the C will remain on their transcript &lt;em&gt;but&lt;/em&gt;
it won&amp;rsquo;t affect their GPA. For those wanting to get into grad school
(me), it is a god send. I have been so lax this semester about doing
&lt;em&gt;anything&lt;/em&gt; for my classes that I will very likely end up opting in for
all of courses except German. As I said above, I don&amp;rsquo;t even know if I&amp;rsquo;ll
make a C in Calculus though that isn&amp;rsquo;t just because I haven&amp;rsquo;t done all
of the work; I have one of the most difficult professors in the math
department.I am worried but I&amp;rsquo;m &lt;em&gt;very&lt;/em&gt; good at keeping that in the back
of my mind under many many layers of keeping myself busy. It&amp;rsquo;s a bit
like that meme of the dog saying &amp;ldquo;this is fine&amp;rdquo; while the house burns
around him except I&amp;rsquo;m not looking at the fire. My head is craned towards
my monitor, my fingers on the keyboard, and my mind is somewhere in a
server in Germany ignoring every bit of it.&lt;/p&gt;
&lt;p&gt;This is very much a badly-written ramble and I&amp;rsquo;m not even going to read
through it before posting. I don&amp;rsquo;t like talking about this kind of thing
but it feels good to get it off my chest, even if it is garbled and
likely hard to read. I will try to only have a single &amp;ldquo;downer&amp;rdquo; post like
this in the series; I have a few ideas for much better content.&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;This is published as part of &lt;em&gt;100 Days To Offload&lt;/em&gt; and is not indicative of the
rest of the content there; most of it is much more positive. To join in, simply
write a post, submit it here (dead link), and use &lt;code&gt;#100DaysToOffload&lt;/code&gt; somewhere
on your social media.&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I actually took the course last semester and ended up dropping it
because my grade was so bad right out of the gate.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Part of my cellar</title>
      <link>https://secluded.site/part-of-my-cellar/</link>
      <category>Nørding/Churchwarden/Cellar/Pipes/Missouri Meerschaum/Mauro Armellini</category>>
      <pubDate>Fri, 17 Apr 2020 20:18:01 -0400</pubDate>
      <guid>https://secluded.site/part-of-my-cellar/</guid>
      <description>&lt;p&gt;Continuing with my journey into the world of pipe smoking, I thought I
would show what my &lt;em&gt;cellar&lt;/em&gt;&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; looks like. It&amp;rsquo;s not much—just some jars
and a pipe stand on my dresser—but it&amp;rsquo;s more than what I&amp;rsquo;ve seen some
other people have&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;. I&amp;rsquo;ll talk about tobacco in another post; this one
is just about what&amp;rsquo;s on the left of the picture below. The paper is
something I saw in a YouTube video and I thought it was a really cool
idea; rather than pinching your tobacco out of the jar, sprinkling it
into the bowl, and inevitably spilling some, simply dump it onto a sheet
of paper. From there, you can pull apart any clumps that may have
formed, fill the bowl, then fold the paper in half lengthwise and pour
what&amp;rsquo;s left back into to the jar.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/dresser.jpg&#34; alt=&#34;Picture of my dresser with some pipes, accessories, and tobacco. To
the right, there are 12 big jars of tobacco along with a smaller one. On
the left is my half-full pipe stand with three pipes in it, my lighter,
a pipe tool, a wind cap, a smaller single stand to the right, and a
sheet of paper in the front.&#34;&gt;&lt;/p&gt;
&lt;p&gt;The small stand to the right of the big one is the &lt;a href=&#34;https://www.smokingpipes.com/accessories/pipe%20accessories/moreinfo.cfm?product_id=120415&#34;&gt;Single Pipe Stand
from
SmokingPipes&lt;/a&gt;.
I do like it but it&amp;rsquo;s really only suitable for pipes with straight&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt;
stems; with bent stems, the mouthpiece ends up resting on the table. I
haven&amp;rsquo;t tried it but I would recommend going with the &lt;a href=&#34;https://www.smokingpipes.com/accessories/pipe%20accessories/moreinfo.cfm?product_id=120414&#34;&gt;solid
version&lt;/a&gt;
if you&amp;rsquo;re wanting a stand for a single pipe because it&amp;rsquo;s more versatile.
The larger one, below, is the &lt;a href=&#34;https://www.smokingpipes.com/accessories/pipe%20accessories/moreinfo.cfm?product_id=120414&#34;&gt;Woodmere 6 Pipe
Stand&lt;/a&gt;
from the same website. It has the same problem as the first but it&amp;rsquo;s not
as pronounced; pipes with bent stems need to be pushed forward in the
divot in the base so they can lean back against the bar. Otherwise, the
weight of the stem and shank&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; will cause them to fall forward.&lt;/p&gt;
&lt;p&gt;Pipes will be described further down so the next thing is the metal
object that looks like a sink drain. It&amp;rsquo;s a &lt;a href=&#34;https://www.thecountrysquireonline.com/product/wind-cap/&#34;&gt;wind cap from The Country
Squire&lt;/a&gt; (which
also has &lt;a href=&#34;https://www.podastery.com/podcast-country-squire-radio&#34;&gt;a great
podcast&lt;/a&gt;). I&amp;rsquo;ve
found it to be very handy at my university when it&amp;rsquo;s windy. The next
item is just a simple &amp;ldquo;Czech pipe tool&amp;rdquo; that can be purchased from
pretty much any store that sells pipes, both brick-and-mortar and online
retailers. The last thing is a Zippo &lt;em&gt;pipe&lt;/em&gt; lighter. These are entirely
different from normal Zippo lighters because they&amp;rsquo;re meant to be held
sideways over the bowl of a pipe. This design lets you put the flame
directly to the tobacco rather than drawing it over the side of the bowl
and scorching the rim. I ordered mine from Amazon a year or so ago but
have since stopped using Amazon due to ethical and privacy concerns. I
can&amp;rsquo;t find the same product on &lt;a href=&#34;https://www.zippo.com/collections/pipe-lighters&#34;&gt;Zippo&amp;rsquo;s
website&lt;/a&gt; so here&amp;rsquo;s a
link to it from
&lt;a href=&#34;https://www.walmart.com/ip/Zippo-Red-Pipe-High-Polished-Brass-Windproof-Lighter-28322-NEW-L-K/628527710&#34;&gt;Wal-mart.&lt;/a&gt;
I also dislike using Wal-mart but it&amp;rsquo;s marginally better than Amazon.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/pipes.jpg&#34; alt=&#34;This picture is pretty much the same as the earlier one but without
the tobacco and paper.&#34;&gt;&lt;/p&gt;
&lt;p&gt;Now the fun part &amp;#x1f609; The first pipe I got was the &lt;a href=&#34;https://corncobpipe.com/missouri-pride-corncob-pipe.html&#34;&gt;Missouri Pride from
Missouri
Meerschaum.&lt;/a&gt;
An &lt;em&gt;excellent&lt;/em&gt; starter pipe, I ended up giving it to my room mate after
he showed an interest in the hobby. However, a close friend of mine had
given me one of his old pipes and I fell in love with it. Unfortunately,
I know absolutely &lt;em&gt;nothing&lt;/em&gt; about it other than it was made by &lt;a href=&#34;https://pipedia.org/wiki/Armellini&#34;&gt;Mauro
Armellini&lt;/a&gt;, an Italian craftsman who
died several years ago. I&amp;rsquo;m considering sending an email to the company
and seeing if they can tell me anything about it. On one side of the
shank is the name &lt;em&gt;Mauro Armellini&lt;/em&gt;, the bottom has the number &lt;em&gt;705&lt;/em&gt;,
and the other side says &lt;em&gt;Verona&lt;/em&gt; with the word &lt;em&gt;ARCOBALENO&lt;/em&gt; below it. If
anyone reading this knows something about the pipe, please let me know.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/armellini.jpg&#34; alt=&#34;A picture of my pipe from Mauro Armellini. It&amp;rsquo;s sitting on my porch
rail with the yard in the background; the grass is a light green and the
leaves of the woods further on are darker. The pipe is a rich brown with
a cream-coloured opalescent stem. There is a mother-of-pearl inlay on
top of the stem.&#34;&gt;&lt;/p&gt;
&lt;p&gt;The first &amp;ldquo;real&amp;rdquo; pipe I bought myself was a churchwarden&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; from
&lt;a href=&#34;https://www.nordingpipes.com/&#34;&gt;Nørding Pipes.&lt;/a&gt; If you&amp;rsquo;re curious about
the company or the founder, Erik Nørding, listen to this episode of the
&lt;a href=&#34;https://countrysquireradio.fireside.fm/341&#34;&gt;Country Squire Radio.&lt;/a&gt;
After I heard it, I decided to make one of their pipes my first
purchase. What I ended up getting was a Partially Rusticated&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;
Churchwarden from
&lt;a href=&#34;https://www.smokingpipes.com/pipes/new/Nording/moreinfo.cfm?product_id=363601&#34;&gt;SmokingPipes.&lt;/a&gt;
I&amp;rsquo;ve been using it for a month or so now and absolutely love it,
especially when I&amp;rsquo;m sitting on the porch reading or going lunting&lt;sup id=&#34;fnref:7&#34;&gt;&lt;a href=&#34;#fn:7&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;7&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/churchwarden-nording.jpg&#34; alt=&#34;This is also a picture of a pipe on my porch rail. It is significantly
longer at about 10.5 inches or 265 millimetres. The stem has a gentle
curve. The bowl is the same deep brown as the Armellini pipe but the
finish is newer so it shines more. The rustication will be hard to
describe. The rest of the pipe is brown but the rusticated part is
black. The texture is rough but smooth—the edges that might have been
jagged were sanded down. The bottom of the bowl is what&amp;rsquo;s rusticated;
the top is normal. When held upside down, it almost looks as if the
rusticated part is dripping onto the normal part and the same for the
stem.&#34;&gt;&lt;/p&gt;
&lt;p&gt;My latest acquisition is &lt;a href=&#34;https://corncobpipe.com/the-emerald-corn-cob-pipe&#34;&gt;The
Emerald&lt;/a&gt; from
&lt;a href=&#34;https://corncobpipe.com&#34;&gt;Missouri Meerschaum.&lt;/a&gt; It is a corn cob pipe
but not like the Missouri Pride; this model has very obviously been
sanded smooth and sealed so that it &lt;em&gt;almost&lt;/em&gt; feels like finished wood.
The stem is a higher quality acrylic than their other models and much
more pleasant to look at as well. This is the model they released for
Saint Patrick&amp;rsquo;s Day in 2019 but, due to popular demand, they started
producing it again. I&amp;rsquo;m hoping to purchase this year&amp;rsquo;s as well and start
building a collection.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/emerald.jpg&#34; alt=&#34;This pipe is a light cream colour. The bowl looks like the cob of an
ear of corn (that&amp;rsquo;s what it is) with a short wooden tube sticking out of
it. The bent stem is a deep marbled green.&#34;&gt;&lt;/p&gt;
&lt;p&gt;This last picture is of me sitting on my porch with a book, my
churchwarden, my lighter, and my pipe tool. It was a warm and peaceful
afternoon and I had a strong urge to capture the moment because this is
one of the &lt;em&gt;big&lt;/em&gt; reasons I enjoy smoking a pipe. In the rigorous life of
a university student, musician, and systems administrator, this is my
rare chance to just slow down and simply be in the moment without
worrying over anything else.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/jpgs/porch.jpg&#34; alt=&#34;In this picture, you can see the top edge of the book I&amp;rsquo;m reading, my
crossed legs resting on the porch rail, my churchwarden to the left, and
my light and pipe tool to the right. This is the same &amp;ldquo;warm&amp;rdquo; scene as
described in the picture of Armellini&amp;rsquo;s pipe; it&amp;rsquo;s very
peaceful&#34;&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;In this context, a cellar is simply a place to store pipes and
pipe tobacco. When someone says they&amp;rsquo;re going to &lt;em&gt;cellar&lt;/em&gt; their
tobacco, they mean they&amp;rsquo;re going to prepare it for long-term
storage.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;One was literally just a cardboard box with some jars inside and a
few pipes laying on top. There&amp;rsquo;s nothing wrong with that but I
prefer to have a little more space.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;The stem is the part of the pipe where the mouthpiece is. In these
pictures, it&amp;rsquo;s opalescent for the first, marbled for the second, and
solid black for the third.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;The shank is where the stem is inserted; it&amp;rsquo;s in between that and
the bowl and made from the same material as the bowl.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;&lt;em&gt;Churchwarden&lt;/em&gt; refers to the length of the pipe. There are many
theories about why it&amp;rsquo;s named so but one I find interesting is that
it&amp;rsquo;s after real
&lt;a href=&#34;https://en.wikipedia.org/wiki/Churchwarden&#34;&gt;churchwardens.&lt;/a&gt; They
would have to stay up all night guarding the church and couldn&amp;rsquo;t be
expected to go that long without smoking. However, the smoke from a
traditional pipe would often obscure their vision because it was so
close to their face. The churchwarden was invented so the bowl was
significantly further away and wouldn&amp;rsquo;t get in their line of sight.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;Rustication is the process of adding texture to the bowl (or
shank) of a pipe. Generally, this is done to hide imperfections in
the briar so the pipe still looks good. Personally, I stay away from
&lt;em&gt;fully&lt;/em&gt; rusticated pipes not just because I don&amp;rsquo;t like the
aesthetics but because the wood is likely poor quality. This is
certainly not &lt;em&gt;always&lt;/em&gt; the case, however.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:7&#34;&gt;
&lt;p&gt;Lunting is &lt;em&gt;the act of taking a leisurely stroll whilst smoking a
tobacco pipe (&lt;a href=&#34;https://www.lunting.org/&#34;&gt;Lunting.org&lt;/a&gt;).&lt;/em&gt; When I go
hiking, I&amp;rsquo;ll often take my pipe with me; it&amp;rsquo;s a calm and
contemplative time to simply think and enjoy a good tobacco.&amp;#160;&lt;a href=&#34;#fnref:7&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Site changes</title>
      <link>https://secluded.site/site-changes/</link>
      <category>RSS/Site update</category>>
      <pubDate>Mon, 13 Apr 2020 19:50:25 -0400</pubDate>
      <guid>https://secluded.site/site-changes/</guid>
      <description>&lt;p&gt;I just created a new category called &lt;a href=&#34;../categories/meta&#34;&gt;Meta&lt;/a&gt; and it&amp;rsquo;ll be used for updates about this website and about me. The first thing is that I didn&amp;rsquo;t realise until a few minutes ago that the RSS feeds only had summaries of my posts; that issue has been fixed and the full content is available in each one now. The second thing is some of my plans for this site. Until now, &lt;a href=&#34;https://nixnet.services&#34;&gt;NixNet&lt;/a&gt; has been my online &amp;ldquo;home&amp;rdquo;. I&amp;rsquo;m in the process of making this my home instead. As NixNet grows, it needs to become less personal and more . . . &amp;ldquo;official&amp;rdquo; I guess. Sometime tomorrow, I plan to move all of the blog posts from there to here and make the &lt;code&gt;Blog&lt;/code&gt; menu item lead to &lt;code&gt;secluded.site&lt;/code&gt;. I&amp;rsquo;ll also put redirect in place so links to the old posts will lead to their new home over here.&lt;/p&gt;
&lt;p&gt;Another one of my plans is the make the &lt;code&gt;READ OTHER POSTS&lt;/code&gt; section at the bottom a bit more intuitive. Right now, clicking on the right arrow opens the chronologically previous post and the left arrow opens the next one out of the &lt;em&gt;global&lt;/em&gt; list. That&amp;rsquo;s fine for now but it will be an annoyance when some of my &lt;a href=&#34;../categories/dungeons-dragons&#34;&gt;D&amp;amp;D campaigns&lt;/a&gt; get longer or when I do a series of posts on some topic. It might end up being next week or something but I&amp;rsquo;m going to set up some better logic for determining what&amp;rsquo;s &amp;ldquo;next&amp;rdquo; and what&amp;rsquo;s &amp;ldquo;previous&amp;rdquo; as well as better visual indicators of which is which.&lt;/p&gt;
&lt;p&gt;I don&amp;rsquo;t have &lt;em&gt;any&lt;/em&gt; idea how I would set it up but it would also be nice to let readers pick combinations of feeds rather than having separate feeds for each one or a single feed for &lt;em&gt;everything&lt;/em&gt;. The reason why I set up individual feeds is the same as why I&amp;rsquo;m wanting to give the option for combining them; I know the &lt;a href=&#34;../categories/pipe-smoking/&#34;&gt;Pipe Smoking&lt;/a&gt; category is something few people will want to read but it&amp;rsquo;s a passion of mine and I plan to write about it anyway. The reading experience of the site as a whole shouldn&amp;rsquo;t be lessened because of it though.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Typing International Characters</title>
      <link>https://secluded.site/typing-international-characters/</link>
      <category>Keyboard/Typing/Writing/International/Typography</category>>
      <pubDate>Wed, 08 Apr 2020 13:21:39 -0400</pubDate>
      <guid>https://secluded.site/typing-international-characters/</guid>
      <description>&lt;p&gt;My first computer was an &lt;a href=&#34;https://www.cnet.com/products/acer-c710-2055-chromebook/specs/&#34;&gt;Acer C710
Chromebook.&lt;/a&gt;
There were a &lt;em&gt;lot&lt;/em&gt; of problems with it but one thing I always
appreciated were its dead keys. Until a few days ago, I had &lt;em&gt;completely&lt;/em&gt;
forgotten what the feature was called. Once I figured it out, however, I
was able to do some digging and find the answer fairly quickly.&lt;/p&gt;
&lt;h2 id=&#34;dead-keys&#34;&gt;Dead keys&lt;/h2&gt;
&lt;p&gt;Dead keys&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; are actually a type of modifier, like &lt;code&gt;Ctrl&lt;/code&gt; or &lt;code&gt;Shift&lt;/code&gt;.
They allow people to type accented characters that don&amp;rsquo;t appear on their
keyboard. For example, I have a US keyboard and there is no enye (the
diactric&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; mark over the ñ) as can be found on Spanish and Latin
American layouts.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m not exactly sure why but dead keys don&amp;rsquo;t have to be held down when
you want to use them but they don&amp;rsquo;t; simply strike the dead key then the
character you intend to modify and the resulting accented character will
be rendered properly.&lt;/p&gt;
&lt;p&gt;Dead keys allow writers to use far more characters that just the
accented ones found in various alphabets. Indeed, one can type a &lt;em&gt;very&lt;/em&gt;
wide variety of symbols:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;™ © ® § ¶ ∵ € ¢ ¥ ⅞ x³ ∞ ¬ ÷ ± × ≠ ♪ ♬ ♭ ♮ ♯ → ⇒ ☭ ㉔ ⓐ ß æ ø Œ
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;The full list of all possible combinations (on Linux) can be found in
&lt;a href=&#34;https://cgit.freedesktop.org/xorg/lib/libX11/plain/nls/en_US.UTF-8/Compose.pre&#34;&gt;the documentation from David
Monniaux.&lt;/a&gt;
For a shorter but easier-to-read list, refer to the &lt;a href=&#34;https://help.ubuntu.com/community/GtkComposeTable&#34;&gt;GtkComposeTable
from Ubuntu.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;compose-key&#34;&gt;Compose key&lt;/h2&gt;
&lt;p&gt;If you write code &lt;em&gt;at all&lt;/em&gt;, enabling dead keys alone would be an
absolute &lt;em&gt;nightmare&lt;/em&gt;. To get double quotes, you would have type &lt;code&gt;&amp;quot;&lt;/code&gt; then
&lt;code&gt;Space&lt;/code&gt; every single time. The same goes for &lt;code&gt;&#39;&lt;/code&gt;, &lt;code&gt;:&lt;/code&gt;, &lt;code&gt;;&lt;/code&gt;, &lt;code&gt;~&lt;/code&gt;, etc.
The compose key&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; makes this &lt;em&gt;much&lt;/em&gt; less of an issue. When struck, it
indicates that the next few keys (2 or more) are to function as dead
keys. With this enabled, you can write code without abusing your space
bar but also type résumé&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; correctly.&lt;/p&gt;
&lt;p&gt;I have found this absolutely invaluable in my German course. I am able
to type something like &lt;em&gt;Linux ist großartig&lt;/em&gt; without searching &amp;ldquo;eszet&amp;rdquo;
and copying it from Wikipedia&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt;.&lt;/p&gt;
&lt;h2 id=&#34;usage&#34;&gt;Usage&lt;/h2&gt;
&lt;p&gt;How you enable dead keys or the compose key depends &lt;em&gt;entirely&lt;/em&gt; on your
operating system. I&amp;rsquo;m sure most Linux distributions that ship with a
DE&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt; like &lt;a href=&#34;https://www.gnome.org/&#34;&gt;GNOME,&lt;/a&gt; &lt;a href=&#34;https://kde.org/&#34;&gt;KDE,&lt;/a&gt;
&lt;a href=&#34;https://xfce.org/&#34;&gt;XFCE,&lt;/a&gt; etc. will have a GUI option in the settings.
I use &lt;a href=&#34;https://archlinux.org/&#34;&gt;Arch Linux&lt;/a&gt; with
&lt;a href=&#34;https://github.com/Airblader/i3&#34;&gt;i3-gaps&lt;/a&gt; and thus don&amp;rsquo;t have a GUI to
manage these kinds of things. That&amp;rsquo;s where the &lt;a href=&#34;https://wiki.archlinux.org/index.php/&#34;&gt;Arch
Wiki&lt;/a&gt; comes in.&lt;/p&gt;
&lt;p&gt;Depending on whether you want dead keys or a compose key, there are
different commands to run. I&amp;rsquo;m not sure how to enable the former—you&amp;rsquo;ll
need to read &lt;a href=&#34;https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration&#34;&gt;the page for
that&lt;/a&gt;
yourself—but mapping an existing key to compose is really easy.&lt;/p&gt;
&lt;p&gt;List what your options are&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;grep &amp;#34;compose:&amp;#34; /usr/share/X11/xkb/rules/base.lst
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Copy which first column you want and paste it into this command&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap -option &amp;lt;option-goes-here&amp;gt;
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;I mapped mine to the right &lt;code&gt;Alt&lt;/code&gt; key as I never use it and it&amp;rsquo;s near the space bar. The command for that would simply be:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;setxkbmap -option compose:ralt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;For other interesting things you can do with your keyboard, check &lt;a href=&#34;https://wiki.archlinux.org/index.php/Xorg/Keyboard_configuration#Frequently_used_XKB_options&#34;&gt;that
whole
section&lt;/a&gt;
of the Arch Wiki. It&amp;rsquo;s really one of the best resources there is for
this kind of thing.&lt;/p&gt;
&lt;h2 id=&#34;edit&#34;&gt;Edit&lt;/h2&gt;
&lt;p&gt;Since the time of publication, I&amp;rsquo;ve started using
&lt;a href=&#34;https://wayland.freedesktop.org/&#34;&gt;Wayland&lt;/a&gt; and configuring your
keyboard with &lt;code&gt;setxkbmap&lt;/code&gt; doesn&amp;rsquo;t work. Instead, assuming you&amp;rsquo;re running
&lt;a href=&#34;https://github.com/swaywm/sway/&#34;&gt;sway,&lt;/a&gt; add something along this vein
to your config. If you want to use something other than your right &lt;code&gt;Alt&lt;/code&gt;
key, make sure you change that.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-text&#34; data-lang=&#34;text&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;input type:keyboard xkb_options compose:ralt
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;They&amp;rsquo;re called dead keys because, with most keyboards and
operating systems, there is no visual indication that it&amp;rsquo;s been
struck; the key appears to be dead.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.dictionary.com/browse/diacritic?s=t&#34;&gt;Dictionary.com&lt;/a&gt;:
&amp;ldquo;&lt;em&gt;a mark, point, or sign added or attached to a letter or character
to distinguish it from another of similar form, to give it a
particular phonetic value, to indicate stress, etc.&lt;/em&gt;”&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;Also known as a &lt;em&gt;multi key&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;Yes, résumé is the correct spelling. Resume is &lt;em&gt;accepted&lt;/em&gt; but it&amp;rsquo;s
&lt;em&gt;more&lt;/em&gt; correct with the diacritical&lt;sup id=&#34;fnref1:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; marks.&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;I also had to do the same when I wanted to add an
&lt;a href=&#34;https://wikipedia.org/wiki/Diaeresis_(diacritic)&#34;&gt;umlaut&lt;/a&gt; to
anything, as in &lt;em&gt;über&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;&lt;em&gt;DE&lt;/em&gt; is short for &lt;em&gt;Desktop Environment&lt;/em&gt;. If you&amp;rsquo;re not familiar
with the term, a DE is basically a suite of applications and
programs that make up the interface a computer user interacts with.
The dock on macOS, the start menu on Windows, your file manager,
these are all examples of &lt;em&gt;tightly&lt;/em&gt; integrated applications that
provide the core functionality of whatever operating system you use.&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>The Guilded Mouse</title>
      <link>https://secluded.site/the-guilded-mouse/</link>
      <pubDate>Tue, 07 Apr 2020 12:53:05 -0400</pubDate>
      <guid>https://secluded.site/the-guilded-mouse/</guid>
      <description>&lt;p&gt;A few days ago, &lt;a href=&#34;https://mastodon.xyz/@klaatu&#34;&gt;@klaatu&lt;/a&gt; asked &lt;a href=&#34;https://mastodon.xyz/@klaatu/103907619917870037&#34;&gt;if anyone was up
for a game of D&amp;amp;D 5e.&lt;/a&gt; I didn&amp;rsquo;t
notice it until I saw @ShellOwl&amp;rsquo;s reply (dead link to reply on fedi) in my local
timeline and simply had to join in; my last D&amp;amp;D campaign has been &lt;a href=&#34;../temporary-death-of-the-campaign/&#34;&gt;put on
hold&lt;/a&gt; for the foreseeable future but of
course I still want to play. We met up last Thursday, had our first session, and
I thoroughly enjoyed myself; I&amp;rsquo;m looking forward to the next few weeks!&lt;/p&gt;
&lt;hr&gt;
&lt;p&gt;My companions and I have been adventuring together for some time but, until now, I never thought to record our journeys. As I had the strange feeling I should do so now, on our way to the Guilded Mouse, I picked up a spare book and additional ink. Today has been largely uneventful, however I&amp;rsquo;ll document it regardless.&lt;/p&gt;
&lt;p&gt;A few days ago, we were invited to meet with a man named Sarus at a tavern known as &lt;em&gt;The Guilded Mouse&lt;/em&gt;. Upon arriving in the city, we found that it was a small hole-in-the-wall place and didn&amp;rsquo;t look like much at all. Its slight appearance gave the impression of being wedged between the two much larger buildings on either side. I led the way with Doctor Reed following a few paces behind and Iliris trailing further back, not wanting to be seen as our companion quite yet.&lt;/p&gt;
&lt;p&gt;On entering the tavern, we found two men that could have been Sarus; one with a silver cloak on the left and one clad in grey on the right. The fellow in silver looked rather out of place and uncomfortable, as if he had never hired mercenaries before. However, his garb implied a great deal of wealth and I was rather intrigued. Doctor Reed and I crossed the tavern to speak with the man as Iliris leaned against the bar and ordered a mug of ale. A roguish character, I assumed he had some plan to eavesdrop on our conversation and join in when he felt the time was right.&lt;/p&gt;
&lt;p&gt;We walked up to the man and, peering at us amiably, he asked if there was anything he could do for us. I replied asking him if he went by the name of Sarus. He said he did not but he was looking for a band of adventurers who might help with a problem his organisation was facing. Based on his garb, I assumed he could pay well so I was certainly interested, however we had already arranged to meet with someone else. I explained this and offered to return and hear him out once we concluded our other business and he, with a very relieved expression, accepted. I turned to Doctor Reed, gave a questioning look, and received a nod in confirmation.&lt;/p&gt;
&lt;p&gt;I crossed to the man with the grey cloak and asked if &lt;em&gt;he&lt;/em&gt; went by the name Sarus. He replied with a question of his own and asked if we were the adventurers he was waiting for and, sitting down, I said yes. From this vantage point, I was able to get a closer look at the man; from head to toe, his garb was quite the opposite of the man in silver, favouring function over form. He wore sturdy, leather boots instead of cloth shoes, breeches with bulging pockets, a nondescript vest, and that thick, grey cloak. He introduced himself as Something Sarus—I&amp;rsquo;ve forgotten his forename—and said he was a tenured professor of History at the University of Subtleties. He went on to explain that, in his research, he had discovered what might be a very notable temple not far away, approximately two days journey, and he would like to hire some adventurers to retrieve some artefacts. Specifically, he wanted items of importance to the civilisation he was studying, the Jaundools.&lt;/p&gt;
&lt;p&gt;Pausing for a moment, Sarus fumbled around in his pack and retrieved what appeared to be a very intricate and complex magnifying glass. He held it up and said that it would detect the kind of artefacts he wanted us to collect. Being rather scholarly, I was curious how it worked on a more fundamental level. Hesitating as if gauging my intelligence and whether or not I would actually understand him, he said that it was a device of his own creation and tuned to a very specific god. He never had the chance to actually test it in the field so he requested that we monitor it carefully and apprise him of its behaviour when we returned. Satisfied that I could be trusted with it, Sarus handed the device to me and said to turn the knob on the handle left or right to adjust it; it was rather finicky and I would have to play with it. When looking at something related to the Jaundools, the band should emit a faint green glow. As Sarus sat back, indicating he had nothing further to say, Doctor Reed leaned forward and asked a few questions of his own.&lt;/p&gt;
&lt;p&gt;The first thing on his mind was whether or not the temple was inhabited; he wanted to know if we would be stealing from anyone. Sarus said that, as far as he knew, the temple was completely abandoned and had been for centuries. He expected that the only creatures we would encounter would be on the road there. He would go himself but the way was too dangerous and he had students to instruct. The university had graciously offered to finance the expedition and he would be able to pay us 200 gold pieces each. This was a meagre sum and, seeing both of us hesitate, Sarus quickly added that we would be able to keep &lt;em&gt;any&lt;/em&gt; artefacts we found that were &lt;em&gt;not&lt;/em&gt; related to the Jaundools.&lt;/p&gt;
&lt;p&gt;At this point, Iliris came over from the bar, pulled up a chair, sat down, and got right to business. He asked what &lt;em&gt;exactly&lt;/em&gt; we could expect at the temple and on the way there: would there just be a few small creatures easily taken care of, was there something larger awaiting us, what? A little taken aback at this blunt intruder, Sarus said that, based on the research he had conducted, the temple was &lt;em&gt;completely&lt;/em&gt; empty. It had been lost for centuries and no one but he and the university knew it existed. Iliris peered suspiciously at the man and said, considering that he didn&amp;rsquo;t actually know for &lt;em&gt;sure&lt;/em&gt; what was awaiting them at the temple, they should really be paid 250 gold pieces each. Uncertainty about the dangers would increase the price. Sarus quickly agreed and said that the university had a small amount set aside and he would be able to draw from it to pay us; 250 each would be fine.&lt;/p&gt;
&lt;p&gt;Iliris then asked if there was a minimum number of artefacts we should bring back and Sarus said there was no &lt;em&gt;hard&lt;/em&gt; minimum but he would be extremely disappointed if we returned with fewer than six small items or something of equivalent value: one large statue, a few medium-size pieces, something like that. He also said that there was no urgency in completing the expedition. He wanted us to take our time and examine everything thoroughly so we could make the most of the journey. Satisfied, Iliris rose and stepped back to the bar to finish his drink. With a covert gesture to Doctor Reed, he indicated that we had yet to decide on a meeting place once the job was completed. The Doctor asked and Sarus suggested simply seeking his office at the university.&lt;/p&gt;
&lt;p&gt;After draining his glass, Iliris walked to the wealthy man we first met with. I was not within earshot but, from what I could see, it looked as if he took on the same attitude as with Sarus; incredibly blunt and business-like. Doctor Reed and I were content to stay where we were so we both got a drink and I ordered some food. After a short period of time, Iliris got up and simply left without so much as a nod us. We finished our food and strode outside after him. Summing up the conversation, Iliris said that the man would pay each of us 300 gold pieces if we would investigate a manor in a neighbouring town. The locals say it&amp;rsquo;s haunted by its previous owner but the city council he represents believes it to be nothing more than superstition. Regardless, they still need to put on a show for the townspeople&amp;rsquo;s benefit so he wants us to take a look and rid the place of any creatures or ghosts that may be there, however unlikely that may be.&lt;/p&gt;
&lt;p&gt;Iliris took out a slip of paper he said the man gave him; it had a name and address on it where we could reach him once the job was complete. When I saw it, I felt a slight gust of cold air on the nape of my neck. I motioned for him to give it to me and, as soon as my fingers touched the rough scrap of paper, I got the odd feeling that whoever wrote the words was not from Baldur&amp;rsquo;s Gate—indeed, was not even from the Forgotten Realms. My mind whirled with the implication as I passed it back to Iliris and commented on the impression. Unable to investigate further, we simply let it go for now.&lt;/p&gt;
&lt;p&gt;After a few minutes of discussion, it was decided that we would venture to the house. We travelled cautiously and chose to rest for the night by a river. Rather unfortunately, some crocodiles happened to live there. I was nearest to the water and so was attacked first and promptly knocked unconscious. I woke a few seconds later as Doctor Reed cast &lt;em&gt;Healing Word&lt;/em&gt; and revived me. Iliris had jumped from his position further away to a tree branch and then onto the beast attacking me. Rising, I drew my crossbow and fired a bolt at the one Doctor Reed was charging; it thudded into the crocodile&amp;rsquo;s flesh and sank in. Nonetheless, when he met the animal, it snapped at him and he quickly went down, as well. Neither Iliris nor I had anything that could revive him so we focused first on slaying the beasts.&lt;/p&gt;
&lt;p&gt;Just as I loosed another bolt at the crocodile chewing on Doctor Reed, I heard a groan and saw Iliris sink to the ground, slammed into unconsciousness by the beast he had been riding. Still determined to minimise the damage done to Doctor Reed, I took a third shot in his direction and that crocodile let out a sharp hiss just before it slunk off toward the river and died halfway there. As I made ready to cast &lt;em&gt;Misty Step&lt;/em&gt;, Doctor Reed rose and—still reeling—tried to regain his bearings. A moment later, I appeared approximately 15 feet away from the remaining crocodile and quickly fired. The bolt sailed past and into the water. Fortunately, Doctor Reed had recovered enough to loose a bolt of his own and slay the creature.&lt;/p&gt;
&lt;p&gt;We dragged the bodies away from the camp, returned, bandaged our wounds, ate a hearty dinner, and decided who would take first watch. Doctor Reed volunteered so I&amp;rsquo;m using a portion of this time to write. He should wake me in about an hour. In the morning, we&amp;rsquo;ll be off to Saltmarsh.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>On smoking a pipe</title>
      <link>https://secluded.site/on-smoking-a-pipe/</link>
      <category>Personal/Missouri Meerschaum/Indian Summer/Lord of the Rings</category>>
      <pubDate>Sun, 05 Apr 2020 21:38:07 -0400</pubDate>
      <guid>https://secluded.site/on-smoking-a-pipe/</guid>
      <description>&lt;p&gt;The Lord of the Rings is one the greatest book series I have ever read
as well as one of my favourite movie trilogies; when I was younger, I
watched them so often that I knew &lt;em&gt;almost&lt;/em&gt; exactly where all the scenes
were in the timeline and could quote a fair few of the lines verbatim &amp;#x1f609;
Pipe smoking was very prominent throughout, from the hobbits to the
humans to the dwarves, and I was always intrigued by it. In my second
year of high school/college,&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; I took a public speaking course and
decided to do my persuasive speech on the topic; my purpose was not to
convince people &lt;em&gt;to&lt;/em&gt; smoke a pipe, rather that they shouldn&amp;rsquo;t judge pipe
smokers as harshly. In conducting my research, I ended up wanting to try
it for myself.&lt;/p&gt;
&lt;p&gt;Another influence was likely my grandfather. I don&amp;rsquo;t remember it
&lt;em&gt;particularly&lt;/em&gt; well other than a few scattered images here and there but
I do know he smoked everything from cigarettes to cigars, cigarillos,
and pipes. A few days ago, my grandmother commented on my pipe stand and
said he had had one very similar before his stroke.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;Shortly after my 18th birthday, I ordered &lt;a href=&#34;https://corncobpipe.com/missouri-pride-corncob-pipe.html&#34;&gt;my first corn cob
pipe&lt;/a&gt; from
&lt;a href=&#34;https://corncobpipe.com/&#34;&gt;Missouri Meerschaum&lt;/a&gt; and ended up falling in
love. I went to my local tobacconist and asked what he recommended for
someone who was just getting into it. He suggested two blends I think
they created in-house; one was an aromatic&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; called &lt;em&gt;Indian Summer&lt;/em&gt;
and the other was an English&lt;sup id=&#34;fnref1:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; which I&amp;rsquo;ve forgotten the name of.&lt;/p&gt;
&lt;p&gt;The first one I tried was Indian Summer as people typically start with
an aromatic. It&amp;rsquo;s sort of like drinking beer before brandy (I&amp;rsquo;ve never
had brandy so I don&amp;rsquo;t know what it actually tastes like); the former is
palatable to most while the latter is an acquired taste. The flavour was
a little odd but I enjoyed it nonetheless. The English on the other hand
. . . suffice it to say&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; that my palate hadn&amp;rsquo;t (and still hasn&amp;rsquo;t)
developed that far. When I open the jar, my nose is assaulted with a
smell reminiscent of burning rubber; it&amp;rsquo;s very sharp and acrid. Other
than smelling it and promptly deciding to leave it for another day, that
blend has stayed in the same jar since I made the purchase.&lt;/p&gt;
&lt;p&gt;The pipe I started with, the &lt;a href=&#34;https://corncobpipe.com/missouri-pride-corncob-pipe.html&#34;&gt;Missouri
Pride,&lt;/a&gt; is one
that pretty much every podcast, blog post, and tutorial recommends.
There&amp;rsquo;s no reason to pay over $100 for an artisan pipe when you can get
a feel for the hobby spending less than $15 including tobacco, tamper,
and pipe cleaners. It wasn&amp;rsquo;t a &lt;em&gt;stellar&lt;/em&gt; experience but I would
certainly recommend it to anyone that&amp;rsquo;s curious; corn cob pipes are the
best way to see if you&amp;rsquo;ll enjoy the activity. In addition, many pipe
smokers still buy cobs because of their low price. You can take one out
with you and, if you drop and break it, you&amp;rsquo;re really not out that much.
My &lt;a href=&#34;https://corncobpipe.com/the-emerald-corn-cob-pipe&#34;&gt;Emerald&lt;/a&gt; is
supposed to get here sometime tomorrow (I know that website is down at
the moment; I&amp;rsquo;ll edit this and add a picture or two once the pipe
arrives).&lt;/p&gt;
&lt;p&gt;One of my favourite aspects of smoking a pipe is the &amp;ldquo;ritual&amp;rdquo; associated
with it. You pick which pipe you&amp;rsquo;re in the mood for, select the tobacco,
go through the stages of packing the bowl, striking the &amp;ldquo;false
light&amp;rdquo;,&lt;sup id=&#34;fnref:5&#34;&gt;&lt;a href=&#34;#fn:5&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;5&lt;/a&gt;&lt;/sup&gt; letting it go out, tamping it down again, striking the &amp;ldquo;true
light&amp;rdquo;, and then, finally, sitting back to enjoy the flavour whilst
reading a good book. It&amp;rsquo;s one of the most relaxing hobbies I&amp;rsquo;ve ever
had. Another aspect I appreciate is the &lt;em&gt;rich&lt;/em&gt; history and tradition
associated with pipe smoking. I may discuss this further in another post
but, for now, I&amp;rsquo;ll say that tradition and history are &lt;em&gt;incredibly&lt;/em&gt;
important to me.&lt;sup id=&#34;fnref:6&#34;&gt;&lt;a href=&#34;#fn:6&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;6&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;I attended an Early College; I was taking college courses &lt;em&gt;instead
of&lt;/em&gt; some high school courses yet getting credit for both. I ended up
going to high school for five years and coming out with three
Associate Degrees.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;When I was 7 or 8, he had a severe stroke due to a blood clot
likely caused by how often he smoked. He spent the next 9 years
paralysed on his left side and wheelchair-bound.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;You can read about the different styles and flavours of pipe
tobacco at the &lt;a href=&#34;https://pipedia.org/wiki/Pipe_Tobaccos&#34;&gt;Pipedia&lt;/a&gt;, a
fantastic resource on pipe smoking.&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref1:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://www.dictionary.com/browse/suffice-it-to-say&#34;&gt;Dictionary.com&lt;/a&gt;:
&amp;ldquo;It is enough to say this and no more, as in &lt;em&gt;Suffice it to say that
the judge was furious when the invitation was withdrawn.&lt;/em&gt;&amp;rdquo;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:5&#34;&gt;
&lt;p&gt;When you&amp;rsquo;re lighting a pipe, you first put the flame to the
tobacco and move it around the bowl trying to evenly &amp;ldquo;toast&amp;rdquo; it, all
the while drawing the flame down further by sucking as you would on
a straw (&lt;em&gt;not&lt;/em&gt; inhaling). After doing this for 15-20 seconds, you
stop and let the flame die. The tobacco will fluff up from the heat
(like when lighting any other fire with tinder) so you tamp it back
down. The next time you light it, it will stay lit. This is the
&amp;ldquo;true light&amp;rdquo;.&amp;#160;&lt;a href=&#34;#fnref:5&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:6&#34;&gt;
&lt;p&gt;Because this is my blog and I don&amp;rsquo;t have to conform to any
academic standards, I&amp;rsquo;m ending it here. Goodbye and thanks for
reading &amp;#x1f601;&amp;#160;&lt;a href=&#34;#fnref:6&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>(Temporary?) Death of the Campaign</title>
      <link>https://secluded.site/temporary-death-of-the-campaign/</link>
      <pubDate>Fri, 03 Apr 2020 09:13:20 -0400</pubDate>
      <guid>https://secluded.site/temporary-death-of-the-campaign/</guid>
      <description>&lt;p&gt;With the emergence of COVID-19, our university shutting down, and
everything going remote, this campaign has ended. Our DM and a few of
the other guys don&amp;rsquo;t like playing without face-to-face interaction. It&amp;rsquo;s
unfortunate but I do understand; half of our sessions consisted of us
being complete dumbasses and dying laughing at something stupid one of
us did. I did have half-finished notes that were going to be made into
stories like &lt;a href=&#34;../kroznik/&#34;&gt;the first&lt;/a&gt; but I don&amp;rsquo;t remember
enough of what else happened to complete them.&lt;/p&gt;
&lt;p&gt;We might pick things up in the Fall once the university opens and we can
move back in or we might just start a new one; it remains to be seen.
Whatever happens, there will be a new post in &lt;a href=&#34;../categories/dungeons-dragons/&#34;&gt;the
category.&lt;/a&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Consuming News</title>
      <link>https://secluded.site/consuming-news/</link>
      <category>Productivity/Reading/RSS/wallabag/TT-RSS/Firefox/eReader/Workflow</category>>
      <pubDate>Tue, 31 Mar 2020 14:08:14 -0400</pubDate>
      <guid>https://secluded.site/consuming-news/</guid>
      <description>&lt;p&gt;I recently posted about getting through 487 feed items in less than half an hour
and I thought I would write about my setup here. There are three primary
applications that require some configuration:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a href=&#34;https://tt-rss.org/&#34;&gt;Feed reader&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://www.mozilla.org/firefox/new/&#34;&gt;Browser&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;&lt;a href=&#34;https://wallabag.org&#34;&gt;Read-it-later service&lt;/a&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;tiny-tiny-rss&#34;&gt;Tiny Tiny RSS&lt;/h2&gt;
&lt;p&gt;My feed reader of choice is TT-RSS. It&amp;rsquo;s one of the most advanced
readers I&amp;rsquo;ve ever used and can be tailored for any workflow. My basic
preferences are below:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&amp;#x2705; Enable categories&lt;/li&gt;
&lt;li&gt;&amp;#x2705; Combined mode&lt;/li&gt;
&lt;li&gt;&amp;#x2705; Always expand articles&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt;&lt;/li&gt;
&lt;li&gt;&amp;#x2705; Show content preview in headlines&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;Making use of the categories is &lt;em&gt;very&lt;/em&gt; important; if you have a lot of
feeds, getting through them is much easier when you can go topic by
topic and leave some for when you have more time.&lt;/p&gt;
&lt;p&gt;In addition to categories, the &lt;em&gt;big&lt;/em&gt; feature I make use of is keyboard
shortcuts. You can view those from the hamburger menu&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt; in the top
right at &lt;code&gt;Keyboard shortcuts help&lt;/code&gt;. &lt;code&gt;n&lt;/code&gt; and &lt;code&gt;o&lt;/code&gt; is what I make use of
more than any other; &lt;code&gt;n&lt;/code&gt; goes to the next article (or scrolls in
particularly long ones) and &lt;code&gt;o&lt;/code&gt; opens the source in a new tab. This
would be great except that most browsers automatically switch to that
new tab. If you&amp;rsquo;re just wanting to get it up there to deal with later as
I do, this diversion is &lt;em&gt;incredibly&lt;/em&gt; annoying. Thankfully, it can be
disabled in Firefox &amp;#x1f60f;&lt;/p&gt;
&lt;h2 id=&#34;firefox&#34;&gt;Firefox&lt;/h2&gt;
&lt;p&gt;This setting is pretty damn easy; open &lt;code&gt;about:config&lt;/code&gt;, search for
&lt;code&gt;loadDivertedInBackground&lt;/code&gt;, and set it to true.&lt;/p&gt;
&lt;p&gt;When you right-click something and open it in a new tab, you&amp;rsquo;re
automatically diverted to it. In some cases, this is convenient but I&amp;rsquo;ve
always found it annoying and worked around it by middle clicking links.
Changing this setting in &lt;code&gt;about:config&lt;/code&gt; will make it so &lt;em&gt;all&lt;/em&gt; tabs open
in the background leaving your current tab focused.&lt;/p&gt;
&lt;h2 id=&#34;wallabag&#34;&gt;wallabag&lt;/h2&gt;
&lt;p&gt;My read-it-later application is &lt;a href=&#34;https://wallabag.org&#34;&gt;wallabag,&lt;/a&gt; a
libre alternative to Mozilla&amp;rsquo;s Pocket (which they still haven&amp;rsquo;t made
open source &amp;#x1f440;) I use the &lt;a href=&#34;https://addons.mozilla.org/en-US/firefox/addon/wallabagger/&#34;&gt;Firefox
Add-on&lt;/a&gt; so
simply clicking the icon will send the URL to my server for download. I
also have an application on &lt;a href=&#34;https://us.kobobooks.com/products/kobo-aura-one-limited-edition&#34;&gt;my
eReader&lt;/a&gt;
called &lt;a href=&#34;https://gitlab.com/anarcat/wallabako/&#34;&gt;Wallabako.&lt;/a&gt; It downloads
articles from wallabag as ePubs so I can read online articles while I&amp;rsquo;m
offline as if they were books. A dream come true &amp;#x1f609;&lt;/p&gt;
&lt;h2 id=&#34;entire-workflow&#34;&gt;Entire workflow&lt;/h2&gt;
&lt;p&gt;With all that out of the way, here&amp;rsquo;s my entire workflow.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;Select topic of interest (category)&lt;/li&gt;
&lt;li&gt;Start at the top and use &lt;code&gt;n&lt;/code&gt; to quickly view the &lt;code&gt;n&lt;/code&gt;ext headline and
maybe a short preview of the content&lt;/li&gt;
&lt;li&gt;If you want to read more, &lt;code&gt;o&lt;/code&gt;pen it in the background&lt;/li&gt;
&lt;li&gt;Continue pressing &lt;code&gt;n&lt;/code&gt; and/or &lt;code&gt;o&lt;/code&gt; until you get to the bottom&lt;/li&gt;
&lt;li&gt;If you have time, move to the next category&lt;/li&gt;
&lt;li&gt;Use &lt;code&gt;CTRL+Tab&lt;/code&gt; to cycle through all the links you opened and send
them to wallabag for consuming later&lt;/li&gt;
&lt;/ol&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;Depending on what feeds you add, you might want to disable this.
Slashdot makes up the bulk of my feed items and they generally fit
on one page.&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;A hamburger menu is three parallel horizontal lines typically
styled as a button that expands to show a menu of some kind.&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Reading Methods &amp; RSVP</title>
      <link>https://secluded.site/reading-methods-rsvp/</link>
      <category>Productivity/Reading/TIL</category>>
      <pubDate>Thu, 13 Feb 2020 21:57:28 -0500</pubDate>
      <guid>https://secluded.site/reading-methods-rsvp/</guid>
      <description>&lt;h2 id=&#34;reading-methods&#34;&gt;Reading methods&lt;/h2&gt;
&lt;p&gt;Today, I learned that there are three primary ways people read. The
first and most common is &lt;em&gt;mental reading&lt;/em&gt; and this is when you &amp;ldquo;say&amp;rdquo; the
words in your head as if you were speaking them.&lt;sup id=&#34;fnref:1&#34;&gt;&lt;a href=&#34;#fn:1&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;1&lt;/a&gt;&lt;/sup&gt; I find this useful
when writing because it&amp;rsquo;s as if I&amp;rsquo;m &lt;em&gt;actually&lt;/em&gt; speaking them; picking
out sentences and phrases that don&amp;rsquo;t sound quite right is easier. In
writing courses, the instructor&amp;rsquo;s advice is often to read your work
aloud and see how it sounds as mistakes, word choices, and grammatical
errors are typically much more prominent. Personally, I find doing it in
my head sufficient though. Mental reading is the slowest method but also
where your comprehension is at its peak; you are forced to slow down and
that gives your brain more time to process the information it&amp;rsquo;s being
fed. The average speed is 250 WPM.&lt;sup id=&#34;fnref:2&#34;&gt;&lt;a href=&#34;#fn:2&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;2&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;The second method is called &lt;em&gt;auditory reading&lt;/em&gt; and it&amp;rsquo;s just listening
to words spoken by a person or a TTS&lt;sup id=&#34;fnref:3&#34;&gt;&lt;a href=&#34;#fn:3&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;3&lt;/a&gt;&lt;/sup&gt; engine. Because listening is
generally more passive, it&amp;rsquo;s much easier to completely miss individual
words while still understanding the meaning of the phrase or passage.
This is significantly faster than mental reading at an average of around
450 WPM. However, comprehension takes a hit because you have less time
to process the information.&lt;/p&gt;
&lt;p&gt;&lt;em&gt;Visual reading&lt;/em&gt; is the last and fastest. The concept may be kind of
hard to grasp at first but the next paragraph about Stutter will
hopefully make it clearer. Visual reading is understanding the meaning
of the word without having to hear it or say it in your head,
recognising it based on its shape and the letters it&amp;rsquo;s comprised of.
Comprehension is at its lowest here but speed peaks. The &lt;em&gt;average&lt;/em&gt;
reader who uses this method can consume 700 words per minute. To put
that in perspective, it&amp;rsquo;s 2.8x faster than mental reading. While
comprehension is low, it is not nonexistent. The best way to understand
what I mean is to try it for yourself.&lt;/p&gt;
&lt;p&gt;&lt;strong&gt;Note:&lt;/strong&gt; &lt;a href=&#34;https://steemit.com/content/@jacor/speed-reading-a-wonderful-skill-to-obtain&#34;&gt;Some
sources&lt;/a&gt;
say that, with practise and when done correctly, there is no difference
in comprehension, rather the opposite; you retain information
&lt;em&gt;significantly&lt;/em&gt; better when speed reading properly. This is where I
would recommend actually doing it and deciding for yourself.&lt;/p&gt;
&lt;h2 id=&#34;stutter&#34;&gt;Stutter&lt;/h2&gt;
&lt;p&gt;&lt;a href=&#34;https://github.com/jamestomasino/stutter&#34;&gt;Stutter&lt;/a&gt; is a Firefox and
Chrome extension that brings RSVP&lt;sup id=&#34;fnref:4&#34;&gt;&lt;a href=&#34;#fn:4&#34; class=&#34;footnote-ref&#34; role=&#34;doc-noteref&#34;&gt;4&lt;/a&gt;&lt;/sup&gt; to your browser and lets you
develop visual reading skills. It specifically makes use of &lt;em&gt;peripheral
reading&lt;/em&gt; and displays a single word at time but moves through them at
rapid pace. It highlights a single character of the current word just to
the left of the centre. This is because a word can usually be recognised
by its first few characters; the rest aren&amp;rsquo;t as important. The highlight
remains in a fixed position so you never have to move your eyes. Because
of that, Stutter is able to display new words much more quickly; the
average reader can usually comfortably start at 500 WPM but it is
possible to reach speeds of over 1200 WPM with regular practise. I
haven&amp;rsquo;t gotten that far yet &amp;#x1f609;&lt;/p&gt;
&lt;p&gt;For more information on speed reading, the &lt;a href=&#34;https://wikipedia.org/wiki/Speed_reading&#34;&gt;Wikipedia
page&lt;/a&gt; (where I got most of my
information) is really interesting and well-worth a read.&lt;/p&gt;
&lt;h2 id=&#34;edits&#34;&gt;Edits&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;@caltlgin (dead link to fedi profile) recommended
&lt;a href=&#34;https://octobanana.com/software/fltrdr&#34;&gt;flrdr,&lt;/a&gt; a TUI tool for reading with
RSVP&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;footnotes&#34; role=&#34;doc-endnotes&#34;&gt;
&lt;hr&gt;
&lt;ol&gt;
&lt;li id=&#34;fn:1&#34;&gt;
&lt;p&gt;The technical term is
&lt;em&gt;&lt;a href=&#34;https://wikipedia.org/wiki/Subvocalization&#34;&gt;subvocalisation&lt;/a&gt;&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:1&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:2&#34;&gt;
&lt;p&gt;Words per minute&amp;#160;&lt;a href=&#34;#fnref:2&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:3&#34;&gt;
&lt;p&gt;&lt;a href=&#34;https://wikipedia.org/wiki/Speech_synthesis&#34;&gt;Text-to-speech&lt;/a&gt;&amp;#160;&lt;a href=&#34;#fnref:3&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&#34;fn:4&#34;&gt;
&lt;p&gt;&lt;em&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Rapid_serial_visual_presentation&#34;&gt;Rapid serial visual
presentation&lt;/a&gt;&lt;/em&gt;&amp;#160;&lt;a href=&#34;#fnref:4&#34; class=&#34;footnote-backref&#34; role=&#34;doc-backlink&#34;&gt;&amp;#x21a9;&amp;#xfe0e;&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/div&gt;
</description>
    </item>
    
    <item>
      <title>Krozn&#39;ik</title>
      <link>https://secluded.site/kroznik/</link>
      <pubDate>Sun, 09 Feb 2020 01:03:03 -0500</pubDate>
      <guid>https://secluded.site/kroznik/</guid>
      <description>&lt;p&gt;Today was, quite honestly, average for this band. Before I get into what happened, however, I had better introduce myself. I am Krozn&amp;rsquo;ik, a half-orc. I know not where I was born save that the entirety of my village was slaughtered and I was raised by one of the knights party to the massacre. I was incredibly young at the time so he is the only father I have ever really known. We never had much but it was enough: a modest house near the centre of a small town, clothes without holes, enough food that we didn&amp;rsquo;t starve, and so on. Though Father tried to teach me the ways of the sword, shield, and spear, it wasn&amp;rsquo;t until I picked up a greataxe that he felt I had &amp;ldquo;found it&amp;rdquo;. Within a couple short years, I was wielding the weapon as an extension of my body, able to make it sing as it sliced through the air, turned on a dime, and darted through the wooden poles we set up for practice.&lt;/p&gt;
&lt;p&gt;Once I grew to be 17 or so, father started sending me to deal with minor issues in the neighbouring villages in his stead, fending off small groups of bandits, protecting towns from parties of goblins, things like that. Eventually, our lord sent me a few hundred kilometres West to care for another village. While there, a large band of orcs raided my father&amp;rsquo;s city and slew him along with every one else. I left my people in the care of another knight and began a quest for vengeance. That is a story for another time, however.&lt;/p&gt;
&lt;p&gt;This tale follows Angus, a dwarvish giant, a human ranger, Ryu, a barbarian called Tyler2, Valthos the Fighter, and, of course, me. It&amp;rsquo;s an odd story, taking place in the caverns of Purgatorus, but one well worth reading. I didn&amp;rsquo;t think to record our journey until the third encounter so I will do my best to recap it in the following entries. For now, this brief and inadequate introduction will have to suffice; we have just made camp and are resting for our journey back to Byron in the Cathedral of Thyatira.&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Downloading courses from Linux Academy</title>
      <link>https://secluded.site/downloading-courses-from-linux-academy/</link>
      <category>youtube-dl/Linux Academy/Training</category>>
      <pubDate>Sat, 19 Oct 2019 01:35:00 -0400</pubDate>
      <guid>https://secluded.site/downloading-courses-from-linux-academy/</guid>
      <description>&lt;h2 id=&#34;forward&#34;&gt;Forward&lt;/h2&gt;
&lt;p&gt;Every month, Linux Academy releases courses for free. I&amp;rsquo;m a very busy
college student and don&amp;rsquo;t have time to whirl through everything I want
to before it goes behind their paywall again so I figured out how to
download a course or two every month using
&lt;a href=&#34;https://github.com/ytdl-org/youtube-dl/&#34;&gt;&lt;code&gt;youtube-dl&lt;/code&gt;.&lt;/a&gt;&lt;/p&gt;
&lt;h2 id=&#34;setup&#34;&gt;Setup&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Install
&lt;a href=&#34;https://ytdl-org.github.io/youtube-dl/download.html&#34;&gt;&lt;code&gt;youtube-dl&lt;/code&gt;&lt;/a&gt;&lt;/li&gt;
&lt;li&gt;Make sure you have a browser handy&lt;/li&gt;
&lt;li&gt;Create a community account on Linux Academy&lt;/li&gt;
&lt;li&gt;Get some food&lt;/li&gt;
&lt;li&gt;Maybe a drink&lt;/li&gt;
&lt;li&gt;Sit back down in your chair&lt;/li&gt;
&lt;li&gt;Spin around a bit&lt;/li&gt;
&lt;li&gt;Read on&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;downloading&#34;&gt;Downloading&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Log into your account&lt;/li&gt;
&lt;li&gt;Pick the course you want&lt;/li&gt;
&lt;li&gt;Open the developer console and go to &lt;code&gt;Network&lt;/code&gt; (Ctrl+Shift+E in
Firefox)&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll want to select &lt;code&gt;Media&lt;/code&gt; as shown in the screenshot below&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;In moving my posts around, this screenshot has disappeared&lt;/em&gt; &amp;#x1f937;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Click the video you want to start with&lt;/li&gt;
&lt;li&gt;Watch the network logs&lt;/li&gt;
&lt;li&gt;You&amp;rsquo;ll see an entry that starts with &lt;code&gt;playlist&lt;/code&gt; (screenshot below)&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;&lt;em&gt;In moving my posts around, this screenshot has disappeared&lt;/em&gt; &amp;#x1f937;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Right click it&lt;/li&gt;
&lt;li&gt;Copy the URL&lt;/li&gt;
&lt;li&gt;Paste it after &lt;code&gt;youtube-dl&lt;/code&gt; in a terminal:&lt;/li&gt;
&lt;/ul&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amolith@poseidon:~ $ youtube-dl https://video-cdn.linuxacademy.com/vods3/_definst_/smil:box/cdnstore/modules/lots-of-stuff-in-here
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;ul&gt;
&lt;li&gt;Press enter&lt;/li&gt;
&lt;li&gt;Watch the magic unfold&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;At a high level, &lt;code&gt;youtube-dl&lt;/code&gt; is acting like your browser and following
the &lt;code&gt;m3u&lt;/code&gt; playlist to download chunks of the file. After it fetches them
all, it runs them through &lt;code&gt;ffmpeg&lt;/code&gt; to stitch them together into a single
video!&lt;/p&gt;
&lt;p&gt;I found it useful to open a text editor and script downloading a whole
course at a time. All you have to do is type &lt;code&gt;youtube-dl -o&lt;/code&gt; and
copy/paste it however many times there are videos. Then, copy and paste
the video title in quotes after &lt;code&gt;-o&lt;/code&gt; and add &lt;code&gt;.mp4&lt;/code&gt; to the end (command
example below). After that, paste the URL. Do that with every video in
the series, save the script, run &lt;code&gt;chmod +x &amp;lt;script&amp;gt;&lt;/code&gt;, then &lt;code&gt;./&amp;lt;script&amp;gt;&lt;/code&gt;
and (after a bit) you&amp;rsquo;ll have an entire course you can watch at your
leasure!&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amolith@poseidon:~ $ youtube-dl -o &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;04 - Conclusion and Next Steps.mp4&amp;#34;&lt;/span&gt; https://video-cdn.linuxacademy.com/vods3/_definst_/smil:box/cdnstore/modules/lots-of-stuff-here
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;strong&gt;NOTE:&lt;/strong&gt; You may want to set up your directory structure beforehand so
it&amp;rsquo;s easier to script the process. Here&amp;rsquo;s an example of one of mine:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amolith@poseidon:~/Videos/Courses/Ansible - Playbooks Deep Dive $ tree
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;.
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-- 01 - Course Overview
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 01 - About the Course.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 02 - About the Training Architect.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 03 - Course Features and Tools.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 04 - About Ansible Playbooks.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\-&lt;/span&gt;- 05 - Advanced Inventory Configuration.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-- 02 - Playbook Basics
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 01 - Using YAML &lt;span style=&#34;font-weight:bold&#34;&gt;for&lt;/span&gt; Ansible Playbooks.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 02 - Creating an Ansible Play.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 03 - The ansible-playbook Command.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\-&lt;/span&gt;- 04 - Understanding Playbook Tasks.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-- 03 - Essential Playbook Syntax
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 01 - Using Variables in Playbooks.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 02 - Working with Templates.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 03 - Using Ansible Facts.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 04 - Conditional Execution in Playbooks.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 05 - Using Loops in Ansible.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\-&lt;/span&gt;- 06 - Working with Handlers in Ansible.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;+-- 04 - Advanced Playbook Syntax
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 01 - Executing Selective Parts of a Playbook.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 02 - Working with Sensitive Data Using Ansible Vault.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 03 - Error Handling in a Playbook: limit, ignore_errors, changed_when, and failed_when.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 04 - Error Handling in a Playbook: Block Groups and The Debug Module.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 05 - Asynchronous Tasks within a Playbook.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 06 - Delegating Playbook Execution with delegate_to and local_action.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 07 - Parallelism in Playbooks.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 08 - Using run_once.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   +-- 09 - Overview of Ansible Roles.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;|   &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\-&lt;/span&gt;- 10 - Ansible Role Demo.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#666;font-style:italic&#34;&gt;\-&lt;/span&gt;- 05 - Conclusion and Next Steps.mp4
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;4 directories, 26 files
&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;amolith@poseidon:~/Videos/Courses/Ansible - Playbooks Deep Dive $
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;</description>
    </item>
    
    <item>
      <title>Removing your site from the Wayback Machine (GPG)</title>
      <link>https://secluded.site/removing-your-site-from-the-wayback-machine-gpg/</link>
      <category>Archive.org/Privacy/Sysadmin</category>>
      <pubDate>Tue, 04 Jun 2019 21:57:00 -0400</pubDate>
      <guid>https://secluded.site/removing-your-site-from-the-wayback-machine-gpg/</guid>
      <description>&lt;h2 id=&#34;preface&#34;&gt;Preface&lt;/h2&gt;
&lt;p&gt;If you simply want to remove your website and nothing else, read through
the setup and verifying identities sections then continue from the &lt;a href=&#34;../removing-your-site-from-the-wayback-machine-keybase/#for-domains-you-own&#34;&gt;For
domains you
own&lt;/a&gt;
section of the previous post. If you&amp;rsquo;re wanting to address
accounts/profiles on websites you don&amp;rsquo;t own, read on.&lt;/p&gt;
&lt;p&gt;In addition to dealing with the Wayback Machine, this article is also
supposed to help you get started using GPG in every-day life for general
security and privacy.&lt;/p&gt;
&lt;h2 id=&#34;getting-set-up&#34;&gt;Getting set up&lt;/h2&gt;
&lt;h3 id=&#34;installation--generating-keys&#34;&gt;Installation &amp;amp; Generating Keys&lt;/h3&gt;
&lt;p&gt;First of all, you&amp;rsquo;ll want to install GPG. The package on most
distributions should be just be &lt;code&gt;gnupg&lt;/code&gt;.&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Debian: &lt;code&gt;sudo apt install gnupg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Arch: &lt;code&gt;sudo pacman -S gnupg&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Fedora: &lt;code&gt;sudo dnf install gnupg&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;The next step is generating your key. While it will take a bit longer to
generate, a stronger key will be more secure. Also make sure you read
this excerpt from the &lt;code&gt;man&lt;/code&gt; page as it contains a useful warning.&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;strong&gt;WARNINGS&lt;/strong&gt;&lt;/p&gt;
&lt;p&gt;Use a &lt;em&gt;good&lt;/em&gt; password for your user account and a &lt;em&gt;good&lt;/em&gt; passphrase to
protect your secret key. This passphrase is the weakest part of the
whole system. Programs to do dictionary attacks on your secret keyring
are very easy to write and so you should protect your &lt;code&gt;~/.gnupg/&lt;/code&gt;
directory very well.&lt;/p&gt;
&lt;/blockquote&gt;
&lt;p&gt;With that said, use &lt;code&gt;gpg --full-gen-key&lt;/code&gt; to get started. Keep in mind
that you don&amp;rsquo;t actually have to use your real name or personal email
address. If you &lt;em&gt;want&lt;/em&gt; a personal key, go ahead and create one but you
can also use a pseudonym and fake address if you&amp;rsquo;d like.&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;I would use the default (1) of &amp;ldquo;RSA and RSA&amp;rdquo;.&lt;/li&gt;
&lt;li&gt;Again, you can use default but I would recommend 4096 bits because
it&amp;rsquo;s much more secure. This does mean, however, that it will take
longer to generate the key.&lt;/li&gt;
&lt;li&gt;An expiry date is recommended but you don&amp;rsquo;t necessarily have to set
one.&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; have to use your real name. You can use a pseudonym if
you wish.&lt;/li&gt;
&lt;li&gt;You &lt;em&gt;don&amp;rsquo;t&lt;/em&gt; have to use your personal email. You can use a
pseudonymous one if you wish.&lt;/li&gt;
&lt;li&gt;You don&amp;rsquo;t need a comment&lt;/li&gt;
&lt;li&gt;Confirm&lt;/li&gt;
&lt;li&gt;Come up with a &lt;em&gt;&lt;strong&gt;secure&lt;/strong&gt;&lt;/em&gt; password or, even better, a pass&lt;em&gt;phrase&lt;/em&gt;.&lt;/li&gt;
&lt;li&gt;Move your mouse around a bit, type, something like that while it&amp;rsquo;s
generating the key.&lt;/li&gt;
&lt;/ol&gt;
&lt;h3 id=&#34;email&#34;&gt;Email&lt;/h3&gt;
&lt;p&gt;I use &lt;a href=&#34;https://www.thunderbird.net/&#34;&gt;Thunderbird&lt;/a&gt; for email and there is
a great addon for it called &lt;a href=&#34;https://enigmail.net/&#34;&gt;Enigmail&lt;/a&gt;. It&amp;rsquo;s
quite easy to set up and use but there is a really annoying bug that
you&amp;rsquo;ll experience when replying in threaded mode. If you want to encrypt
a reply, simply open the editor in a new window.&lt;/p&gt;
&lt;h2 id=&#34;verifying-identities&#34;&gt;Verifying Identities&lt;/h2&gt;
&lt;p&gt;In general, all you&amp;rsquo;ll have to do is type something along the lines of:&lt;/p&gt;
&lt;blockquote&gt;
&lt;p&gt;I am &amp;lt;your-name-here&amp;gt; and I own the following accounts:&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Account 1 - &amp;lt;link&amp;gt;&lt;/li&gt;
&lt;li&gt;Account 2 - &amp;lt;link&amp;gt;&lt;/li&gt;
&lt;li&gt;Etc.&lt;/li&gt;
&lt;/ul&gt;
&lt;/blockquote&gt;
&lt;p&gt;You&amp;rsquo;ll save that in a text file, run &lt;code&gt;gpg --clearsign file.txt&lt;/code&gt;, copy
the output, then paste it wherever it needs to go, whether that&amp;rsquo;s a
blog, a GitHub gist, etc. With Twitter/Mastodon and their character
limit, this won&amp;rsquo;t quite work. The best solution there is probably to
post a link to a gpg-signed message on your website that links back to
the post.&lt;/p&gt;
&lt;p&gt;Really, all you have to do is tie all of your accounts together in as
close-knit a web as you can and sign with your GPG key wherever
possible. Linking everything to everything else would definitely work
but it should also be enough to link everything to a single document on
your website (or a gist in GitHub etc.) that links back to all of those.&lt;/p&gt;
&lt;p&gt;I&amp;rsquo;m probably not explaining very well so here&amp;rsquo;s a diagram showing it.&lt;/p&gt;
&lt;p&gt;&lt;img src=&#34;../assets/pngs/archive-diagram.png&#34; alt=&#34;a diagram illustrating the text
below&#34;&gt;&lt;/p&gt;
&lt;p&gt;Note that the email links to everything else but nothing links back to
the email. It&amp;rsquo;s the main document that&amp;rsquo;s at the centre of it all. Make
sure both it and the email are signed. If you toot, link to the toot in
the main document. If you make a gist, link to the gist in the main
document.&lt;/p&gt;
&lt;h2 id=&#34;sending-the-email&#34;&gt;Sending the email&lt;/h2&gt;
&lt;p&gt;Once you have all the groundwork laid out, you&amp;rsquo;ll be ready to send the
email; the address is &lt;a href=&#34;mailto:info@archive.org&#34;&gt;info@archive.org.&lt;/a&gt;
Explain what you would like done and link to the document requesting
your domain exclusion first as that&amp;rsquo;s the easiest to verify. In the next
paragraph, I would explain a little bit about what you&amp;rsquo;ve set up with
signing messages and creating the &amp;ldquo;Web of Verification&amp;rdquo; (lol). Under
that, I would link to the posts asking for the accounts to be removed.
Make sure those posts also link back to the main document. Be polite,
say thank you, then send the email!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Removing your site from the Wayback Machine (Keybase)</title>
      <link>https://secluded.site/removing-your-site-from-the-wayback-machine-keybase/</link>
      <category>Archive.org/Privacy/Sysadmin</category>>
      <pubDate>Mon, 03 Jun 2019 12:08:00 -0400</pubDate>
      <guid>https://secluded.site/removing-your-site-from-the-wayback-machine-keybase/</guid>
      <description>&lt;h2 id=&#34;preface&#34;&gt;Preface&lt;/h2&gt;
&lt;p&gt;There may be a myriad of reasons you want to do this, from removing
sensitive information to regaining a measure of control over your
content. Whatever your purpose, below should be a quick and easy way to
achieve it.&lt;/p&gt;
&lt;h2 id=&#34;for-domains-you-own&#34;&gt;For domains you own&lt;/h2&gt;
&lt;p&gt;The easiest way to verify you own a domain is to put a text file in an
easily accessible location and email
&lt;a href=&#34;mailto:info@archive.org&#34;&gt;info@archive.org&lt;/a&gt; asking for removal and link
to it. Mine is at
&lt;a href=&#34;https://nixnet.services/removal-request.txt&#34;&gt;removal-request.txt.&lt;/a&gt; It
would be better if you didn&amp;rsquo;t copy mine word-for-word and wrote your own
instead though &amp;#x1f609;&lt;/p&gt;
&lt;p&gt;If that&amp;rsquo;s all you intend to do, this should be sufficient and there&amp;rsquo;s no
need to read any further. If you want to exclude your &lt;em&gt;profiles&lt;/em&gt; as well
(for example, all your GitHub repos, Twitter, Mastodon, etc.) read on.&lt;/p&gt;
&lt;h2 id=&#34;for-domains-you--dont--own&#34;&gt;For domains you  &lt;em&gt;don&amp;rsquo;t&lt;/em&gt;  own&lt;/h2&gt;
&lt;p&gt;There are a few things I used that worked in harmony to verify my other
accounts. &lt;a href=&#34;https://keybase.io/&#34;&gt;Keybase&lt;/a&gt; was the most useful for this
purpose. It is a proprietary service but I deem the level of proof it
facilitates worth compromising for.&lt;/p&gt;
&lt;p&gt;The other tool I used was &lt;a href=&#34;https://gnupg.org/&#34;&gt;GPG.&lt;/a&gt; For the sake of
keeping it simple, &lt;em&gt;this&lt;/em&gt; guide will just deal with GPG from within
Keybase. I &lt;em&gt;&lt;strong&gt;really&lt;/strong&gt;&lt;/em&gt; recommend actually learning to use GPG on its
own; it&amp;rsquo;s wonderful for protecting your privacy and verifying your
identity in a multitude of situations. The next post will be on using
GPG &lt;em&gt;outside&lt;/em&gt; of Keybase for this so &lt;a href=&#34;../posts/index.xml&#34;&gt;stay tuned.&lt;/a&gt;&lt;/p&gt;
&lt;h3 id=&#34;generating-your-key&#34;&gt;Generating your key&lt;/h3&gt;
&lt;p&gt;After creating your Keybase account, click &amp;ldquo;add a PGP key&amp;rdquo;, &amp;ldquo;I need a
public key&amp;rdquo;, then enter the requisite information. You should use
whatever name is associated with the account you&amp;rsquo;ll be emailing
Archive.org from as well as that address. Wait a bit while it generates
the key&amp;hellip;&lt;/p&gt;
&lt;h3 id=&#34;verifying-some-accounts&#34;&gt;Verifying some accounts&lt;/h3&gt;
&lt;p&gt;This is where you verify whatever accounts you want removed. Just click
the option and go through the steps! Aside from personal websites,
Twitter, GitHub, Reddit, etc., you can also prove accounts on a lot of
other services (including Mastodon). More are being added every day so
check back if there&amp;rsquo;s something specific you want to address.&lt;/p&gt;
&lt;p&gt;Once this is done, you&amp;rsquo;ll be ready to contact Archive.org about getting
your stuff removed.&lt;/p&gt;
&lt;h3 id=&#34;signing-some-messages&#34;&gt;Signing some messages&lt;/h3&gt;
&lt;p&gt;In the top right of Keybase, you&amp;rsquo;ll see a pencil. Click it and you&amp;rsquo;ll be
taken to a page with a text box. This is where you&amp;rsquo;ll type your email
and the text file for your website proof. For the text file, copy the
signed message and paste it into your text editor, save, and put it at
the root of your website. For example, mine is at
&lt;a href=&#34;https://nixnet.services/removal-request.txt&#34;&gt;removal-request.txt.&lt;/a&gt; It
would be better if you didn&amp;rsquo;t copy mine word for word and wrote your own
&amp;#x1f609; For the email, you&amp;rsquo;ll do the same thing but paste the signed message
into your email client, whether that&amp;rsquo;s Thunderbird, ProtonMail,
Tutanota, etc. The text file only needs to contain the request for the
(sub)domain removal. The email needs to contain the request for
everything along with links to the text file, you Keybase account, and
whatever you want removed.&lt;/p&gt;
&lt;p&gt;Before sending it, you should also go back to your profile, click your
key, and copy everything in the text box that starts with &lt;code&gt;-----BEGIN PGP PUBLIC KEY BLOCK-----&lt;/code&gt;. Paste that into another text file but save
it with the &lt;code&gt;.asc&lt;/code&gt; extension. For example, &lt;code&gt;key.asc&lt;/code&gt;. Attach this to the
email, send it to &lt;a href=&#34;mailto:info@archive.org&#34;&gt;info@archive.org,&lt;/a&gt; wait a
couple days, and you&amp;rsquo;re done!&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Forecasting with a command</title>
      <link>https://secluded.site/forecasting-with-a-command/</link>
      <category>CLI</category>>
      <pubDate>Fri, 14 Dec 2018 21:41:00 -0400</pubDate>
      <guid>https://secluded.site/forecasting-with-a-command/</guid>
      <description>&lt;p&gt;We all love the CLI &lt;em&gt;(and if we don&amp;rsquo;t, we should)&lt;/em&gt; so wouldn&amp;rsquo;t it be great if there was a tool to see your weather forecast with a single command? Ceda EI at &lt;a href=&#34;https://webionite.com&#34; target=&#34;_blank&#34;&gt;webionite.com&lt;/a&gt; has written a tool that uses the Dark Sky API to give you the forecast for a day or week, at your location, and in Celsius or Fahrenheit.&lt;/p&gt;
&lt;h2 id=&#34;celsius&#34;&gt;Celsius&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Weather for one week - &lt;code&gt;$ curl sky.webionite.com/location&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Weather for today - &lt;code&gt;$ curl sky.webionite.com/location/t&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;fahrenheit&#34;&gt;Fahrenheit&lt;/h2&gt;
&lt;ul&gt;
&lt;li&gt;Weather for one week - &lt;code&gt;$ curl sky.webionite.com/f/location&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Weather for today - &lt;code&gt;$ curl sky.webionite.com/f/location/t&lt;/code&gt;&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;A great way to make this faster and simpler is to put an alias in your shell&amp;rsquo;s &lt;code&gt;rc&lt;/code&gt; file. For bash, you can do that with:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;font-weight:bold;font-style:italic&#34;&gt;echo&lt;/span&gt; &lt;span style=&#34;color:#666;font-style:italic&#34;&gt;&amp;#34;alias weather=&amp;#39;curl sky.webionite.com/f/location&amp;#39;&amp;#34;&lt;/span&gt; &amp;gt;&amp;gt; ~/.bashrc
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you ever forget how to use the tool, just run &lt;code&gt;curl sky.webionite.com&lt;/code&gt; and you&amp;rsquo;ll be given instructions.
&lt;img src=&#34;../assets/pngs/weather.png&#34; alt=&#34;screenshot of the output of the command. it shows two rows of four boxes with ascii art depicting rain, overcast clouds, and the sun obscured by clouds. it shows the temperature and the time of day. everything is coloured and looks very attractive.&#34;&gt;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Arch Spin pt. 3 - packages.x86_64</title>
      <link>https://secluded.site/arch-spin-pt.-3-packages.x86_64/</link>
      <category>Arch Linux/Arch Spin</category>>
      <pubDate>Sat, 18 Aug 2018 16:52:42 -0400</pubDate>
      <guid>https://secluded.site/arch-spin-pt.-3-packages.x86_64/</guid>
      <description>&lt;h2 id=&#34;package-configuration&#34;&gt;Package configuration&lt;/h2&gt;
&lt;p&gt;As I said in the last post, this is the file in which you list the
applications you wish to install. I won&amp;rsquo;t list the defaults because
there a lot. &lt;em&gt;However&lt;/em&gt;, this basic setup only builds to a total of ~440
MB so you can add &lt;em&gt;many&lt;/em&gt; more applications.&lt;/p&gt;
&lt;p&gt;I want the setup on this bootable to be exactly the same as what I
currently have on my system. I did not want to manually enter every
single package though. Thankfully, pacman is a feature-complete tool and
it lets you get a &lt;em&gt;lot&lt;/em&gt; of information about installed packages. &lt;code&gt;pacman -Qne&lt;/code&gt; lists all the currently installed packages that you explicitly
installed. It does not list dependencies of those applications. What I
did was run &lt;code&gt;pacman -Qne &amp;gt;&amp;gt; ~/liveiso/packages.x86_64&lt;/code&gt; to add all the
apps I have installed from the official Arch repos to the end of the
file so nothing was overwritten.&lt;/p&gt;
&lt;p&gt;After, I ran &lt;code&gt;pacman -Qni &amp;gt;&amp;gt; official.txt&lt;/code&gt; so I could get information
about all those packages and decide whether or not I wanted to keep
them. For example, I removed some stuff from deepin that I no longer
used, SuperTuxKart, and a lot of other stuff. This shrunk my iso from
3.6 GB to 2.5. Now I have a lot of space to use for installing my
applications from the AUR. This includes &lt;a href=&#34;https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks#Custom_local_repository&#34;&gt;making a custom
repo&lt;/a&gt;
for the packages and &lt;a href=&#34;https://wiki.archlinux.org/index.php/DeveloperWiki:Building_in_a_Clean_Chroot&#34;&gt;building them in a
chroot&lt;/a&gt;
so you make &lt;em&gt;sure&lt;/em&gt; you have all the needed dependencies while keeping
your system from being messed up while building.&lt;/p&gt;
&lt;p&gt;All of this will be discussed in the next blog post (when I get to it).&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Arch Spin pt. 2 — Initial setup</title>
      <link>https://secluded.site/arch-spin-pt.-2-initial-setup/</link>
      <category>Arch Linux/Arch Spin</category>>
      <pubDate>Fri, 17 Aug 2018 14:11:07 -0400</pubDate>
      <guid>https://secluded.site/arch-spin-pt.-2-initial-setup/</guid>
      <description>&lt;p&gt;&lt;em&gt;I &lt;strong&gt;think&lt;/strong&gt; I&amp;rsquo;m going to call it a spin . . .&lt;/em&gt;&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;Install the package &lt;code&gt;archiso&lt;/code&gt; from the official repos or &lt;code&gt;archiso-git&lt;/code&gt;
from the AUR&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ mkdir ~/&amp;lt;build-directory&amp;gt;&lt;/code&gt;
&lt;ul&gt;
&lt;li&gt;Replace &lt;code&gt;&amp;lt;build-directory&amp;gt;&lt;/code&gt; with wherever you want the iso build
to be stored. This is where we&amp;rsquo;ll be spending all of our time
configuring. Mine is at &lt;code&gt;~/liveiso/&lt;/code&gt; and that&amp;rsquo;s the path I&amp;rsquo;ll be
using in this and future posts&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;li&gt;&lt;code&gt;$ sudo cp -r /usr/share/archiso/configs/releng/ ~/liveiso&lt;/code&gt;&lt;/li&gt;
&lt;li&gt;Edit &lt;code&gt;~/liveiso/packages.x86_64&lt;/code&gt; to install desired software
&lt;ul&gt;
&lt;li&gt;This will be addressed in the next post, &lt;code&gt;packages.x86_64&lt;/code&gt;, where
I also give some quick ways to install everything you might want.&lt;/li&gt;
&lt;/ul&gt;
&lt;/li&gt;
&lt;/ul&gt;
</description>
    </item>
    
    <item>
      <title>Arch Spin pt. 1 — The perfect bootable</title>
      <link>https://secluded.site/arch-spin-pt.-1-the-perfect-bootable/</link>
      <category>Arch Linux/Arch Spin</category>>
      <pubDate>Wed, 15 Aug 2018 10:38:00 -0400</pubDate>
      <guid>https://secluded.site/arch-spin-pt.-1-the-perfect-bootable/</guid>
      <description>&lt;p&gt;Today I had an orthodontist appointment and a voice lesson. The
appointment was at 15:00 and the voice lesson at 16:00. I got to the
orthodontist&amp;rsquo;s office 10 minutes early, was told to right to the back
(like always), I sat down in the seat, and the orthodontist came over
after a few minutes with another patient. He looked at my teeth, had me
put my retainers in, checked how they fit, then said I don&amp;rsquo;t ever need
to come back (unless I do need to). That all took about 7 or 8 minutes.
My voice lesson was ~5 minutes away so I had an hour to kill. I drove to
the college (where the lesson was), went into the computer lab, and
booted my &lt;a href=&#34;http://multibootusb.org/&#34;&gt;multibootable&lt;/a&gt; bootable.&lt;/p&gt;
&lt;p&gt;I went through the distros I had and chose the &lt;a href=&#34;https://manjaro.org/category/community-editions/i3/&#34;&gt;i3 spin of
Manjaro,&lt;/a&gt;
forgetting that it hadn&amp;rsquo;t written correctly and was corrupt. I went
through a couple of other distros that were as well and settled on
&lt;a href=&#34;https://www.parrotsec.org/download-home.php&#34;&gt;Parrot Home.&lt;/a&gt; While I love
Parrot Home for security reasons, it wasn&amp;rsquo;t what I was looking for. I
started trying to think of a distro that fit all my daily needs that I
could take on a flash drive with me wherever I went and . . . I
couldn&amp;rsquo;t.&lt;/p&gt;
&lt;p&gt;I would boot it, try to install some app I&amp;rsquo;m missing (Telegram, for
instance), find that I need to first update everything then upgrade some
packages then have no space left to install Telegram. There isn&amp;rsquo;t one
distro I can think of that I wouldn&amp;rsquo;t have to do that with. So I thought
I&amp;rsquo;d try my hand at installing Arch on a flash drive.&lt;/p&gt;
&lt;p&gt;As I was reading, I decided I would rather make a &lt;em&gt;live&lt;/em&gt; system. This
way, I can log into whatever I need to and, as soon as I turn it off,
whatever I did disappears. I asked around in the Arch &lt;a href=&#34;https://t.me/archlinuxgroup&#34;&gt;Telegram
channel&lt;/a&gt; and was given a few pages to read
up on the wiki as well as a youtube video. First is &lt;a href=&#34;https://wiki.archlinux.org/index.php/archiso&#34;&gt;building the arch
iso,&lt;/a&gt; &lt;a href=&#34;https://wiki.archlinux.org/index.php/Pacman/Tips_and_tricks#Custom_local_repository&#34;&gt;making a custom
repo&lt;/a&gt;
for installing AUR packages, building them in a
&lt;a href=&#34;https://wiki.archlinux.org/index.php/DeveloperWiki:Building_in_a_Clean_Chroot&#34;&gt;chroot&lt;/a&gt;
so you don&amp;rsquo;t mess with your current setup, and the &lt;a href=&#34;https://www.youtube.com/watch?v=DqV1BJtJXEA&#34;&gt;YouTube
videos&lt;/a&gt; that help tie it
all together:&lt;/p&gt;
&lt;h2 id=&#34;summary&#34;&gt;Summary&lt;/h2&gt;
&lt;p&gt;That&amp;rsquo;ll be it for this post. It was originally a lot longer but I think
I want to keep them to a quick read so it&amp;rsquo;s easier to pick up where you
left off. I&amp;rsquo;m not sure what the next post will contain but I am sure
that it talks about setting up your dev environment &amp;#x1f609;&lt;/p&gt;
</description>
    </item>
    
    <item>
      <title>Lossless screen recording</title>
      <link>https://secluded.site/lossless-screen-recording/</link>
      <category>FFmpeg/CLI/Minimalism</category>>
      <pubDate>Sun, 12 Aug 2018 17:15:20 -0400</pubDate>
      <guid>https://secluded.site/lossless-screen-recording/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve been trying off and on for the past few weeks to figure out how to
record my 1920x1080 monitor. The recording is going to be some music
videos for a friend. Originally, it was just going to be a single
background image for the whole video then I had the idea of using
&lt;a href=&#34;https://github.com/karlstav/cava&#34;&gt;cava&lt;/a&gt; in a transparent terminal on
top of the background. This didn&amp;rsquo;t work at all because it actually kept
freezing when I tried to record it. So I tried switching to
&lt;a href=&#34;http://ncmpcpp.rybczak.net/&#34;&gt;ncmpcpp&amp;rsquo;s visualiser.&lt;/a&gt; This still had
horrible lag so I&amp;rsquo;ve been puzzling over how to use ffmpeg to
&lt;em&gt;losslessly&lt;/em&gt; record my second monitor. The reason OBS and similar screen
recorders are so slow is because, most of the time, they encode to the
end format while recording and that uses a lot of system resources. I
finally figured it out and have pasted the command below.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ffmpeg -video_size 1920x1080 -framerate 30 -f x11grab -draw_mouse 0 -i :0.0+1366,0 -c:v libx264 -crf 0 -preset ultrafast output.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Above is exactly what I used for my 1080p monitor with 768p laptop
screen. I&amp;rsquo;ve modified the command so you can see what you need to edit
for your use-case.&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ffmpeg -video_size &amp;lt;target-resolution&amp;gt; -framerate 30 -f x11grab -i :0.0+&amp;lt;width-of-unused-monitor&amp;gt;,0 -c:v libx264 -crf 0 -preset ultrafast &amp;lt;filename&amp;gt;.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;If you do &lt;em&gt;not&lt;/em&gt; want the cursor recorded, add &lt;code&gt;-draw_mouse 0&lt;/code&gt; directly
after &lt;code&gt;x11grab&lt;/code&gt; like I did in the first command.&lt;/p&gt;
&lt;p&gt;My video was 470mb for a ~13 minute video. If you&amp;rsquo;re going to archive
the recording or are concerned about file size, re-encode it with a
slower preset. This will be a lot slower and take a lot of CPU but the
resulting file is &lt;em&gt;significantly&lt;/em&gt; smaller than the original and still
lossless. I this as a general purpose screen recorder. Previously, I was
using OBS and the lag in the video was incredible but with ffmpeg, it&amp;rsquo;s
smooth as butter. The command for re-encoding is below:&lt;/p&gt;
&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;background-color:#fff;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-bash&#34; data-lang=&#34;bash&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;ffmpeg -i output.mkv -c:v libx264 -crf 0 -preset veryslow output-smaller.mkv
&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;&lt;img src=&#34;../assets/gifs/ffmpeg-lossless.gif&#34; alt=&#34;&#34;&gt;&lt;/p&gt;
&lt;h2 id=&#34;note&#34;&gt;Note&lt;/h2&gt;
&lt;p&gt;This command only works with X, not Wayland. Skimming &lt;code&gt;ffmpeg&lt;/code&gt;&amp;rsquo;s man
page, I see that &lt;code&gt;video4linux2&lt;/code&gt; is another option for capturing video so
you may be able to replace &lt;code&gt;x11grab&lt;/code&gt; with it for the same result. I have
not tested this so I don&amp;rsquo;t know if it&amp;rsquo;ll work or not.&lt;/p&gt;
</description>
    </item>
    
  </channel>
</rss>
