<?xml version="1.0" encoding="utf-8" standalone="yes"?><?xml-stylesheet href="/feed_style.xsl" type="text/xsl"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:media="https://www.rssboard.org/media-rss"><channel><title>The Internet's Shittiest Wizard</title><link>/</link><description>Recent content on The Internet's Shittiest Wizard</description><generator>Hugo -- gohugo.io</generator><language>en-us</language><copyright>none use whatever you want dude just go for it</copyright><lastBuildDate>Tue, 09 Dec 2025 11:42:20 -0500</lastBuildDate><atom:link href="/index.xml" rel="self" type="application/rss+xml"/><icon>https://worstwizard.online/mage.png</icon><item><title>Learning to Love Making Music Again</title><link>/posts/storytime/folkmusic/</link><pubDate>Tue, 09 Dec 2025 11:42:20 -0500</pubDate><guid>/posts/storytime/folkmusic/</guid><description><![CDATA[<h2 id="seeking">Seeking</h2>
<p>Back at the <a href="posts/storytime/annual_update">beginning of the year</a> I mentioned something about folk music. So here&rsquo;s what that&rsquo;s all about.</p>
<p>In 2023 I was re-listening to the <a href="https://en.wikipedia.org/wiki/The_Kingkiller_Chronicle">Kingkiller Chronicle</a> books on audiobook, a format that I think really works for that series. I&rsquo;ve listened to those books about a half dozen times and the thing that always stuck with me is how much Kvothe, the protagonist, constantly drones on and on about how much he <em>needs</em> to play music in order to survive. Now, I grew up playing viola<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> in the school orchestra and learning via (admittedly poorly administered) <a href="https://en.wikipedia.org/wiki/Suzuki_method">Suzuki Method</a> and I was starting to crave playing again, but I just couldn&rsquo;t use that tiny old viola. I figured I&rsquo;d look around for something more like what Kvothe plays, the lute.</p>
<p>So I messed around with my wife&rsquo;s mini Taylor a bit, but dude, guitars do <em>not</em> make any sense at all. There&rsquo;s way too many strings! And they&rsquo;re in 4ths, except for the B string which is a 3rd which is&hellip;why? I just cannot wrap my mind around it. So I looked for something more lute-like and I found the mandolin.</p>
<h2 id="finding">Finding</h2>
<p>Around December of 2023, a friend of mine gave me his unused mandolin and I fell in love with it overnight. I had already played around on my viola held sideways and plucked like a tiny&hellip;well, I guess a mandola actually. It  came quite naturally, and since the mandolin has the same tuning as the violin, it was really easy to just pick it up and figure out where everything was. I read a couple books on music theory and got my head around a couple great double stops, chords, <a href="https://robcoleman.com/jethro/">practice methods from Jethro Burns</a> and really got into going to jams weekly with the local <a href="https://www.columbusfolkmusicsociety.org/">folk music society</a>. I don&rsquo;t think I&rsquo;ve spent a day in the same building as a mandolin without having played some music since I started again. Brian, I am deeply indebted to you for this.</p>
<p>And then this past June my wife got me a lovely banjo. I fell in love all over again! I messed around with the different tunings and started trying to play some folk punk and Elle Cordova and now I&rsquo;m trying to learn the clawgrass method from Mark Johnson, who I managed to meet during a trip to visit my in-laws. I love the slight drone, the inherent syncopation in drop-thumbing, the ability to make your tuning easier to play quickly. And of course that gorgeous clucking and singing sound. What a magnificent instrument to sing along to.</p>
<p>Anyway, I encourage you to explore non-guitar instruments too. Understand what this shitty narrator (that&rsquo;s Kvothe, not me) was talking about, how thoroughly music will speak to your soul and the magic that can pour out of you when you play it with others. Go to a jam. Learn to take a solo. Touch the face of god a little bit, it&rsquo;s fine.</p>
<p>Maybe I&rsquo;ll post some music here in a bit, once I get the recording stuff going. I&rsquo;ll work on making a native embed for the blog and making a music category. I need to post about it more because getting myself out there kinda&hellip;I guess I just like expressing myself? Maybe this is just a better way for me to do it than I had been doing in the past. Hooray for self-discovery!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>I still have the instrument I played then, a 3/4 size viola that my fully adult fingers simply do not fit on anymore so I just can&rsquo;t play it.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description><media:thumbnail url="https://worstwizard.online/posts/folkmusic/clawhammer_mandolin.jpg"/></item><item><title>Alien</title><link>/posts/alien/</link><pubDate>Mon, 08 Dec 2025 23:56:33 -0500</pubDate><guid>/posts/alien/</guid><description><![CDATA[<p>When I was between 10 and 13, my dad started to raplidly collect a series of dead-end telecommunications technologies. That&rsquo;s not fair, it was only the one IBM beige landline phone with a screen that could tilt to make the basement flourscent lights glare across the cheap plastic a little worse.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> But the big thing we got was a dial-up internet connection which I fell in love with immediately, particularly the Yahoo Kidz services which lead me to the rest of Yahoo, including the chats. Precious little wizlet I was, I would hang out in the most mature sounding rooms possible, mainly the default &ldquo;Philosophy&rdquo; room.</p>
<p>There&rsquo;s an exchange I remember having in that chat room so many years ago. I was, like I said, probably only a little older than 10. Maybe even 6th grade? I feel like remembering being heavily influenced by the Ender&rsquo;s Shadow series that ran parallel to Ender&rsquo;s game and seeing myself, the young little shit that I was, as so smart that it was obvious that I also wan&rsquo;t human. That maybe I, like the genetically modified boy in those books, was a new fork in the path that is human evolution. And I took those thoughts and brought them right to the poor default Philosphy chat on Yahoo in the year 2000 or something. And the adults in there who were discussing actual philophy took a moment to chastise me. I mean, I was a kid being obnoxious in their chat room, I&rsquo;d do it to me too these days. And probably not as kindly as they did. But they told me in no short terms that what I was saying was ridiculous and out of some sort sci-fi wish.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> And they were right. That sort of talk didn&rsquo;t belong there, and I didn&rsquo;t belong in their space polluting it with fanciful ideas of being some sort of other-being.</p>
<p>But even then, even twenty five years ago, I felt different. I knew I wasn&rsquo;t &ldquo;normal&rdquo;. Sure, I was smart for an 11 year old.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> But what sticks with me now, looking back, is how I felt. How I still feel. Like I don&rsquo;t belong. I was sort of right too, I am some kind of other-being. An alien. A skinwalker, pretending to be human and only mostly succeeding. And there&rsquo;s an ever present feeling that someday there will be someone who can see the light pouring through the seams in my human suit and expose me for what I am: Not Like Them. A kind of imposter syndrome that goes further than just not believing I am capable of my job, but that I&rsquo;m also incapable of being a son, brother, friend or father. All because I am fundamentally different.</p>
<p>And the task of the past 3 or 4 years of my life has been to refute the other side of this. I am different. It&rsquo;s just not as bad as I though. I am in fact human, and there are many, many, many people like me. I am a person who is capable of feeling and thought and reason. We&rsquo;re all faking it, I&rsquo;m just doing it a lot more often than most. I am not fundamentally different<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup>, I&rsquo;m just a guy.  And since I am a person who is capable of pain and grief and loss, I should let myself have those, feel those, struggle with those things more than I have been letting myself in the past. That othering myself as hard as I was isn&rsquo;t actually dealing with my own problems, it&rsquo;s running away from them by means of denying myself my own humanity. And buddy, that does not do well on the ol&rsquo; soul.</p>
<p>I don&rsquo;t know what I meant to get out of putting this all out here, but it certainly feels better having written it out than not. But maybe it will help someone else. I don&rsquo;t know. Here&rsquo;s to hoping.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>It was my Uncle who managed to have a collection of 8 Tracks and LaserDiscs that I treasured growing up.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Of course I don&rsquo;t remember the exact details of what was said, it&rsquo;s 25 years ago now. But I still carry the feeling of it, I think that counts for something.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I might still be smart for a 36 year old, actually. But that&rsquo;s tooting my own horn, and I&rsquo;m a strings guy.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>Only mentally different.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item><item><title>Nyetcooking</title><link>/posts/cooking/nyetcooking/</link><pubDate>Mon, 08 Dec 2025 16:35:12 -0500</pubDate><guid>/posts/cooking/nyetcooking/</guid><description><![CDATA[<h2 id="tldr">TL;DR</h2>
<p>I am coming back from the dead to unveil my new page, <a href="https://worstwizard.online/nyetcooking">Nyetcooking</a>, a page I initially created as a means of bypassing their paywall. This is actually a pretty useful little tool, which is a nice change of pace from making a shitty Gematria calculator and a <a href="https://sansculottid.es">day calendar</a> for a system that&rsquo;s been disused for over two centuries.</p>
<h2 id="the-long-winded-story-before-the-recipe">The Long Winded Story Before the Recipe</h2>
<p>So I was minding my own business, trying to find a recipe for banana bread<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> when I come across one NYTimescooking had hidden from me. I don&rsquo;t like that. I open up devtools on the page to see what layer I need to delete to see the rest of the rendered page, and lo and behold, there is already a wonderful little JSON object there with <em>all</em> the recipe data I need. As an engineer who hates frontend work, this excites me. Data? Structured?</p>
<p>With a JSON all I needed to get the recipe was a way to get the JSON object and then pass it into a Jinja template. First I wrote it in Go, since I waas in the middle of learning that for work. Turns out, Go is cool, but it&rsquo;s also not comfy yet. And since it isn&rsquo;t comfy, it turned out as a clunky CLI tool. Eventually, after trying to share it with some friends online, I realized what I needed to do.</p>
<p>Frontend development. Euugh.</p>
<p>I made everything into a Flask app and just ran with what I had already built. From there I stole the CSS styling from this site and made a 404 page. Bingo bango bongo, free recipes from just one website. Awesome! Now I (and maybe some other people) no longer need to give money to a print organization that provides cover for a genocidal regime! Neat!</p>
<h2 id="but-thats-not-all">But That&rsquo;s Not All!</h2>
<p>I tried to see if the regular NYTimes pages also follow the same pattern. As it turns out, no! They actually have bot protections on and even if they didn&rsquo;t, they likely don&rsquo;t provide a JSON slug with all the page data on it for me to consume. Why not?</p>
<p>When you&rsquo;re looking for news, you don&rsquo;t ask Alexa to search all news sources. You know which sources you think are reliable and you probably already subscribe to them in some manner. Recipes aren&rsquo;t like that. When you want banana bread, you do not care where the recipe comes from <sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup>, you mainly just care about having a good recipe. And so most recipe sites do not use any bot protections, because they <em>want</em> bots to scrape them and return traffic back. They <em>want</em> Alexa to grab the whole JSON slug so it can read it out to you.</p>
<p>And this focus on discoverability extends not just to NYTimes but also Allrecipes, Bon Appetit, Binging with Babish etc. They&rsquo;re all useing the Schema.org <a href="https://schema.org/recipe">Recipe</a> schema, so this same logic works on <em>most</em> recipe websites! Not all of them, especially not those from smaller creators who have paywalled blogs. I made the choice that I don&rsquo;t care about stealing from <a href="https://babi.sh">Babish</a>, a man whose stylized face I see on knives at my local grocery store, and do care about not stealing from <a href="https://www.ethanchlebowski.com/">Ethan Chlebowski</a>, a guy who just cooks on YouTube. You should pay Ethan.</p>
<h2 id="sharing-is-caring">Sharing is Caring</h2>
<p>The only problem I had at this point was that the original page just cared about NYTimes recipes, so it was able to easily recreate the url to curl and re-cache the data as needed. So I just quickly changed this so that the path for nyetcooking recipes also recreates the full url from the original recipe, giving yourself a way to link back to it if needed. And then I added a printable page and a markdown page for those who also collect digital recipes.</p>
<p>And now it&rsquo;s done! Have fun finding stuff to cook!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>It truly does not matter and you absolutely do not care.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Sorta. I mean, if you&rsquo;re vegan or gluten free or something, you probably care more. But for those of use with fewer to no eating restrictions, not really.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description><media:thumbnail url="https://worstwizard.online/posts/nyetcook/cawcaw.jpg"/></item><item><title>Annual Update</title><link>/posts/storytime/annual_update/</link><pubDate>Wed, 29 Jan 2025 13:34:12 -0500</pubDate><guid>/posts/storytime/annual_update/</guid><description><![CDATA[<p>I&rsquo;m still alive, I swear. You can check my pulse. It&rsquo;s still sorta going.</p>
<p>I need to write more posts for this blog, if only to reflect on my own feelings a little bit more in writing. Maybe journaling again would be a good idea, maybe publishing it out to the world like this.</p>
<p>Updates have been sparse, but that&rsquo;s to be expected. The toddler has taken up a ton of my time, much to my joy and amusement. Unfortunately, days have started to blend together into the same mush, which isn&rsquo;t <em>great</em>. I need to start breaking up my weeks a bit more and going into the office instead of simply WFH all the time, if only to prevent myself from getting into a &ldquo;every day is the same day&rdquo; funk.</p>
<p>Quick things to possibly expect in the coming months:</p>
<ul>
<li>I got a drum smoker and it&rsquo;s better than a Weber. We will revisit my quite limited BBQ opinions.</li>
<li>I got back in to Magic: the Gathering and hoooooo boy do I have some fuckin&rsquo; opinions.</li>
<li>Folk music: learn to play it.</li>
<li>Writing out a Pathfinder one-shot and coming up with a process for fleshing it out.</li>
</ul>
<p>I&rsquo;ve had other ideas for posts and they always end up half written and in the trash bin. I have so many text files in my blog folder that remain unpublished and unreviewed. I promise to get to those soon.</p>
<p>&ldquo;Soon.&rdquo;</p>
]]></description></item><item><title>Kettle Corniness</title><link>/posts/cooking/kettle/</link><pubDate>Fri, 24 Nov 2023 21:47:57 -0500</pubDate><guid>/posts/cooking/kettle/</guid><description><![CDATA[<h2 id="an-old-man-reminisces">An Old Man Reminisces</h2>
<p>The first grill I ever bought was a Weber kettle. Christ, I was young then. Young and stupid. The first time my roommate and I tried to light that thing was on the balcony of our third floor apartment. Central Ohio didn&rsquo;t really get hit hard by hurricane Ike but a storm was definitely rolling in from the east. We set the grill up on the north side of the building and couldn&rsquo;t get the damn thing lit for all the wind, so we used more and more lighter fluid. The lid came into play in short order, thankfully, and we ended up letting the thing rust out on the balcony. I don&rsquo;t know if we were more afraid of the grill or my own asinine stupidity, but it was definitely fear that kept me from using that thing much more.</p>
<p>I later inherited another 18 inch kettle from my future in-laws when they moved out of their house. This one sat on the front porch of my rented townhouse with their old reclining leather love seat, the grillin&rsquo; couch. I was working at call centers and drinking way more than I needed to<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> while charring up bahama mamas and smoking whole packs of black ad milds. This grill was eventually gifted to a friend when we were moving because I had learned previously how hard it is to move a used and ill maintained grill from one location to another.</p>
<p>Anyway, that young idiot from before never learned his lesson. In 2020 I bought my third and current <a href="https://www.homedepot.com/p/Weber-22-in-Original-Kettle-Charcoal-Grill-in-Black-741001/100012014">Weber kettle</a>, this time a 22&quot;. Unlike you, <a href="https://www.youtube.com/watch?v=u981JhkK46o&amp;list=PLpdyXnYZVE553s2ArxXvcHlWtksj0mPbI">dear reader</a>, I did not have the benefit of two narrative paragraphs summing up the previous 13 someodd years of failing to cook with charcoal: <strong><em>I</em></strong> was the problem. That was hard won wisdom, but if you want change you must change yourself.</p>
<p>I became determined to make good barbeque at home. That year I had a lot more free time and a much untapped restaurant budget, so I dove in headfirst. Learning the principles of kettle BBQ (itself a compromise) taught me a lot about the cooker itself and encouraged me to make some&hellip; improvements. Behold, reader, the result of a decade of failure turned into success.</p>
<h2 id="hear-me-out">Hear Me Out&hellip;</h2>
<p>Why kettles? Honestly? Momentum. This is the only grill I&rsquo;ve ever had, it&rsquo;s what I know.</p>
<p>But for me if you&rsquo;re going to have a grill you may as well have a charcoal grill.  You&rsquo;re supposed to taste the meat <em>and</em> the heat, Hank, that&rsquo;s why you&rsquo;re outside and not using the stove. Plus I don&rsquo;t like keeping volatile fuels around the house <em>don&rsquo;t look at my jars of miniature painting chemicals we&rsquo;re not talking about those right now.</em> On top of that, with gas I have to learn to inspect and replace hosing and fitments as they age and weather or else I could be looking at a serious disaster. And most of the time these parts are the ones most hidden by the manufacturer because they&rsquo;re ugly as hell.</p>
<p>Charcoal grilling allows for a greater flexibility when you&rsquo;re at home, camping, going to the park or whatever. You can buy cheap bags of fuel at basically any gas station convenience store and if you needed even the grill itself. Using charcoal just feels <em>weightier</em> too. Maybe because the alternative is literally a gas, but charcoal itself has a long a storied history as a fuel. There&rsquo;s something to be said for learning to cook on all levels of a coal fire, including a nice sliced warm apple dessert. If something breaks, you can fix it yourself pretty easily, probably with scrap.</p>
<p>And if we&rsquo;re going for flexibility, there&rsquo;s something to be said for kettle grill. With my current kettle grill I have:</p>
<ul>
<li>grilled burgers and hot dogs on my son&rsquo;s birthday</li>
<li>roasted chickens</li>
<li>cooked chicken thighs</li>
<li>made queso fundido</li>
<li>smoked salmon and mashed potatoes <em>together</em> on a plank</li>
<li>had a firepit</li>
<li>traveled to a bachelor party in a cabin and made ribs</li>
<li>taken the grill to multiple friendsgivings and <a href="https://worstwizard.online/posts/cooking/turking/">smoked turkeys</a></li>
</ul>
<p>It&rsquo;s a backyard party grill, a smoker, a coal oven, you could even use it as a pizza oven if you wanted to. Got a yard space or alley? The kettle will fit and you can do anything you want with it. The benefit over the kamado style grill is obvious, it doesn&rsquo;t <a href="https://www.homedepot.com/p/Char-Griller-Akorn-Auto-Kamado-20-inch-Digital-WiFi-Charcoal-Grill-in-Gray-6480/319059752">weigh as much as it costs</a>. Once you get one of those suckers it&rsquo;s parked in its spot until it dies or gets stolen.</p>
<p>If I wanted to step up even further I would probably go with an offset smoker, which is just a better smoker that I can also use in grill mode. The benefit here is more real estate, but the downside is that these become less portable until you start <a href="https://mattsbbqpits.com/premium-trailer-pit-smokers.html">scaling up way too much</a>. I&rsquo;d love one of these someday if I had the money, but a smaller one just for home use. But I&rsquo;d always want a kettle I can take with me places. It&rsquo;s just too useful.</p>
<h2 id="this-machine-grills-fascists">This Machine Grills Fascists</h2>
<p><img src="/posts/grill_pics/grill_pfp.jpg" alt="Grill PFP" title="My grill, with all its modifications showing."></p>
<p>This is my grill. There are none like it, because I&rsquo;ve made it my own.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> Weber makes a mean kettle, the curves are sturdy and allow for heat and smoke to circulate smoothly. The air intake is intuitive and the 22&quot; has a great ash bucket. Three legs are sturdier than four and because there are fewer legs they can be <a href="https://www.merriam-webster.com/dictionary/foreshadowing">slightly larger in diameter</a>. There&rsquo;s a thermometer on it! That&rsquo;s nice, isn&rsquo;t it? Kinda. The design hasn&rsquo;t changed much for the past few decades so it&rsquo;s easy to get replacement parts or even start a new grill if you need to. Please join me on a tour of the features my grill has that your own grill should perhaps consider for itself followed by an abrupt, unsatisfying ending.</p>
<h3 id="feature-one-longer-gams">Feature One: Longer Gams</h3>
<p>The first problem is that they come designed for hobbits. I&rsquo;m over 6 foot, and the grate height of like 2 foot just isn&rsquo;t going to fly for me. Thankfully <a href="https://youtu.be/0dipbp7sKcc">Tom Horsman has a fix for this</a>: <a href="https://www.homedepot.com/p/3-4-in-x-10-ft-Electric-Metallic-Tube-EMT-Conduit-853429/100400406">3/4 inch electrical conduit</a> fits snugly into the legs of a Weber kettle and you can use sheet metal screws to secure them. If you cut two 19 inch segments for the back legs and a 25 inch segment for the front you can raise your kettle up 6 inches to counter height.</p>
<p><img src="/posts/grill_pics/conduit_legs.jpg" alt="Conduit Legs" title="3/4 inch conduit fits snugly in the legs, secured by sheet metal screws"></p>
<h3 id="feature-two-the-tongsaver-9000">Feature Two: The Tongsaver 9000</h3>
<p>The next big issue was the top exhaust vent. You see, it&rsquo;s a metal &ldquo;daisy&rdquo; disc on the top of a metal body with a fire in it. It gets really fucking hot. At first I handled this by whacking it with my dirty tongs which was annoying and gross. Eventually I drilled out the rivet holding the daisy disc on and replaced it with a machine screw, nut and lock washer. This lets me take it off for cleaning so it can cover the holes better. While it was off I also drilled out a hole to attach a <a href="https://www.homedepot.com/p/Nicholson-4-1-8-in-x-1-1-16-in-Wood-File-Handle-21522N/100183485">file handle</a> so I could save my tongs and poor little fingies.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> Eventually I found a handle replacement for another grill on clearance and switched to that cause it didn&rsquo;t have a ferrule.</p>
<p><img src="/posts/grill_pics/exhaust_vent_modifications.jpg" alt="Exhaust Vent Modifications" title="The exhaust vent has a handle and can be removed for cleaning."></p>
<h3 id="feature-three-port-authority">Feature Three: Port Authority</h3>
<p>Putting temperature probes through the lid means the lid is loose and air is getting in. That&rsquo;s not good for barbeque at all, plus it means that you&rsquo;re losing some of the control you have on the airflow in your grill. Let&rsquo;s change that by simply drilling a big hole in the side of it. Then you plug it back up with this <a href="https://www.amazon.com/LavaLock%C2%AE-Silicon-Grommet-Smoker-Thermometer/dp/B0797GXWLX?th=1">little silicone grommet</a> that has a slit for thermometer probes.</p>
<p>The big concern here is the enameling on the exterior of our grill. That&rsquo;s what protects it from the elements, if it cracks then the grill is going to rust out way faster. This can be mitigated by taping over the area you want to drill through before you start. Mark it off with sharpie and use a step bit to get it to the size you need.</p>
<p><img src="/posts/grill_pics/probe_port.jpg" alt="Probe Port" title="A silicone probe port"></p>
<h1 id="guantanamo-bay-is-still-open-in-2023"><strong>Guantanamo Bay is still open in 2023.</strong></h1>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Hence the kind of thinking that puts upholstered furniture on the porch and then, later, back inside another apartment. Cherish your 20&rsquo;s, you will never be this free and stupid again.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>I encourage you to do the same. It&rsquo;s beautiful to turn your tools into bespoke reflections of your own creativity. Make the handle conform to your hand.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>I still hit it with the tongs clack clack mfer.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description><media:thumbnail url="https://worstwizard.online/posts/grill_pics/charcoal.jpg"/></item><item><title>The Once and Future (tur)King</title><link>/posts/cooking/turking/</link><pubDate>Thu, 23 Nov 2023 21:48:01 -0500</pubDate><guid>/posts/cooking/turking/</guid><description><![CDATA[<h1 id="the-long-boring-part-before-the-recipe">The Long Boring Part Before the Recipe</h1>
<p>Thanksgiving dinner is my favorite thing to cook every year. It really only got big for me when I was 19, my group of friends ended up starting a friendsgiving a tradition that has so far lasted for 15 years. It&rsquo;s been my favorite day of the year every year and as I&rsquo;ve grown up and started my own family I&rsquo;ve carried that love for that event over to the holiday proper.</p>
<p>Now as a total aside, I&rsquo;ve long held that when dealing with software for a living wears a hole into your soul. Building intangible, completely logical constructs out of text is pretty neat, but I can&rsquo;t touch my stupid website. I can&rsquo;t play catch with the dumb Godot dice game I poorly made. I yearn for the physical, to see the product of my own hands&rsquo; labor. I&rsquo;ve never been much good at building things, even in the software world where I have more experience, so I instead turn to cooking.</p>
<p>Cooking is great skill to pour yourself into because, as a wise philosopher once said, <a href="https://youtu.be/aklwE3zdG14">ya gotta eat</a>. Like&hellip;three times a day usually. If you plan ahead and have some spare time you can turn that into a lot of practice. It can teach you a lot of other skills, like chemistry and organization. It&rsquo;s incredible to feel your body learn the way to dice an onion more and more comfortably over time. Cooking taught me to respect the tools in my toolbox and take care of them, but to also not get overly precious about which ones I keep. They are tools after all, not objects d&rsquo;art.</p>
<p>Over the many years of gatherings I&rsquo;ve been a party to the cooking of many a fowl, and in 2020 I picked up barbeque as a hobby. I learned on my 22&quot; Weber kettle, which has slowly been modified into a counter height machine with extra cleaning and safety features. It comes with me to many a cookout in a variety of locations for ribs or pulled pork, but most famously this a machine that roasts birds. I have dedicated a non-neglible fraction of my life to the roasting of turkeys, and the result is, to be modest, positively sublime. This is a turkey breast that, when microwaved the next day for leftovers, is still moist and tender. For the past three Thanksgivings I have <em>forgotten</em> to make gravy from scratch and had to use packets and it didn&rsquo;t even matter, it was not needed. Some have even referred to my smoked turkey as their personal <a href="https://knowyourmeme.com/memes/how-often-do-you-think-about-the-roman-empire">Roman Empire</a>.</p>
<p>This is all to say: I <strong>love</strong> making this dish. Over many years of cooking many different fowl many different ways, this is my favorite one. Yes, there are personal reasons why I&rsquo;m attached to turkey. Yes, this is tuned speciically to the needs of me and my small cooker. I could be writing this to an audience of people who know what they&rsquo;re doing. But they don&rsquo;t need this.</p>
<p>I do. I forget shit all the time. This is for me. I need to write another one of these for the stuffing so I remember how to make it year to year.</p>
<p><img src="/posts/turkey_pics/two_birds.jpg" alt="My Glistening Thighs" title="The result of this method for a group using 2 grills"></p>
<h1 id="the-actual-recipe-part">The Actual Recipe Part</h1>
<hr>
<h2 id="theory">Theory</h2>
<p>Space is limited in my 22&quot; kettle and the heat is all going to be coming from one direction. This means we will need to butcher the turkey so that we can both fit into the kettle and also protect it from the more direct heat. With a  22&quot; kettle grill you&rsquo;re probably only going to be able to fit a 12 to 14 pound turkey, even if butchered and positioned well. You do not want to cram this into the grill, it will only make the finished producct that much worse for lack of smoke and glaze.</p>
<p>We&rsquo;re also going to need to get smoke to adhere to the turkey and make bark. With poultry, a little smoke goes a long way because the skin can get really weird and leathery if you get too much bark. It&rsquo;s better to apply a seasoning with smoked paprika to help visually bring out the redness of smoke but also bring extra smoky flavor. We&rsquo;ll apply this rub overnight so that it has time to penetrate the meat and really improve the flavor.</p>
<p>Poultry also tends to dry out, so we&rsquo;re going to give it some help by giving it a glaze. This well also just make it nice and savory and sweet and unctuous, it&rsquo;s just good all around.</p>
<p>To avoid further drying, we&rsquo;re going to cook this bird relatively hot. 350-375F the whole time, keeping things relatively close to typical oven temps. Going too much lower will give the meat a little too much time to dry out, instead we want to cook evenly and relatively quckly. The easy way to achieve this with a kettle grill is to use one whole chimney of lit lump charcoal far off on the back side of the grill. I also have a <a href="https://snsgrills.com/collections/slow-n-sear">Slow-N-Sear</a> that I swear by to keep coals safely in one area of the grill. If you&rsquo;re clever with steel or tin foil you can make something similar yourself.</p>
<p>We&rsquo;re going to use a thermometer to test doneness and check grill temp. This is honestly the most optional, but also the most <strong>Big &ldquo;E&rdquo; Easy Mode</strong> way to do things. If you have a cheap $30 one that uses two probes, that&rsquo;s perfect. One probe should be in the grill about an inch or two away from any meat and the other should be in the coldest part of the breast. You should get it pretty deep and then move it around to figure out where the coldest part is.</p>
<h3 id="butchery">Butchery</h3>
<p>We&rsquo;re going to spatchcock the turkey by taking a sharp, sturdy knife and running it along either side of the spine. and then cut off the leg quarters. I prefer to trim off the wings as well, they can just go right in with the neck and spine for making gravy. I also take the time to trim off excess rib bones, just to make things a little nicer.</p>
<h3 id="rub">Rub</h3>
<ul>
<li>4 Tbsp fresh ground black pepper</li>
<li>2 Tbsp garlic powder</li>
<li>2 Tbsp onion powder</li>
<li>1 Tbsp smoked paprika</li>
<li>1/4 cup kosher salt</li>
</ul>
<p>Shake this up to an even mix. Before spreading it onto your turkey, pat the meat dry. I like to do each leg quarter and then the breast last. Do not feel tempted to use the whole batch of rub. The more rub that&rsquo;s on any spot the more bark it will develop. I think that gets really overwhelming really fast and want the glaze to carry most of our external flavor anyway. You&rsquo;ll see areas, especailly on the breast, where too much rub was applied.</p>
<h3 id="glaze">Glaze</h3>
<ul>
<li>4-6 cloves garlic, lightly crushed but still together</li>
<li>peel from one orange</li>
<li>1/3 cup light brown sugar</li>
<li>1/3 cup soy sauce</li>
<li>1/3 cup apple cider vinegar</li>
<li>1/3 cup and 1 Tbsp neutral oil (I like peanut)</li>
</ul>
<p>Put all the ingredients in a pot and reduce it until it becomes just a little thicker and the house smells insanely good. I like to store this in a one pint mason jar for easy of shaking with the peel and garlic still in there as agitators to help the oil to mix back in after separating.</p>
<h1 id="praxis">Praxis</h1>
<p>Light the chimney.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> I use a couple straw firestarters and take one or two strands from one and put it on the top of hte chimney. When they catch, the chimney is ready to dump. You don&rsquo;t necessarily want all the coals lit at once, that could cause temps to spike pretty quickly, so having this extra fuel as a cushion and to even out our cooking is nice.</p>
<p>Once the chimney is dumped, position your grate and let it get up to temp. Right around 300F I like to throw on a large handful of applewood chunks, this will be the only wood we apply to our fire today, the rest of the smoke will come naturally from the charcoal, which is why it&rsquo;s imporant to <strong>buy quality lump charcoal</strong> so that it doesn&rsquo;t sputter, pop or give off nasty smoke. I like <a href="https://www.royaloak.com/products/hardwood-lump-charcoal/">Royal Oak</a>, it&rsquo;s cheap and clean.</p>
<p>Once the smoke goes from billowy and white to thin and blue, check the temp. Once it&rsquo;s 360 to 370F put the breast on first with the thickest part towards the fire so the thin part doesn&rsquo;t dry out. Try to get it as far from the fire as possible while leaving an inch from the edge of the grill for airflow. Position the leg quarters ahead of the breast, closer to the fire so that the thickest parts are the closest. The dark meat is going to act as a heatshield for the light meat which is more prone to drying out. Dark meat is pretty forgiving, and likes to go to higher temps anyway.</p>
<h3 id="correct">Correct:</h3>
<p><img src="/posts/turkey_pics/one_bird_orientation.jpg" alt="The spread" title="A late cook picture showing the orientation as well as safety precautions aka the hose."></p>
<h3 id="incorrect">Incorrect:</h3>
<p><img src="/posts/turkey_pics/one_chicken_wrong.jpg" alt="A chicken being cooking in the opposite of the correct way" title="A chicken undergoing a test run to this method, but oriented super backwards."></p>
<p>At this point you should put your probe into the deepest part of the breast. At this point, take a best guess, but in about 5 to 10 minutes the temperature gradient on the meat should have begun to form so you can find it a bit easier by just sliding the probe in and out.</p>
<p>Once you find that, and you can adjust that as you cook, it&rsquo;s basically just fire management. Keep the vents managed so that the grill temperature is between about 330-375F and then once the meat is at about 120 degrees start lacquering on thick layers of the glaze. Shake the glaze up well and then mop it on there, I recommend dabbing with a long bristled silicone brush.</p>
<p><img src="/posts/turkey_pics/one_bird_early_glazing.jpg" alt="Early Glazing" title="Early into the glazing process, only one layer in and the effect is dramatic."></p>
<p>Pull all the meat once the meat thermometer reads 165F. <strong>LET REST FOR A MINIMUM OF 45 MINUTES</strong> under very loosly tented foil. Cutting into this while it&rsquo;s too hot will release all that moisture we&rsquo;ve been saving into the air, making the meat dry. Use this time to make sure the other stuff is ready to go, clean some dishes, set the table. Just let it sit.</p>
<p>You cannot undo slicing the turkey, all you can do is add more gravy. Just wait until&hellip;</p>
<hr>
<h1 id="yer-done">Yer Done</h1>
<p>Slice it up and serve. I like to avoid slicing into a turkey breast until it&rsquo;s time to eat it so as to keep it from drying out, so gauge your crowd and slice accordingly. There&rsquo;s a trade-off in convenience vs quality when it comes to slicing the meat before storage. That said, a late night drunken turkey sandwich with presliced meat is <em>choice</em>.</p>
<p>That&rsquo;s it! I hope explaining the methods helped you understand why I do it this way so you can adapt it to your own cooking situation. And maybe you can heal your weary soul with this, it grew a part of mine back.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Crack a beer.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description><media:thumbnail url="https://worstwizard.online/posts/turkey_pics/two_birds_thighs.jpg"/></item><item><title>'Confession'</title><link>/posts/storytime/confession/</link><pubDate>Wed, 12 Jul 2023 10:20:33 -0400</pubDate><guid>/posts/storytime/confession/</guid><description><![CDATA[<p>This is a short story I found in my old Blogger profile while I was cleaning things out. The date on this is 3/22/2010, which seems like it checks out to me. I remember writing this after taking some adderall to study and ended up cleaning the whole apartment, writing a single page of legible fiction, and then failing out of community college.</p>
<p>I&rsquo;m posting this here because I lost it for 13 years. I never thought I&rsquo;d see it again and I want to keep it so I can go back and wish I had the guts to edit this and make it something worth my time. Presented without further ado: Confessional. I warn you, it&rsquo;s not great.</p>
<hr>
<p>St. Vincent&rsquo;s is an innocuous modern looking Catholic church down the street from my high school. Coincidentally, it was also directly across the street from my work where I performed my duties as a sickeningly exuberant drug store clerk. Between the St. Vincent youth group almost exclusively going to my school and half the congregation making a quick booze run after morning services I got a bit of exposure to St. Vincent&rsquo;s regulars. Naturally, I&rsquo;d peeked inside during a few interfaith meetings (through the safety of my own denomination, of course) and once sneaked off campus during lunch for a free meal and sermon. Hell, I even had a friend who was buried there. I think that&rsquo;s why I chose it as my entrance into the Catholic world.</p>
<p>See, I grew up in a Protestant family. But we weren&rsquo;t just Protestant. We were Disciples of Christ. It&rsquo;s about three steps from just saying &ldquo;fuck it&rdquo; and going to the Unitarian church down the street. Only our sanctuary didn&rsquo;t reek of illegal substances. Disciples of Christ is a denomination where Pascal&rsquo;s Wager was applied to recycling as often as it was the existence of the one who is called I Am. So growing up I always considered my denomination to make theological sense but it just didn&rsquo;t exude legitimacy in the way only Catholicism can. I secretly craved a real clerical hierarchy, actual epic architecture and the millennia of rich history and tradition the priesthood could provide. In my eyes, the Disciples of Christ were garish and gaudy compared to the sincere solemnity that came with the Vatican&rsquo;s blessing. For a long time after I lost my faith I thought often about what would have happened had I grown up Catholic. What it was like to be confirmed. What it was like to be served communion on my knees rather than shared through intinction. What it was like to go to confession. From my place in the well lit, contemporary pews of my Disciples home, I coveted my neighbor&rsquo;s ass.</p>
<p>So I went to St. Vincent&rsquo;s. It was some time after school let out and I had pulled into the all but deserted parking lot in my beaten and abused Kia Rio. To be perfectly honest, I was terrified of the building the moment I saw it. More than a decade and a half of idolatry was at stake. I secretly prayed to a non-deity that this would fulfill me. After ten solid minutes of psyching myself up I opened the car door and slid outside, slamming it shut again and staring at the looming building. I took one step forward and paused. The building dominated my vision. I stepped back, fished a cigarette out of the crushed pack in my pants pocket and leaned against my car, gazing at the sleek brushed gunmetal cross on the squat but elegant brick building. I had to hand it to them: the cherished tradition of religious architecture was alive and well, even with gargoyles omitted. Each smooth line flowed into the next while the brick and mortar materials said &ldquo;I am humility wrapped in silk.&rdquo; I paused to consider whether or not this was the right place for a moment before putting out the cigarette and walked inside.</p>
<p>It&rsquo;s funny how cheerful design can confer ominous overtones. I was greeted in the foyer by a trickling interior fountain and yet more stainless steel sculptures. It was almost post-apocalyptic in its tranquility. St. Vincent&rsquo;s had cannibalized the traditions of yore for a more friendly and approachable atmosphere but somehow missed the mark. I&rsquo;m sure with the bustle of a congregation, reinvigorated after a reverent Mass, would have made it seem like a perfect little &ldquo;town square&rdquo; for their community. But now it was silent but for the syncopated dripping of water. It would have almost been funny if it weren&rsquo;t so bleakly serene. My sneakers somehow echoed as I made my way across the tile floor into the grand, sweeping solitude of the sanctuary. The ceiling was a lofty spiral of hardwood that looked like it came straight from the same Scandinavian furnisher who provided the mile long pews. I looked around the circular auditorium nervously for a moment when I didn&rsquo;t immediately find the confessional booth.</p>
<p>But there it was, nothing more than a wooden screen panel and an altar pushed off to the back of sanctuary. As I proceeded, my mind&rsquo;s eye saw towering Gothic stonework and ancient, hand carved confessionals amidst a sea of worn oak pews. Instead I saw something like what Disciples would do if they had to make something the Vatican would approve of. It was clean. Beautiful. Chic. Carefully, I knelt at the altar, feeling the divinity drain from every sanitized surface of this holy place.</p>
<p>Yes, I did get to speak with a priest. He was young and energetic and welcoming, a prime example of respect and enthusiasm in his field. We talked for maybe twenty minutes about faith and the history of Catholicism. Yes, he absolved me of my sins. No, I didn&rsquo;t care. I held no faith in a sky-man then. His words were lost on me. He was just selling his services to another potential pew filler. It&rsquo;s not like I believed anyway. It&rsquo;s not like I actually thought I would be suddenly called upon by a higher power to believe, to have my faith renewed and find new family in the oldest church. No big deal.</p>
<p>But that craving for religious structure is still there. It&rsquo;s something that&rsquo;s hard to shake. And it&rsquo;s something I will continue to fear reaching for. I don&rsquo;t want to be let down like that again.</p>
]]></description></item><item><title>Adventures in Labbing - 'Repcal'</title><link>/posts/tech/coding/adventures-in-repcal/</link><pubDate>Tue, 30 May 2023 23:46:15 -0400</pubDate><guid>/posts/tech/coding/adventures-in-repcal/</guid><description><![CDATA[<p>I made a fun little website called <a href="https://sansculottid.es">sansculottid.es</a> all about the French Republican Calendar. If you&rsquo;re not familiar with the calendar and why I think it&rsquo;s cool, go immediately read Ursula Lawrence&rsquo;s excellent <a href="https://www.ursulalawrence.com/the-french-republican-wall-calendar">introduction to her French Republican Wall Calendar</a>.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> Her calendar&rsquo;s focus on the natural elements really drew me in, and I really think this part stands out.</p>
<blockquote>
<p>The authors of the original calendar thought carefully about when to honor each item. If they did it right, this version should at least be somewhat predictive of what will come into season when. For example, rhubarb almost always appears in the grocery store within a week of Rhubarb Day. Tulips, violets, and lilacs also tend to appear in sync. And for those of us living in northern climes, there is something truly appropriate about assigning coal, peat, and manure (yes, manure) to the depths of January.</p></blockquote>
<p>This project started after <a href="https://worstwizard.online/posts/labbing/adventures-in-n8n">I used n8n to post comics to Discord every day</a>. After adding Webhooks for Nancy and Heathcliff and a ton of other junk I decided I should really apply a lot more effort to annoying my friends and family with unwanted information related to my special interests. What I really wanted was a daily calendar app, sorta like <a href="https://twitter.com/sansculotides">@sansculotides</a>&rsquo;s posts. This was originally a Twitter account, which still exists, but due to that platform&rsquo;s increasing instability there was a bit more impetus to make an alternative. At the time I hadn&rsquo;t really looked too far into Mastodon or the Fediverse and didn&rsquo;t know that <a href="https://botsin.space/@sansculotides">@sansculotides@botsinspace</a> had already migrated to a more durable platform.</p>
<p>Because of the previous n8n project, I had initially conceived of this project in terms of setting up just an RSS feed with the needed data. I spent forever fighting with python&rsquo;s feedgenerator library before pulling the plug. I eventually figured out how to simply post the information about the current day to a web page. I had been playing with Flask recently and decided to paste things together. Let&rsquo;s be clear, this is babby&rsquo;s first website for sure. What I think is interesting is the infrastructure I used.</p>
<p>In order to practice with discord.py a bit after its near overhaul, I decided to use it to make a Webhook that scraped the webpage I had made. That was extremely easy. I packaged it into a container image and made a kubernetes CronJob that ran that container on a schedule. When that eventually broke, I decided to make a /data endpoint that just has a json of the object I created. I redesigned the webhook container to just read the json data instead of scraping HTML.</p>
<p>Here&rsquo;s the fun part. I realized at this point that I could open this up to everybody. I was a able to use python&rsquo;s kubernetes library to generate additional CronJobs defined by some user input at the /signup page. Now anybody with access to create a webhook in their Discord server can similarly have this delivered right to friends notfications bars. Get as annoying as possible!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>My wife actually gifted me a copy of this calendar a couple years back and it&rsquo;s maybe one of my favorite posessions, so if you&rsquo;re interested I cannot recommend finding one for yourself. If not, boy have I got great news about a brand new website that you just heard about.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description><media:thumbnail url="https://worstwizard.online/posts/fflag.jpg"/></item><item><title>Worshiping a Dead Goddess</title><link>/posts/gaming/worshipping-dead-goddess/</link><pubDate>Thu, 06 Apr 2023 00:49:50 -0400</pubDate><guid>/posts/gaming/worshipping-dead-goddess/</guid><description><![CDATA[<hr>
<p>My go to move when making a character for any TTRPG is to make the <em>Zealot of a Small Order</em>. A lot of the time for me this takes the form of a Lawful Neutral dwarf cleric who is utterly devoted to one very specific reading of one very particular facet of  one domain a given major deity.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> It&rsquo;s so fun and easy to come up with a character concept that has an interesting perspective by taking that reading to its logical conclusion at a Heroic 11<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> I like that <em>Zealots of Small Orders</em> tend to be earnest weirdos who seldom fit in. I love the idea of dedicating your life to an aberrant perspective on minutae.</p>
<p>In exploring these concepts I have somtimes dreamed up a few fun and/or interesting Small Orders on which to base my zealots, and the two which I write about today are reflections of each other. They are what happens when the god of practicality is killed in cold blood, and what mortal apostles do after outliving the god they expected to outlive ten more generations.</p>
<h1 id="a-bit-of-context">A Bit of Context</h1>
<p>This story takes place after Lathander&rsquo;s insurgent attempt to acquire supreme divine power by remaking the pantheon in his own image, an event now known as the Dawn Cataclysm. It&rsquo;s hard to place divine events on mortal timelines accurately due to the immense and awesome scale alone, though it&rsquo;s thought that it was about -255 DR when the goddess of the depths, Umberlee, sprung upon Murdane, Helm&rsquo;s lover, and dragged her to the bottom of the sea in her briny emrace.  It&rsquo;s commonly said that Helm holds an iron cold grudge against Lathander to this very day for instigating the events that caused the god of guardians to lose what he cherished most. What&rsquo;s not as commonly known is how this attitude is tempered by Lathander&rsquo;s own loss in Tyche.</p>
<p>What is much less known is where Helm&rsquo;s attitude towards Lathander is cold, towards Umberlee it&rsquo;s a burning impotent rage. Picture in your mind the god Helm, covered as he is from head to toe in plate armor, his steel helm drawn tightly over his face standing just below the knee in lake water. See how he must stop in that place, how he cannot extend his protection further becaus the waves will win this fight <em>every single time.</em> It&rsquo;s no contest. And so Helm does&rsquo;t fight. This is the reason no matter how far you&rsquo;ve sailed, you will always feel a moment of uneasiness stepping onto water and you leave Helm&rsquo;s protection, giving yourself to the mercy of Umberlee. This is the bodily feeling of having the divine grace of a god stripped away from you.</p>
<h1 id="murdanes-vigil-anchorites">Murdane&rsquo;s Vigil Anchorites</h1>
<p>Having lost the tempering effect of Murdane&rsquo;s pragmatic presence, some Helmites decided to devote themselves to lifelong vigils in her memory. With a slightly emboldened flair for the dramatic, these adherents of Helm have decided to brick themselves into lighthouses that dot the rocky and windswept shores of the Sword Coast. They serve as lighthouse keepers and serve as clergy for the locals. They often become respected religious authors and philosophers within their community. A stereotypal anchorite is a seventh child of noble upbringing with a religious bent or bookish streak and a preference for independence, seclusion, and indoor life. Often times a wealthy family that supports the anchorite will lavish the lighthouse with amenities to make their family member more comfortable throughout their stay. Longstanding aristocratic families may have an heirloom tower, decorated with religious iconography.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup></p>
<p>Due to the frequent overlap of noble heritage, privacy, location at points of interest, and frequent transmission of written messages; Anchorites of Murdane&rsquo;s Vigil tend to be favored recruitment targets for spies and other clandestine operatives. They can often be swayed to the interestes of some ruling power or another by trying to be helpful to their family&rsquo;s ambitions in some way. It&rsquo;s uncommon but common enough to note that sometimes at the onset of political intrigue, there will be a rash of anchorite escapes that occeasionally become political prisoners. Somtimes you need to escape having covertly sided with the losing side of a war and the enemy knowing your precise location. Sometimes you just make a dumb decision when you&rsquo;re young.</p>
<h1 id="celebrants-of-the-drowned-goddess">Celebrants of the Drowned Goddess</h1>
<p>The sudden loss of their god sent the disciples of Murdane into a shock and mourning, a tumultuous period which saw as many as 5% of members break their vows and leave their respective orders.But the apostles of the goddess of pragmatism will not let a minor thing like the death of their god sway them from their task.</p>
<p>The Anchorites, with their wealth and bombast, made a very public show of with the establishment of their order. By the time the disciples of Murdane emerged from their grief, a whole separate religious order had publicly claimed their grief. Feeling snubbed by their nearest deific patron, they began their pragmatic work. In their homespun gear, they began scouring the wilderness for places where one could drown and correcting it. When you see a sturdy log tipped to cross your local creek, thank the Celebrants. When you see stacks of large bouyant fruits near the lakeside, thank the Celebrants. You may still find them, taking on their solo adventures as traveling tinkers without packs.</p>
<p>Often they will be contracted to provide consultation during large bridge construction projects. Celebrants near riverside cities often live much more lavish lives than their rural comrades.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Like the psychopomp purging the plumbing clogs of undeath from the river of souls.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>12&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>It might be cool to have this be the pride of the city or town, but the family may have a dark history. Who knows? This is all for you to run with.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description><media:thumbnail url="https://worstwizard.online/posts/lighthouse.jpg"/></item><item><title>Windows Thoughts</title><link>/posts/tech/windows/</link><pubDate>Tue, 07 Feb 2023 15:25:06 -0500</pubDate><guid>/posts/tech/windows/</guid><description><![CDATA[<p>I really haven&rsquo;t used my Windows machine much since getting the Mac for work. I should probably stop that, it&rsquo;s just&hellip;so much more convenient to use the Macbook in most cases. I mean, it certainly helps that it&rsquo;s portable and not tied to one desk location, but I&rsquo;m usually at that same location using the same monitors for the Windows desktop.</p>
<p>I guess the problem is I mainly use this machine for gaming and since the baby I haven&rsquo;t really been able to dive into games like I used to. Maybe that will change, maybe not, but the one thing I do know for certain is I have been enjoying setting up this machine to use WSL 2 in as many cases as possible. I never really had to spend to much of my time developing anything specifically for Windows and I honestly can&rsquo;t imagine a world where that would happen anymore. With the power of containers it&rsquo;s kinda pointless to do anything but run Linux nodes and ship your software in a container. In the long run, I kinda expect to see the death of Windows development for the Enterprise.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>That&rsquo;s kinda what I&rsquo;m doing here on this machine. I have a VM in my Windows machine so I can use Debian instead of Windows for all the tasks I actually care about. I do have that one scrapped laptop I got from the repair shop but it&rsquo;s missing a power cable.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> But the point being, I basically just have venv for a whole machine inside Windows now. And I use that to make containers to send to other Linux machines. It&rsquo;s sick to not ever have to think about .NET or whatever it&rsquo;s called. It&rsquo;s awesome that I can manipulate files on Windows from WSL so I don&rsquo;t have to alias those damn Powershell commands.</p>
<p>Man, I just gotta make an Arch partition or something.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>Side note: I wonder how much longer Windows even has. We&rsquo;ve seen corporate owned OS&rsquo;s die before, but I don&rsquo;t really see Windows regaining the prominence it had in the 90s. Most people don&rsquo;t even use a laptop or desktop in their day to day life anymore and Windows is kinda considered to be the less &ldquo;premium&rdquo; option of the two major keyboard-using OS&rsquo;s out there. Maybe this is finally the year of Linux desktop&hellip;&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>This week I&rsquo;m going to have to start a series about scrappernetes and the dumb shit I run with at home. That&rsquo;s really the fun stuff here.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item><item><title>Mad About Infrastructure</title><link>/posts/tech/mad-about-infrastructure/</link><pubDate>Wed, 01 Feb 2023 22:46:47 -0500</pubDate><guid>/posts/tech/mad-about-infrastructure/</guid><description><![CDATA[<p>We made it back! The Tupperbaby is an incredibly understanding traveler, though we did run into several issues unrelated to the baby.</p>
<p>You see, when <a href="https://www.youtube.com/watch?v=pUZD9DMMJ08">Reagan fired those 11,000 air traffic controllers for striking</a>, it had knock-on effects throughout the industry that caused permanent damage to not only that industry but to the labor movement writ large. This was followed by a series of recessions, terrorist attacks, recessions, coronaviruses, and recessions have kept the remaining airlines confident that they can get away with poor behavior because the government will just bail them out with no consequences. So now they&rsquo;re just not afraid to funnel all their money right back to executives and shareholders.</p>
<p>Fast forward my whole fucking life and now every time we fly there&rsquo;s at least one 3-6 hour delay. And that&rsquo;s what happened this time! American Airlines decided that a delay of 6 hours did not justify a refund, just a rescheduling at most. No reimbursements whatsoever and they nearly lost our kid&rsquo;s car seat. Luckly for us many airlines, <a href="https://www.dallasnews.com/business/airlines/2020/03/18/american-airlines-spent-12-billion-on-stock-buybacks-during-flush-times-now-it-says-it-needs-a-bailout/">including American</a> decided that it would be better to buy back their own stock than make improvements to their infrastructure or do anything more than the standard landlord &ldquo;thick coat of paint&rdquo; on their existing fleet. As such, our flight out of Texas (the most important one) was delayed 6 hours because their ancient planes continue falling apart and they don&rsquo;t have enough parts or technicians to address the issue at this point.</p>
<p>It&rsquo;s just embarassing. We live in a damn <a href="https://youtu.be/L5H4qhIpXgk">failed state.</a> It&rsquo;s only a matter of time before it all falls down.</p>
]]></description></item><item><title>Thursday</title><link>/posts/thursday/</link><pubDate>Thu, 26 Jan 2023 20:55:20 -0500</pubDate><guid>/posts/thursday/</guid><description><![CDATA[<p>This post will be periodically updated as we travel throughout the day. I&rsquo;ve set it as a draft for now (so this should be erased), but we&rsquo;ll see how that goes.</p>
<p>I hate traveling, particularly flying. I&rsquo;m over 6 foot tall, so there&rsquo;s no comfortable way to sit in an airline seat for me. On top of that, I&rsquo;m a Big Dude<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> so it&rsquo;s even harder to just sit comfortably than you&rsquo;d imagine. Last year we took the train west to Oregon and that was truly a delight. I&rsquo;m less than thrilled about going through TSA again and I&rsquo;m certainly less than thrilled about being in an absolute hellscape of suburban north-central Texas</p>
<p>I think we&rsquo;re pretty well prepared, but I just don&rsquo;t know how to handle a baby in a plane. We&rsquo;ll see, I guess.</p>
<h3 id="update">Update</h3>
<p>Ok, that wasn&rsquo;t so bad actually. No delays, no issues, baby was an angel the whole time and he pooped only after we got off the plane.</p>
<p>We got to my parent&rsquo;s and my dad left to do a night class, which means no fight right out the gate. Baby is now asleep and doing great.</p>
<p>On to tomorrow, I guess.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>TM&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item><item><title>Adventures in Labbing: Part 4 - Github Actions</title><link>/posts/tech/coding/adventures-in-actions/</link><pubDate>Wed, 25 Jan 2023 12:51:46 -0500</pubDate><guid>/posts/tech/coding/adventures-in-actions/</guid><description><![CDATA[<p>It&rsquo;s working! I set up a self-hosted action runner on one of the scrappernetes nodes and made it run as a service. This allowed me to start building out steps using the <code>doctl</code> tools after I was able to install that on the node as well.</p>
<p>This was pretty easy with the Actions Runner documentation.</p>
<h6 id="download">Download</h6>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># Create a folder</span>
</span></span><span style="display:flex;"><span>$ mkdir actions-runner <span style="color:#f92672">&amp;&amp;</span> cd actions-runner
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Download the latest runner package</span>
</span></span><span style="display:flex;"><span>$ curl -o actions-runner-linux-x64-2.301.1.tar.gz -L https://github.com/actions/runner/releases/download/v2.301.1/actions-runner-linux-x64-2.301.1.tar.gz
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Optional: Validate the hash</span>
</span></span><span style="display:flex;"><span>$ echo <span style="color:#e6db74">&#34;3ee9c3b83de642f919912e0594ee2601835518827da785d034c1163f8efdf907  actions-runner-linux-x64-2.301.1.tar.gz&#34;</span> | shasum -a <span style="color:#ae81ff">256</span> -c
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Extract the installer</span>
</span></span><span style="display:flex;"><span>$ tar xzf ./actions-runner-linux-x64-2.301.1.tar.gz
</span></span></code></pre></div><h6 id="configure">Configure</h6>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span><span style="color:#75715e"># Create the runner and start the configuration experience</span>
</span></span><span style="display:flex;"><span>$ ./config.sh --url https://github.com/foo/bar --token fubar
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Create a service.</span>
</span></span><span style="display:flex;"><span>$ ./svc.sh install
</span></span><span style="display:flex;"><span><span style="color:#75715e"># Last step, run it!</span>
</span></span><span style="display:flex;"><span>$ ./svc.sh start
</span></span></code></pre></div><p>From there it was just a matter of making sure <code>runs-on: self-hosted</code> is in my workflow, which coincidentally looks like this.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">name</span>: <span style="color:#ae81ff">Docker</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># This workflow uses actions that are not certified by GitHub.</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># They are provided by a third-party and are governed by</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># separate terms of service, privacy policy, and support</span>
</span></span><span style="display:flex;"><span><span style="color:#75715e"># documentation.</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">on</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">push</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">branches</span>: [ <span style="color:#e6db74">&#34;main&#34;</span> ]
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">pull_request</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">branches</span>: [ <span style="color:#e6db74">&#34;main&#34;</span> ]
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">env</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># Use docker.io for Docker Hub if empty</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">REGISTRY</span>: <span style="color:#ae81ff">registry.digitalocean.com/foo</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>  <span style="color:#75715e"># github.repository as &lt;account&gt;/&lt;repo&gt;</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">IMAGE_NAME</span>: <span style="color:#ae81ff">bar</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">jobs</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">build</span>:
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">runs-on</span>: <span style="color:#ae81ff">self-hosted</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">permissions</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">contents</span>: <span style="color:#ae81ff">read</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">packages</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>      <span style="color:#75715e"># This is used to complete the identity challenge</span>
</span></span><span style="display:flex;"><span>      <span style="color:#75715e"># with sigstore/fulcio when running outside of PRs.</span>
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">id-token</span>: <span style="color:#ae81ff">write</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">steps</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Checkout Repo</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">actions/checkout@v3</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">repository</span>: <span style="color:#ae81ff">foo/bar</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">token</span>: <span style="color:#ae81ff">${{ secrets.GH_TOKEN }}</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">ref</span>: <span style="color:#ae81ff">main</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">DigitalOcean Docker Image Publish</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">ripplr-io/docr-docker-publish@v1</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">image_path</span>: <span style="color:#ae81ff">foo/bar</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      <span style="color:#75715e"># Set up the Kubernetes CLI with your DigitalOcean Kubernetes cluster.</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Set up kubectl</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">uses</span>: <span style="color:#ae81ff">matootie/dokube@v1.4.0</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">with</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">personalAccessToken</span>: <span style="color:#ae81ff">${{ secrets.DO_TOKEN }}</span>
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">clusterName</span>: <span style="color:#ae81ff">ward-personal-sandbox</span>
</span></span><span style="display:flex;"><span>
</span></span><span style="display:flex;"><span>      <span style="color:#75715e"># Run any kubectl commands you want!</span>
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">name</span>: <span style="color:#ae81ff">Rollout Pods</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">run</span>: <span style="color:#ae81ff">kubectl rollout restart deploy -n blog blog</span>
</span></span></code></pre></div><p>This makes building and deploying the blog a breeze. I even included a quick Github trigger in n8n so it knows when I&rsquo;ve pushed a new blog post and makes a Toot promoting it with a small snippet of text from the top of the post. Here&rsquo;s what that looks like now.</p>
<p><img src="/posts/n8n-github.png" alt="Mastodon Post Workflow" title="A n8n workflow that is triggered daily at 10 am with a schedule node, and also when a Github repo's  main branch is pushed or pull requested to. From there it goes through an RSS node, to a couple of code nodes that format the text from RSS, then posting to Mastodon as described in the previous blog entry."></p>
<p>I&rsquo;m exited to maybe get a couple posts done while on the road. The best thing to do might be to make a bunch of branches with pre-formatted posts ready to go so I can edit them on mobile and PR them in.</p>
<p>I&rsquo;m just happy it&rsquo;s up and working! I think I&rsquo;ll get everything ready for the trip now.</p>
]]></description></item><item><title>Adventures in Labbing: Part 3 - Jenkins</title><link>/posts/tech/coding/adventures-in-jenkins/</link><pubDate>Wed, 25 Jan 2023 00:23:19 -0500</pubDate><guid>/posts/tech/coding/adventures-in-jenkins/</guid><description><![CDATA[<p>Fuck <a href="https://www.jenkins.io/">Jenkins</a> man.</p>
<p>I do this shit for work, not for fun. I&rsquo;m already done. The problem I&rsquo;m running into is specifically around credentials, which I feel should be fairly easy to manage with Kubernetes secrets but apparently not for Jenkins. Fighting with the UI and the settings, I&rsquo;m just&hellip;I think I&rsquo;m done? I&rsquo;m going to leave it installed for now because I think it might actually be something I come back around to in a week or so. Maybe on my trip next week if I need some time to myself. Whatever, I&rsquo;m not getting paid for this right now this is entirely for my own purposes.</p>
<p>Overall the goal is to get CI working so I can simply PR to the <code>main</code> branch of the repo containing this blog with each update as I work on it and then the pipeline takes care of everything as it&rsquo;s deployed into kubernetes. I want to get this done by tomorrow evening so I can make quick posts on the road in Texas this weekend.<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<p>The other thing is I was looking at <a href="https://about.gitlab.com/install/">self-hosting Gitlab</a>. This could be a promising way to take care of two birds with one stone: self hosting my own code repos and container registries as well as having CI built right in? That&rsquo;s mighty tempting. I think it&rsquo;s going to be a much bigger undertaking than I currently expect them to be. Until then, I think I might just have to rely on self-hosted github action runners. This will at least get the container images built and pushed, and I can worry about refreshing my production images shortly.</p>
<p>n8n is working fantastically except it appears to be giving me one issue as well. It&rsquo;s double posting. Every time a workflow runs it does sends the result twice. I just realized why while typing this out. Hold up.</p>
<pre tabindex="0"><code>❯ kgp -n n8n
NAME                   READY   STATUS             RESTARTS   AGE
n8n-66bff5d4cb-676rq   1/1     Running            0          27h
n8n-7df76b6594-c9m58   1/1     Running            0          27h
</code></pre><p>These dumb assholes execute from both pods. What stupid bullshit. Ha. Well, spoilers, scaling down to 1 replica fixed it. I&rsquo;ve got some docs to read or a bug report to file.</p>
<p>Sorry for the disappointing update. I&rsquo;m thinking I might try to get a little less technical in future posts, but since I&rsquo;m in the process of setting all this up it&rsquo;s been a very fun thing to sort of document this along the way. I dunno, since we&rsquo;re going to be in Texas this weekend I expect there to be one or two more posts that are entirely devoid of technical content.</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>We&rsquo;re taking the kiddo down to Texas for his great-granny&rsquo;s 94th birthday.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item><item><title>Adventures in Labbing: Part 2 - n8n</title><link>/posts/tech/coding/adventures-in-n8n/</link><pubDate>Mon, 23 Jan 2023 21:45:20 -0500</pubDate><guid>/posts/tech/coding/adventures-in-n8n/</guid><description><![CDATA[<p>A few years back a friend of mine in a Discord server created a bot that, on request, browsed some GoComics for a given comic strip or comment if possible. We mainly used it to ask for the most recent Heathcliff, Nancy and Garfield strips, but you did have to ask for them. So usually someone in Europe would ping the bot when they woke up and bing bang boom Bob&rsquo;s <a href="https://tupperward.net/posts/adventures-in-labbing/">yer@email.biz</a> we got our comics. But for everybody in the US this was effectively automation (so long as someone in Europe remained routine-driven, a pretty safe bet).</p>
<p>I took a bit of a break from that Discord, but still wanted comics delivered right to my door, so I initially tried to set up an RSS reader in IFTTT and</p>
<p><img src="/posts/ifttt.png" alt="/posts/ifttt.png" title="You're using 1 of 5 Applets">
<em>This is no good. I have way more than 5 bad ideas.</em></p>
<p>Holy moly this is not gonna be sustainable. A little bit of searching brought me to a self-hosted solution. At the time I just had a little VM I hosted stuff on and I would run docker-compose stacks as needed and there was a free, self-hosted project called <a href="https://n8n.io">n8n</a> that had exactly that. In no time I had an instance set up<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup> and when I saw this</p>
<p><img src="/posts/n8n.png" alt="/posts/n8n.png" title="Active Workflows: 2 of Unlimited">
<em>Freedom!</em></p>
<p>had a huge sigh of relief. I could fuck this up seven ways from Sunday and it wasn&rsquo;t gonna cost me a god damned thing. Will it be harder and dumber than just learning how to use a handful of APIs and writing scripts in python? Probably yeah. Was I still able to retrieve data from <a href="https://comicsrss.com">comicsrss.com</a> daily using a cron job, use regex to find the image url in the most recent item in a given RSS feed, and send that to a Discord webhook to be embedded into its own channel?</p>
<p><img src="/posts/n8n-pipeline.png" alt="/posts/n8n-pipeline.png" title="The workflow described above. These images are much larger than I thought.">
<em>You betcha.</em></p>
<p>Since I&rsquo;m migrating everything over to the oceanetes cluster, it was easy to <a href="https://github.com/8gears/n8n-helm-chart">use the n8n helm chart</a> and the Ingress configuration from <a href="https://tupperward.net/posts/adventures-in-labbing">last time</a> to get a shiny new isntance up and running almost as little time as with docker-compose, only this time I have TLS!</p>
<h2 id="a-quick-first-workflow">A Quick First Workflow</h2>
<p>Making the workflow was easy enough. I  just pointed the RSS Read node to <a href="https://www.comicsrss.com/rss/heathcliff.rss">https://www.comicsrss.com/rss/heathcliff.rss</a>. and then executed a bit of dumb js to find the image url.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-javascript" data-lang="javascript"><span style="display:flex;"><span><span style="color:#66d9ef">var</span> <span style="color:#a6e22e">content</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">$input</span>.<span style="color:#a6e22e">first</span>().<span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">content</span>;
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">const</span> <span style="color:#a6e22e">regex</span> <span style="color:#f92672">=</span> <span style="color:#e6db74">/https:\/\/assets\.amuniversal\.com\/(.*?)&#34;/</span>;
</span></span><span style="display:flex;"><span><span style="color:#a6e22e">$input</span>.<span style="color:#a6e22e">first</span>().<span style="color:#a6e22e">json</span>.<span style="color:#a6e22e">url</span> <span style="color:#f92672">=</span> <span style="color:#a6e22e">content</span>.<span style="color:#a6e22e">match</span>(<span style="color:#a6e22e">regex</span>)[<span style="color:#ae81ff">0</span>].<span style="color:#a6e22e">slice</span>(<span style="color:#ae81ff">0</span>, <span style="color:#f92672">-</span><span style="color:#ae81ff">1</span>);
</span></span><span style="display:flex;"><span><span style="color:#66d9ef">return</span> [<span style="color:#a6e22e">$input</span>.<span style="color:#a6e22e">first</span>().<span style="color:#a6e22e">json</span>];
</span></span></code></pre></div><p>I think the trickest part of this is <a href="https://support.discord.com/hc/en-us/articles/228383668-Intro-to-Webhooks">setting up the Discord webhook</a> but even that is pretty trivial.</p>
<p><img src="/posts/garbage-ape-webhook.png" alt="It really is just that easy" title="A quick screenshot of the Discord webhoook filled out."></p>
<p>And let&rsquo;s do a quick test run&hellip;</p>
<p><img src="/posts/garbage-ape.png" alt="Working Webhook" title="The webhook Garbage Ape posts the most recently daily Heathcliff comic"></p>
<p>Success!<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup></p>
<h2 id="posting-to-mastodon">Posting to Mastodon</h2>
<p>Similarly, I&rsquo;m setting n8n up to promote this blog using my Mastodon account. There is a community module in n8n for this, but I can&rsquo;t get the OAuth2 node to cooperate. Instead I opted for making direct HTTP requests to the <code>/api/v1</code> endpoint of the Mastodon instance as referenced in the <a href="https://docs.joinmastodon.org/methods/statuses/">Mastodon API docs</a>.</p>
<p>To be honest, I couldn&rsquo;t find too much information about this regarding n8n and that was the impetus of this blog post. Well, that and making sure I don&rsquo;t get stagnant.</p>
<p>Using direct HTTP Requests to the API meant getting an <code>access_token</code> from my Mastodon instance, but setting that up in Developer settings took less than a minute. After receiving the <code>access_token</code> I was able to create a Header credential in n8n with the key <code>Authorization</code> and the value <code>Bearer &lt;access_token&gt;</code>. From there I just needed to send a <code>status</code> object in the body using JSON. Because I can use data from earlier in the workflow, I will be importing data from this website&rsquo;s RSS feed a lot like how we did in the first example. Here&rsquo;s what that HTTP Request node looks like in n8n.</p>
<p><img src="/posts/http.png" alt="/posts/http.png" title="Filled out node details for an HTTP request as stated above">
<em>Christ on a cracker that&rsquo;s a long image. I gotta figure out image formatting in this.</em></p>
<p>The end result is output that is a bit generic right now, but we can always expand on.</p>
<blockquote>
<p>Check out my newest blog post Adventures in Labbing: Part 2 - Adventures in n8n.</p>
<p><a href="https://tupperward.net/posts/adventures-in-n8n/">https://tupperward.net/posts/adventures-in-n8n/</a></p>
<p>#blog</p></blockquote>
<p>Not that shabby! I would like to add a description field so I can get a little more robust with these automated messages, but this is a really suiting first start.</p>
<p>Next up: Jenkins for CD of this very blog!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>without TLS shhhh. Now we don&rsquo;t have that problem. We&rsquo;re big kids now.&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Look, I&rsquo;m not going to ping the server at odd hours to do dumb shit for a dumb blog post. I mean I guess it&rsquo;s not pinging it&rsquo;s in its own channel, and nobody is tagged&hellip;whatever deal with a stale picture.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item><item><title>Adventures in Labbing: Part 1</title><link>/posts/tech/coding/adventures-in-labbing/</link><pubDate>Fri, 20 Jan 2023 23:43:25 -0500</pubDate><guid>/posts/tech/coding/adventures-in-labbing/</guid><description><![CDATA[<h2 id="the-importance-of-being-earnest">The Importance of Being Earnest</h2>
<p>So far the biggest lesson I would have to impart on you, reader, is how easy it is to get TLS working with cert-manager on your cluster. It&rsquo;s so easy, in fact, I think getting cert-manager installed on your lab cluster is maybe one of the first things you should do. <a href="https://www.linuxjournal.com/content/how-secure-your-website-openssl-and-ssl-certificates">SSL/TLS certs</a> are going to be massively important in the decentralized authentication of the future. In fact, authenticatation is exactly what they&rsquo;re for. They confirm that the domain <em>name</em> owner is the same person as the content owner. It&rsquo;s increasingly important that you confirm that the content you&rsquo;re receiving is in fact from who you&rsquo;re expecting it to be from, take Musk&rsquo;s Twitter for example. You don&rsquo;t want everyone to think your famous jolly cartoon character is flipping them off do you?</p>
<h2 id="cert-manager-and-ingress">Cert-Manager and Ingress</h2>
<p>What we will need:</p>
<ul>
<li>A Kubernetes cluster and kubectl</li>
<li><a href="https://helm.sh/docs/intro/install/">Helm</a></li>
<li>A working <a href="https://github.com/kubernetes/ingress-nginx">NGINX Ingress Controller</a> (<em>optional, you can use whatever ingress controller you want, hon.</em>)</li>
<li><a href="https://www.youtube.com/watch?v=Fafowelwoc0">Patience</a></li>
</ul>
<p>Get yourself some <a href="https://cert-manager.io">cert-manager.io</a> by givin&rsquo; em the <a href="https://cert-manager.io/docs/installation/helm/">ol&rsquo; razzle dazzle.</a></p>
<p><code>helm repo add jetstack https://charts.jetstack.io</code></p>
<p>Razzle dazzle &rsquo;em.</p>
<p><code>helm repo update</code></p>
<p>Give &rsquo;em a show that&rsquo;s so splendiferous.</p>
<pre tabindex="0"><code>helm install \
cert-manager jetstack/cert-manager \
--namespace cert-manager \
--create-namespace \
--version v1.11.0 \
--set installCRDs=true
</code></pre><p>Row after row will grow vociferous.</p>
<h6 id="staging-issueryaml">staging-issuer.yaml</h6>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">cert-manager.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">ClusterIssuer</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">staging-issuer</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">acme</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">email</span>: <span style="color:#ae81ff">yer@email.biz</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">preferredChain</span>: <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">privateKeySecretRef</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">name</span>: <span style="color:#ae81ff">staging-issuer-private-key</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">server</span>: <span style="color:#ae81ff">https://acme-staging-v02.api.letsencrypt.org/directory</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">solvers</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">http01</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">ingress</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">class</span>: <span style="color:#ae81ff">nginx</span>
</span></span></code></pre></div><p>Give &rsquo;em the ol&rsquo; flim-flam flummox, Fool and fracture &rsquo;em.</p>
<p><code>kubectl create -f staging-issuer.yaml</code></p>
<p>How can they hear the truth above the roar? (roar, roar, roar)</p>
<h6 id="prod-issueryaml">prod-issuer.yaml</h6>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">cert-manager.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">ClusterIssuer</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">prod-issuer</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">acme</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">email</span>: <span style="color:#ae81ff">yer@email.biz</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">preferredChain</span>: <span style="color:#e6db74">&#34;&#34;</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">privateKeySecretRef</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">name</span>: <span style="color:#ae81ff">prod-issuer-private-key</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">server</span>: <span style="color:#ae81ff">https://acme-v02.api.letsencrypt.org/directory</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">solvers</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#f92672">http01</span>:
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">ingress</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">class</span>: <span style="color:#ae81ff">nginx</span>
</span></span></code></pre></div><p>Throw &rsquo;em a fake and a finagle they&rsquo;ll never know you&rsquo;re just a bagel</p>
<p><code>kubectl create -f prod-issuer.yaml</code></p>
<p>Razzle dazzle &rsquo;em and they&rsquo;ll beg you for moooooooooore!<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<h2 id="mr-cellophane-is-objectively-better">Mr. Cellophane Is Objectively Better</h2>
<p>Ok, so now we have a staging-issuer and a prod-issuer. Both of these are ClusterIssuer resources, so any project you call out with these on your cluster will get their requested certs. These ClusterIssuers will manage our certificate requests as we set up our ingresses. We set up two different Issuers so we don&rsquo;t ping the production ACME url too many times and get our domain blocked. Once we know the cert is being applied we can just swap over to the prod-issuer and get the for-real one, but to start it&rsquo;s always best to go with staging.</p>
<p>Here&rsquo;s what my <a href="https://repcal.tupperward.net">repcal</a> site&rsquo;s Ingress resource looks like. Note the annotation and TLS sections.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-yaml" data-lang="yaml"><span style="display:flex;"><span><span style="color:#f92672">apiVersion</span>: <span style="color:#ae81ff">networking.k8s.io/v1</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">kind</span>: <span style="color:#ae81ff">Ingress</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">metadata</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">annotations</span>:
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">cert-manager.io/cluster-issuer</span>: <span style="color:#ae81ff">prod-issuer</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">name</span>: <span style="color:#ae81ff">repcal</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">namespace</span>: <span style="color:#ae81ff">repcal</span>
</span></span><span style="display:flex;"><span><span style="color:#f92672">spec</span>:
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">ingressClassName</span>: <span style="color:#ae81ff">nginx</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">rules</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">host</span>: <span style="color:#ae81ff">repcal.tupperward.net</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">http</span>:
</span></span><span style="display:flex;"><span>      <span style="color:#f92672">paths</span>:
</span></span><span style="display:flex;"><span>      - <span style="color:#f92672">backend</span>:
</span></span><span style="display:flex;"><span>          <span style="color:#f92672">service</span>:
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">name</span>: <span style="color:#ae81ff">repcal</span>
</span></span><span style="display:flex;"><span>            <span style="color:#f92672">port</span>:
</span></span><span style="display:flex;"><span>              <span style="color:#f92672">number</span>: <span style="color:#ae81ff">80</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">path</span>: <span style="color:#ae81ff">/</span>
</span></span><span style="display:flex;"><span>        <span style="color:#f92672">pathType</span>: <span style="color:#ae81ff">Prefix</span>
</span></span><span style="display:flex;"><span>  <span style="color:#f92672">tls</span>:
</span></span><span style="display:flex;"><span>  - <span style="color:#f92672">hosts</span>:
</span></span><span style="display:flex;"><span>    - <span style="color:#ae81ff">repcal.tupperward.net</span>
</span></span><span style="display:flex;"><span>    <span style="color:#f92672">secretName</span>: <span style="color:#ae81ff">prod-repcal-tls</span>
</span></span></code></pre></div><p>With that annotation, cert-manager will know which issuer use to handle your certificate request. It will then create a Certificate, CertificateRequest and Challenge CRDs inside kubernetes as well as a couple of Secets to store temporary and permanent data for the certs. You can follow this process by following these resources.</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>❯ k apply -f ingress.yaml
</span></span><span style="display:flex;"><span>ingress.networking.k8s.io/repcal configured
</span></span><span style="display:flex;"><span>❯ k get cert -n repcal
</span></span><span style="display:flex;"><span>NAME              READY   SECRET            AGE
</span></span><span style="display:flex;"><span>prod-repcal-tls   False   prod-repcal-tls   5s
</span></span></code></pre></div><p>And the certificate request</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>❯ k get cr -n repcal
</span></span><span style="display:flex;"><span>NAME                    APPROVED   DENIED   READY   ISSUER        REQUESTOR                                                    AGE
</span></span><span style="display:flex;"><span>prod-repcal-tls-kqczc   True                False   prod-issuer   system:serviceaccount:cert-manager:cert-manager-controller   19s
</span></span></code></pre></div><p>And the challenge</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>❯ k get challenge -n repcal
</span></span><span style="display:flex;"><span>NAME                                         STATE     DOMAIN                  AGE
</span></span><span style="display:flex;"><span>prod-repcal-tls-kqczc-614032786-1555122464   pending   repcal.tupperward.net   29s
</span></span></code></pre></div><p>Usually if the challenge isn&rsquo;t resolved in under a minute, you should start troubleshooting. But eventually you get this!</p>
<div class="highlight"><pre tabindex="0" style="color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;"><code class="language-shell" data-lang="shell"><span style="display:flex;"><span>❯ k get cr -n repcal
</span></span><span style="display:flex;"><span>NAME                    APPROVED   DENIED   READY   ISSUER        REQUESTOR                                                    AGE
</span></span><span style="display:flex;"><span>prod-repcal-tls-kqczc   True                True    prod-issuer   system:serviceaccount:cert-manager:cert-manager-controller   56s
</span></span><span style="display:flex;"><span>❯ k get cert -n repcal
</span></span><span style="display:flex;"><span>NAME              READY   SECRET            AGE
</span></span><span style="display:flex;"><span>prod-repcal-tls   True    prod-repcal-tls   61s
</span></span></code></pre></div><p>And Bob&rsquo;s <a href="mailto:yer@email.biz">yer@email.biz</a> your site has a cert!</p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p><a href="https://youtu.be/ByeXMGqapnU">For Your Convenience</a>&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item><item><title>Spurge-Laurel</title><link>/posts/spurge-laurel/</link><pubDate>Thu, 19 Jan 2023 21:50:34 -0500</pubDate><guid>/posts/spurge-laurel/</guid><description><![CDATA[<p><a href="https://repcal.tupperward.net/">Tomorrow is primidi 1 pluviôse an 231</a>, celebrating the <a href="https://en.wikipedia.org/wiki/Daphne_laureola">spurge-laurel</a>. Spurge-laurel doesn&rsquo;t grow here and that bothers me.</p>
<p>I love the <a href="https://en.wikipedia.org/wiki/French_Republican_calendar">French Republican Calendar</a> a lot. It&rsquo;s such a beautiful and revolutiponary idea: reclaiming the very framework of time from the gods and kings whose names litter the Gregorian days and months. What&rsquo;s a way to celebrate the saints in a secular manner, in a way for the common person to still understand it. On top of that, the saints days were replaced by common Parisian countryside plants and animals as well as common tools that would be familiar to a common person of the time.</p>
<p>That&rsquo;s why spurge-laurel is on there. That stuff does not grow in Ohio. I mean I&rsquo;m sure you could try but why the hell would you introduce a new species. That&rsquo;s how you get invasive carp, dude, do you want invasive carp?</p>
<p>One of the things I want to do with my life is adapt the vulgar calenar to be localized to this time and place. Times have changed since the Paris Commune and I think that we deserve to have a stronger relationship to the calendar we keep, down to the local level. One of the reasons I like the vulgar calendar so much is that it overlays fairly neatly onto pretty much any other calendar I can think of, so it&rsquo;s faily easy to adapt to your needs.</p>
]]></description></item><item><title>Reintroduction - Less Incoherent Rambling</title><link>/posts/incoherent-ramble/</link><pubDate>Wed, 18 Jan 2023 03:02:51 -0500</pubDate><guid>/posts/incoherent-ramble/</guid><description><![CDATA[<p>Re-reading my very first post makes me realize that perhaps a second introduction is in order, this one a little more concise and simultaneously a little more specific.</p>
<p>I&rsquo;m Ward. I am a self-taught engineer coming from the help desk and now working primarily with kubernetes and Platform engineering teams. I&rsquo;m a fairly new dad which is about as mundane as thrilling adventures gets. I live in central Ohio, obviously. My interests are in distributed systems, games of all varieties but specifically TTRPGS, wargames and chess-like games (e.g. The Duke, Tak).</p>
<p>I believe in a decentralized world and I think the fediverse and the tools it leverages provides us a vision forwards past the heavily monetized series of walled gardens we have to navigate currently. The internet is supposed to be the sum of all human knowledge, we need to distribute that knowledge better.</p>
<p>My mission with this site is to demonstrate what you can do with barely any knowledge about anything. I&rsquo;ll write up a walkthrough on how I stook up this Hugo site and then a rough idea of the infrastructure behind it. I want to also provide a shoestring option for you, because I believe in a self-hosted future. This will include managing my home k3s cluster made from trash computers, Scrappernetes, which has only caused one small fire so far!</p>
<p>I also want to be able to use this as a bit of a platform for some helpful ideas and organizations that are heling to make this miserable world a little bit easier to live in. As such, those ideas and organizations will likely align with the following:</p>
<p>Trans Rights, BLM, 1312, FOSS, IWW</p>
<p>Stay tuned!</p>
]]></description></item><item><title>Plugging Away</title><link>/posts/plugging-away/</link><pubDate>Tue, 17 Jan 2023 20:19:46 -0500</pubDate><guid>/posts/plugging-away/</guid><description><![CDATA[<p>Ok, finally got this up and running. I&rsquo;m going to work now on getting a handle of the formatting, but first we&rsquo;re doing a bunch of CI/CD work. I&rsquo;m a damned DevOps guy so let&rsquo;s make it happen.</p>
<p>What we&rsquo;re going to likely be doing is using Jenkins as always, but I&rsquo;m curious about exploring Dagger.io to really more easily manage the pipeline work and test it locally. The big idea would be to always make it so that the image being served on the live site matches what is in my GitHub repo. So that&rsquo;s going to mean playing a lot with GitHub Action Runners. Or not. Who knows!</p>
<p>There really is no purpose to this post except as a method of becoming more acclimated to writing and publishing to this blog more frequently. I don&rsquo;t know how often updates are going to be coming, but I figure I might as well practice writing a bit.</p>
<p>That&rsquo;s all for now!</p>
]]></description></item><item><title>A Bold Step Backwards</title><link>/posts/bold-step-backwards/</link><pubDate>Fri, 13 Jan 2023 20:05:19 -0500</pubDate><guid>/posts/bold-step-backwards/</guid><description><![CDATA[<h2 id="a-brief-introduction">A Brief Introduction</h2>
<p>I&rsquo;m Ward, a simple idiot wizard and tech dude based out of central Ohio.  My relationship with central Ohio is very similar to my relationship with my dad: strained and vacillating between love and extreme frustration. I decided, some weeks ago, that with the current shift in the internet it would be a good idea to put my money where my mouth is and create a personal website with which I can convey to people my stupid thoughts in a more thorough and effective manner than a half though out toot scrawled from the toilet.</p>
<p>And I do think having a personal site is important, even if its just for a persona and not a person. Your identity should be your own and <em>the</em> best way to ensure that it is verified is by having a domain and a site hosted on it with SSL and being loud about who you are. It should be something you have as programmer to show off your work, sure, but I wholeheartedly believe in distributed, decentralized systems and I want to be a part of one.</p>
<p>Here&rsquo;s me doing that.</p>
<p>I also want to make it as clear as possible why I&rsquo;m doing it and where I&rsquo;m coming from so I will now write a screed and there&rsquo;s nothing you can do about it! Report me to the mods! I&rsquo;m the mods! Who&rsquo;s laughing now? Me! Hahahahaha!<sup id="fnref:1"><a href="#fn:1" class="footnote-ref" role="doc-noteref">1</a></sup></p>
<h2 id="biased-context">Biased Context</h2>
<p>In 2007 some turtlenecked asshole introduced us to the concept of &ldquo;Apps&rdquo;. I was 17 then and half a lifetime ago I remember going to a hookah bar with my friends and all crowding around the Nick&rsquo;s new iPhone. &ldquo;Look, I just press this and it goes right to YouTube,&rdquo; my Nick said, pawing at the slightly less responsive than we&rsquo;d like device. &ldquo;The maps app isn&rsquo;t very good though,&rdquo; he continued, waiting in dismay for streaming video to be more readily accessible over data carriers only 10 years down the road. &ldquo;I hope they can add Mapquest or Google Maps instead.&rdquo;</p>
<p>We didn&rsquo;t know then but we were fawning over the death of the internet as we knew it.</p>
<p>At this point in my life I was a member of several PHPBB forums, which used to be the easiest way to share a community space and host discussions. Joining each of these forums was its own adventure, too. Usually, you&rsquo;d be going about your business reading dumb little webcomics or playing a dumb little flash game and you&rsquo;d see in the header of the page a menu that links to a forum. You&rsquo;re already there, reading the dumb little comic or playing dumb little game and want to know what other people think about it so you sign up and introduce yourself. Before you know it you&rsquo;re embroiled in a year long drama about who cheated at The Werewolf Game and how and a small group splinters of to make their own forum, each with its own heritage and culture from previous users.</p>
<p>This was a time when users owned the internet in a very literal sense.<sup id="fnref:2"><a href="#fn:2" class="footnote-ref" role="doc-noteref">2</a></sup> They owned the sites they conversed on, they owned the discourse they were engaging in, they sometimes even owned the hardware and kept it tucked away in a bedroom closet to quietly overheat. I&rsquo;m trying not to sound wistful for a bygone era from my youth, but it&rsquo;s hard not to.</p>
<p>Things changed in 2007.<sup id="fnref:3"><a href="#fn:3" class="footnote-ref" role="doc-noteref">3</a></sup> The simultaneous arrival of &ldquo;The App&rdquo; and the maturation of social media as a concept to look less like a toy for teens and more like Something Useful. There weren&rsquo;t too many options at first but the slow trickle of new apps and social media sites became a steady stream. Twitter moved from the SMS part of your phone to its own app. Facebook moved from your desktop to an app. Every point of friction that could exist between a user and simply tapping a button on their phone to go to their favorite website had to be eroded away because the longer it took for them to get the app store the longer it took for them to see that Shakira&rsquo;s new single was also on iTunes and it was only $0.99 god dammit. &ldquo;There&rsquo;s an app for that&rdquo; became a meme before we even had widespread adoption of the term &ldquo;meme&rdquo;.</p>
<p>By 2010, smartphones had gotten cheap enough that there were a couple competitors to Apple&rsquo;s dominance with iOS. Many people started to do most of their social media consumption on the phone rather than through a keyboard and mouse, and they were more likely to use social media provided to them with a single button and a monolithic userbase that all their friends were on. It was cheaper and easier to just use the standard Facebook Group or Facebook Messenger and businesses, fan clubs and neighborhood watches all migrated to these massive platforms, abandoning their previous bulletin boards for the Wall. And so we&rsquo;ve been stuck, penned in by the environment we opted in to. Inefficient, cookie cutter, bland. We had made for ourselves a digital suburban hellscape.</p>
<p>And that&rsquo;s basically where we&rsquo;ve been the past decade. First MySpace and then Facebook came in like Wal-Mart and Sam&rsquo;s Club and decimated the internet landscape around them and certainly not for the better. Now every small business site looks exactly the same and if they don&rsquo;t engage on Facebook they will lose customers simply from a lack of reach. And that reach is increasingly something that they&rsquo;re having to pay for again. The cost of these centralized, monolothic services coincides with the rise of the algorithm, allowing the gestalt consciousness of YouTube decide at a whim what our political leanings should be and what kinds of food we might be interested in making for dinner.</p>
<h2 id="the-blockchain-killed-web-20-and-web3-at-the-same-time">The Blockchain Killed Web 2.0 and Web3 at the Same Time</h2>
<p>Thankfully, the blockchain did them in. The instant these international megacorps saw the ability to sell digital ownership, they hopped on it. Unfortunately, the blockchain is nothing but a very clever way to inefficiently manage verification. The tools it use are present in other technologies that are cheaper, easier to use and nowhere near as complicated or requiring as much buy-in from the end user. Not that the suits in charge care, they just see the dollar signs. And so the biggest dumbasses of a generation went all-in on one of the most useless technologies to ever exist entirely because the financial sector couldn&rsquo;t stop salivating over it. Meta is now focused on the Metaverse and is letting Facebook wither away. Twitter is now intrinsically linked with the DogeCoin guy and hemorhagging users and advertisers like rats from a sinking ship.</p>
<p>As we sit and watch the simultaneous demise of both Web 2.0 and Web3, I think it&rsquo;s a smart idea to look backwards to what we lost by limiting ourselves to the boundaries of the App Store and its easily monetizable centralized Websites as a Service. They don&rsquo;t work at scale. Flat out, it just can&rsquo;t happen. There&rsquo;s a reason RSS is still the podcast delivery method of choice: a protocol can&rsquo;t die the same way an organization can. Has RSS been supplanted by Atom? Yes. Does the average user know or care? Not in the slightest.</p>
<p>This is the way.</p>
<h2 id="get-it-like-from-that-show">Get It? Like From That Show!</h2>
<p>I have a lot of thoughts about all of this, and I&rsquo;m sure I&rsquo;ll get further into them in later posts. I probably need to dig into some of these things a little more later on. And that&rsquo;s what this is for. It&rsquo;s also a place that I control. A corner to myself that I can shape and share as I please. This is what the internet <em>should</em> be like. Decentralized, federated, personal.</p>
<p>This is the way.<sup id="fnref:4"><a href="#fn:4" class="footnote-ref" role="doc-noteref">4</a></sup></p>
<div class="footnotes" role="doc-endnotes">
<hr>
<ol>
<li id="fn:1">
<p>BAHAHAHAHAHAHAHA!&#160;<a href="#fnref:1" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:2">
<p>Or at least it felt like it. I dunno dude, look at the title of this site.&#160;<a href="#fnref:2" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:3">
<p>Or at least it felt like it. I dunno dude, look at the title of this site.&#160;<a href="#fnref:3" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
<li id="fn:4">
<p>How obvious is it that I petered out towards the end? Leave a comment telling me I&rsquo;m bad at doing something I&rsquo;m doing now for the first time.&#160;<a href="#fnref:4" class="footnote-backref" role="doc-backlink">&#x21a9;&#xfe0e;</a></p>
</li>
</ol>
</div>
]]></description></item></channel></rss>