add learning
This commit is contained in:
725
learning/index.html
Normal file
725
learning/index.html
Normal file
@@ -0,0 +1,725 @@
|
||||
<!doctype html>
|
||||
<html lang="en">
|
||||
<head>
|
||||
<meta charset="utf-8">
|
||||
<meta name="viewport" content="width=device-width, initial-scale=1.0">
|
||||
<title>Learning</title>
|
||||
<meta name="description" content="The long-running and erratically updated blog of Kathleen Fitzpatrick.">
|
||||
<link rel="alternate" href="feed/feed.xml" type="application/atom+xml" title="kfitz">
|
||||
<script async="" src="https://talk.hyvor.com/embed/embed.js" type="module"></script>
|
||||
<link rel="webmention" href="https://webmention.io/kfitz.info/webmention">
|
||||
<link rel="pingback" href="https://webmention.io/kfitz.info/xmlrpc">
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
<style>/**
|
||||
* okaidia theme for JavaScript, CSS and HTML
|
||||
* Loosely based on Monokai textmate theme by http://www.monokai.nl/
|
||||
* @author ocodia
|
||||
*/
|
||||
|
||||
code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
color: #f8f8f2;
|
||||
background: none;
|
||||
text-shadow: 0 1px rgba(0, 0, 0, 0.3);
|
||||
font-family: Consolas, Monaco, 'Andale Mono', 'Ubuntu Mono', monospace;
|
||||
font-size: 1em;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
word-wrap: normal;
|
||||
line-height: 1.5;
|
||||
|
||||
-moz-tab-size: 4;
|
||||
-o-tab-size: 4;
|
||||
tab-size: 4;
|
||||
|
||||
-webkit-hyphens: none;
|
||||
-moz-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
}
|
||||
|
||||
/* Code blocks */
|
||||
pre[class*="language-"] {
|
||||
padding: 1em;
|
||||
margin: .5em 0;
|
||||
overflow: auto;
|
||||
border-radius: 0.3em;
|
||||
}
|
||||
|
||||
:not(pre) > code[class*="language-"],
|
||||
pre[class*="language-"] {
|
||||
background: #272822;
|
||||
}
|
||||
|
||||
/* Inline code */
|
||||
:not(pre) > code[class*="language-"] {
|
||||
padding: .1em;
|
||||
border-radius: .3em;
|
||||
white-space: normal;
|
||||
}
|
||||
|
||||
.token.comment,
|
||||
.token.prolog,
|
||||
.token.doctype,
|
||||
.token.cdata {
|
||||
color: #8292a2;
|
||||
}
|
||||
|
||||
.token.punctuation {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.token.namespace {
|
||||
opacity: .7;
|
||||
}
|
||||
|
||||
.token.property,
|
||||
.token.tag,
|
||||
.token.constant,
|
||||
.token.symbol,
|
||||
.token.deleted {
|
||||
color: #f92672;
|
||||
}
|
||||
|
||||
.token.boolean,
|
||||
.token.number {
|
||||
color: #ae81ff;
|
||||
}
|
||||
|
||||
.token.selector,
|
||||
.token.attr-name,
|
||||
.token.string,
|
||||
.token.char,
|
||||
.token.builtin,
|
||||
.token.inserted {
|
||||
color: #a6e22e;
|
||||
}
|
||||
|
||||
.token.operator,
|
||||
.token.entity,
|
||||
.token.url,
|
||||
.language-css .token.string,
|
||||
.style .token.string,
|
||||
.token.variable {
|
||||
color: #f8f8f2;
|
||||
}
|
||||
|
||||
.token.atrule,
|
||||
.token.attr-value,
|
||||
.token.function,
|
||||
.token.class-name {
|
||||
color: #e6db74;
|
||||
}
|
||||
|
||||
.token.keyword {
|
||||
color: #66d9ef;
|
||||
}
|
||||
|
||||
.token.regex,
|
||||
.token.important {
|
||||
color: #fd971f;
|
||||
}
|
||||
|
||||
.token.important,
|
||||
.token.bold {
|
||||
font-weight: bold;
|
||||
}
|
||||
.token.italic {
|
||||
font-style: italic;
|
||||
}
|
||||
|
||||
.token.entity {
|
||||
cursor: help;
|
||||
}
|
||||
/*
|
||||
* New diff- syntax
|
||||
*/
|
||||
|
||||
pre[class*="language-diff-"] {
|
||||
--eleventy-code-padding: 1.25em;
|
||||
padding-left: var(--eleventy-code-padding);
|
||||
padding-right: var(--eleventy-code-padding);
|
||||
}
|
||||
.token.deleted {
|
||||
background-color: hsl(0, 51%, 37%);
|
||||
color: inherit;
|
||||
}
|
||||
.token.inserted {
|
||||
background-color: hsl(126, 31%, 39%);
|
||||
color: inherit;
|
||||
}
|
||||
|
||||
/* Make the + and - characters unselectable for copy/paste */
|
||||
.token.prefix.unchanged,
|
||||
.token.prefix.inserted,
|
||||
.token.prefix.deleted {
|
||||
-webkit-user-select: none;
|
||||
user-select: none;
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
padding-top: 2px;
|
||||
padding-bottom: 2px;
|
||||
}
|
||||
.token.prefix.inserted,
|
||||
.token.prefix.deleted {
|
||||
width: var(--eleventy-code-padding);
|
||||
background-color: rgba(0,0,0,.2);
|
||||
}
|
||||
|
||||
/* Optional: full-width background color */
|
||||
.token.inserted:not(.prefix),
|
||||
.token.deleted:not(.prefix) {
|
||||
display: block;
|
||||
margin-left: calc(-1 * var(--eleventy-code-padding));
|
||||
margin-right: calc(-1 * var(--eleventy-code-padding));
|
||||
text-decoration: none; /* override del, ins, mark defaults */
|
||||
color: inherit; /* override del, ins, mark defaults */
|
||||
}
|
||||
/* This is an arbitrary CSS string added to the bundle */
|
||||
/* Defaults */
|
||||
@font-face {
|
||||
font-family: "Atkinson Hyperlegible";
|
||||
src: url('/css/files/atkinson-hyperlegible-latin-400-normal.woff2') format('woff2');
|
||||
font-display: swap;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Atkinson Hyperlegible";
|
||||
font-weight: bold;
|
||||
src: url('/css/files/atkinson-hyperlegible-latin-700-normal.woff2') format('woff2');
|
||||
font-display: swap;
|
||||
}
|
||||
@font-face {
|
||||
font-family: "Atkinson Hyperlegible";
|
||||
font-style: italic
|
||||
src: url('/css/files/atkinson-hyperlegible-latin-400-italic.woff2') format('woff2');
|
||||
font-display: swap;
|
||||
}
|
||||
|
||||
:root {
|
||||
--font-family: "Atkinson Hyperlegible", -apple-system, system-ui, sans-serif;
|
||||
--font-family-monospace: Consolas, Menlo, Monaco, Andale Mono WT, Andale Mono, Lucida Console, Lucida Sans Typewriter, DejaVu Sans Mono, Bitstream Vera Sans Mono, Liberation Mono, Nimbus Mono L, Courier New, Courier, monospace;
|
||||
font-size: 18px;
|
||||
}
|
||||
|
||||
/* Theme colors */
|
||||
:root {
|
||||
--color-gray-20: #e0e0e0;
|
||||
--color-gray-50: #C0C0C0;
|
||||
--color-gray-90: #333;
|
||||
|
||||
--background-color: #fff;
|
||||
|
||||
--text-color: var(--color-gray-90);
|
||||
--text-color-link: #d61d4a;
|
||||
--text-color-link-active: #853439;
|
||||
--text-color-link-visited: #e8325e;
|
||||
|
||||
--syntax-tab-size: 2;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
:root {
|
||||
--color-gray-20: #e0e0e0;
|
||||
--color-gray-50: #C0C0C0;
|
||||
--color-gray-90: #dad8d8;
|
||||
|
||||
/* --text-color is assigned to --color-gray-_ above */
|
||||
--text-color-link: #1493fb;
|
||||
--text-color-link-active: #6969f7;
|
||||
--text-color-link-visited: #a6a6f8;
|
||||
|
||||
--background-color: #15202b;
|
||||
}
|
||||
}
|
||||
|
||||
|
||||
/* Global stylesheet */
|
||||
* {
|
||||
box-sizing: border-box;
|
||||
}
|
||||
|
||||
@view-transition {
|
||||
navigation: auto;
|
||||
}
|
||||
|
||||
html,
|
||||
body {
|
||||
padding: 0;
|
||||
margin: 0 auto;
|
||||
font-family: var(--font-family);
|
||||
color: var(--text-color);
|
||||
background-color: var(--background-color);
|
||||
}
|
||||
html {
|
||||
overflow-y: scroll;
|
||||
}
|
||||
body {
|
||||
max-width: 40em;
|
||||
}
|
||||
|
||||
/* https://www.a11yproject.com/posts/how-to-hide-content/ */
|
||||
.visually-hidden {
|
||||
clip: rect(0 0 0 0);
|
||||
clip-path: inset(50%);
|
||||
height: 1px;
|
||||
overflow: hidden;
|
||||
position: absolute;
|
||||
white-space: nowrap;
|
||||
width: 1px;
|
||||
}
|
||||
|
||||
p:last-child {
|
||||
margin-bottom: 0;
|
||||
}
|
||||
p {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
li {
|
||||
line-height: 1.5;
|
||||
}
|
||||
|
||||
a[href] {
|
||||
color: var(--text-color-link);
|
||||
}
|
||||
a[href]:visited {
|
||||
color: var(--text-color-link-visited);
|
||||
}
|
||||
a[href]:hover,
|
||||
a[href]:active {
|
||||
color: var(--text-color-link-active);
|
||||
}
|
||||
|
||||
main,
|
||||
footer {
|
||||
padding: 1rem;
|
||||
}
|
||||
main :first-child {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
header {
|
||||
border-bottom: 1px dashed var(--color-gray-20);
|
||||
}
|
||||
header:after {
|
||||
content: "";
|
||||
display: table;
|
||||
clear: both;
|
||||
}
|
||||
|
||||
footer {
|
||||
border-top: 1px dashed var(--color-gray-50);
|
||||
}
|
||||
|
||||
.links-nextprev {
|
||||
display: flex;
|
||||
justify-content: space-between;
|
||||
gap: .5em 1em;
|
||||
list-style: "";
|
||||
border-top: 1px dashed var(--color-gray-20);
|
||||
padding: 1em 0;
|
||||
}
|
||||
.links-nextprev > * {
|
||||
flex-grow: 1;
|
||||
}
|
||||
.links-nextprev-next {
|
||||
text-align: right;
|
||||
}
|
||||
|
||||
table {
|
||||
margin: 1em 0;
|
||||
}
|
||||
table td,
|
||||
table th {
|
||||
padding-right: 1em;
|
||||
}
|
||||
|
||||
pre,
|
||||
code {
|
||||
font-family: var(--font-family-monospace);
|
||||
}
|
||||
pre:not([class*="language-"]) {
|
||||
margin: .5em 0;
|
||||
line-height: 1.375; /* 22px /16 */
|
||||
-moz-tab-size: var(--syntax-tab-size);
|
||||
-o-tab-size: var(--syntax-tab-size);
|
||||
tab-size: var(--syntax-tab-size);
|
||||
-webkit-hyphens: none;
|
||||
-ms-hyphens: none;
|
||||
hyphens: none;
|
||||
direction: ltr;
|
||||
text-align: left;
|
||||
white-space: pre;
|
||||
word-spacing: normal;
|
||||
word-break: normal;
|
||||
overflow-x: auto;
|
||||
}
|
||||
code {
|
||||
word-break: break-all;
|
||||
}
|
||||
|
||||
/* Header */
|
||||
header {
|
||||
display: flex;
|
||||
gap: 1em .5em;
|
||||
flex-wrap: wrap;
|
||||
align-items: center;
|
||||
padding: 1em;
|
||||
}
|
||||
.home-link {
|
||||
font-size: 1.5em; /* 16px /16 */
|
||||
font-weight: 700;
|
||||
margin-right: 2em;
|
||||
}
|
||||
.home-link:link:not(:hover) {
|
||||
text-decoration: none;
|
||||
}
|
||||
|
||||
/* Nav */
|
||||
.nav {
|
||||
display: flex;
|
||||
padding: 0;
|
||||
margin: 0;
|
||||
list-style: none;
|
||||
}
|
||||
.nav-item {
|
||||
display: inline-block;
|
||||
margin-right: 1em;
|
||||
}
|
||||
.nav-item a[href]:not(:hover) {
|
||||
text-decoration: none;
|
||||
}
|
||||
.nav a[href][aria-current="page"] {
|
||||
text-decoration: underline;
|
||||
}
|
||||
|
||||
/* Posts list */
|
||||
.postlist {
|
||||
list-style: none;
|
||||
padding: 0;
|
||||
padding-left: 1.5rem;
|
||||
}
|
||||
.postlist-item {
|
||||
display: flex;
|
||||
flex-wrap: wrap;
|
||||
align-items: baseline;
|
||||
counter-increment: start-from -1;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.postlist-item:before {
|
||||
display: inline-block;
|
||||
pointer-events: none;
|
||||
content: "" counter(start-from, decimal-leading-zero) ". ";
|
||||
line-height: 100%;
|
||||
text-align: right;
|
||||
margin-left: -1.5rem;
|
||||
}
|
||||
.postlist-date,
|
||||
.postlist-item:before {
|
||||
font-size: 0.8125em; /* 13px /16 */
|
||||
color: var(--color-gray-90);
|
||||
}
|
||||
.postlist-date {
|
||||
word-spacing: -0.5px;
|
||||
}
|
||||
.postlist-link {
|
||||
font-size: 1.1875em; /* 19px /16 */
|
||||
font-weight: 700;
|
||||
flex-basis: calc(100% - 1.5rem);
|
||||
padding-left: .25em;
|
||||
padding-right: .5em;
|
||||
text-underline-position: from-font;
|
||||
text-underline-offset: 0;
|
||||
text-decoration-thickness: 1px;
|
||||
}
|
||||
.postlist-item-active .postlist-link {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
/* Archive list */
|
||||
.archivelist {
|
||||
padding: 0;
|
||||
padding-left: 2.5rem;
|
||||
}
|
||||
.archivelist-item {
|
||||
align-items: baseline;
|
||||
margin-bottom: 1em;
|
||||
}
|
||||
.archivelist-item::marker {
|
||||
text-align: right;
|
||||
margin-left: -1.5rem;
|
||||
font-size: 0.8125em; /* 13px /16 */
|
||||
color: var(--color-gray-90);
|
||||
}
|
||||
.archivelist-date {
|
||||
font-size: 0.8125em; /* 13px /16 */
|
||||
color: var(--color-gray-90);
|
||||
word-spacing: -0.5px;
|
||||
}
|
||||
.archivelist-link {
|
||||
font-size: 1.1875em; /* 19px /16 */
|
||||
font-weight: 700;
|
||||
flex-basis: calc(100% - 1.5rem);
|
||||
padding-left: .25em;
|
||||
padding-right: .5em;
|
||||
text-underline-position: from-font;
|
||||
text-underline-offset: 0;
|
||||
text-decoration-thickness: 1px;
|
||||
}
|
||||
.archivelist-item-active .archivelist-link {
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
|
||||
/* Tags */
|
||||
.post-tag {
|
||||
display: inline-flex;
|
||||
align-items: center;
|
||||
justify-content: center;
|
||||
text-transform: capitalize;
|
||||
font-style: italic;
|
||||
}
|
||||
.postlist-item > .post-tag {
|
||||
align-self: center;
|
||||
}
|
||||
|
||||
/* Tags list */
|
||||
.post-metadata {
|
||||
display: inline-flex;
|
||||
flex-wrap: wrap;
|
||||
gap: .5em;
|
||||
list-style: none;
|
||||
border-top: 1px dashed var(--color-gray-20);
|
||||
border-bottom: 1px dashed var(--color-gray-20);
|
||||
padding: 3px 0px 3px 0px;
|
||||
margin: 0;
|
||||
font-size: .8em;
|
||||
}
|
||||
.post-metadata time {
|
||||
margin-right: 1em;
|
||||
}
|
||||
|
||||
/* Direct Links / Markdown Headers */
|
||||
.header-anchor {
|
||||
text-decoration: none;
|
||||
font-style: normal;
|
||||
font-size: 1em;
|
||||
margin-left: .1em;
|
||||
}
|
||||
a[href].header-anchor,
|
||||
a[href].header-anchor:visited {
|
||||
color: transparent;
|
||||
}
|
||||
a[href].header-anchor:focus,
|
||||
a[href].header-anchor:hover {
|
||||
text-decoration: underline;
|
||||
}
|
||||
a[href].header-anchor:focus,
|
||||
:hover > a[href].header-anchor {
|
||||
color: #aaa;
|
||||
}
|
||||
|
||||
h2 + .header-anchor {
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
}
|
||||
|
||||
h1 {
|
||||
font-weight: bolder;
|
||||
}
|
||||
|
||||
summary {
|
||||
font-size: 1.5em;
|
||||
font-weight: bold;
|
||||
margin-bottom: .5em;
|
||||
}
|
||||
|
||||
img {
|
||||
display: block;
|
||||
margin-left: auto;
|
||||
margin-right: auto;
|
||||
}
|
||||
|
||||
blockquote {
|
||||
display: block;
|
||||
margin-left: 2em;
|
||||
margin-right: 3em;
|
||||
padding-left: 10px;
|
||||
border-left: 10px solid var(--text-color-link);
|
||||
}
|
||||
|
||||
hr.new {
|
||||
border: none;
|
||||
border-top: 1px dashed var(--color-gray-50);
|
||||
}
|
||||
/* Webmention Section */
|
||||
|
||||
.webmentions {
|
||||
display:block;
|
||||
text-align: left;
|
||||
}
|
||||
.webmentions__facepile {
|
||||
display:flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.webmentions__face {
|
||||
width: 2rem;
|
||||
height: 2rem;
|
||||
border-radius: 50%;
|
||||
object-fit: cover;
|
||||
flex: none;
|
||||
}
|
||||
.webmentions__list {
|
||||
list-style-type: none;
|
||||
padding:0;
|
||||
}
|
||||
.webmentions__item {
|
||||
margin-bottom: 2rem;
|
||||
}
|
||||
|
||||
/* Single Webmention */
|
||||
|
||||
.webmention {
|
||||
display:block;
|
||||
}
|
||||
.webmention__meta,
|
||||
.webmention__author {
|
||||
display: flex;
|
||||
align-items: center;
|
||||
flex-wrap: wrap;
|
||||
}
|
||||
.webmention__meta {
|
||||
margin-bottom:.5rem;
|
||||
}
|
||||
.webmention__author {
|
||||
margin-right:.25rem;
|
||||
}
|
||||
.webmention__author__photo {
|
||||
height: 3rem;
|
||||
width: 3rem;
|
||||
border-radius: 50%;
|
||||
object-fit: cover;
|
||||
margin-right:.5rem;
|
||||
}
|
||||
.webmention__pubdate {
|
||||
font-style: italic;
|
||||
}
|
||||
/* Message Box */
|
||||
.message-box {
|
||||
--color-message-box: #ffc;
|
||||
|
||||
display: block;
|
||||
background-color: var(--color-message-box);
|
||||
color: var(--color-gray-90);
|
||||
padding: 1em 0.625em; /* 16px 10px /16 */
|
||||
}
|
||||
.message-box ol {
|
||||
margin-top: 0;
|
||||
}
|
||||
|
||||
@media (prefers-color-scheme: dark) {
|
||||
.message-box {
|
||||
--color-message-box: #082840;
|
||||
}
|
||||
}</style>
|
||||
</head>
|
||||
<body>
|
||||
<a href="#skip" class="visually-hidden">Skip to main content</a>
|
||||
|
||||
<header>
|
||||
<a href="/" class="home-link">kfitz</a>
|
||||
<nav>
|
||||
<h2 class="visually-hidden" id="top-level-navigation-menu">Top level navigation menu</h2>
|
||||
<ul class="nav">
|
||||
<li class="nav-item"><a href="/">Home</a></li>
|
||||
<li class="nav-item"><a href="/blog/">Archive</a></li>
|
||||
<li class="nav-item"><a href="/about/">About</a></li>
|
||||
<li class="nav-item"><a href="/projects/">Projects</a></li>
|
||||
<li class="nav-item"><a href="/presentations/">Presentations</a></li>
|
||||
<li class="nav-item"><a href="/teaching/">Teaching</a></li>
|
||||
<li class="nav-item"><a href="/feed/feed.xml">Feed</a></li>
|
||||
</ul>
|
||||
</nav>
|
||||
</header>
|
||||
|
||||
<link href="/pagefind/pagefind-ui.css" rel="stylesheet">
|
||||
<script src="/pagefind/pagefind-ui.js"></script>
|
||||
<div id="search"></div>
|
||||
<script>
|
||||
window.addEventListener('DOMContentLoaded', (event) => {
|
||||
new PagefindUI({ element: "#search", showSubResults: true });
|
||||
});
|
||||
</script>
|
||||
|
||||
<main id="skip">
|
||||
<heading-anchors>
|
||||
|
||||
<h1 id="learning">Learning</h1>
|
||||
|
||||
<ul class="post-metadata">
|
||||
<li><time datetime="2025-09-07">07 September 2025</time></li>
|
||||
<li><a href="/tags/tinkering/" class="post-tag">tinkering</a></li>
|
||||
</ul>
|
||||
|
||||
<p>Over the last several months, I've been engaged in a project designed to bring a bunch of the stuff I'm hosting in various places around the internet home. And I mean "home" quite literally: I not only wanted to control the data I was putting out into the world, and the software I was using to do it, but also the metal on which it's hosted. I wanted my stuff on my server in my very own house.</p>
|
||||
<p>Why? I can't fully articulate the drive. Some of it stems from a long-standing desire to "<a href="https://en.wikipedia.org/wiki/DeGoogle">de-google</a>," to <a href="https://www.theverge.com/24293448/x-twitter-musk-deactivate-how-to">quit Twitter</a>, and to focus my creative energy on formats and platforms that I can trust and over which I can exercise some level of control. But that drive got exacerbated by everything that's happened around us since January and the creeping sense that even good actors in today's technology landscape could wind up being attacked, or even weaponized. And so the question started nagging at me a bit: what would it be to <em>really</em> self-host? What would be required, and what would I need to learn?</p>
|
||||
<p>I want to acknowledge the very clear ways in which the privileges of my education, my social position, and my income allow me to take a project like this on just because I feel like it. I have the disposable income to invest in a small home server and other equipment, and I live in a house that is wired for very fast fiber-based internet. I've also been an intermittent tinkerer for a couple of decades, having launched a blog on a shared hosting provider back in 2002 and having taken that blog -- uh, <em>this blog</em> -- through a wide variety of redesigns, platform migrations, and hosting changes over the years. Much of that tinkering is <a href="https://kfitz.info/tags/tinkering/">documented in the archives</a>, including my 2023 move away from WordPress, first to Jekyll and then to Eleventy.</p>
|
||||
<p>So I've had a long-standing desire to be more in control of my digital footprint, to ensure that I own as much of the work I do online as possible, and to live up to <a href="https://about.hcommons.org/about-us/">the values that the Knowledge Commons team has developed</a>, including experimenting with new modes of working and supporting the open exchange of knowledge and using open-source tools to do so. And the last year has made me all the more cognizant of the ways that trusting my digital past and presence to services that I cannot fully control -- that may be highly trustworthy today but whose leadership could change and whose guiding values could shift at any time -- opened up a range of potential risks.</p>
|
||||
<p>On top of which, each time I've learned something new in the process of my tinkering, I've found myself wanting to know more. So I decided at some point this spring that I was going to invest in the hardware and the time required for me to set up a home network capable of allowing me to self-host the various sites and services I've had scattered around elsewhere.</p>
|
||||
<p>What I didn't recognize when I started down this path was how little I knew about networking. I'd sort of self-hosted a pretty good range of sites and services on Digital Ocean (including migrating from Github to my own <a href="/gitea/">Gitea</a> instance), and I'd gotten passably good at pretty basic Linux systems administration thanks to their amazing suite of <a href="https://www.digitalocean.com/community/tutorials?q=docker+ubuntu">tutorials</a><sup class="footnote-ref"><a href="#fn1" id="fnref1">[1]</a></sup>. I knew how to obtain a domain name and how to configure its DNS records to point to a particular server. I could follow the documentation provided for the installation and use of packages on that server. But several things had never occurred to me, things as basic as how you make it possible for devices on a local, private network to be selectively and securely reachable from outside that network when desired. Or what is required to set up a fully functioning webserver when you're starting with bare metal.</p>
|
||||
<p>It took several months and a bunch of frustration for me to get everything working, but if you're reading this post it's currently working well. I'm writing in an Obsidian vault that contains the content of my Eleventy-based site. When I'm done writing I'll use npm to build and index the site and git to push it to the Gitea instance on my home server. I'll then ssh into the container hosting my website and pull the updates in from Gitea. It's super simple when it's all working.</p>
|
||||
<p>But when it's not, finding the right search terms to track down what could be wrong -- not to mention an unbefouled engine through which to do that search -- is really, really hard. And increasingly so when the results include posts made as long as 15 years ago about obsolete versions of the software you're asking about, on forums where n00bs are routinely yelled at for asking stupid questions and/or insulted for doing it wrong. And then there's the documentation that requires significant expertise to comprehend, and the "getting started" instructions that leave out key steps.</p>
|
||||
<p>I got enormous help in sorting out some intractable issues from two key directions, though: prior blog posts here (see in particular <a href="https://kfitz.info/networking/">Networking</a> and <a href="https://kfitz.info/networking-continued/">Networking Continued</a>), which produced generous, thoughtful responses from several people (most notably the always amazing <a href="https://jadin.me">Taylor Jadin</a> of Reclaim Hosting<sup class="footnote-ref"><a href="#fn2" id="fnref2">[2]</a></sup>), and a series of Mastodon chats (most recently with the very kind and helpful <a href="https://floss.social/@monospace">Monospace Mentor</a><sup class="footnote-ref"><a href="#fn3" id="fnref3">[3]</a></sup>). There's something to be said here about the ways that the human-to-human contact made possible by small networks and self-hosted open-source projects can allow for far better learning than can the aging content buried in vast piles of self-aggrandizing bloviation on major forums.</p>
|
||||
<p>It's a point that should be obvious, except that we live at a time when a not insubstantial number of tech billionaires are trying to convince us that the future of education lies in AI rather than in human interactions and connections. Given the extent to which AI has already undermined our ability to find the information we need on the web, we would be well-served by spending more time thinking about how to reinforce the human networks that can support learning in the midst of entropic decline.</p>
|
||||
<hr class="footnotes-sep">
|
||||
<section class="footnotes">
|
||||
<ol class="footnotes-list">
|
||||
<li id="fn1" class="footnote-item"><p>The thing I most love about these tutorials is that they're written not as though you're just there to find the answer and get out, but as though you actually want to learn. That is, they don't just provide command after command, but rather walk you through what each command does and why you want to do it. <a href="#fnref1" class="footnote-backref">↩︎</a></p>
|
||||
</li>
|
||||
<li id="fn2" class="footnote-item"><p>I so, so admire his self-description as someone who is "passionate about educating and empowering people who want to make cool stuff on the web." I wish that there were more of that around and a lot fewer Reddit bros needing to display their dominance by trashing folks with less experience. <a href="#fnref2" class="footnote-backref">↩︎</a></p>
|
||||
</li>
|
||||
<li id="fn3" class="footnote-item"><p>Self-described "greybeard geek" who offers courses, support, and mentoring for folks seeking to build their DevOps skills -- as well as generous support for random folks on Mastodon asking "but how does the VM know that I'm asking it to be a webserver?" <a href="#fnref3" class="footnote-backref">↩︎</a></p>
|
||||
</li>
|
||||
</ol>
|
||||
</section>
|
||||
|
||||
<ul class="links-nextprev"><li class="links-nextprev-prev">← Previous<br> <a href="/success-at-last/">Success, at Last</a></li>
|
||||
</ul>
|
||||
|
||||
<hyvor-talk-comments website-id="9100" page-id="/learning/"></hyvor-talk-comments>
|
||||
|
||||
<div class="webmentions" id="webmentions">
|
||||
<h3 id="webmentions-2">Webmentions</h3>
|
||||
|
||||
|
||||
<p>No replies yet.</p>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
</div>
|
||||
|
||||
|
||||
</heading-anchors>
|
||||
</main>
|
||||
|
||||
<footer>
|
||||
<p><em>Built with <a href="https://www.11ty.dev/">Eleventy v3.1.0</a>. All content <a href="https://creativecommons.org/licenses/by/4.0/deed.en">CC BY 4.0</a> if you're human.</em></p><p></p>
|
||||
</footer>
|
||||
|
||||
<script type="module" src="/dist/rJ3_G-2ArF.js"></script>
|
||||
</body>
|
||||
</html>
|
||||
Reference in New Issue
Block a user