add learning
This commit is contained in:
1 parent
a290ff7a04
commit
903df28b7f
88 files changed
+993
-60
No files matched your search
@@ -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>
|
||||
|
||||
+83
-1
@@ -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. I’ve 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.
|
||||
|
||||
I’m 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 he’s 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 doesn’t 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 it’s a compelling idea to put a jumble of redemption narratives at the center of interlocking stories set in the Star Trek world, I honestly don’t 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, we’re watching all the series and movies in release order. At this point we’ve also watched the entire—and quite fun—first season of Picard and are partially through Lower Decks. They’re both much more pleasant than Discovery’s first season, and Lower Decks in particular is very rewarding considering the way we’re 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 I’m 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, I’m still going to keep tracking my reading here, especially since I’ll be able to annotate articles and add my own extended notes and posts.
|
||||
|
||||
If you’re on BookWyrm and want to connect, please do. If you’re not, why not give it a try? It’s 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, Jekyll’s “related posts” are actually just the most recent posts, not posts more meaningfully related to the content of a post? Yeah, that’s bugged me for years. And I’ve 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 I’ve 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 I’ll 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 you’re 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. I’ve 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 post’s 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, I’d 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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
+29
-19
@@ -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"><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="https://kfitz.info/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="https://kfitz.info/learning/#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="https://kfitz.info/learning/#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="https://kfitz.info/learning/#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="https://kfitz.info/learning/#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="https://kfitz.info/learning/#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="https://kfitz.info/learning/#fnref3" class="footnote-backref">↩︎</a></p>
|
||||
</li>
|
||||
</ol>
|
||||
</section>
|
||||
</content>
|
||||
</entry>
|
||||
<entry>
|
||||
<title>Success, at Last</title>
|
||||
<link href="https://kfitz.info/success-at-last/" />
|
||||
@@ -152,24 +180,6 @@
|
||||
<p>On the one hand, I take this as an encouraging sign: I really do want to work on this thing!</p>
|
||||
<p>On the other, I recognize the temptations posed by the alluring project you don'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.</p>
|
||||
<p>But right here, right now, I long for a writing project to really wrestle with. And so I'm looking forward to carving out the moments here and there to work on it, even if I don't quit my day job to do it.</p>
|
||||
</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"><p>I am delighted this morning to share the news that <em>Leading Generously</em> is now available as an <a href="https://www.audible.com/pd/Leading-Generously-Audiobook/B0DW9LHBL8?source_code=AUDFPWS0223189MWU-BK-ACX0-434650&amp;ref=acx_bty_BK_ACX0_434650_pd_us">audiobook</a>,<sup class="footnote-ref"><a href="https://kfitz.info/leading-generously-audiobook/#fn1" id="fnref1">[1]</a></sup> in addition to its <a href="https://www.press.jhu.edu/books/title/12787/leading-generously">print and e-book formats</a>! The audiobook is narrated by the amazing <a href="https://www.linkedin.com/in/kristin-aikin-salada-386a32">Kristin Aikin Salada</a>, who has posted a more enticing excerpt on her <a href="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;utm_medium=member_desktop&amp;rcm=ACoAAA8vjagBut77QdZiq1_BYQEcHrmB129syng">LinkedIn announcement</a> than the opening pages that Audible shares.<sup class="footnote-ref"><a href="https://kfitz.info/leading-generously-audiobook/#fn2" id="fnref2">[2]</a></sup></p>
|
||||
<p>If you listen to the audiobook, I'd love to hear your thoughts. I'm thinking hard about the form that I might want my next project to take, and I'm wondering how thinking about that project as audio-first (whether audiobook or podcast) might affect my approach.</p>
|
||||
<hr class="footnotes-sep">
|
||||
<section class="footnotes">
|
||||
<ol class="footnotes-list">
|
||||
<li id="fn1" class="footnote-item"><p>The audiobook is also <a href="https://www.audible.co.uk/pd/Leading-Generously-Audiobook/B0DW9JDZZK">available in the UK</a>, and I assume elsewhere, though the link doesn't localize on its own. <a href="https://kfitz.info/leading-generously-audiobook/#fnref1" class="footnote-backref">↩︎</a></p>
|
||||
</li>
|
||||
<li id="fn2" class="footnote-item"><p>My friends at <a href="https://www.rawsignal.ca/">Raw Signal Group</a> 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't quite as conducive to sharing your sources. <a href="https://kfitz.info/leading-generously-audiobook/#fnref2" class="footnote-backref">↩︎</a></p>
|
||||
</li>
|
||||
</ol>
|
||||
</section>
|
||||
</content>
|
||||
</entry>
|
||||
</feed>
|
||||
+9
-1
@@ -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'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...</content>
|
||||
</entry>
|
||||
|
||||
<entry>
|
||||
<title>Success, at Last</title>
|
||||
<link href="https://kfitz.info/success-at-last/"/>
|
||||
|
||||
@@ -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 pageWhat’s a Postroll?My Postroll ProperOther Peoples’s Postrolls (OPP)What’s a Postroll?
|
||||
|
||||
How can a blogroll page function differently?
|
||||
|
||||
On this postroll page—inspired by Brandon’s—I’ll 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, I’m 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 page’s 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 I’ve added to this list.)
|
||||
|
||||
Tracy Durnell’s 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 Smith’s 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, they’re all in just the first few paragraphs, before we even get to the Go-Go’s and R.E.M.
|
||||
Jacky Alciné’s post about not bothering with electoral politics online anymore provides me a very welcome reminder of what’s behind some people’s reasons to avoid discussions of elections online.
|
||||
Jason Heppler’s How I use Obsidian post covers a lot of the strengths to using Obsidian for notes and longer-form writing. Although I don’t currently use any of the plugins or organizational strategies discussed here, I’m 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.
|
||||
James’s 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 people’s expectations.
|
||||
As soon as you encounter the three-digit number in the title of John Coulthart’s Weekend links 732, you can realize how long this blog has been running. It’s 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 Dash’s Today’s 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 Joy’s 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 Durnell’s The injustice embedded in our infrastructure quickly weaves together a game, a book, an email, a city’s community budget process, and other people’s blogs while making the post’s 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. Jackson’s Befores and afters profoundly resonates with me in terms of no longer feeling like I’m “part of the new guard.” Although I’m actually new enough as an instructional designer to not even know whether there’s as much of a sense of “newer” and “older” guards in this field as there is in librarianship, I definitely feel like I’m traversing similar thresholds in life. As a side note, I also appreciate how John tends to add sections like “What I’m reading” and “Garden update” to his posts.
|
||||
Keenan’s 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 Fitzpatrick’s Generosity and Pragmatism shares an insight from Deb Chachra’s 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 Boston’s When Do Checks Become Review? asks what lines we can draw around peer review and integrity checks.
|
||||
Olu Niyi-Awosusi’s Weeknotes #4 (Week 24, 2024) showed me how nicely one can style a site made with Quartz—and the look of Olu’s 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 Sheehan’s Twelve favorite problems currently only has a list of 5. I can’t remember previously hearing about this “favorite problems” framework, which Evan ascribes to Richard Feynman, but I’m instantly a fan.
|
||||
Vic Kostrzewski’s My mental health stack – everyday things I use for my mental health shares a lot of technologies that I don’t use, but I deeply appreciate this sharing of struggles and approaches.
|
||||
Mandy Brown’s Common future reading note connects Ursula Franklin’s earthworm theory of social change to climate change, since talking about the weather is increasingly one way of talking about our common future.
|
||||
Sri Seah’s GHDR Report 0404: Powered by Prosocial Motivation shares a great insight into motivation—and I think I’m often motivated similarly, by feeling connections with other people. (The post also touches on how Sri has “conversations” with ChatGPT, a use I’d rarely considered before outside of working with students.)
|
||||
John Maxwell’s All I Need to Know about DH I Learned in a MOO shares welcome insights about some early formats of online communities.
|
||||
Robb Knight’s Slash Pages is a brief and welcome backstory for why he started Slashpages.net.
|
||||
P.L. Thomas’s 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.
|
||||
Brandon’s On Adding A Blogroll Slashpage gave me the idea for this alterative format in the first place.
|
||||
Other Peoples’s Postrolls (OPP)
|
||||
|
||||
Do you have a postroll page? Let me know and I’ll try to add it here.
|
||||
|
||||
(I can’t commit to maintaining this kind of list forever, for the same reasons that maintaining a blogroll can be awkward. But I’m excited to point to some other postrolls for now.)
|
||||
|
||||
Brandon’s Postroll.
|
||||
Jedda’s Postroll.
|
||||
Kudos
|
||||
|
||||
Did you enjoy this? Let me know:
|
||||
</div>
|
||||
</article>
|
||||
|
||||
</li>
|
||||
|
||||
</ol>
|
||||
|
||||
|
||||
|
||||
+7
-7
@@ -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>
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
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.
@@ -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":["_","‿","⁀","⁔","︳","︴","﹍","﹎","﹏","_"]}
|
||||
@@ -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);
|
||||
|
||||
@@ -1,8 +1,8 @@
|
||||
(()=>{var b=Object.defineProperty;var w=(i,e)=>{for(var t in e)b(i,t,{get:e[t],enumerable:!0})};var f={};w(f,{FilterPills:()=>h,Input:()=>l,Instance:()=>p,ResultList:()=>a,Summary:()=>o});var r=class i{constructor(e){this.element=document.createElement(e)}id(e){return this.element.id=e,this}class(e){return this.element.classList.add(e),this}attrs(e){for(let[t,s]of Object.entries(e))this.element.setAttribute(t,s);return this}text(e){return this.element.innerText=e,this}html(e){return this.element.innerHTML=e,this}handle(e,t){return this.element.addEventListener(e,t),this}addTo(e){return e instanceof i?e.element.appendChild(this.element):e.appendChild(this.element),this.element}};var T=async(i=100)=>new Promise(e=>setTimeout(e,i)),l=class{constructor(e={}){if(this.inputEl=null,this.clearEl=null,this.instance=null,this.searchID=0,this.debounceTimeoutMs=e.debounceTimeoutMs??300,e.inputElement){if(e.containerElement){console.warn("[Pagefind Input component]: inputElement and containerElement both supplied. Ignoring the container option.");return}this.initExisting(e.inputElement)}else if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Input component]: No selector supplied for containerElement or inputElement");return}this.inputEl.addEventListener("input",async t=>{if(this.instance&&typeof t?.target?.value=="string"){this.updateState(t.target.value);let s=++this.searchID;if(await T(this.debounceTimeoutMs),s!==this.searchID)return null;this.instance?.triggerSearch(t.target.value)}}),this.inputEl.addEventListener("keydown",t=>{t.key==="Escape"&&(++this.searchID,this.inputEl.value="",this.instance?.triggerSearch(""),this.updateState("")),t.key==="Enter"&&t.preventDefault()}),this.inputEl.addEventListener("focus",()=>{this.instance?.triggerLoad()})}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No container found for ${e} selector`);return}if(t.tagName==="INPUT")console.warn(`[Pagefind Input component]: Encountered input element for ${e} when a container was expected`),console.warn("[Pagefind Input component]: Treating containerElement option as inputElement and proceeding"),this.initExisting(e);else{t.innerHTML="";let s=0;for(;document.querySelector(`#pfmod-input-${s}`);)s+=1;let n=new r("form").class("pagefind-modular-input-wrapper").attrs({role:"search","aria-label":"Search this site",action:"javascript:void(0);"});new r("label").attrs({for:`pfmod-input-${s}`,"data-pfmod-sr-hidden":"true"}).text("Search this site").addTo(n),this.inputEl=new r("input").id(`pfmod-input-${s}`).class("pagefind-modular-input").attrs({autocapitalize:"none",enterkeyhint:"search"}).addTo(n),this.clearEl=new r("button").class("pagefind-modular-input-clear").attrs({"data-pfmod-suppressed":"true"}).text("Clear").handle("click",()=>{this.inputEl.value="",this.instance.triggerSearch(""),this.updateState("")}).addTo(n),n.addTo(t)}}initExisting(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No input element found for ${e} selector`);return}if(t.tagName!=="INPUT"){console.error(`[Pagefind Input component]: Expected ${e} to be an <input> element`);return}this.inputEl=t}updateState(e){this.clearEl&&(e&&e?.length?this.clearEl.removeAttribute("data-pfmod-suppressed"):this.clearEl.setAttribute("data-pfmod-suppressed","true"))}register(e){this.instance=e,this.instance.on("search",(t,s)=>{this.inputEl&&document.activeElement!==this.inputEl&&(this.inputEl.value=t,this.updateState(t))})}focus(){this.inputEl&&this.inputEl.focus()}};var g=i=>{if(i instanceof Element)return[i];if(Array.isArray(i)&&i.every(e=>e instanceof Element))return i;if(typeof i=="string"||i instanceof String){let e=document.createElement("div");return e.innerHTML=i,[...e.childNodes]}else return console.error(`[Pagefind ResultList component]: Expected template function to return an HTML element or string, got ${typeof i}`),[]},v=()=>{let i=(e=30)=>". ".repeat(Math.floor(10+Math.random()*e));return`<li class="pagefind-modular-list-result">
|
||||
(()=>{var w=Object.defineProperty;var b=(i,e)=>{for(var t in e)w(i,t,{get:e[t],enumerable:!0})};var f={};b(f,{FilterPills:()=>c,Input:()=>a,Instance:()=>p,ResultList:()=>o,Summary:()=>h});var r=class i{constructor(e){this.element=document.createElement(e)}id(e){return this.element.id=e,this}class(e){return this.element.classList.add(e),this}attrs(e){for(let[t,s]of Object.entries(e))this.element.setAttribute(t,s);return this}text(e){return this.element.innerText=e,this}html(e){return this.element.innerHTML=e,this}handle(e,t){return this.element.addEventListener(e,t),this}addTo(e){return e instanceof i?e.element.appendChild(this.element):e.appendChild(this.element),this.element}};var T=async(i=100)=>new Promise(e=>setTimeout(e,i)),a=class{constructor(e={}){if(this.inputEl=null,this.clearEl=null,this.instance=null,this.searchID=0,this.debounceTimeoutMs=e.debounceTimeoutMs??300,e.inputElement){if(e.containerElement){console.warn("[Pagefind Input component]: inputElement and containerElement both supplied. Ignoring the container option.");return}this.initExisting(e.inputElement)}else if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Input component]: No selector supplied for containerElement or inputElement");return}this.inputEl.addEventListener("input",async t=>{if(this.instance&&typeof t?.target?.value=="string"){this.updateState(t.target.value);let s=++this.searchID;if(await T(this.debounceTimeoutMs),s!==this.searchID)return null;this.instance?.triggerSearch(t.target.value)}}),this.inputEl.addEventListener("keydown",t=>{t.key==="Escape"&&(++this.searchID,this.inputEl.value="",this.instance?.triggerSearch(""),this.updateState("")),t.key==="Enter"&&t.preventDefault()}),this.inputEl.addEventListener("focus",()=>{this.instance?.triggerLoad()})}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No container found for ${e} selector`);return}if(t.tagName==="INPUT")console.warn(`[Pagefind Input component]: Encountered input element for ${e} when a container was expected`),console.warn("[Pagefind Input component]: Treating containerElement option as inputElement and proceeding"),this.initExisting(e);else{t.innerHTML="";let s=0;for(;document.querySelector(`#pfmod-input-${s}`);)s+=1;let n=new r("form").class("pagefind-modular-input-wrapper").attrs({role:"search","aria-label":"Search this site",action:"javascript:void(0);"});new r("label").attrs({for:`pfmod-input-${s}`,"data-pfmod-sr-hidden":"true"}).text("Search this site").addTo(n),this.inputEl=new r("input").id(`pfmod-input-${s}`).class("pagefind-modular-input").attrs({autocapitalize:"none",enterkeyhint:"search"}).addTo(n),this.clearEl=new r("button").class("pagefind-modular-input-clear").attrs({"data-pfmod-suppressed":"true"}).text("Clear").handle("click",()=>{this.inputEl.value="",this.instance.triggerSearch(""),this.updateState("")}).addTo(n),n.addTo(t)}}initExisting(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Input component]: No input element found for ${e} selector`);return}if(t.tagName!=="INPUT"){console.error(`[Pagefind Input component]: Expected ${e} to be an <input> element`);return}this.inputEl=t}updateState(e){this.clearEl&&(e&&e?.length?this.clearEl.removeAttribute("data-pfmod-suppressed"):this.clearEl.setAttribute("data-pfmod-suppressed","true"))}register(e){this.instance=e,this.instance.on("search",(t,s)=>{this.inputEl&&document.activeElement!==this.inputEl&&(this.inputEl.value=t,this.updateState(t))})}focus(){this.inputEl&&this.inputEl.focus()}};var g=i=>{if(i instanceof Element)return[i];if(Array.isArray(i)&&i.every(e=>e instanceof Element))return i;if(typeof i=="string"||i instanceof String){let e=document.createElement("div");return e.innerHTML=i,[...e.childNodes]}else return console.error(`[Pagefind ResultList component]: Expected template function to return an HTML element or string, got ${typeof i}`),[]},v=()=>{let i=(e=30)=>". ".repeat(Math.floor(10+Math.random()*e));return`<li class="pagefind-modular-list-result">
|
||||
<div class="pagefind-modular-list-thumb" data-pfmod-loading></div>
|
||||
<div class="pagefind-modular-list-inner">
|
||||
<p class="pagefind-modular-list-title" data-pfmod-loading>${i(30)}</p>
|
||||
<p class="pagefind-modular-list-excerpt" data-pfmod-loading>${i(40)}</p>
|
||||
</div>
|
||||
</li>`},y=i=>{let e=new r("li").class("pagefind-modular-list-result"),t=new r("div").class("pagefind-modular-list-thumb").addTo(e);i?.meta?.image&&new r("img").class("pagefind-modular-list-image").attrs({src:i.meta.image,alt:i.meta.image_alt||i.meta.title}).addTo(t);let s=new r("div").class("pagefind-modular-list-inner").addTo(e),n=new r("p").class("pagefind-modular-list-title").addTo(s);return new r("a").class("pagefind-modular-list-link").text(i.meta?.title).attrs({href:i.meta?.url||i.url}).addTo(n),new r("p").class("pagefind-modular-list-excerpt").html(i.excerpt).addTo(s),e.element},E=i=>{if(!(i instanceof HTMLElement))return null;let e=window.getComputedStyle(i).overflowY;return e!=="visible"&&e!=="hidden"?i:E(i.parentNode)},d=class{constructor(e={}){this.rawResult=e.result,this.placeholderNodes=e.placeholderNodes,this.resultFn=e.resultFn,this.intersectionEl=e.intersectionEl,this.result=null,this.waitForIntersection()}waitForIntersection(){if(!this.placeholderNodes?.length)return;let e={root:this.intersectionEl,rootMargin:"0px",threshold:.01};new IntersectionObserver((s,n)=>{this.result===null&&s?.[0]?.isIntersecting&&(this.load(),n.disconnect())},e).observe(this.placeholderNodes[0])}async load(){if(!this.placeholderNodes?.length)return;this.result=await this.rawResult.data();let e=this.resultFn(this.result),t=g(e);for(;this.placeholderNodes.length>1;)this.placeholderNodes.pop().remove();this.placeholderNodes[0].replaceWith(...t)}},a=class{constructor(e){if(this.intersectionEl=document.body,this.containerEl=null,this.results=[],this.placeholderTemplate=e.placeholderTemplate??v,this.resultTemplate=e.resultTemplate??y,e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind ResultList component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind ResultList component]: No container found for ${e} selector`);return}this.containerEl=t}append(e){for(let t of e)this.containerEl.appendChild(t)}register(e){e.on("results",t=>{this.containerEl&&(this.containerEl.innerHTML="",this.intersectionEl=E(this.containerEl),this.results=t.results.map(s=>{let n=g(this.placeholderTemplate());return this.append(n),new d({result:s,placeholderNodes:n,resultFn:this.resultTemplate,intersectionEl:this.intersectionEl})}))}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerHTML="")})}};var o=class{constructor(e={}){if(this.containerEl=null,this.defaultMessage=e.defaultMessage??"",this.term="",e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Summary component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Summary component]: No container found for ${e} selector`);return}this.containerEl=t,this.containerEl.innerText=this.defaultMessage}register(e){e.on("search",(t,s)=>{this.term=t}),e.on("results",t=>{if(!this.containerEl||!t)return;if(!this.term){this.containerEl.innerText=this.defaultMessage;return}let s=t?.results?.length??0;this.containerEl.innerText=`${s} result${s===1?"":"s"} for ${this.term}`}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerText=`Searching for ${this.term}...`)})}};var h=class{constructor(e={}){if(this.instance=null,this.wrapper=null,this.pillContainer=null,this.available={},this.selected=["All"],this.total=0,this.filterMemo="",this.filter=e.filter,this.ordering=e.ordering??null,this.alwaysShow=e.alwaysShow??!1,this.selectMultiple=e.selectMultiple??!1,!this.filter?.length){console.error("[Pagefind FilterPills component]: No filter option supplied, nothing to display");return}if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind FilterPills component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind FilterPills component]: No container found for ${e} selector`);return}t.innerHTML="";let s=`pagefind_modular_filter_pills_${this.filter}`,n=new r("div").class("pagefind-modular-filter-pills-wrapper").attrs({role:"group","aria-labelledby":s});this.alwaysShow||n.attrs({"data-pfmod-hidden":!0}),new r("div").id(s).class("pagefind-modular-filter-pills-label").attrs({"data-pfmod-sr-hidden":!0}).text(`Filter results by ${this.filter}`).addTo(n),this.pillContainer=new r("div").class("pagefind-modular-filter-pills").addTo(n),this.wrapper=n.addTo(t)}update(){let e=this.available.map(t=>t[0]).join("~");e==this.filterMemo?this.updateExisting():(this.renderNew(),this.filterMemo=e)}pushFilters(){let e=this.selected.filter(t=>t!=="All");this.instance.triggerFilter(this.filter,e)}pillInner(e,t){return this.total?`<span aria-label="${e}">${e} (${t})</span>`:`<span aria-label="${e}">${e}</span>`}renderNew(){this.available.forEach(([e,t])=>{new r("button").class("pagefind-modular-filter-pill").html(this.pillInner(e,t)).attrs({"aria-pressed":this.selectedLine truncated
|
||||
</li>`},y=(i,e)=>{let t=new r("li").class("pagefind-modular-list-result");if(e){let l=new r("div").class("pagefind-modular-list-thumb").addTo(t);i?.meta?.image&&new r("img").class("pagefind-modular-list-image").attrs({src:i.meta.image,alt:i.meta.image_alt||i.meta.title}).addTo(l)}let s=new r("div").class("pagefind-modular-list-inner").addTo(t),n=new r("p").class("pagefind-modular-list-title").addTo(s);return new r("a").class("pagefind-modular-list-link").text(i.meta?.title).attrs({href:i.meta?.url||i.url}).addTo(n),new r("p").class("pagefind-modular-list-excerpt").html(i.excerpt).addTo(s),t.element},E=i=>{if(!(i instanceof HTMLElement))return null;let e=window.getComputedStyle(i).overflowY;return e!=="visible"&&e!=="hidden"?i:E(i.parentNode)},d=class{constructor(e={}){this.rawResult=e.result,this.placeholderNodes=e.placeholderNodes,this.resultFn=e.resultFn,this.intersectionEl=e.intersectionEl,this.showImages=e.showImages,this.result=null,this.waitForIntersection()}waitForIntersection(){if(!this.placeholderNodes?.length)return;let e={root:this.intersectionEl,rootMargin:"0px",threshold:.01};new IntersectionObserver((s,n)=>{this.result===null&&s?.[0]?.isIntersecting&&(this.load(),n.disconnect())},e).observe(this.placeholderNodes[0])}async load(){if(!this.placeholderNodes?.length)return;this.result=await this.rawResult.data();let e=this.resultFn(this.result,this.showImages),t=g(e);for(;this.placeholderNodes.length>1;)this.placeholderNodes.pop().remove();this.placeholderNodes[0].replaceWith(...t)}},o=class{constructor(e){if(this.intersectionEl=document.body,this.containerEl=null,this.results=[],this.placeholderTemplate=e.placeholderTemplate??v,this.resultTemplate=e.resultTemplate??y,this.showImages=e.showImages??!0,e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind ResultList component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind ResultList component]: No container found for ${e} selector`);return}this.containerEl=t}append(e){for(let t of e)this.containerEl.appendChild(t)}register(e){e.on("results",t=>{this.containerEl&&(this.containerEl.innerHTML="",this.intersectionEl=E(this.containerEl),this.results=t.results.map(s=>{let n=g(this.placeholderTemplate());return this.append(n),new d({result:s,placeholderNodes:n,resultFn:this.resultTemplate,intersectionEl:this.intersectionEl,showImages:this.showImages})}))}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerHTML="")})}};var h=class{constructor(e={}){if(this.containerEl=null,this.defaultMessage=e.defaultMessage??"",this.term="",e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind Summary component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind Summary component]: No container found for ${e} selector`);return}this.containerEl=t,this.containerEl.innerText=this.defaultMessage}register(e){e.on("search",(t,s)=>{this.term=t}),e.on("results",t=>{if(!this.containerEl||!t)return;if(!this.term){this.containerEl.innerText=this.defaultMessage;return}let s=t?.results?.length??0;this.containerEl.innerText=`${s} result${s===1?"":"s"} for ${this.term}`}),e.on("loading",()=>{this.containerEl&&(this.containerEl.innerText=`Searching for ${this.term}...`)})}};var c=class{constructor(e={}){if(this.instance=null,this.wrapper=null,this.pillContainer=null,this.available={},this.selected=["All"],this.total=0,this.filterMemo="",this.filter=e.filter,this.ordering=e.ordering??null,this.alwaysShow=e.alwaysShow??!1,this.selectMultiple=e.selectMultiple??!1,!this.filter?.length){console.error("[Pagefind FilterPills component]: No filter option supplied, nothing to display");return}if(e.containerElement)this.initContainer(e.containerElement);else{console.error("[Pagefind FilterPills component]: No selector supplied for containerElement");return}}initContainer(e){let t=document.querySelector(e);if(!t){console.error(`[Pagefind FilterPills component]: No container found for ${e} selector`);return}t.innerHTML="";let s=`pagefind_modular_filter_pills_${this.filter}`,n=new r("div").class("pagefind-modular-filter-pills-wrapper").attrs({role:"group","aria-labelledby":s});this.alwaysShow||n.attrs({"data-pfmod-hidden":!0}),new r("div").id(s).class("pagefind-modular-filter-pills-label").attrs({"data-pfmod-sr-hidden":!0}).text(`Filter results by ${this.filter}`).addTo(n),this.pillContainer=new r("div").class("pagefind-modular-filter-pills").addTo(n),this.wrapper=n.addTo(t)}update(){let e=this.available.map(t=>t[0]).join("~");e==this.filterMemo?this.updateExisting():(this.renderNew(),this.filterMemo=e)}pushFilters(){let e=this.selected.filter(t=>t!=="All");this.instance.triggerFilter(this.filter,e)}pillInner(e,t){return this.total?`<span aria-label="${e}" data-pfmod-pill-count="${t}">${e} (${t})</span>`:`<span aria-label="${e}">${e}</span>`}renderNew(){Line truncated
|
||||
`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript?.src??"bad script location"}]`):console.error("no known script location")}await e.options(this.pagefindOptions||{});for(let t of this.options.mergeIndex){if(!t.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let s=t.bundlePath;delete t.bundlePath,await e.mergeIndex(s,t)}this.__pagefind__=e}this.availableFilters=await this.__pagefind__.filters(),this.totalFilters=this.availableFilters,this.__dispatch__("filters",{available:this.availableFilters,total:this.totalFilters})}};window.PagefindModularUI=f;})();
|
||||
@@ -1,2 +1,2 @@
|
||||
(()=>{var Ms=Object.defineProperty;var y=(n,e)=>{for(var t in e)Ms(n,t,{get:e[t],enumerable:!0})};function z(){}function mt(n){return n()}function gn(){return Object.create(null)}function G(n){n.forEach(mt)}function nt(n){return typeof n=="function"}function K(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}var et;function ie(n,e){return et||(et=document.createElement("a")),et.href=e,n===et.href}function En(n){return Object.keys(n).length===0}var Rn=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,de=class{constructor(e){this.options=e,this._listeners="WeakMap"in Rn?new WeakMap:void 0}observe(e,t){return this._listeners.set(e,t),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(t=>{var s;for(let r of t)de.entries.set(r.target,r),(s=this._listeners.get(r.target))===null||s===void 0||s(r)})}};de.entries="WeakMap"in Rn?new WeakMap:void 0;var bn=!1;function As(){bn=!0}function vs(){bn=!1}function b(n,e){n.appendChild(e)}function S(n,e,t){n.insertBefore(e,t||null)}function k(n){n.parentNode&&n.parentNode.removeChild(n)}function Q(n,e){for(let t=0;t<n.length;t+=1)n[t]&&n[t].d(e)}function C(n){return document.createElement(n)}function ws(n){return document.createElementNS("http://www.w3.org/2000/svg",n)}function w(n){return document.createTextNode(n)}function A(){return w(" ")}function x(){return w("")}function J(n,e,t,s){return n.addEventListener(e,t,s),()=>n.removeEventListener(e,t,s)}function g(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function Hs(n){return Array.from(n.childNodes)}function N(n,e){e=""+e,n.data!==e&&(n.data=e)}function pt(n,e){n.value=e??""}function B(n,e,t){n.classList[t?"add":"remove"](e)}var st=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,s=null){this.e||(this.is_svg?this.e=ws(t.nodeName):this.e=C(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(s)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;t<this.n.length;t+=1)S(this.t,this.n[t],e)}p(e){this.d(),this.h(e),this.i(this.a)}d(){this.n.forEach(k)}};var he;function fe(n){he=n}function Tn(){if(!he)throw new Error("Function called outside component initialization");return he}function gt(n){Tn().$$.on_mount.push(n)}function Et(n){Tn().$$.on_destroy.push(n)}var se=[];var le=[],re=[],ft=[],Fs=Promise.resolve(),dt=!1;function Ns(){dt||(dt=!0,Fs.then(kn))}function ht(n){re.push(n)}function Cn(n){ft.push(n)}var _t=new Set,ne=0;function kn(){if(ne!==0)return;let n=he;do{try{for(;ne<se.length;){let e=se[ne];ne++,fe(e),Os(e.$$)}}catch(e){throw se.length=0,ne=0,e}for(fe(null),se.length=0,ne=0;le.length;)le.pop()();for(let e=0;e<re.length;e+=1){let t=re[e];_t.has(t)||(_t.add(t),t())}re.length=0}while(se.length);for(;ft.length;)ft.pop()();dt=!1,_t.clear(),fe(n)}function Os(n){if(n.fragment!==null){n.update(),G(n.before_update);let e=n.dirty;n.dirty=[-1],n.fragment&&n.fragment.p(n.ctx,e),n.after_update.forEach(ht)}}function js(n){let e=[],t=[];re.forEach(s=>n.indexOf(s)===-1?e.push(s):t.push(s)),t.forEach(s=>s()),re=e}var tt=new Set,ee;function ae(){ee={r:0,c:[],p:ee}}function oe(){ee.r||G(ee.c),ee=ee.p}function U(n,e){n&&n.i&&(tt.delete(n),n.i(e))}function P(n,e,t,s){if(n&&n.o){if(tt.has(n))return;tt.add(n),ee.c.push(()=>{tt.delete(n),s&&(t&&n.d(1),s())}),n.o(e)}else s&&s()}function Sn(n,e){P(n,1,1,()=>{e.delete(n.key)})}function yn(n,e,t,s,r,l,i,a,o,f,u,m){let p=n.length,h=l.length,_=p,c={};for(;_--;)c[n[_].key]=_;let d=[],T=new Map,R=new Map,M=[];for(_=h;_--;){let v=m(r,l,_),H=t(v),O=i.get(H);O?s&&M.push(()=>O.p(v,e)):(O=f(H,v),O.c()),T.set(H,d[_]=O),H in c&&R.set(H,Math.abs(_-c[H]))}let D=new Set,X=new Set;function V(v){U(v,1),v.m(a,u),i.set(v.key,v),u=v.first,h--}for(;p&&h;){let v=d[h-1],H=n[p-1],O=v.key,W=H.key;v===H?(u=v.first,p--,h--):T.has(W)?!i.has(O)||D.has(O)?V(v):X.has(W)?p--:R.get(O)>R.get(W)?(X.add(O),V(v)):(D.add(W),p--):(o(H,i),p--)}for(;p--;){let v=n[p];T.has(v.key)||o(v,i)}for(;h;)V(d[h-1]);return G(M),d}var zs=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],Ua=new Set([...zs]);function Mn(n,e,t){let s=n.$$.props[e];s!==void 0&&(n.$$.bound[s]=t,t(n.$$.ctx[s]))}function rt(n){n&&n.c()}function me(n,e,t,s){let{fragment:r,after_update:l}=n.$$;r&&r.m(e,t),s||ht(()=>{let i=n.$$.on_mount.map(mt).filter(nt);n.$$.on_destroy?n.$$.on_destroy.push(...i):G(i),n.$$.on_mount=[]}),l.forEach(ht)}function ue(n,e){let t=n.$$;t.fragment!==null&&(js(t.after_update),G(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroyLine truncated
|
||||
`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}u||t(24,u=f?12:30);let F={...d||{},excerptLength:u};await E.options(F);for(let j of T){if(!j.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let L=j.bundlePath;delete j.bundlePath,await E.mergeIndex(L,j)}H=E,hs()}},hs=async()=>{H&&(dn=await H.filters(),(!ce||!Object.keys(ce).length)&&t(18,ce=dn))},ms=E=>{let F={};return Object.entries(E).filter(([,j])=>j).forEach(([j])=>{let[L,te]=j.split(/:(.*)$/);F[L]=F[L]||[],F[L].push(te)}),F},_e,ps=async(E,F)=>{if(!E){t(15,ut=!1),_e&&clearTimeout(_e);return}let j=ms(F),L=()=>gs(E,j);c>0&&E?(_e&&clearTimeout(_e),_e=setTimeout(L,c),await pn(),H.preload(E,{filters:j})):L(),Es()},pn=async()=>{for(;!H;)mn(),await new Promise(E=>setTimeout(E,50))},gs=async(E,F)=>{t(16,fn=E||""),typeof p=="function"&&(E=p(E)),t(14,ot=!0),t(15,ut=!0),await pn();let j=++_n,L={filters:F};X&&typeof X=="object"&&(L.sort=X);let te=await H.search(E,L);_n===j&&(te.filters&&Object.keys(te.filters)?.length&&t(18,ce=te.filters),t(13,cn=te),t(14,ot=!1),t(17,ct=i))},Es=()=>{let E=W.offsetWidth;E!=fs&&t(10,O.style.paddingRight=`${E+2}px`,O)},Rs=E=>{E?.preventDefault(),t(17,ct+=i)},bs=E=>{E.key==="Escape"&&(t(9,v=""),O.blur()),E.key==="Enter"&&E.preventDefault()};function Ts(){v=this.value,t(9,v),t(23,R)}function Cs(E){le[E?"unshift":"push"](()=>{O=E,t(10,O)})}function ks(E){le[E?"unshift":"push"](()=>{W=E,t(11,W)})}let Ss=()=>{t(9,v=""),O.blur()};function ys(E){V=E,t(0,V)}return n.$$set=E=>{"base_path"in E&&t(25,l=E.base_path),"page_size"in E&&t(26,i=E.page_size),"reset_styles"in E&&t(1,a=E.reset_styles),"show_images"in E&&t(2,o=E.show_images),"show_sub_results"in E&&t(3,f=E.show_sub_results),"excerpt_length"in E&&t(24,u=E.excerpt_length),"process_result"in E&&t(4,m=E.process_result),"process_term"in E&&t(27,p=E.process_term),"show_empty_filters"in E&&t(5,h=E.show_empty_filters),"open_filters"in E&&t(6,_=E.open_filters),"debounce_timeout_ms"in E&&t(28,c=E.debounce_timeout_ms),"pagefind_options"in E&&t(29,d=E.pagefind_options),"merge_index"in E&&t(30,T=E.merge_index),"trigger_search_term"in E&&t(23,R=E.trigger_search_term),"translations"in E&&t(7,M=E.translations),"autofocus"in E&&t(8,D=E.autofocus),"sort"in E&&t(31,X=E.sort),"selected_filters"in E&&t(0,V=E.selected_filters)},n.$$.update=()=>{if(n.$$.dirty[0]&8388608)e:R&&(t(9,v=R),t(23,R=""));if(n.$$.dirty[0]&513)e:ps(v,V)},[V,a,o,f,m,h,_,M,D,v,O,W,at,cn,ot,ut,fn,ct,ce,hn,ds,mn,Rs,R,u,l,i,p,c,d,T,X,bs,Ts,Cs,ks,Ss,ys]}var on=class extends q{constructor(e){super(),Y(this,e,ja,Na,K,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},_s=on;var un;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(un=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{un="/pagefind/"}var it=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",s=e.bundlePath??un,r=e.pageSize??5,l=e.resetStyles??!0,i=e.showImages??!0,a=e.showSubResults??!1,o=e.excerptLength??0,f=e.processResult??null,u=e.processTerm??null,m=e.showEmptyFilters??!0,p=e.openFilters??[],h=e.debounceTimeoutMs??300,_=e.mergeIndex??[],c=e.translations??[],d=e.autofocus??!1,T=e.sort??null;delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.openFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,delete e.autofocus,delete e.sort;let R=t instanceof HTMLElement?t:document.querySelector(t);R?this._pfs=new _s({target:R,props:{base_path:s,page_size:r,reset_styles:l,show_images:i,show_sub_results:a,excerpt_length:o,process_result:f,process_term:u,show_empty_filters:m,open_filters:p,debounce_timeout_ms:h,merge_index:_,translations:c,autofocus:d,sort:T,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}triggerFilters(e){let t={};for(let[s,r]of Object.entries(e))if(Array.isArray(r))for(let l of r)t[`${s}:${l}`]=!0;else t[`${s}:${r}`]=!0;this._pfs.$$set({selected_filters:t})}destroy(){this._pfs.$destroy()}};window.PagefindUI=it;})();
|
||||
(()=>{var Ur=Object.defineProperty;var A=(n,e)=>{for(var t in e)Ur(n,t,{get:e[t],enumerable:!0})};function U(){}function bt(n){return n()}function yn(){return Object.create(null)}function K(n){n.forEach(bt)}function at(n){return typeof n=="function"}function G(n,e){return n!=n?e==e:n!==e||n&&typeof n=="object"||typeof n=="function"}var lt;function ie(n,e){return lt||(lt=document.createElement("a")),lt.href=e,n===lt.href}function vn(n){return Object.keys(n).length===0}var Hn=typeof window<"u"?window:typeof globalThis<"u"?globalThis:global,de=class{constructor(e){this.options=e,this._listeners="WeakMap"in Hn?new WeakMap:void 0}observe(e,t){return this._listeners.set(e,t),this._getObserver().observe(e,this.options),()=>{this._listeners.delete(e),this._observer.unobserve(e)}}_getObserver(){var e;return(e=this._observer)!==null&&e!==void 0?e:this._observer=new ResizeObserver(t=>{var r;for(let s of t)de.entries.set(s.target,s),(r=this._listeners.get(s.target))===null||r===void 0||r(s)})}};de.entries="WeakMap"in Hn?new WeakMap:void 0;var wn=!1;function Dr(){wn=!0}function Ir(){wn=!1}function R(n,e){n.appendChild(e)}function S(n,e,t){n.insertBefore(e,t||null)}function k(n){n.parentNode&&n.parentNode.removeChild(n)}function Q(n,e){for(let t=0;t<n.length;t+=1)n[t]&&n[t].d(e)}function C(n){return document.createElement(n)}function Pr(n){return document.createElementNS("http://www.w3.org/2000/svg",n)}function w(n){return document.createTextNode(n)}function v(){return w(" ")}function x(){return w("")}function J(n,e,t,r){return n.addEventListener(e,t,r),()=>n.removeEventListener(e,t,r)}function m(n,e,t){t==null?n.removeAttribute(e):n.getAttribute(e)!==t&&n.setAttribute(e,t)}function Lr(n){return Array.from(n.childNodes)}function z(n,e){e=""+e,n.data!==e&&(n.data=e)}function Tt(n,e){n.value=e??""}function B(n,e,t){n.classList[t?"add":"remove"](e)}var ot=class{constructor(e=!1){this.is_svg=!1,this.is_svg=e,this.e=this.n=null}c(e){this.h(e)}m(e,t,r=null){this.e||(this.is_svg?this.e=Pr(t.nodeName):this.e=C(t.nodeType===11?"TEMPLATE":t.nodeName),this.t=t.tagName!=="TEMPLATE"?t:t.content,this.c(e)),this.i(r)}h(e){this.e.innerHTML=e,this.n=Array.from(this.e.nodeName==="TEMPLATE"?this.e.content.childNodes:this.e.childNodes)}i(e){for(let t=0;t<this.n.length;t+=1)S(this.t,this.n[t],e)}p(e){this.d(),this.h(e),this.i(this.a)}d(){this.n.forEach(k)}};var he;function fe(n){he=n}function Fn(){if(!he)throw new Error("Function called outside component initialization");return he}function Ct(n){Fn().$$.on_mount.push(n)}function kt(n){Fn().$$.on_destroy.push(n)}var re=[];var le=[],se=[],gt=[],qr=Promise.resolve(),Et=!1;function Br(){Et||(Et=!0,qr.then(zn))}function Rt(n){se.push(n)}function Nn(n){gt.push(n)}var pt=new Set,ne=0;function zn(){if(ne!==0)return;let n=he;do{try{for(;ne<re.length;){let e=re[ne];ne++,fe(e),Vr(e.$$)}}catch(e){throw re.length=0,ne=0,e}for(fe(null),re.length=0,ne=0;le.length;)le.pop()();for(let e=0;e<se.length;e+=1){let t=se[e];pt.has(t)||(pt.add(t),t())}se.length=0}while(re.length);for(;gt.length;)gt.pop()();Et=!1,pt.clear(),fe(n)}function Vr(n){if(n.fragment!==null){n.update(),K(n.before_update);let e=n.dirty;n.dirty=[-1],n.fragment&&n.fragment.p(n.ctx,e),n.after_update.forEach(Rt)}}function Wr(n){let e=[],t=[];se.forEach(r=>n.indexOf(r)===-1?e.push(r):t.push(r)),t.forEach(r=>r()),se=e}var it=new Set,ee;function ae(){ee={r:0,c:[],p:ee}}function oe(){ee.r||K(ee.c),ee=ee.p}function D(n,e){n&&n.i&&(it.delete(n),n.i(e))}function P(n,e,t,r){if(n&&n.o){if(it.has(n))return;it.add(n),ee.c.push(()=>{it.delete(n),r&&(t&&n.d(1),r())}),n.o(e)}else r&&r()}function On(n,e){P(n,1,1,()=>{e.delete(n.key)})}function jn(n,e,t,r,s,l,i,a,o,f,c,d){let p=n.length,h=l.length,u=p,_={};for(;u--;)_[n[u].key]=u;let E=[],b=new Map,T=new Map,M=[];for(u=h;u--;){let H=d(s,l,u),F=t(H),O=i.get(F);O?r&&M.push(()=>O.p(H,e)):(O=f(F,H),O.c()),b.set(F,E[u]=O),F in _&&T.set(F,Math.abs(u-_[F]))}let y=new Set,X=new Set;function V(H){D(H,1),H.m(a,c),i.set(H.key,H),c=H.first,h--}for(;p&&h;){let H=E[h-1],F=n[p-1],O=H.key,W=F.key;H===F?(c=H.first,p--,h--):b.has(W)?!i.has(O)||y.has(O)?V(H):X.has(W)?p--:T.get(O)>T.get(W)?(X.add(O),V(H)):(y.add(W),p--):(o(F,i),p--)}for(;p--;){let H=n[p];b.has(H.key)||o(H,i)}for(;h;)V(E[h-1]);return K(M),E}var Kr=["allowfullscreen","allowpaymentrequest","async","autofocus","autoplay","checked","controls","default","defer","disabled","formnovalidate","hidden","inert","ismap","loop","multiple","muted","nomodule","novalidate","open","playsinline","readonly","required","reversed","selected"],Eo=new Set([...Kr]);function Un(n,e,t){let r=n.$$.props[e];r!==void 0&&(n.$$.bound[r]=t,t(n.$$.ctx[r]))}function ut(n){n&&n.c()}function me(n,e,t,r){let{fragment:s,after_update:l}=n.$$;s&&s.m(e,t),r||Rt(()=>{let i=n.$$.on_mount.map(bt).filter(at);n.$$.on_destroy?n.$$.on_destroy.push(...i):K(i),n.$$.on_mount=[]}),l.forEach(Rt)}function ue(n,e){let t=n.$$;t.fragment!==null&&(Wr(t.after_update),K(t.on_destroy),t.fragment&&t.fragment.d(e),t.on_destroyLine truncated
|
||||
`)),document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"?console.error(`[DEBUG: Loaded from ${document.currentScript.src??"bad script location"}]`):console.error("no known script location")}c||t(24,c=f?12:30);let N={...E||{},excerptLength:c};await g.options(N);for(let j of b){if(!j.bundlePath)throw new Error("mergeIndex requires a bundlePath parameter");let L=j.bundlePath;delete j.bundlePath,await g.mergeIndex(L,j)}F=g,Sr()}},Sr=async()=>{F&&(kn=await F.filters(),(!ce||!Object.keys(ce).length)&&t(18,ce=kn))},Mr=g=>{let N={};return Object.entries(g).filter(([,j])=>j).forEach(([j])=>{let[L,te]=j.split(/:(.*)$/);N[L]=N[L]||[],N[L].push(te)}),N},_e,Ar=async(g,N)=>{if(!g){t(15,ht=!1),_e&&clearTimeout(_e);return}let j=Mr(N),L=()=>yr(g,j);_>0&&g?(_e&&clearTimeout(_e),_e=setTimeout(L,_),await An(),F.preload(g,{filters:j})):L(),vr()},An=async()=>{for(;!F;)Mn(),await new Promise(g=>setTimeout(g,50))},yr=async(g,N)=>{t(16,Cn=g||""),typeof p=="function"&&(g=p(g)),t(14,dt=!0),t(15,ht=!0),await An();let j=++Tn,L={filters:N};X&&typeof X=="object"&&(L.sort=X);let te=await F.search(g,L);Tn===j&&(te.filters&&Object.keys(te.filters)?.length&&t(18,ce=te.filters),t(13,bn=te),t(14,dt=!1),t(17,mt=i))},vr=()=>{let g=W.offsetWidth;g!=Cr&&t(10,O.style.paddingRight=`${g+2}px`,O)},Hr=g=>{g?.preventDefault(),t(17,mt+=i)},wr=g=>{g.key==="Escape"&&(t(9,H=""),O.blur()),g.key==="Enter"&&g.preventDefault()};function Fr(){H=this.value,t(9,H),t(23,T)}function Nr(g){le[g?"unshift":"push"](()=>{O=g,t(10,O)})}function zr(g){le[g?"unshift":"push"](()=>{W=g,t(11,W)})}let Or=()=>{t(9,H=""),O.blur()};function jr(g){V=g,t(0,V)}return n.$$set=g=>{"base_path"in g&&t(25,l=g.base_path),"page_size"in g&&t(26,i=g.page_size),"reset_styles"in g&&t(1,a=g.reset_styles),"show_images"in g&&t(2,o=g.show_images),"show_sub_results"in g&&t(3,f=g.show_sub_results),"excerpt_length"in g&&t(24,c=g.excerpt_length),"process_result"in g&&t(4,d=g.process_result),"process_term"in g&&t(27,p=g.process_term),"show_empty_filters"in g&&t(5,h=g.show_empty_filters),"open_filters"in g&&t(6,u=g.open_filters),"debounce_timeout_ms"in g&&t(28,_=g.debounce_timeout_ms),"pagefind_options"in g&&t(29,E=g.pagefind_options),"merge_index"in g&&t(30,b=g.merge_index),"trigger_search_term"in g&&t(23,T=g.trigger_search_term),"translations"in g&&t(7,M=g.translations),"autofocus"in g&&t(8,y=g.autofocus),"sort"in g&&t(31,X=g.sort),"selected_filters"in g&&t(0,V=g.selected_filters)},n.$$.update=()=>{if(n.$$.dirty[0]&8388608)e:T&&(t(9,H=T),t(23,T=""));if(n.$$.dirty[0]&513)e:Ar(H,V)},[V,a,o,f,d,h,u,M,y,H,O,W,ft,bn,dt,ht,Cn,mt,ce,Sn,kr,Mn,Hr,T,c,l,i,p,_,E,b,X,wr,Fr,Nr,zr,Or,jr]}var En=class extends q{constructor(e){super(),Y(this,e,po,ho,G,{base_path:25,page_size:26,reset_styles:1,show_images:2,show_sub_results:3,excerpt_length:24,process_result:4,process_term:27,show_empty_filters:5,open_filters:6,debounce_timeout_ms:28,pagefind_options:29,merge_index:30,trigger_search_term:23,translations:7,autofocus:8,sort:31,selected_filters:0},null,[-1,-1])}},Tr=En;var Rn;try{document?.currentScript&&document.currentScript.tagName.toUpperCase()==="SCRIPT"&&(Rn=new URL(document.currentScript.src).pathname.match(/^(.*\/)(?:pagefind-)?ui.js.*$/)[1])}catch{Rn="/pagefind/"}var _t=class{constructor(e){this._pfs=null;let t=e.element??"[data-pagefind-ui]",r=e.bundlePath??Rn,s=e.pageSize??5,l=e.resetStyles??!0,i=e.showImages??!0,a=e.showSubResults??!1,o=e.excerptLength??0,f=e.processResult??null,c=e.processTerm??null,d=e.showEmptyFilters??!0,p=e.openFilters??[],h=e.debounceTimeoutMs??300,u=e.mergeIndex??[],_=e.translations??[],E=e.autofocus??!1,b=e.sort??null;delete e.element,delete e.bundlePath,delete e.pageSize,delete e.resetStyles,delete e.showImages,delete e.showSubResults,delete e.excerptLength,delete e.processResult,delete e.processTerm,delete e.showEmptyFilters,delete e.openFilters,delete e.debounceTimeoutMs,delete e.mergeIndex,delete e.translations,delete e.autofocus,delete e.sort;let T=t instanceof HTMLElement?t:document.querySelector(t);T?this._pfs=new Tr({target:T,props:{base_path:r,page_size:s,reset_styles:l,show_images:i,show_sub_results:a,excerpt_length:o,process_result:f,process_term:c,show_empty_filters:d,open_filters:p,debounce_timeout_ms:h,merge_index:u,translations:_,autofocus:E,sort:b,pagefind_options:e}}):console.error(`Pagefind UI couldn't find the selector ${t}`)}triggerSearch(e){this._pfs.$$set({trigger_search_term:e})}triggerFilters(e){let t={};for(let[r,s]of Object.entries(e))if(Array.isArray(s))for(let l of s)t[`${r}:${l}`]=!0;else t[`${r}:${s}`]=!0;this._pfs.$$set({selected_filters:t})}destroy(){this._pfs.$destroy()}};window.PagefindUI=_t;})();
|
||||
Binary file not shown.
@@ -1,9 +1,6 @@
|
||||
const pagefind_version="1.3.0";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document!=='undefined'&&document.currentScript!==null){script_src=new URL("UNHANDLED",location.href).toString()}let wasm=undefined;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}let WASM_VECTOR_LEN=0;function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1,1)>>>0;getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret>>>0};const cachedTextEncoder=(typeof TextEncoder!=='undefined'?new TextEncoder('utf-8'):{encode:()=>{throw Error('TextEncoder not available')}});const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length,1)>>>0;getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len,1)>>>0;const mem=getUint8Memory0();let offset=0;for(;offset<len;offset++){const code=arg.charCodeAt(offset);if(code>0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3,1)>>>0;const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written;ptr=realloc(ptr,len,offset,1)>>>0}WASM_VECTOR_LEN=offset;return ptr}__exports.set_ranking_weights=function(ptr,weights){const ptr0=passStringToWasm0(weights,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.set_ranking_weights(ptr,ptr0,len0);return ret>>>0};__exports.load_index_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_index_chunk(ptr,ptr0,len0);return ret>>>0};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret>>>0};__exports.add_synthetic_filter=function(ptr,filter){const ptr0=passStringToWasm0(filter,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.add_synthetic_filter(ptr,ptr0,len0);return ret>>>0};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=(typeof TextDecoder!=='undefined'?new TextDecoder('utf-8',{ignoreBOM:true,fatal:true}):{decode:()=>{throw Error('TextDecoder not available')}});if(typeof TextDecoder!=='undefined'){cachedTextDecoder.decode()};function getStringFromWasm0(ptr,len){ptr=ptr>>>0;return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_indexes=function(ptr,query){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_filter_indexes=function(ptr,filters){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_all_filter_indexes=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.filters=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32MemoLine truncated
|
||||
const pagefind_version="1.4.0";let wasm_bindgen;(function(){const __exports={};let script_src;if(typeof document!=='undefined'&&document.currentScript!==null){script_src=new URL("UNHANDLED",location.href).toString()}let wasm=undefined;let WASM_VECTOR_LEN=0;let cachedUint8Memory0=null;function getUint8Memory0(){if(cachedUint8Memory0===null||cachedUint8Memory0.byteLength===0){cachedUint8Memory0=new Uint8Array(wasm.memory.buffer)}return cachedUint8Memory0}const cachedTextEncoder=(typeof TextEncoder!=='undefined'?new TextEncoder('utf-8'):{encode:()=>{throw Error('TextEncoder not available')}});const encodeString=(typeof cachedTextEncoder.encodeInto==='function'?function(arg,view){return cachedTextEncoder.encodeInto(arg,view)}:function(arg,view){const buf=cachedTextEncoder.encode(arg);view.set(buf);return{read:arg.length,written:buf.length}});function passStringToWasm0(arg,malloc,realloc){if(realloc===undefined){const buf=cachedTextEncoder.encode(arg);const ptr=malloc(buf.length,1)>>>0;getUint8Memory0().subarray(ptr,ptr+buf.length).set(buf);WASM_VECTOR_LEN=buf.length;return ptr}let len=arg.length;let ptr=malloc(len,1)>>>0;const mem=getUint8Memory0();let offset=0;for(;offset<len;offset++){const code=arg.charCodeAt(offset);if(code>0x7F)break;mem[ptr+offset]=code}if(offset!==len){if(offset!==0){arg=arg.slice(offset)}ptr=realloc(ptr,len,len=offset+arg.length*3,1)>>>0;const view=getUint8Memory0().subarray(ptr+offset,ptr+len);const ret=encodeString(arg,view);offset+=ret.written;ptr=realloc(ptr,len,offset,1)>>>0}WASM_VECTOR_LEN=offset;return ptr}__exports.set_ranking_weights=function(ptr,weights){const ptr0=passStringToWasm0(weights,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;const ret=wasm.set_ranking_weights(ptr,ptr0,len0);return ret>>>0};function passArray8ToWasm0(arg,malloc){const ptr=malloc(arg.length*1,1)>>>0;getUint8Memory0().set(arg,ptr/1);WASM_VECTOR_LEN=arg.length;return ptr}__exports.init_pagefind=function(metadata_bytes){const ptr0=passArray8ToWasm0(metadata_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.init_pagefind(ptr0,len0);return ret>>>0};__exports.load_filter_chunk=function(ptr,chunk_bytes){const ptr0=passArray8ToWasm0(chunk_bytes,wasm.__wbindgen_malloc);const len0=WASM_VECTOR_LEN;const ret=wasm.load_filter_chunk(ptr,ptr0,len0);return ret>>>0};let cachedInt32Memory0=null;function getInt32Memory0(){if(cachedInt32Memory0===null||cachedInt32Memory0.byteLength===0){cachedInt32Memory0=new Int32Array(wasm.memory.buffer)}return cachedInt32Memory0}const cachedTextDecoder=(typeof TextDecoder!=='undefined'?new TextDecoder('utf-8',{ignoreBOM:true,fatal:true}):{decode:()=>{throw Error('TextDecoder not available')}});if(typeof TextDecoder!=='undefined'){cachedTextDecoder.decode()};function getStringFromWasm0(ptr,len){ptr=ptr>>>0;return cachedTextDecoder.decode(getUint8Memory0().subarray(ptr,ptr+len))}__exports.request_filter_indexes=function(ptr,filters){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(filters,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_filter_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_indexes=function(ptr,query){let deferred2_0;let deferred2_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);const ptr0=passStringToWasm0(query,wasm.__wbindgen_malloc,wasm.__wbindgen_realloc);const len0=WASM_VECTOR_LEN;wasm.request_indexes(retptr,ptr,ptr0,len0);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred2_0=r0;deferred2_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred2_0,deferred2_1,1)}};__exports.request_all_filter_indexes=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.request_all_filter_indexes(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.filters=function(ptr){let deferred1_0;let deferred1_1;try{const retptr=wasm.__wbindgen_add_to_stack_pointer(-16);wasm.filters(retptr,ptr);var r0=getInt32Memory0()[retptr/4+0];var r1=getInt32Memory0()[retptr/4+1];deferred1_0=r0;deferred1_1=r1;return getStringFromWasm0(r0,r1)}finally{wasm.__wbindgen_add_to_stack_pointer(16);wasm.__wbindgen_free(deferred1_0,deferred1_1,1)}};__exports.enter_playground_mode=function(ptr){const ret=wasm.enter_playground_mode(ptr);return ret>>>0};__exports.search=function(ptr,query,filter,sort,exact){let deferred4_0;let deferred4_1;try{const retptr=wasm.__wbindgLine truncated
|
||||
${e?.toString()}`);throw new Error("Failed to load Pagefind metadata")}}findIndex(language){if(this.languages){let index=this.languages[language];if(index)return index;index=this.languages[language.split("-")[0]];if(index)return index;let topLang=Object.values(this.languages).sort((a,b)=>b.page_count-a.page_count);if(topLang[0])return topLang[0]}throw new Error("Pagefind Error: No language indexes found.")}async loadMeta(index){try{let compressed_resp=await fetch(`${this.basePath}pagefind.${index}.pf_meta`);let compressed_meta=await compressed_resp.arrayBuffer();this.searchMeta=this.decompress(new Uint8Array(compressed_meta),"Pagefind metadata")}catch(e){console.error(`Failed to load the meta index:
|
||||
${e?.toString()}`)}}async loadWasm(language){try{const wasm_url=`${this.basePath}wasm.${language}.pagefind`;let compressed_resp=await fetch(wasm_url);let compressed_wasm=await compressed_resp.arrayBuffer();const final_wasm=this.decompress(new Uint8Array(compressed_wasm),"Pagefind WebAssembly");if(!final_wasm){throw new Error("No WASM after decompression")}this.wasm=await this.backend(final_wasm)}catch(e){console.error(`Failed to load the Pagefind WASM:
|
||||
${e?.toString()}`);throw new Error(`Failed to load the Pagefind WASM:
|
||||
${e?.toString()}`)}}async _loadGenericChunk(url,method){try{let compressed_resp=await fetch(url);let compressed_chunk=await compressed_resp.arrayBuffer();let chunk=this.decompress(new Uint8Array(compressed_chunk),url);let ptr=await this.getPtr();this.raw_ptr=this.backend[method](ptr,chunk)}catch(e){console.error(`Failed to load the index chunk ${url}:
|
||||
${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(/</g,"<").replace(/>/g,">");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}parseFilters(str){let output={};if(!str)return output;for(const block of str.split("__PF_FILTER_DELIM__")){let[filter,values]=block.split(/:(.*)$/);output[filter]={};if(values){for(const valueBlock of values.split("__PF_VALUE_DELIM__")){if(valueBlock){let extract=valueBlock.match(/^(.*):(\d+)$/);if(extract){let[,value,count]=extract;output[filter][value]=parseInt(count)??count}}}}}return output}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_chunks=filters2.split(" ").filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks]);ptr=await this.getPtr();let results=this.backend.filters(ptr);return this.parseFilters(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}term=term.toLowerCase().trim().replace(/[\.`~!@#\$%\^&\*\(\)\{\}\[\]\\\|:;'",<>\/\?\-]/g,"").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let filter_resp=this.backend.request_filter_indexes(ptr,filter_list);let chunks=index_resp.split(" ").filter((v)=>v).map((chunk)=>this.loadChunk(chunk));let filter_chunks=filter_resp.split(" ").filter((v)=>v).map((chunk)=>
Line truncated
|
||||
hash:${hash}
|
||||
score:${score}
|
||||
locations:${all_locations}`);let weighted_locations=all_locations.length?all_locations.split(",").map((l)=>{let[weight,balanced_score,location]=l.split(">");return{weight:parseInt(weight)/24,balanced_score:parseFloat(balanced_score),location:parseInt(location)}}):[];let locations=weighted_locations.map((l)=>l.location);return{id:hash,score:parseFloat(score)*this.indexWeight,words:locations,data:async()=>await this.loadFragment(hash,weighted_locations,term)}});const searchTime=Date.now()-searchStart;const realTime=Date.now()-start;log(`Found ${results.length} result${results.length == 1 ? "" : "s"} for "${term}" in ${Date.now() - searchStart}ms (${Date.now() - start}ms realtime)`);return{results:resultsInterface,unfilteredResultCount:parseInt(unfilteredResultCount),filters:filterObj,totalFilters:totalFilterObj,timings:{preload:realTime-searchTime,search:searchTime,total:realTime}}}};var Pagefind=class{constructor(options2={}){this.backend=wasm_bindgen;this.primaryLanguage="unknown";this.searchID=0;this.primary=new PagefindInstance({...options2,primary:true});this.instances=[this.primary];this.init(options2?.language)}async options(options2){await this.primary.options(options2)}async init(overrideLanguage){if(document?.querySelector){const langCode=document.querySelector("html")?.getAttribute("lang")||"unknown";this.primaryLanguage=langCode.toLocaleLowerCase()}await this.primary.init(overrideLanguage?overrideLanguage:this.primaryLanguage,{load_wasm:true})}async mergeIndex(indexPath,options2={}){if(this.primary.basePath.startsWith(indexPath)){console.warn(`Skipping mergeIndex ${indexPath} that appears to be the same as the primary index (${this.primary.basePath})`);return}let newInstance=new PagefindInstance({primary:false,basePath:indexPath});this.instances.push(newInstance);while(this.primary.wasm===null){await asyncSleep(50)}await newInstance.init(options2.language||this.primaryLanguage,{load_wasm:false});delete options2["language"];await newInstance.options(options2)}mergeFilters(filters2){const merged={};for(const searchFilter of filters2){for(const[filterKey,values]of Object.entries(searchFilter)){if(!merged[filterKey]){merged[filterKey]=values;continue}else{const filter=merged[filterKey];for(const[valueKey,count]of Object.entries(values)){filter[valueKey]=(filter[valueKey]||0)+count}}}}return merged}async filters(){let filters2=await Promise.all(this.instances.map((i2)=>i2.filters()));return this.mergeFilters(filters2)}async preload(term,options2={}){await Promise.all(this.instances.map((i2)=>i2.preload(term,options2)))}async debouncedSearch(term,options2,debounceTimeoutMs){const thisSearchID=++this.searchID;this.preload(term,options2);await asyncSleep(debounceTimeoutMs);if(thisSearchID!==this.searchID){return null}const searchResult=await this.search(term,options2);if(thisSearchID!==this.searchID){return null}return searchResult}async search(term,options2={}){let search2=await Promise.all(this.instances.map((i2)=>i2.search(term,options2)));const filters2=this.mergeFilters(search2.map((s)=>s.filters));const totalFilters=this.mergeFilters(search2.map((s)=>s.totalFilters));const results=search2.map((s)=>s.results).flat().sort((a,b)=>b.score-a.score);const timings=search2.map((s)=>s.timings);const unfilteredResultCount=search2.reduce((sum,s)=>sum+s.unfilteredResultCount,0);return{results,unfilteredResultCount,filters:filters2,totalFilters,timings}}};var pagefind=void 0;var initial_options=void 0;var init_pagefind=()=>{if(!pagefind){pagefind=new Pagefind(initial_options??{})}};var options=async(new_options)=>{if(pagefind){await pagefind.options(new_options)}else{initial_options=new_options}};var init=async()=>{init_pagefind()};var destroy=async()=>{pagefind=void 0;initial_options=void 0};var mergeIndex=async(indexPath,options2)=>{init_pagefind();return await pagefind.mergeIndex(indexPath,options2)};var search=async(term,options2)=>{init_pagefind();return await pagefind.search(term,options2)};var debouncedSearch=async(term,options2,debounceTimeoutMs=300)=>{init_pagefind();return await pagefind.debouncedSearch(term,options2,debounceTimeoutMs)};var preload=async(term,options2)=>{init_pagefind();return await pagefind.preload(term,options2)};var filters=async()=>{init_pagefind();return await pagefind.filters()};export{debouncedSearch,destroy,filters,init,mergeIndex,options,preload,search}
|
||||
${e?.toString()}`)}}async loadChunk(hash){if(!this.loaded_chunks[hash]){const url=`${this.basePath}index/${hash}.pf_index`;this.loaded_chunks[hash]=this._loadGenericChunk(url,"load_index_chunk")}return await this.loaded_chunks[hash]}async loadFilterChunk(hash){if(!this.loaded_filters[hash]){const url=`${this.basePath}filter/${hash}.pf_filter`;this.loaded_filters[hash]=this._loadGenericChunk(url,"load_filter_chunk")}return await this.loaded_filters[hash]}async _loadFragment(hash){let compressed_resp=await fetch(`${this.basePath}fragment/${hash}.pf_fragment`);let compressed_fragment=await compressed_resp.arrayBuffer();let fragment=this.decompress(new Uint8Array(compressed_fragment),`Fragment ${hash}`);return JSON.parse(new TextDecoder().decode(fragment))}async loadFragment(hash,weighted_locations=[],search_term){if(!this.loaded_fragments[hash]){this.loaded_fragments[hash]=this._loadFragment(hash)}let fragment=await this.loaded_fragments[hash];fragment.weighted_locations=weighted_locations;fragment.locations=weighted_locations.map((l)=>l.location);if(!fragment.raw_content){fragment.raw_content=fragment.content.replace(/</g,"<").replace(/>/g,">");fragment.content=fragment.content.replace(/\u200B/g,"")}if(!fragment.raw_url){fragment.raw_url=fragment.url}fragment.url=this.processedUrl(fragment.raw_url,search_term);const excerpt_start=calculate_excerpt_region(weighted_locations,this.excerptLength);fragment.excerpt=build_excerpt(fragment.raw_content,excerpt_start,this.excerptLength,fragment.locations);fragment.sub_results=calculate_sub_results(fragment,this.excerptLength);return fragment}fullUrl(raw){if(/^(https?:)?\/\//.test(raw)){return raw}return`${this.baseUrl}/${raw}`.replace(/\/+/g,"/").replace(/^(https?:\/)/,"$1/")}processedUrl(url,search_term){const normalized=this.fullUrl(url);if(this.highlightParam===null){return normalized}let individual_terms=search_term.split(/\s+/);try{let processed=new URL(normalized);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString()}catch(e){try{let processed=new URL(`https://example.com${normalized}`);for(const term of individual_terms){processed.searchParams.append(this.highlightParam,term)}return processed.toString().replace(/^https:\/\/example\.com/,"")}catch(e2){return normalized}}}async getPtr(){while(this.raw_ptr===null){await asyncSleep(50)}if(!this.raw_ptr){console.error("Pagefind: WASM Error (No pointer)");throw new Error("Pagefind: WASM Error (No pointer)")}return this.raw_ptr}stringifyFilters(obj={}){return JSON.stringify(obj)}stringifySorts(obj={}){let sorts=Object.entries(obj);for(let[sort,direction]of sorts){if(sorts.length>1){console.warn(`Pagefind was provided multiple sort options in this search, but can only operate on one. Using the ${sort} sort.`)}if(direction!=="asc"&&direction!=="desc"){console.warn(`Pagefind was provided a sort with unknown direction ${direction}. Supported: [asc, desc]`)}return`${sort}:${direction}`}return``}async filters(){let ptr=await this.getPtr();let filters2=this.backend.request_all_filter_indexes(ptr);let filter_array=JSON.parse(filters2);if(Array.isArray(filter_array)){let filter_chunks=filter_array.filter((v)=>v).map((chunk)=>this.loadFilterChunk(chunk));await Promise.all([...filter_chunks])}ptr=await this.getPtr();let results=this.backend.filters(ptr);return JSON.parse(results)}async preload(term,options2={}){await this.search(term,{...options2,preload:true})}async search(term,options2={}){options2={verbose:false,filters:{},sort:{},...options2};const log=(str)=>{if(options2.verbose)console.log(str)};log(`Starting search on ${this.basePath}`);let start=Date.now();let ptr=await this.getPtr();let filter_only=term===null;term=term??"";let exact_search=/^\s*".+"\s*$/.test(term);if(exact_search){log(`Running an exact search`)}let trueLanguage=null;try{trueLanguage=Intl.getCanonicalLocales(this.loadedLanguage)[0]}catch(err2){}const term_chunks=[];let segments;if(trueLanguage&&typeof Intl.Segmenter!=="undefined"){const segmenter=new Intl.Segmenter(trueLanguage,{granularity:"grapheme"});segments=[...segmenter.segment(term)].map(({segment})=>segment)}else{segments=[...term]}for(const segment of segments){if(this.includeCharacters?.includes(segment)){term_chunks.push(segment)}else if(!/^\p{Pd}|\p{Pe}|\p{Pf}|\p{Pi}|\p{Po}|\p{Ps}$/u.test(segment)){term_chunks.push(segment.toLocaleLowerCase())}}term=term_chunks.join("").replace(/\s{2,}/g," ").trim();log(`Normalized search term to ${term}`);if(!term?.length&&!filter_only){return{results:[],unfilteredResultCount:0,filters:{},totalFilters:{},timings:{preload:Date.now()-start,search:Date.now()-start,total:Date.now()-start}}}let sort_list=this.stringifySorts(options2.sort);log(`Stringified sort to ${sort_list}`);const filter_list=this.stringifyFilters(options2.filters);log(`Stringified filters to ${filter_list}`);let index_resp=this.backend.request_indexes(ptr,term);let index_array=JSON.parse(index_resp);let filter_resp=this
Line truncated
|
||||
Binary file not shown.
Binary file not shown.
+6
-1
@@ -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>
|
||||
@@ -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,9 +685,43 @@ 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>
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
|
||||
@@ -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>
|
||||
|
||||
Reference in new issue
Block a user