add learning

This commit is contained in:
Kathleen Fitzpatrick
2025-09-07 13:57:38 -04:00
parent a290ff7a04
commit 903df28b7f
88 changed files with 993 additions and 60 deletions

View File

@@ -548,6 +548,11 @@ pre[class*="language-diff-"] {
<details><summary>2025</summary>
<ol reversed="" class="archivelist">
<li class="archivelist-item">
<a href="/learning/" class="archivelist-link">Learning</a><br>
<time class="archivelist-date" datetime="2025-09-07">07 September 2025</time>
</li>
<li class="archivelist-item">
<a href="/success-at-last/" class="archivelist-link">Success, at Last</a><br>
<time class="archivelist-date" datetime="2025-08-31">31 August 2025</time>

View File

@@ -687,7 +687,89 @@ hr.new {
<h3 id="webmentions-2">Webmentions</h3>
<p>No replies yet.</p>
<h4 id="1-reply">1 Reply</h4>
<ol class="webmentions__list">
<li class="webmentions__item">
<article class="webmention h-cite" id="webmention-1936163">
<div class="webmention__meta">
<a class="webmention__author p-author h-card u-url" href="https://www.ryanpatrickrandall.com/weekly-assemblage/wa-2024-week-26" target="_blank" rel="noopener noreferrer">
<img class="webmention__author__photo" src="/blog/img/default_avatar.png" alt="">
<strong class="p-name">By: Ryan P. Randall</strong>
</a>
<time class="webmention__pubdate dt-published" datetime="2024-07-02T17:39:49-06:00">02 Jul 2024 - 23:39</time>
</div>
<div class="webmention__content p-content">
On this pageFlock of the WeekViewingUgly BettyStar Trek: DiscoveryStar Trek: Picard and Lower DecksBookWyrmSite Refinements of the WeekWeekly Whaaa…?
Flock of the Week
A family of wild turkeys has apparently taken up residence in our neighborhood. Ive seen them strolling, scratching, and insect-buffeting their way through our yard twice, and also seen them a few streets away on an evening walk. Two adults, plus about seven offspring.
Im used to our many geese neighbors, but the turkeys were quite a surprise the first time I saw them! The cat has seemed even more surprised both times hes seen them.
Viewing
Ugly Betty
We somehow tore through all of Ugly Betty in the last few months. I never caught it during its initial airing, but at least to me, it certainly doesnt seem as outdated as its age might suggest.
Star Trek: Discovery
We also made it through the first couple seasons of Star Trek: Discovery, the first of which was much more of a slog. Although I can definitely get why its a compelling idea to put a jumble of redemption narratives at the center of interlocking stories set in the Star Trek world, I honestly dont comprehend what audience they had in mind for the repeated torture sequences involved in one of these storylines.
We almost gave up on watching it—multiple times!
Thankfully, the second season rediscovers excitement at the prospect of strange new worlds, and decides to be far less hostile to the viewer.
Star Trek: Picard and Lower Decks
As part of our Viewing Alpha, were watching all the series and movies in release order. At this point weve also watched the entire—and quite fun—first season of Picard and are partially through Lower Decks. Theyre both much more pleasant than Discoverys first season, and Lower Decks in particular is very rewarding considering the way were doing such an extended speed-run of everything.
BookWyrm
Seeing Kathleen Fitzpatrick mention BookWyrm on her blog provided just enough of a nudge for me to start trying it again. I went ahead and made lists from the books in my exam reading lists, and Im hoping that the extra potential for interaction on BookWyrm will give me more inertia on both the lists and using that site in general.
Of course, Im still going to keep tracking my reading here, especially since Ill be able to annotate articles and add my own extended notes and posts.
If youre on BookWyrm and want to connect, please do. If youre not, why not give it a try? Its a nice, gentle introduction to some of the core ideas of the “Fediverse” (the collectively-owned network of platforms like Mastodon).
Site Refinements of the Week
Did you know that, by default, Jekylls “related posts” are actually just the most recent posts, not posts more meaningfully related to the content of a post? Yeah, thats bugged me for years. And Ive finally done something about it.
After a bit of searching, I found this post from Webjeda, which is written to work either by tag or by category. I use both here, so Ive been slowly weaving the two together. Currently I prioritize tags as more meaningful than categories, so if a post has both tags and a category, its tags will determine what goes in the “related” section. (I do still want to work out what to display when a post has neither tags nor categories. Probably Ill extend my current set of if statements into a larger set of if/elsif/else statements.)
I also improved on the Webjeda code by using actual semantic elements. Why use a bunch of <div> elements when youre really making an unsorted list? Accept<ul> and <li> as your friends already, developers!
Finally, I made the tags and categories functional links. And, since the list of tags could quickly become unruly, I hid those within a <details> disclosure widget. Ive thus far only ever used a single category at a time (and plan to continue that), so those always remain visible at the bottom of each related posts excerpt rather than requiring extra interaction.
As far as I can tell, this is all done accessibly. To reduce repeated content for screen readers—and to lower cognitive load for everyone—I also removed the author sidebar from most posts and pages.
If you have any feedback on any of this, Id appreciate hearing from you!
Kudos
Did you enjoy this? Let me know:
Perhaps even leave a comment below?
</details></li></ul></div>
</div></article>
</li>
</ol>

View File

@@ -5,11 +5,39 @@
<subtitle>The long-running and erratically updated blog of Kathleen Fitzpatrick.</subtitle>
<link href="https://kfitz.info/feed/feed.xml" rel="self" />
<link href="https://kfitz.info/" />
<updated>2025-08-31T18:34:18Z</updated>
<updated>2025-09-07T17:28:41Z</updated>
<id>https://kfitz.info/</id>
<author>
<name>Kathleen Fitzpatrick</name>
</author>
<entry>
<title>Learning</title>
<link href="https://kfitz.info/learning/" />
<updated>2025-09-07T17:28:41Z</updated>
<id>https://kfitz.info/learning/</id>
<content type="html">&lt;p&gt;Over the last several months, I&#39;ve been engaged in a project designed to bring a bunch of the stuff I&#39;m hosting in various places around the internet home. And I mean &amp;quot;home&amp;quot; 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&#39;s hosted. I wanted my stuff on my server in my very own house.&lt;/p&gt;
&lt;p&gt;Why? I can&#39;t fully articulate the drive. Some of it stems from a long-standing desire to &amp;quot;&lt;a href=&quot;https://en.wikipedia.org/wiki/DeGoogle&quot;&gt;de-google&lt;/a&gt;,&amp;quot; to &lt;a href=&quot;https://www.theverge.com/24293448/x-twitter-musk-deactivate-how-to&quot;&gt;quit Twitter&lt;/a&gt;, 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&#39;s happened around us since January and the creeping sense that even good actors in today&#39;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 &lt;em&gt;really&lt;/em&gt; self-host? What would be required, and what would I need to learn?&lt;/p&gt;
&lt;p&gt;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&#39;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, &lt;em&gt;this blog&lt;/em&gt; -- through a wide variety of redesigns, platform migrations, and hosting changes over the years. Much of that tinkering is &lt;a href=&quot;https://kfitz.info/tags/tinkering/&quot;&gt;documented in the archives&lt;/a&gt;, including my 2023 move away from WordPress, first to Jekyll and then to Eleventy.&lt;/p&gt;
&lt;p&gt;So I&#39;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 &lt;a href=&quot;https://about.hcommons.org/about-us/&quot;&gt;the values that the Knowledge Commons team has developed&lt;/a&gt;, 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.&lt;/p&gt;
&lt;p&gt;On top of which, each time I&#39;ve learned something new in the process of my tinkering, I&#39;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&#39;ve had scattered around elsewhere.&lt;/p&gt;
&lt;p&gt;What I didn&#39;t recognize when I started down this path was how little I knew about networking. I&#39;d sort of self-hosted a pretty good range of sites and services on Digital Ocean (including migrating from Github to my own &lt;a href=&quot;https://kfitz.info/gitea/&quot;&gt;Gitea&lt;/a&gt; instance), and I&#39;d gotten passably good at pretty basic Linux systems administration thanks to their amazing suite of &lt;a href=&quot;https://www.digitalocean.com/community/tutorials?q=docker+ubuntu&quot;&gt;tutorials&lt;/a&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://kfitz.info/learning/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt;. 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&#39;re starting with bare metal.&lt;/p&gt;
&lt;p&gt;It took several months and a bunch of frustration for me to get everything working, but if you&#39;re reading this post it&#39;s currently working well. I&#39;m writing in an Obsidian vault that contains the content of my Eleventy-based site. When I&#39;m done writing I&#39;ll use npm to build and index the site and git to push it to the Gitea instance on my home server. I&#39;ll then ssh into the container hosting my website and pull the updates in from Gitea. It&#39;s super simple when it&#39;s all working.&lt;/p&gt;
&lt;p&gt;But when it&#39;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&#39;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&#39;s the documentation that requires significant expertise to comprehend, and the &amp;quot;getting started&amp;quot; instructions that leave out key steps.&lt;/p&gt;
&lt;p&gt;I got enormous help in sorting out some intractable issues from two key directions, though: prior blog posts here (see in particular &lt;a href=&quot;https://kfitz.info/networking/&quot;&gt;Networking&lt;/a&gt; and &lt;a href=&quot;https://kfitz.info/networking-continued/&quot;&gt;Networking Continued&lt;/a&gt;), which produced generous, thoughtful responses from several people (most notably the always amazing &lt;a href=&quot;https://jadin.me&quot;&gt;Taylor Jadin&lt;/a&gt; of Reclaim Hosting&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://kfitz.info/learning/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;), and a series of Mastodon chats (most recently with the very kind and helpful &lt;a href=&quot;https://floss.social/@monospace&quot;&gt;Monospace Mentor&lt;/a&gt;&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://kfitz.info/learning/#fn3&quot; id=&quot;fnref3&quot;&gt;[3]&lt;/a&gt;&lt;/sup&gt;). There&#39;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.&lt;/p&gt;
&lt;p&gt;It&#39;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.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The thing I most love about these tutorials is that they&#39;re written not as though you&#39;re just there to find the answer and get out, but as though you actually want to learn. That is, they don&#39;t just provide command after command, but rather walk you through what each command does and why you want to do it. &lt;a href=&quot;https://kfitz.info/learning/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;I so, so admire his self-description as someone who is &amp;quot;passionate about educating and empowering people who want to make cool stuff on the web.&amp;quot; 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. &lt;a href=&quot;https://kfitz.info/learning/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn3&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;Self-described &amp;quot;greybeard geek&amp;quot; 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 &amp;quot;but how does the VM know that I&#39;m asking it to be a webserver?&amp;quot; &lt;a href=&quot;https://kfitz.info/learning/#fnref3&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
</entry>
<entry>
<title>Success, at Last</title>
<link href="https://kfitz.info/success-at-last/" />
@@ -152,24 +180,6 @@
&lt;p&gt;On the one hand, I take this as an encouraging sign: I really do want to work on this thing!&lt;/p&gt;
&lt;p&gt;On the other, I recognize the temptations posed by the alluring project you don&#39;t have time for, and the ways that turning that project into your primary point of focus can take a lot of the shine off.&lt;/p&gt;
&lt;p&gt;But right here, right now, I long for a writing project to really wrestle with. And so I&#39;m looking forward to carving out the moments here and there to work on it, even if I don&#39;t quit my day job to do it.&lt;/p&gt;
</content>
</entry>
<entry>
<title>Leading Generously, the Audiobook!</title>
<link href="https://kfitz.info/leading-generously-audiobook/" />
<updated>2025-02-18T13:39:29Z</updated>
<id>https://kfitz.info/leading-generously-audiobook/</id>
<content type="html">&lt;p&gt;I am delighted this morning to share the news that &lt;em&gt;Leading Generously&lt;/em&gt; is now available as an &lt;a href=&quot;https://www.audible.com/pd/Leading-Generously-Audiobook/B0DW9LHBL8?source_code=AUDFPWS0223189MWU-BK-ACX0-434650&amp;amp;ref=acx_bty_BK_ACX0_434650_pd_us&quot;&gt;audiobook&lt;/a&gt;,&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://kfitz.info/leading-generously-audiobook/#fn1&quot; id=&quot;fnref1&quot;&gt;[1]&lt;/a&gt;&lt;/sup&gt; in addition to its &lt;a href=&quot;https://www.press.jhu.edu/books/title/12787/leading-generously&quot;&gt;print and e-book formats&lt;/a&gt;! The audiobook is narrated by the amazing &lt;a href=&quot;https://www.linkedin.com/in/kristin-aikin-salada-386a32&quot;&gt;Kristin Aikin Salada&lt;/a&gt;, who has posted a more enticing excerpt on her &lt;a href=&quot;https://www.linkedin.com/posts/%F0%9F%8E%A4kristin-aikin-salada-386a32_we-put-people-first-say-so-many-employers-activity-7297457727751012352-B7vG?utm_source=share&amp;amp;utm_medium=member_desktop&amp;amp;rcm=ACoAAA8vjagBut77QdZiq1_BYQEcHrmB129syng&quot;&gt;LinkedIn announcement&lt;/a&gt; than the opening pages that Audible shares.&lt;sup class=&quot;footnote-ref&quot;&gt;&lt;a href=&quot;https://kfitz.info/leading-generously-audiobook/#fn2&quot; id=&quot;fnref2&quot;&gt;[2]&lt;/a&gt;&lt;/sup&gt;&lt;/p&gt;
&lt;p&gt;If you listen to the audiobook, I&#39;d love to hear your thoughts. I&#39;m thinking hard about the form that I might want my next project to take, and I&#39;m wondering how thinking about that project as audio-first (whether audiobook or podcast) might affect my approach.&lt;/p&gt;
&lt;hr class=&quot;footnotes-sep&quot;&gt;
&lt;section class=&quot;footnotes&quot;&gt;
&lt;ol class=&quot;footnotes-list&quot;&gt;
&lt;li id=&quot;fn1&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;The audiobook is also &lt;a href=&quot;https://www.audible.co.uk/pd/Leading-Generously-Audiobook/B0DW9JDZZK&quot;&gt;available in the UK&lt;/a&gt;, and I assume elsewhere, though the link doesn&#39;t localize on its own. &lt;a href=&quot;https://kfitz.info/leading-generously-audiobook/#fnref1&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;li id=&quot;fn2&quot; class=&quot;footnote-item&quot;&gt;&lt;p&gt;My friends at &lt;a href=&quot;https://www.rawsignal.ca/&quot;&gt;Raw Signal Group&lt;/a&gt; might find the opening lines of her excerpt a bit familiar! Which raises an interesting question about citations in audiobooks. I know how that would be handled in an audio-first project, but the translation from print to audio isn&#39;t quite as conducive to sharing your sources. &lt;a href=&quot;https://kfitz.info/leading-generously-audiobook/#fnref2&quot; class=&quot;footnote-backref&quot;&gt;↩︎&lt;/a&gt;&lt;/p&gt;
&lt;/li&gt;
&lt;/ol&gt;
&lt;/section&gt;
</content>
</entry>
</feed>

View File

@@ -545,13 +545,21 @@ pre[class*="language-diff-"] {
<subtitle>The long-running and erratically updated blog of Kathleen Fitzpatrick.</subtitle>
<link href="https://kfitz.info/feed/masto.xml" rel="self"/>
<link href="https://kfitz.info/"/>
<updated>2025-08-31T18:34:18Z</updated>
<updated>2025-09-07T17:28:41Z</updated>
<id>https://kfitz.info/</id>
<author>
<name>Kathleen Fitzpatrick</name>
<email>kfitz@kfitz.info</email>
</author>
<entry>
<title>Learning</title>
<link href="https://kfitz.info/learning/"/>
<updated>2025-09-07T17:28:41Z</updated>
<id>https://kfitz.info/learning/</id>
<content type="html">Over the last several months, I&#39;ve been engaged in a project designed to bring a bunch of the stuff I&#39;m hosting in various places around the internet home. And I mean &amp;quot;home&amp;quot; quite literally: I not only wanted to control the data I was...</content>
</entry>
<entry>
<title>Success, at Last</title>
<link href="https://kfitz.info/success-at-last/"/>

View File

@@ -680,7 +680,7 @@ hr.new {
<h3 id="webmentions-2">Webmentions</h3>
<h4 id="1-reply">1 Reply</h4>
<h4 id="2-replies">2 Replies</h4>
<ol class="webmentions__list">
<li class="webmentions__item">
@@ -706,6 +706,73 @@ hr.new {
</li>
<li class="webmentions__item">
<article class="webmention h-cite" id="webmention-1936203">
<div class="webmention__meta">
<a class="webmention__author p-author h-card u-url" href="https://www.ryanpatrickrandall.com/postroll/" target="_blank" rel="noopener noreferrer">
<img class="webmention__author__photo" src="/blog/img/default_avatar.png" alt="">
<strong class="p-name">By: Ryan P. Randall</strong>
</a>
<time class="webmention__pubdate dt-published" datetime="2024-07-05T00:00:00-06:00">05 Jul 2024 - 06:00</time>
</div>
<div class="webmention__content p-content">
On this pageWhats a Postroll?My Postroll ProperOther Peopless Postrolls (OPP)Whats a Postroll?
How can a blogroll page function differently?
On this postroll page—inspired by Brandons—Ill list n share-worthy posts, aiming to add two or more new posts a week. This means that older entries will eventually cycle out of the list. (As of 2024-07-05, Im still deciding how many n will equal, a number which will almost certainly intertwingle with how quickly I add new posts.)
This approach is not quite analogous to a mixtape full of things that work well together, but it will hopefully highlight particular posts in a different way than my blogroll pages more general “hey, check out this feed (or band / musician)” can do.
My Postroll Proper
This list is numbered chronologically, with “1” indicating the newest addition to the list. (It feels worth reiterating: 1. does not mean “best”, and it is also unrelated to when the post was published. The first link is just the most recently thing Ive added to this list.)
Tracy Durnells Using personal weeknotes as a tool for attention reflects on how she started using weeknotes and how she uses them now, with an emphasis on awareness, accountability, and shaping her own behavior. I also really appreciate how she shares her weeknotes template and the process she uses for compiling them.
Ernie Smiths Cassingle Culture weaves a ton of punk / (indie) pop culture / media history into a breezy yet deep narrative of cassette singles. Bow Wow Wow? Boy George? Malcolm McLaren? Yep, theyre all in just the first few paragraphs, before we even get to the Go-Gos and R.E.M.
Jacky Alcinés post about not bothering with electoral politics online anymore provides me a very welcome reminder of whats behind some peoples reasons to avoid discussions of elections online.
Jason Hepplers How I use Obsidian post covers a lot of the strengths to using Obsidian for notes and longer-form writing. Although I dont currently use any of the plugins or organizational strategies discussed here, Im considering making a Dataview-powered way of searching my literature notes along the lines of the Doing History with Zotero and Obsidian guide by Elena Razlogova linked to from this post.
Jamess reflection on four years of the personal web mentions a lot of same things I find so compelling about maintaining a website / blog / digital garden. You can do things with less worry about other peoples expectations.
As soon as you encounter the three-digit number in the title of John Coultharts Weekend links 732, you can realize how long this blog has been running. Its been a constant in my RSS readers for coming up on two full decades—I feel like I probably first heard of it through Arthur magazine or something! This particular week includes a mention of a new album where Shackleton (purveyor of often-otherworldly bass & percussion music) collaborates with Six Organs of Admittance (conjuror of often-psychedelic folk), links ranging from a pulp paperback book artists to a Wire magazine article on experimental radio to a collection of 60s acid rock buttons, and a great Japanese woodblock print from the late 1800s.
Anil Dashs Todays AI is unreasonable succinctly describes what I also find regrettable about the current generative AI hype: they generate bullshit by design, this bullshit is inconsistently generated in ways that cannot be easily debugged by users, and systems designed around these types of unpredictability and unreasonableness tend to remove agency from users.
Sara Joys This is My Church resonates with me both regarding particular communities (I helped start a swing dancing club at UC Riverside as an undergrad) and regarding the ways that social media and blogging communities feel to me now.
Tracy Durnells The injustice embedded in our infrastructure quickly weaves together a game, a book, an email, a citys community budget process, and other peoples blogs while making the posts point. This is a really nice example of how a blog post can act as a condensed essay, taking a reader on a quick travel through a set of ideas and perhaps coming away with a changed perspective.
John M. Jacksons Befores and afters profoundly resonates with me in terms of no longer feeling like Im “part of the new guard.” Although Im actually new enough as an instructional designer to not even know whether theres as much of a sense of “newer” and “older” guards in this field as there is in librarianship, I definitely feel like Im traversing similar thresholds in life. As a side note, I also appreciate how John tends to add sections like “What Im reading” and “Garden update” to his posts.
Keenans An alarmingly concise and very hinged summary of what it was like to build this site from scratch relates how they built their site… a story told with enough zest and humor that I feel better about the peculiar blend of empowerment and continual facepalming that drive my own site.
Kathleen Fitzpatricks Generosity and Pragmatism shares an insight from Deb Chachras How Infrastructure Works about how being generous is simultaneously being pragmatic. This post is also a great example of a type of blog post that hovers somewhere between a long social media post and a miniature essay.
Arthur Bostons When Do Checks Become Review? asks what lines we can draw around peer review and integrity checks.
Olu Niyi-Awosusis Weeknotes #4 (Week 24, 2024) showed me how nicely one can style a site made with Quartz—and the look of Olus Bear-based blog inspired me to trim the author sidebar links and some other elements from most of my own blog pages. Their various weeknotes are also a great example of that genre of blog post!
Spoiler alert! W. Evan Sheehans Twelve favorite problems currently only has a list of 5. I cant remember previously hearing about this “favorite problems” framework, which Evan ascribes to Richard Feynman, but Im instantly a fan.
Vic Kostrzewskis My mental health stack everyday things I use for my mental health shares a lot of technologies that I dont use, but I deeply appreciate this sharing of struggles and approaches.
Mandy Browns Common future reading note connects Ursula Franklins earthworm theory of social change to climate change, since talking about the weather is increasingly one way of talking about our common future.
Sri Seahs GHDR Report 0404: Powered by Prosocial Motivation shares a great insight into motivation—and I think Im often motivated similarly, by feeling connections with other people. (The post also touches on how Sri has “conversations” with ChatGPT, a use Id rarely considered before outside of working with students.)
John Maxwells All I Need to Know about DH I Learned in a MOO shares welcome insights about some early formats of online communities.
Robb Knights Slash Pages is a brief and welcome backstory for why he started Slashpages.net.
P.L. Thomass What Works?: The Wrong Question for Education Reform shares his personal educational history as well as pointing out various ways that “what works?” is untenable as a question for education reform.
Brandons On Adding A Blogroll Slashpage gave me the idea for this alterative format in the first place.
Other Peopless Postrolls (OPP)
Do you have a postroll page? Let me know and Ill try to add it here.
(I cant commit to maintaining this kind of list forever, for the same reasons that maintaining a blogroll can be awkward. But Im excited to point to some other postrolls for now.)
Brandons Postroll.
Jeddas Postroll.
Kudos
Did you enjoy this? Let me know:
</div>
</article>
</li>
</ol>

View File

@@ -14,7 +14,7 @@
<style>.postlist { counter-reset: start-from 1807 }
<style>.postlist { counter-reset: start-from 1808 }
/* This is an arbitrary CSS string added to the bundle */
/* Defaults */
@font-face {
@@ -562,6 +562,11 @@ Director, <a href="https://hcommons.org">Knowledge Commons</a>.</p>
<ol reversed="" class="postlist">
<li class="postlist-item">
<a href="/learning/" class="postlist-link">Learning</a>
<time class="postlist-date" datetime="2025-09-07">September 2025</time>
</li>
<li class="postlist-item">
<a href="/success-at-last/" class="postlist-link">Success, at Last</a>
<time class="postlist-date" datetime="2025-08-31">August 2025</time>
@@ -582,17 +587,12 @@ Director, <a href="https://hcommons.org">Knowledge Commons</a>.</p>
<time class="postlist-date" datetime="2025-06-26">June 2025</time>
</li>
<li class="postlist-item">
<a href="/all-this/" class="postlist-link">All This</a>
<time class="postlist-date" datetime="2025-05-31">May 2025</time>
</li>
</ol>
<p>1801 more posts can be found in <a href="/blog/">the archive</a>.</p>
<p>1802 more posts can be found in <a href="/blog/">the archive</a>.</p>

725
learning/index.html Normal file
View 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 &quot;home&quot; 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 &quot;<a href="https://en.wikipedia.org/wiki/DeGoogle">de-google</a>,&quot; 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 &quot;getting started&quot; 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 &quot;passionate about educating and empowering people who want to make cool stuff on the web.&quot; 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 &quot;greybeard geek&quot; 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 &quot;but how does the VM know that I'm asking it to be a webserver?&quot; <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>

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

Binary file not shown.

View File

@@ -1 +1 @@
{"version":"1.3.0","languages":{"en":{"hash":"en_d2d4c8a118","wasm":"en","page_count":1880}}}
{"version":"1.4.0","languages":{"en":{"hash":"en_5e61cad585","wasm":"en","page_count":1881}},"include_characters":["_","‿","⁀","⁔","︳","︴","","","","_"]}

View File

@@ -29,7 +29,7 @@ var require_mark = __commonJS({
"node_modules/mark.js/dist/mark.js"(exports, module) {
(function(global, factory) {
typeof exports === "object" && typeof module !== "undefined" ? module.exports = factory() : typeof define === "function" && define.amd ? define(factory) : global.Mark = factory();
})(exports, function() {
})(exports, (function() {
"use strict";
var _typeof = typeof Symbol === "function" && typeof Symbol.iterator === "symbol" ? function(obj) {
return typeof obj;
@@ -41,25 +41,22 @@ var require_mark = __commonJS({
throw new TypeError("Cannot call a class as a function");
}
};
var createClass = function() {
var createClass = /* @__PURE__ */ (function() {
function defineProperties(target, props) {
for (var i = 0; i < props.length; i++) {
var descriptor = props[i];
descriptor.enumerable = descriptor.enumerable || false;
descriptor.configurable = true;
if ("value" in descriptor)
descriptor.writable = true;
if ("value" in descriptor) descriptor.writable = true;
Object.defineProperty(target, descriptor.key, descriptor);
}
}
return function(Constructor, protoProps, staticProps) {
if (protoProps)
defineProperties(Constructor.prototype, protoProps);
if (staticProps)
defineProperties(Constructor, staticProps);
if (protoProps) defineProperties(Constructor.prototype, protoProps);
if (staticProps) defineProperties(Constructor, staticProps);
return Constructor;
};
}();
})();
var _extends = Object.assign || function(target) {
for (var i = 1; i < arguments.length; i++) {
var source = arguments[i];
@@ -71,7 +68,7 @@ var require_mark = __commonJS({
}
return target;
};
var DOMIterator = function() {
var DOMIterator = (function() {
function DOMIterator2(ctx) {
var iframes = arguments.length > 1 && arguments[1] !== void 0 ? arguments[1] : true;
var exclude = arguments.length > 2 && arguments[2] !== void 0 ? arguments[2] : [];
@@ -381,8 +378,8 @@ var require_mark = __commonJS({
}
}]);
return DOMIterator2;
}();
var Mark$1 = function() {
})();
var Mark$1 = (function() {
function Mark3(ctx) {
classCallCheck(this, Mark3);
this.ctx = ctx;
@@ -962,7 +959,7 @@ var require_mark = __commonJS({
}
}]);
return Mark3;
}();
})();
function Mark2(ctx) {
var _this = this;
var instance = new Mark$1(ctx);
@@ -985,7 +982,7 @@ var require_mark = __commonJS({
return this;
}
return Mark2;
});
}));
}
});
@@ -1024,8 +1021,7 @@ var PagefindHighlight = class {
}
// Inline styles might be too hard to override
addHighlightStyles(className) {
if (!className)
return;
if (!className) return;
const styleElement = document.createElement("style");
styleElement.innerText = `:where(.${className}) { background-color: yellow; color: black; }`;
document.head.appendChild(styleElement);
@@ -1046,8 +1042,7 @@ var PagefindHighlight = class {
}
highlight() {
const params = this.getHighlightParams(this.highlightParam);
if (!params || params.length === 0)
return;
if (!params || params.length === 0) return;
this.addStyles && this.addHighlightStyles(this.markOptions.className);
const markInstance = this.createMarkInstance();
this.markText(markInstance, params);

File diff suppressed because one or more lines are too long

File diff suppressed because one or more lines are too long

Binary file not shown.

File diff suppressed because one or more lines are too long

Binary file not shown.

Binary file not shown.

View File

@@ -9081,8 +9081,13 @@
<lastmod>2025-08-31</lastmod>
</url>
<url>
<loc>https://kfitz.info/learning/</loc>
<lastmod>2025-09-07</lastmod>
</url>
<url>
<loc>https://kfitz.info/feed/feed.xml</loc>
<lastmod>2025-08-31</lastmod>
<lastmod>2025-09-07</lastmod>
</url>
</urlset>

View File

@@ -672,7 +672,7 @@ hr.new {
<p>In my current setup, I have Nginx Proxy Manager running in a container on my Proxmox, with a DNS entry set up pointing my IP address to it. Then I have a proxy host pointing to another container in which I'm running Gitea, and I'm successfully pushing and pulling code for this site to and from it.</p>
<p>Next up is setting the actual hosting of this site and a few others that I've been wanting to pull in house. It's nice to see the end of the network architecture phase of this project near and to have the creative work of writing and building opening up in front of me at last!</p>
<ul class="links-nextprev"><li class="links-nextprev-prev">← Previous<br> <a href="/longevity/">Longevity and Sustainability</a></li>
<ul class="links-nextprev"><li class="links-nextprev-prev">← Previous<br> <a href="/longevity/">Longevity and Sustainability</a></li><li class="links-nextprev-next">Next →<br><a href="/learning/">Learning</a></li>
</ul>
<hyvor-talk-comments website-id="9100" page-id="/success-at-last/"></hyvor-talk-comments>
@@ -685,8 +685,42 @@ hr.new {
<h4 id="1-like">1 Like</h4>
<div class="webmentions__facepile">
<a class="h-card u-url link-u-exempt" href="https://bsky.app/profile/kfitz.info/post/3lxpqx2gyt427#liked_by_did:plc:hnpt7ns2lecdujegbi6qkqqm" target="_blank" rel="noopener noreferrer">
<img class="webmention__author__photo" src="https://avatars.webmention.io/cdn.bsky.app/82a7c56b51c6c0b537e5a0b9a8c2bc35fbf9c19e40f8b01ac39e96e2d88ee68a.jpg" alt="Martin Paul Eve" title="Martin Paul Eve" loading="lazy">
</a>
</div>
<h4 id="1-repost">1 Repost</h4>
<div class="webmentions__facepile">
<a class="h-card u-url link-u-exempt" href="https://bsky.app/profile/kfitz.info/post/3lxpqx2gyt427#reposted_by_did:plc:hnpt7ns2lecdujegbi6qkqqm" target="_blank" rel="noopener noreferrer">
<img class="webmention__author__photo" src="https://avatars.webmention.io/cdn.bsky.app/82a7c56b51c6c0b537e5a0b9a8c2bc35fbf9c19e40f8b01ac39e96e2d88ee68a.jpg" alt="Martin Paul Eve" title="Martin Paul Eve" loading="lazy">
</a>
</div>

View File

@@ -14,7 +14,7 @@
<style>.postlist { counter-reset: start-from 56 }
<style>.postlist { counter-reset: start-from 57 }
/* This is an arbitrary CSS string added to the bundle */
/* Defaults */
@font-face {
@@ -546,6 +546,11 @@ pre[class*="language-diff-"] {
<ol reversed="" class="postlist">
<li class="postlist-item">
<a href="/learning/" class="postlist-link">Learning</a>
<time class="postlist-date" datetime="2025-09-07">September 2025</time>
</li>
<li class="postlist-item">
<a href="/networking-continued/" class="postlist-link">Networking Continued</a>
<time class="postlist-date" datetime="2025-08-09">August 2025</time>