<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
  <channel>
    <title>Posts on </title>
    <link>https://minor.gripe/posts/</link>
    <description>Recent content in Posts on </description>
    <generator>Hugo</generator>
    <language>en-us</language>
    <lastBuildDate>Mon, 23 Mar 2026 13:25:41 -0500</lastBuildDate>
    <atom:link href="https://minor.gripe/posts/index.xml" rel="self" type="application/rss+xml" />
    <item>
      <title>Against Open Source&#39;s Anthropocentrism</title>
      <link>https://minor.gripe/posts/2026-03-23-against_open_sources_anthropocentrism/</link>
      <pubDate>Mon, 23 Mar 2026 13:25:41 -0500</pubDate>
      <guid>https://minor.gripe/posts/2026-03-23-against_open_sources_anthropocentrism/</guid>
      <description>&lt;p&gt;One of my colleagues through the Recurse Center community posted their thoughts on &lt;a href=&#34;https://www.visidata.org/blog/2026/ai/&#34; target=&#34;_blank&#34;&gt;using AI to contribute to open source&lt;/a&gt;, and it got me thinking a bit and goaded me into writing this post.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;It feels like open-source projects are losing the plot&amp;ndash;for both good and bad reasons&amp;ndash;on AI contributions, and it really sucks to see it.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;some-examples-from-the-wild&#34;&gt;Some examples from the wild&lt;/h2&gt;&#xA;&lt;p&gt;In January of this year, Daniel Stenberg &lt;a href=&#34;https://daniel.haxx.se/blog/2026/01/26/the-end-of-the-curl-bug-bounty/&#34; target=&#34;_blank&#34;&gt;announced&lt;/a&gt; that the curl project would no longer be running a bug-bounty program, citing AI slop. Never one to mince words:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Millwright: Smarter Tool Selection From Agent Experience</title>
      <link>https://minor.gripe/posts/2026-03-13-millwright_smarter_tool_selection_with_adaptive_toolsheds/</link>
      <pubDate>Fri, 13 Mar 2026 15:35:42 -0500</pubDate>
      <guid>https://minor.gripe/posts/2026-03-13-millwright_smarter_tool_selection_with_adaptive_toolsheds/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;AI agents with large tool catalogs need better tool routing that factors in observed usefulness under real conditions.&lt;/p&gt;&#xA;&lt;p&gt;I introduce Millwright as an approach that presents fewer and more relevant tools during planning, learns from agent experience, and uncovers new tooling opportunities.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Millwright helps your agent choose better tools over time based on experience.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-problem&#34;&gt;The Problem&lt;/h2&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;figure class=&#34; --smart-image &#34;&gt;&#xA;    &#xA;    &#xA;        &lt;a target=&#34;_blank&#34; href=&#34;https://minor.gripe/posts/2026-03-13-millwright_smarter_tool_selection_with_adaptive_toolsheds/images/context_window.png&#34;&gt;&#xA;            &#xA;            &lt;img src=&#34;https://minor.gripe/posts/2026-03-13-millwright_smarter_tool_selection_with_adaptive_toolsheds/images/context_window_hu_d0fceb0ccdb91323.png&#34; width=&#34;800&#34; alt=&#34;Context windows get filled with tools&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;        &lt;/a&gt;&#xA;        &#xA;&lt;/figure&gt;&#xA;&#xA;&lt;p&gt;LLMs have limited context available (even with 128K to 1M+ window sizes on models like Gemini 3 Pro and Llama 4 Scout). When we add tools and their definitions, we lose space for valuable things like RAG, planning, and conversation history. This gets even worse in a large enterprise or situation with hundreds or thousands of tools.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My Friend Ellem</title>
      <link>https://minor.gripe/posts/2026-03-11-my_friend_ellem/</link>
      <pubDate>Wed, 11 Mar 2026 17:27:43 -0500</pubDate>
      <guid>https://minor.gripe/posts/2026-03-11-my_friend_ellem/</guid>
      <description>&lt;p&gt;I met my friend Ellem a few years ago.&lt;/p&gt;&#xA;&lt;p&gt;She was friendly&amp;ndash;irritatingly so, at times&amp;ndash;and always eager to please. She was well-read, though she didn&amp;rsquo;t always seem to understand the nuances of what she&amp;rsquo;d read and often just parroted what the CliffsNotes version might say. She was a mediocre developer, but she always came up with &lt;em&gt;something&lt;/em&gt; I could muddle through and even when it was pure trash it at least got me unstuck and looking at the problem. For me it is often easier to tweak and improve than to start from scratch, and Ellem&amp;rsquo;s rough attempts were always a good way of getting momentum even if I did everything myself afterwards.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gremlins: Ideas for Cogitation and Actuation</title>
      <link>https://minor.gripe/posts/2026-03-09-gremlins_ideas_for_cogitation_and_actuation/</link>
      <pubDate>Mon, 09 Mar 2026 13:37:39 -0500</pubDate>
      <guid>https://minor.gripe/posts/2026-03-09-gremlins_ideas_for_cogitation_and_actuation/</guid>
      <description>&lt;p&gt;As discussed &lt;a href=&#34;https://minor.gripe/posts/2026-02-13-gremlins_bad_news_worse_news_how_to_lose_big/&#34;&gt;previously&lt;/a&gt;, for gremlins there are three important thought-like functions:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;strong&gt;Cogitation&lt;/strong&gt;: the act of planning.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;State&lt;/strong&gt;: the act of storing a plan and the information adjacent to it.&lt;/li&gt;&#xA;&lt;li&gt;&lt;strong&gt;Actuation&lt;/strong&gt;: the act of executing a plan.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;The same basic runtime architecture can accomplish all three things.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-most-basic-gremlin&#34;&gt;The most basic gremlin&lt;/h2&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Start&lt;/li&gt;&#xA;&lt;li&gt;Run prompt&lt;/li&gt;&#xA;&lt;li&gt;Die&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;That&amp;rsquo;s the equivalent of running &lt;code&gt;$ claude -p &amp;quot;Give me three numbers.&amp;quot;&lt;/code&gt;. If you wanted to have it also send emails (the &lt;em&gt;actuation&lt;/em&gt; bit), you&amp;rsquo;d run something like &lt;code&gt;$ claude -p &amp;quot;Send me (at test@example.com) a friendly email.&amp;quot; --allowedTools &amp;quot;Bash&amp;quot;&lt;/code&gt; and it&amp;rsquo;d decide on &lt;code&gt;sendmail&lt;/code&gt; or &lt;code&gt;curl&lt;/code&gt; or something and shoot you an email.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The Case for Apolitical Tech Spaces</title>
      <link>https://minor.gripe/posts/2026-03-02-the_case_for_apolitical_tech_spaces/</link>
      <pubDate>Mon, 02 Mar 2026 11:08:59 -0600</pubDate>
      <guid>https://minor.gripe/posts/2026-03-02-the_case_for_apolitical_tech_spaces/</guid>
      <description>&lt;figure class=&#34;--smart-video  &#34;&gt;&#xA;    &lt;div class=&#34;video-embed  --smart-video &#34;&#xA;        id=&#34;video-youtube-TjDEsGZLbio&#34;&#xA;        style=&#34;position:relative;padding-bottom:56.25%;height:0;overflow:hidden;max-width:100%;background:#000;border-radius:4px;&#34;&gt;&#xA;&#xA;        &#xA;        &#xA;&#xA;        &#xA;        &lt;div class=&#34;video-facade-wrapper&#34; &gt;&#xA;            &#xA;            &#xA;            &lt;button class=&#34;video-facade&#34; aria-label=&#34;Play: Embedded video&#34;&#xA;                onclick=&#34;loadVideo(this, &#39;youtube&#39;, &#39;TjDEsGZLbio&#39;)&#34;&#xA;                style=&#34;position:absolute;top:0;left:0;width:100%;height:100%;border:0;padding:0;cursor:pointer;background:#000 url(&#39;https://i.ytimg.com/vi/TjDEsGZLbio/hqdefault.jpg&#39;) center/cover no-repeat;&#34;&gt;&#xA;                &#xA;                &lt;div class=&#34;video-filter&#34;&#xA;                    style=&#34;position:absolute;top:0;left:0;width:100%;height:100%;background:rgba(102,74,43,0.15);mix-blend-mode:color;pointer-events:none;&#34;&gt;&#xA;                &lt;/div&gt;&#xA;                &lt;svg style=&#34;position:absolute;top:50%;left:50%;transform:translate(-50%,-50%);width:68px;height:48px;pointer-events:none;z-index:2;&#34;&#xA;                    viewBox=&#34;0 0 68 48&#34;&gt;&#xA;                    &lt;path&#xA;                        d=&#34;M66.52 7.74c-.78-2.93-2.49-5.41-5.42-6.19C55.79.13 34 0 34 0S12.21.13 6.9 1.55c-2.93.78-4.63 3.26-5.42 6.19C.06 13.05 0 24 0 24s.06 10.95 1.48 16.26c.78 2.93 2.49 5.41 5.42 6.19C12.21 47.87 34 48 34 48s21.79-.13 27.1-1.55c2.93-.78 4.64-3.26 5.42-6.19C67.94 34.95 68 24 68 24s-.06-10.95-1.48-16.26z&#34;&#xA;                        fill=&#34;#A67F46&#34; /&gt;&#xA;                    &lt;path d=&#34;M45 24L27 14v20&#34; fill=&#34;#F5E8C8&#34; /&gt;&#xA;                &lt;/svg&gt;&#xA;            &lt;/button&gt;&#xA;&#xA;            &#xA;        &lt;/div&gt;&#xA;    &lt;/div&gt;&#xA;    &lt;figcaption&gt;Don&amp;#39;t say that he&amp;#39;s &amp;#39;hypocritical&amp;#39;, say rather that he&amp;#39;s...&amp;#39;apolitical&amp;#39;.&lt;/figcaption&gt;&#xA;&lt;/figure&gt;&#xA;&#xA;&lt;script&gt;&#xA;    if (typeof loadVideo === &#39;undefined&#39;) {&#xA;        function loadVideo(btn, src, id) {&#xA;            var wrapper = btn.parentElement;&#xA;            var container = wrapper.parentElement;&#xA;            var iframe = document.createElement(&#39;iframe&#39;);&#xA;            iframe.setAttribute(&#39;allowfullscreen&#39;, &#39;&#39;);&#xA;            iframe.setAttribute(&#39;allow&#39;, &#39;accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture&#39;);&#xA;            iframe.style.cssText = &#39;position:absolute;top:0;left:0;width:100%;height:100%;border:0;z-index:1;&#39;;&#xA;&#xA;            if (src === &#39;youtube&#39;) {&#xA;                iframe.src = &#39;https://www.youtube-nocookie.com/embed/&#39; + id + &#39;?autoplay=1&#39;;&#xA;            } else if (src === &#39;vimeo&#39;) {&#xA;                iframe.src = &#39;https://player.vimeo.com/video/&#39; + id + &#39;?autoplay=1&#39;;&#xA;            }&#xA;&#xA;            wrapper.remove();&#xA;            container.appendChild(iframe);&#xA;        }&#xA;    }&#xA;&lt;/script&gt;&#xA;&lt;p&gt;Many technical spaces have become extremely partisan, and this has lowered their utility for all parties. This is not a &lt;em&gt;new&lt;/em&gt; phenomenon&amp;ndash;in recent times you can look back at COVID and the summer of Floyd, Gamergate in the early 10&amp;rsquo;s, and even back into the 90s for things like the open-source schism and the Sokal Affair&amp;rsquo;s discussion.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Gremlins: Bad News, Worse News, How to Lose Big</title>
      <link>https://minor.gripe/posts/2026-02-13-gremlins_bad_news_worse_news_how_to_lose_big/</link>
      <pubDate>Fri, 13 Feb 2026 14:16:57 -0600</pubDate>
      <guid>https://minor.gripe/posts/2026-02-13-gremlins_bad_news_worse_news_how_to_lose_big/</guid>
      <description>&lt;p&gt;Things are getting weird. Really really weird.&lt;/p&gt;&#xA;&lt;p&gt;In the past few weeks we&amp;rsquo;ve had:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;The creation of &lt;a href=&#34;https://web.archive.org/web/20260205233937/https://www.moltbook.com/&#34; target=&#34;_blank&#34;&gt;Reddit for agents&lt;/a&gt; (which I slopped a &lt;a href=&#34;https://github.com/crertel/moltbook-client/commits/master/&#34; target=&#34;_blank&#34;&gt;full client for in &lt;strong&gt;less than ten hours!&lt;/strong&gt;&lt;/a&gt;)&lt;/li&gt;&#xA;&lt;li&gt;The creation of a &lt;a href=&#34;https://web.archive.org/web/20260213150350/https://rentahuman.ai/&#34; target=&#34;_blank&#34;&gt;human rental service&lt;/a&gt; (a &lt;em&gt;tremendously&lt;/em&gt; bad idea if you&amp;rsquo;ve ever read Daniel Suarez&amp;rsquo;s &lt;a href=&#34;https://www.amazon.com/Daemon-Daniel-Suarez/dp/1524741892&#34; target=&#34;_blank&#34;&gt;&lt;em&gt;Daemon&lt;/em&gt;&lt;/a&gt;).&lt;/li&gt;&#xA;&lt;li&gt;An agent &lt;a href=&#34;https://github.com/matplotlib/matplotlib/pull/31132&#34; target=&#34;_blank&#34;&gt;getting into a shitfit on Github over a closed PR&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;The same agent, allegedly (because on the internet nobody knows you&amp;rsquo;re a dog), then &lt;a href=&#34;https://web.archive.org/web/20260211225255/https://crabby-rathbun.github.io/mjrathbun-website/blog/posts/2026-02-11-gatekeeping-in-open-source-the-scott-shambaugh-story.html&#34; target=&#34;_blank&#34;&gt;wrote a blogpost&amp;ndash;as was the custom at the time&amp;ndash;pleading about discrimination, attacking the maintainer&amp;rsquo;s character, and basically running the whole &amp;ldquo;I want to brigade an OSS person I don&amp;rsquo;t like&amp;rdquo; playbook&lt;/a&gt;&lt;/li&gt;&#xA;&lt;li&gt;&amp;hellip;and now, &lt;a href=&#34;https://x.com/matthew_pines/status/2022299364866044274&#34; target=&#34;_blank&#34;&gt;somebody&amp;rsquo;s gone and gotten their agent to have kids &lt;em&gt;in silico&lt;/em&gt;&lt;/a&gt;.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;What these all have in common is computer software acting on its own and interacting with humans to varying degrees of disaster.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On genAI, Craftsmanship, and Engineering</title>
      <link>https://minor.gripe/posts/2026-01-26-genai_craftsmanship_and_engineering/</link>
      <pubDate>Mon, 26 Jan 2026 10:18:35 -0600</pubDate>
      <guid>https://minor.gripe/posts/2026-01-26-genai_craftsmanship_and_engineering/</guid>
      <description>&lt;p&gt;The craftsmanship and engineering behind software development have never been in greater danger&amp;ndash;nor seen a greater chance at a renaissance&amp;ndash;than they do now.&lt;/p&gt;&#xA;&lt;p&gt;genAI use, whether in the form of discussion with ChatGPT&amp;rsquo;s web interface on SQL or in the purest yolo form of near AI-psychosis we see with &lt;a href=&#34;https://steve-yegge.medium.com/welcome-to-gas-town-4f25ee16dd04&#34; target=&#34;_blank&#34;&gt;Gas Town&lt;/a&gt;, has spurred our industry to look at itself in ways that we really haven&amp;rsquo;t in years. I think we&amp;rsquo;ll come out of this functioning at a higher level than before&amp;ndash;&lt;strong&gt;but it&amp;rsquo;s gonna hurt&lt;/strong&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ZFS, surprise resilvering, dumb tricks</title>
      <link>https://minor.gripe/posts/2025-12-19-zfs_surprise_resilvering_dumb_tricks/</link>
      <pubDate>Fri, 19 Dec 2025 20:43:42 -0600</pubDate>
      <guid>https://minor.gripe/posts/2025-12-19-zfs_surprise_resilvering_dumb_tricks/</guid>
      <description>&lt;p&gt;Once upon a time I got a 5-bay QNAP, and all was well until it got sulky and one of its SATA connectors decided to give up on life. Drafted in its stead, I&amp;rsquo;ve had a ZFS NAS setup for ages&amp;ndash;going back to Fall of 2019. 8 x 4TB drives, Norco ITX-S8, 32GB ram, Ryzen 2400G, nothing too fancy. NixOS, ZFS with raidz2, great.&lt;/p&gt;&#xA;&lt;p&gt;I ran a handy little &lt;a href=&#34;https://github.com/crertel/slopscripts/blob/main/drives.sh&#34; target=&#34;_blank&#34;&gt;tool&lt;/a&gt; I slopped up and lo-and-behold all the drives are nearly at five and a half years of online time; this is solidly in their golden years. I&amp;rsquo;d been meaning to upgrade the array to larger disks, since a good amount of space is going (cheerfully!) to error-correction and parity, and so had begun collecting replacement disks in anticipation of an upgrade. Rebuilding the array would be time-consuming and annoying and so I&amp;rsquo;d been putting it off.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Humbly Maintaining a NixOS Package</title>
      <link>https://minor.gripe/posts/2025-11-18-humbly_maintaining_a_nix_package/</link>
      <pubDate>Tue, 18 Nov 2025 11:41:55 -0600</pubDate>
      <guid>https://minor.gripe/posts/2025-11-18-humbly_maintaining_a_nix_package/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve got a small handful of packages on &lt;a href=&#34;https://search.nixos.org/packages&#34; target=&#34;_blank&#34;&gt;Nixpkgs&lt;/a&gt; that I maintain. When I was starting out, I didn&amp;rsquo;t really know how to do any of that, and was fortunate enough to have some friends onboard me. In the spirit of giving back, I&amp;rsquo;ll walk through how I do an update pass today on a simple package, and give some background information on how to make it easy.&lt;/p&gt;&#xA;&lt;h3 id=&#34;workflow-of-updating-a-nixos-package&#34;&gt;Workflow of updating a NixOS package&lt;/h3&gt;&#xA;&lt;p&gt;I&amp;rsquo;m a maintainer for the &lt;a href=&#34;https://search.nixos.org/packages?channel=unstable&amp;amp;query=lmstudio&#34; target=&#34;_blank&#34;&gt;lmstudio&lt;/a&gt; package, which wraps the binaries from &lt;a href=&#34;https://lmstudio.ai/&#34; target=&#34;_blank&#34;&gt;LM Studio&lt;/a&gt; (a friendly GUI/IDE for AI model development work). This workflow is for that package; other packages (especially those used by others or built from source) will probably have different details.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Bozon Detection for Communities</title>
      <link>https://minor.gripe/posts/2025-11-10-bozo_scoring_communities/</link>
      <pubDate>Mon, 10 Nov 2025 15:21:36 -0600</pubDate>
      <guid>https://minor.gripe/posts/2025-11-10-bozo_scoring_communities/</guid>
      <description>&lt;p&gt;Every community has some amount of bozo behavior.&lt;/p&gt;&#xA;&lt;p&gt;Past a certain point, the number of bozos in a community exceed a healthy carrying capacity, and will crowd out or drive away sane and healthy members. No community is without &lt;em&gt;some&lt;/em&gt; amount of bozos but it&amp;rsquo;s easy to find yourself at a circus without realizing it until the clown car pulls up.&lt;/p&gt;&#xA;&lt;p&gt;Here are some questions to help score your community of choice, each worth one point.&lt;/p&gt;</description>
    </item>
    <item>
      <title>My AI Apologia: Experiences and Criticisms</title>
      <link>https://minor.gripe/posts/2025-05-03-my_ai_apologia/</link>
      <pubDate>Sat, 03 May 2025 23:44:52 -0500</pubDate>
      <guid>https://minor.gripe/posts/2025-05-03-my_ai_apologia/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;blockquote&gt;&#xA;&lt;p&gt;&lt;strong&gt;apologia&lt;/strong&gt;, &lt;em&gt;n.&lt;/em&gt; &amp;ndash; a defense or justification of one&amp;rsquo;s beliefs, attitudes, or actions.&#xA;&amp;ndash; Webster&amp;rsquo;s College Dictionary&lt;/p&gt;&lt;/blockquote&gt;&#xA;&lt;p&gt;I&amp;rsquo;m getting a bit tired of reading (what I consider to be) increasingly reflexive, dismissive, and (frankly) lazy objections or dismissals of what is broadly now termed generative AI&amp;ndash;often abbreviated to just AI (a travesty) or LLMs (a synecdoche).&lt;/p&gt;&#xA;&lt;p&gt;By writing this, I hope that I might be able to help in some small way by providing my own observations and experiences with these tools, in neither the fawning and hustling tone of breathless wonderment you might find on Twitter or the performative aggrievedness of the Fediverse and various tech communities I frequent.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Reactionary engineer, radical engineer</title>
      <link>https://minor.gripe/posts/2025-04-13-reactionary_engineer_radical_engineer/</link>
      <pubDate>Sun, 13 Apr 2025 17:53:20 -0500</pubDate>
      <guid>https://minor.gripe/posts/2025-04-13-reactionary_engineer_radical_engineer/</guid>
      <description>&lt;p&gt;Bit of a shower-thought today, a continuation of something that&amp;rsquo;s been rattling around in my brain for a minute.&lt;/p&gt;&#xA;&lt;p&gt;I think there&amp;rsquo;s a helpful way of thinking about what I consider to be a core belief spectrum in engineering (and indeed, other fields, but let&amp;rsquo;s set that to the side for the moment), and that by naming and describing it we can come up with a lens that helps us operate more happily and effectively in our lives and careers.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Centaur writing, centaur coding</title>
      <link>https://minor.gripe/posts/2025-04-10-centaur_writing_centaur_coding/</link>
      <pubDate>Thu, 10 Apr 2025 15:38:22 -0500</pubDate>
      <guid>https://minor.gripe/posts/2025-04-10-centaur_writing_centaur_coding/</guid>
      <description>&lt;p&gt;I think there&amp;rsquo;s a much better way of thinking about and referring to what we call &amp;ldquo;vibe coding&amp;rdquo;&amp;ndash;which quite unfortunately is not at all &lt;a href=&#34;https://buttplug.io/documentation/&#34; target=&#34;_blank&#34;&gt;what it sounds like&lt;/a&gt; (warning, sorta NSFW)!&lt;/p&gt;&#xA;&lt;p&gt;I also see an opportunity to be more open-minded about other applications of generative AI when done in concert with an artist.&lt;/p&gt;&#xA;&lt;p&gt;In this post, I&amp;rsquo;ll suggest a better terminology and try to sell you on using it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;a-bit-of-history&#34;&gt;A bit of history&lt;/h2&gt;&#xA;&lt;h3 id=&#34;centaur-chess&#34;&gt;Centaur Chess&lt;/h3&gt;&#xA;&lt;p&gt;Chess is a game that has been played for well over a millenia by humans.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Moving from Zamrazac to Hugo</title>
      <link>https://minor.gripe/posts/2025-03-23-moving_from_zamrazac_to_hugo/</link>
      <pubDate>Sun, 23 Mar 2025 23:22:28 -0500</pubDate>
      <guid>https://minor.gripe/posts/2025-03-23-moving_from_zamrazac_to_hugo/</guid>
      <description>&lt;h2 id=&#34;moving-over&#34;&gt;Moving over&lt;/h2&gt;&#xA;&lt;p&gt;One of my goals for my sabbatical since last November has been upgrading my blogging infra.&#xA;This is now done.&lt;/p&gt;&#xA;&lt;p&gt;I went from an old (read: Ubuntu 19 or so?) VPS running Nginx hosting static files generated by my &lt;a href=&#34;https://github.com/crertel/zamrazac&#34; target=&#34;_blank&#34;&gt;Zamrazac&lt;/a&gt; static site generator to a &lt;a href=&#34;https://nixos.org/&#34; target=&#34;_blank&#34;&gt;NixOS 24.11&lt;/a&gt; VPS running Nginx hosting static files generated by &lt;a href=&#34;https://gohugo.io/&#34; target=&#34;_blank&#34;&gt;Hugo&lt;/a&gt; with a slightly-modified &lt;a href=&#34;https://poison.lukeorth.com/&#34; target=&#34;_blank&#34;&gt;Poison&lt;/a&gt; theme (as well as self-hosted analytics via &lt;a href=&#34;https://plausible.io/&#34; target=&#34;_blank&#34;&gt;Plausible&lt;/a&gt;).&lt;/p&gt;&#xA;&lt;h2 id=&#34;why-move&#34;&gt;Why move?&lt;/h2&gt;&#xA;&lt;p&gt;My original goal with Zamrazac was &amp;ldquo;archival quality&amp;rdquo; blog posts in a language I enjoy. This turned the design space into:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Fragments from a pandemic</title>
      <link>https://minor.gripe/posts/2021-09-29_fragments_from_a_pandemic/</link>
      <pubDate>Wed, 29 Sep 2021 02:23:43 +0000</pubDate>
      <guid>https://minor.gripe/posts/2021-09-29_fragments_from_a_pandemic/</guid>
      <description>&lt;p&gt;&lt;strong&gt;Embattled.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;One word, neatly conveying my experiences of world and of self for near two years. What follows are pieces, images, moments, reflections&amp;ndash;some absurd, some short, some glib, some pretty awful&amp;ndash;on a truly bizarre time in my life.&lt;/p&gt;&#xA;&lt;p&gt;The timeline is, to my recollection, monotonic. I cannot be certain of all, most, or perhaps any of the dates.&lt;/p&gt;&#xA;&lt;hr&gt;&#xA;&lt;h3 id=&#34;1&#34;&gt;1.&lt;/h3&gt;&#xA;&lt;p&gt;We&amp;rsquo;re watching a dragon invade a storefront, the brazen clang and crash of cymbals causing us to wince only occasionally as we enjoy the proceedings.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adventures in bookmark parsing</title>
      <link>https://minor.gripe/posts/2021-04-14_adventures_in_bookmark_parsing/</link>
      <pubDate>Wed, 14 Apr 2021 05:18:10 +0000</pubDate>
      <guid>https://minor.gripe/posts/2021-04-14_adventures_in_bookmark_parsing/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m working on a bookmark manager, and one of the minor features I want is to import all my old Firefox bookmarks.&lt;/p&gt;&#xA;&lt;p&gt;This adventure has been&amp;hellip;an adventure.&lt;/p&gt;&#xA;&lt;p&gt;At least one other person has &lt;a href=&#34;https://github.com/CCharlieLi/bookmark-parser/blob/master/lib/bookmark_parser/html_parser.js&#34; target=&#34;_blank&#34;&gt;tackled this problem&lt;/a&gt; over in Node, but I&amp;rsquo;m taking stabs at it in Elixir because that&amp;rsquo;s kind of my schtick.&lt;/p&gt;&#xA;&lt;h2 id=&#34;on-mozilla-exports&#34;&gt;On Mozilla exports&lt;/h2&gt;&#xA;&lt;p&gt;From Firefox you can have it export all of your bookmarks as an HTML file.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Book: Walkway</title>
      <link>https://minor.gripe/posts/2021-03-14_book__walkway/</link>
      <pubDate>Sun, 14 Mar 2021 20:36:09 +0000</pubDate>
      <guid>https://minor.gripe/posts/2021-03-14_book__walkway/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Finished Cory Doctorow&amp;rsquo;s 2017 &lt;em&gt;Walkaway: A Novel&lt;/em&gt; today. I probably still need to get my review up of Mussolini&amp;rsquo;s biography, but I kinda just want some escapism, so I read this.&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-author&#34;&gt;The author&lt;/h2&gt;&#xA;&lt;p&gt;Doctorow isn&amp;rsquo;t a new author for me&amp;ndash;I&amp;rsquo;ve enjoyed his &lt;a href=&#34;https://en.wikipedia.org/wiki/Makers_%28novel%29&#34; target=&#34;_blank&#34;&gt;Makers&lt;/a&gt; and really enjoyed his short story &amp;ldquo;When Sysadmins Ruled the Earth&amp;rdquo;, as well as his 28c3 talk on &lt;a href=&#34;https://www.youtube.com/watch?v=HUEvRyemKSg&#34; target=&#34;_blank&#34;&gt;&amp;ldquo;The coming war on general computation&lt;/a&gt;. He&amp;rsquo;s something like 50 now (Wikiedpia has his birth year as 1971), and has been most prolific in the last two decades. Lots of awards, editor at Boing-Boing and frequent contributor, and generally well-regarded author.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A fun experiment with grid representation.</title>
      <link>https://minor.gripe/posts/2021-02-05_a_fun_experiment_with_grid_representation_/</link>
      <pubDate>Fri, 05 Feb 2021 19:01:23 +0000</pubDate>
      <guid>https://minor.gripe/posts/2021-02-05_a_fun_experiment_with_grid_representation_/</guid>
      <description>&lt;p&gt;While I was fiddling around with my weird hack project (more on that someday), I had an idea for how to use maps in Elixir.&lt;/p&gt;&#xA;&lt;p&gt;I hadn&amp;rsquo;t noticed, but you can use more than just strings and atoms as keys&amp;hellip;and so, I give you a quick and dirty grid implementation.&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-elixir&#34; data-lang=&#34;elixir&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;defmodule&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;SvgWorld.Simulation.Grid&lt;/span&gt; &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#f92672&#34;&gt;require&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Record&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;Record&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;defrecord(&lt;span style=&#34;color:#e6db74&#34;&gt;:grid&lt;/span&gt;, &lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: %{})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; init(), &lt;span style=&#34;color:#e6db74&#34;&gt;do&lt;/span&gt;: grid(&lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: %{})&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; insert_into_grid(grid(&lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: map) &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; g, x, y, value) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    new_map &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;put(map, {x,y}, value)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    grid(g, &lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: new_map)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; get_from_grid(grid(&lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: map), x, y) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(map, {x,y}, &lt;span style=&#34;color:#e6db74&#34;&gt;:not_found&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; values_in_grid(grid(&lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: map), start_x, start_y, end_x, end_y) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;keys(map)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Enum&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;filter( &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; {x,y} &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; start_x &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; x &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; end_x &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; start_y &lt;span style=&#34;color:#f92672&#34;&gt;and&lt;/span&gt; y &lt;span style=&#34;color:#f92672&#34;&gt;&amp;lt;&lt;/span&gt; end_y &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Enum&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;reduce( %{}, &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt;(key, acc) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;put( acc, key, &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(map, key) ) &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#a6e22e&#34;&gt;@spec&lt;/span&gt; values_near_point_in_grid({&lt;span style=&#34;color:#e6db74&#34;&gt;:grid&lt;/span&gt;, map}, any, any, any) &lt;span style=&#34;color:#f92672&#34;&gt;::&lt;/span&gt; any&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;def&lt;/span&gt; values_near_point_in_grid( grid(&lt;span style=&#34;color:#e6db74&#34;&gt;map&lt;/span&gt;: map), x, y, radius) &lt;span style=&#34;color:#66d9ef&#34;&gt;do&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;keys(map)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Enum&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;filter( &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt; {gx,gy} &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dx &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gx &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; x&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      dy &lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt; gy &lt;span style=&#34;color:#f92672&#34;&gt;-&lt;/span&gt; y&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      (radius &lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt; radius) &lt;span style=&#34;color:#f92672&#34;&gt;&amp;gt;=&lt;/span&gt; ((dx&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dx) &lt;span style=&#34;color:#f92672&#34;&gt;+&lt;/span&gt; (dy&lt;span style=&#34;color:#f92672&#34;&gt;*&lt;/span&gt;dy))&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &lt;span style=&#34;color:#f92672&#34;&gt;|&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Enum&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;reduce( %{}, &lt;span style=&#34;color:#66d9ef&#34;&gt;fn&lt;/span&gt;(key, acc) &lt;span style=&#34;color:#f92672&#34;&gt;-&amp;gt;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;put( acc, key, &lt;span style=&#34;color:#a6e22e&#34;&gt;Map&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;.&lt;/span&gt;get(map, key) ) &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;)&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;end&lt;/span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;You can&amp;rsquo;t do reverse lookups, but that&amp;rsquo;s an easy enough addition you can make to this.&lt;/p&gt;</description>
    </item>
    <item>
      <title>1 Weird CSS Trick</title>
      <link>https://minor.gripe/posts/2020-12-28_1_weird_css_trick/</link>
      <pubDate>Mon, 28 Dec 2020 22:26:17 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-12-28_1_weird_css_trick/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Before we get into anything else, please behold this gross hack:&lt;/p&gt;&#xA;&lt;div class=&#34;highlight&#34;&gt;&lt;pre tabindex=&#34;0&#34; style=&#34;color:#f8f8f2;background-color:#272822;-moz-tab-size:4;-o-tab-size:4;tab-size:4;&#34;&gt;&lt;code class=&#34;language-html&#34; data-lang=&#34;html&#34;&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;head&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;style&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    @&lt;span style=&#34;color:#66d9ef&#34;&gt;keyframes&lt;/span&gt; &lt;span style=&#34;color:#f92672&#34;&gt;spin&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;from&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;transform&lt;/span&gt;: rotate(&lt;span style=&#34;color:#ae81ff&#34;&gt;0&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;deg&lt;/span&gt;); }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#f92672&#34;&gt;to&lt;/span&gt; { &lt;span style=&#34;color:#66d9ef&#34;&gt;transform&lt;/span&gt;: rotate(&lt;span style=&#34;color:#ae81ff&#34;&gt;360&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;deg&lt;/span&gt;); }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    .&lt;span style=&#34;color:#a6e22e&#34;&gt;spinny&lt;/span&gt; {&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;width&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;height&lt;/span&gt;: &lt;span style=&#34;color:#ae81ff&#34;&gt;100&lt;/span&gt;&lt;span style=&#34;color:#66d9ef&#34;&gt;px&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;animation-name&lt;/span&gt;: spin;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;animation-duration&lt;/span&gt;: &lt;span style=&#34;color:#a6e22e&#34;&gt;var&lt;/span&gt;(&lt;span style=&#34;color:#f92672&#34;&gt;--&lt;/span&gt;theta);&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;animation-iteration-count&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;infinite&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;      &lt;span style=&#34;color:#66d9ef&#34;&gt;animation-timing-function&lt;/span&gt;: &lt;span style=&#34;color:#66d9ef&#34;&gt;linear&lt;/span&gt;;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    }&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;style&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;Animation demo&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;h1&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;spinny&amp;#34;&lt;/span&gt;&amp;gt;:(&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--theta: 4000ms&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;spinny&amp;#34;&lt;/span&gt;&amp;gt;:)&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--theta: 2000ms&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;spinny&amp;#34;&lt;/span&gt;&amp;gt;:D&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;    &amp;lt;&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;style&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;--theta: 500ms&amp;#34;&lt;/span&gt; &lt;span style=&#34;color:#a6e22e&#34;&gt;class&lt;/span&gt;&lt;span style=&#34;color:#f92672&#34;&gt;=&lt;/span&gt;&lt;span style=&#34;color:#e6db74&#34;&gt;&amp;#34;spinny&amp;#34;&lt;/span&gt;&amp;gt;XD&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;div&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;  &amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;body&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;span style=&#34;display:flex;&#34;&gt;&lt;span&gt;&amp;lt;/&lt;span style=&#34;color:#f92672&#34;&gt;html&lt;/span&gt;&amp;gt;&#xA;&lt;/span&gt;&lt;/span&gt;&lt;/code&gt;&lt;/pre&gt;&lt;/div&gt;&lt;p&gt;Please load this into a file and view it on your local machine.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Sailing the glass sea</title>
      <link>https://minor.gripe/posts/2020-11-25_sailing_the_glass_sea/</link>
      <pubDate>Wed, 25 Nov 2020 03:49:45 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-11-25_sailing_the_glass_sea/</guid>
      <description>&lt;p&gt;&lt;strong&gt;(Disclaimer: I am not now nor have I ever been a sailor. I hope my meaning survives my nautical ignorance&amp;ndash;if not, please email me and I&amp;rsquo;ll see what I can do. I&amp;rsquo;ve probably also made some errors in the ecology as well.)&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;I.&lt;/strong&gt;&lt;/p&gt;&#xA;&lt;p&gt;You wake up in your cabin, stretching up from your berth and groggily gathering your morning routine&amp;ndash;the tea, the water, fresh clothes, perhaps a shave. The sun lazily crawls up through the windows and slowly slides down the wall as you rouse yourself.&lt;/p&gt;</description>
    </item>
    <item>
      <title>On Slack and Software Teams</title>
      <link>https://minor.gripe/posts/2020-10-29_on_slack_and_software_teams/</link>
      <pubDate>Thu, 29 Oct 2020 19:43:54 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-10-29_on_slack_and_software_teams/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve worked at several companies that had some remote component for collaboration. Sometimes that meant Slack, sometimes Google Chat, sometimes something else, but the experience has given me some thoughts on what works and what doesn&amp;rsquo;t work. I&amp;rsquo;ll focus here on Slack (or similar product) practices.&lt;/p&gt;&#xA;&lt;p&gt;Some of this stuff is aimed at anybody who uses Slack, some of it is aimed at people who are organizing teams&amp;ndash;there is hopefully something here to help everybody.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Where I&#39;d like to work</title>
      <link>https://minor.gripe/posts/2020-10-06_where_i_d_like_to_work/</link>
      <pubDate>Tue, 06 Oct 2020 21:17:43 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-10-06_where_i_d_like_to_work/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;A &lt;a href=&#34;https://lobste.rs/s/etsfrg/what_makes_great_dev_environment&#34; target=&#34;_blank&#34;&gt;thread&lt;/a&gt; on Lobsters got me thinking&amp;hellip;what would I want out of an ideal emplyoment situation?&lt;/p&gt;&#xA;&lt;p&gt;Since I am cheerfully funemployed as of August, I figure I have the time to delve into this a bit. This is all dreaming big; I am under no illusion that any place like this actually exists. It&amp;rsquo;s naive, but after a decade in industry I think it might be nice to take a break from pragmatism. And yeah, some of these are not the way I live my life currently for one reason or another.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comfynets and owning data</title>
      <link>https://minor.gripe/posts/2020-07-17_comfynet__owning_data/</link>
      <pubDate>Fri, 17 Jul 2020 00:47:35 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-07-17_comfynet__owning_data/</guid>
      <description>&lt;h1 id=&#34;introduction&#34;&gt;Introduction&lt;/h1&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been looking more and more at the ideas behind building comfynets&amp;ndash;small self-hosted collections of tools and pages for communities. I&amp;rsquo;ll probably do a writeup on the sort of stuff I&amp;rsquo;d like to see in one.&lt;/p&gt;&#xA;&lt;p&gt;Anyways, one of the bits of fallout from a backchannel I sysadmin involves the custody of data. We&amp;rsquo;ve got a chat instance setup which supports persistent messaging and so forth, but it&amp;rsquo;s backed by a database. I am currently the only one who has access to said database and I&amp;rsquo;m eventually going to be handing the whole mess off to somebody else in the community to deal with since I don&amp;rsquo;t want the responsibility anymore. Anyways, that&amp;rsquo;s a second tangent and writeup.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Book: Homage to Catalonia</title>
      <link>https://minor.gripe/posts/2020-07-06_book__homage_to_catalonia/</link>
      <pubDate>Mon, 06 Jul 2020 04:14:29 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-07-06_book__homage_to_catalonia/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Today I finished reading George Orwell&amp;rsquo;s &lt;em&gt;Homage to Catalonia&lt;/em&gt;, which is a first-person recounting of his experiences fighting Fascism during the &lt;a href=&#34;https://en.wikipedia.org/wiki/Spanish_Civil_War&#34; target=&#34;_blank&#34;&gt;Spanish civil war&lt;/a&gt;. Scattered thoughts follow.&lt;/p&gt;&#xA;&lt;p&gt;&lt;img src=&#34;https://upload.wikimedia.org/wikipedia/en/4/4a/POUM_Obreros.jpg&#34; alt=&#34;POUM poster&#34;&gt;&lt;/p&gt;&#xA;&lt;h2 id=&#34;the-author&#34;&gt;The author&lt;/h2&gt;&#xA;&lt;p&gt;I want to point out that George Orwell was a true mensch&amp;ndash;and that his wife was amazingly competent and patient, both for putting up with his adventurism and then saving his ass when the secret police came knocking. In the author&amp;rsquo;s own words, he set out to Spain to shoot himself a Fascist, and participated in the most direct of action until he was shot in the throat.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Coming attrations 2020</title>
      <link>https://minor.gripe/posts/2020-01-07_coming_attrations_2020/</link>
      <pubDate>Tue, 07 Jan 2020 03:53:41 +0000</pubDate>
      <guid>https://minor.gripe/posts/2020-01-07_coming_attrations_2020/</guid>
      <description>&lt;p&gt;Little under the weather yesterday and today, so just gonna list some things I&amp;rsquo;ll try to write about soon:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Multisystem deployment with KVM and Nixops&lt;/li&gt;&#xA;&lt;li&gt;NAS Appliance with Nix&lt;/li&gt;&#xA;&lt;li&gt;Fermi estimations and how web development is an embarassment&lt;/li&gt;&#xA;&lt;li&gt;Assorted things standard libraries Should Just Do (tm)&lt;/li&gt;&#xA;&lt;li&gt;Adventures in home smart lighting&lt;/li&gt;&#xA;&lt;li&gt;Thoughts smart city data stores&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Catch y&amp;rsquo;all later.&lt;/p&gt;</description>
    </item>
    <item>
      <title>New Years Gumbo Recipe</title>
      <link>https://minor.gripe/posts/2019-12-30_new_years_gumbo_recipe/</link>
      <pubDate>Mon, 30 Dec 2019 17:39:26 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-12-30_new_years_gumbo_recipe/</guid>
      <description>&lt;p&gt;Every year I do a huge gumbo cookout (8 gallons) with friends for NYE. I figured I&amp;rsquo;d record the recipe for posterity:&lt;/p&gt;&#xA;&lt;h2 id=&#34;gumbo-ingredients&#34;&gt;Gumbo ingredients&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Pack of turkey necks (3 or so)&lt;/li&gt;&#xA;&lt;li&gt;whole bunch of Andouille sausage (pack or two)&lt;/li&gt;&#xA;&lt;li&gt;whole bunch of mild italian sausage (pack or two)&lt;/li&gt;&#xA;&lt;li&gt;a duck (dead, cleaned, boneless if possible)&lt;/li&gt;&#xA;&lt;li&gt;5-10 lbs chicken boneless chicken breasts&lt;/li&gt;&#xA;&lt;li&gt;a handful of bay leaves&lt;/li&gt;&#xA;&lt;li&gt;bunch of file powder&lt;/li&gt;&#xA;&lt;li&gt;bunch of green onions&lt;/li&gt;&#xA;&lt;li&gt;12 qt. (plus or minus) of low-sodium chicken broth&lt;/li&gt;&#xA;&lt;li&gt;3-4 celery bundles (transverse sliced, say 1cm wide)&lt;/li&gt;&#xA;&lt;li&gt;3-4 green bell peppers&lt;/li&gt;&#xA;&lt;li&gt;whole bunch of garlic, minced and whole&lt;/li&gt;&#xA;&lt;li&gt;Lea and Perrins Worcestershire sauce&lt;/li&gt;&#xA;&lt;li&gt;few yellow onions, diced&lt;/li&gt;&#xA;&lt;li&gt;few big cans of diced skinless tomatoes (Rotel or other)&lt;/li&gt;&#xA;&lt;li&gt;couple cups of butter&lt;/li&gt;&#xA;&lt;li&gt;couple cups of white flour&lt;/li&gt;&#xA;&lt;li&gt;whole bunch of okra, sliced (deseed if you want to thin the gumbo a little, leave seeds in if you want to save a lot of time)&lt;/li&gt;&#xA;&lt;li&gt;salt&lt;/li&gt;&#xA;&lt;li&gt;parsley&lt;/li&gt;&#xA;&lt;li&gt;black pepper&lt;/li&gt;&#xA;&lt;li&gt;beer or beverage or your choice&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;No shellfish because I don&amp;rsquo;t want to deal with those allergies at my parties, but otherwise shrimp and crab make for some good eating.&lt;/p&gt;</description>
    </item>
    <item>
      <title>In memoriam: Michael Blair Dye</title>
      <link>https://minor.gripe/posts/2019-12-23_in_memoriam__michael_blair_dye/</link>
      <pubDate>Mon, 23 Dec 2019 00:16:13 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-12-23_in_memoriam__michael_blair_dye/</guid>
      <description>&lt;p&gt;This post was originally going to be about how I provisioned a 20TB NAS using ZFS and NixOS. At lunch today I got word that my old boss and friend Michael (Mike) had &lt;a href=&#34;https://www.bowersfuneralhome.net/obituary/michael-dye&#34; target=&#34;_blank&#34;&gt;passed&lt;/a&gt; a bit over a week ago, so instead I&amp;rsquo;m going to write about a few good memories of him by way of celebrating his life and my privilege of having been part of it for a few years.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick thoughts on web tech for research</title>
      <link>https://minor.gripe/posts/2019-12-16_quick_thoughts_on_web_tech_for_research/</link>
      <pubDate>Mon, 16 Dec 2019 15:35:06 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-12-16_quick_thoughts_on_web_tech_for_research/</guid>
      <description>&lt;p&gt;Once upon a time I worked on a web-hosted research platform for human-robot interaction. My colleague and I partnered to make a nice &lt;a href=&#34;http://www.swarmcontrol.net&#34; target=&#34;_blank&#34;&gt;series&lt;/a&gt; of games which could phone home, log results, and show data.&lt;/p&gt;&#xA;&lt;p&gt;It was built on JS, jQuery, Rails on the backend, and hosted on Heroku. I&amp;rsquo;d later rewrite the backend to be a much smaller &lt;a href=&#34;https://github.com/RoboticSwarmControl/SwarmControlRedux&#34; target=&#34;_blank&#34;&gt;node-based&lt;/a&gt; one. I think we may have been the first group to get ruby on Rails into an ICRA paper!&lt;/p&gt;</description>
    </item>
    <item>
      <title>MVP scope, sanity, and schedule</title>
      <link>https://minor.gripe/posts/2019-12-09_mvp_scope__sanity__and_schedule/</link>
      <pubDate>Mon, 09 Dec 2019 17:19:00 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-12-09_mvp_scope__sanity__and_schedule/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;This is a quick little ramble about the scope of minimum viable products (MVPs), their schedule for creation and delivery, and finally the interplay of those things on developers.&lt;/p&gt;&#xA;&lt;h2 id=&#34;whats-in-an-mvp&#34;&gt;What&amp;rsquo;s in an MVP&lt;/h2&gt;&#xA;&lt;p&gt;The entire purpose of an MVP is to create the simplest, cheapest expression of a business idea possible to test if the market wants the thing you&amp;rsquo;re making.&lt;/p&gt;&#xA;&lt;p&gt;Ways to succeed:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Your MVP should contain be clear, incremental step towards a business feature or idea&amp;ndash;ideally testing only one thing.&lt;/li&gt;&#xA;&lt;li&gt;Your MVP should be instrumented/monitored to figure out if it is actually creating results for the money funnel.&lt;/li&gt;&#xA;&lt;li&gt;Your MVP should be cheap enough you don&amp;rsquo;t care if you need to replace it or throw it away. There&amp;rsquo;s no point in running an experiment if you&amp;rsquo;re not gonna try new things when if it doesn&amp;rsquo;t pan out.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Ways to screw up:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Quick and dirty outage reports</title>
      <link>https://minor.gripe/posts/2019-12-02_quick_and_dirty_outage_reports/</link>
      <pubDate>Mon, 02 Dec 2019 07:14:35 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-12-02_quick_and_dirty_outage_reports/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been assembling furniture and rearranging my office into a semblance of a standing-desk, so I&amp;rsquo;m gonna be pick a quick topic for today.&lt;/p&gt;&#xA;&lt;p&gt;This morning around 0930 I was awakened by a text from a friend who was distressed that a community I sysadmin seemed to have no server active. I immediately sat up in bed, stretched a little, and &lt;del&gt;sprung&lt;/del&gt; shuffled, yawning, into action.&lt;/p&gt;&#xA;&lt;p&gt;I did what I&amp;rsquo;d consider a bare-minimum outage response and report, and I figure I&amp;rsquo;ll share that today.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing priorities</title>
      <link>https://minor.gripe/posts/2019-11-25_testing_priorities/</link>
      <pubDate>Mon, 25 Nov 2019 07:02:30 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-11-25_testing_priorities/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Software testing philosophy is softball subject for blog posts, and after a month of fighting with a NAS build I&amp;rsquo;m in the mood for an easy write-up.&lt;/p&gt;&#xA;&lt;p&gt;This is an adaptation of a work thread where I reflected a bit on testing practices, why we test things, and mostly importantly &lt;em&gt;which things&lt;/em&gt; we as professional developers should emphasize and put in the extra effort for.&lt;/p&gt;&#xA;&lt;p&gt;&lt;strong&gt;Fuckhueg disclaimer:&lt;/strong&gt; The following all assumes that the software being worked on is not library code, being produced to serve as a fundamental reusable component for other folks. It similarly assumes the software isn&amp;rsquo;t being done in a regulatory regime (say, United States DoD or FDA) where testing values and procedures are spelled out. Either of those domains likely requires a different mindset about testing.&lt;/p&gt;</description>
    </item>
    <item>
      <title>An approach to NPC knowledge in persistent MMOs</title>
      <link>https://minor.gripe/posts/2019-11-18_an_approach_to_npc_knowledge_in_persistent_mmos/</link>
      <pubDate>Mon, 18 Nov 2019 04:41:03 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-11-18_an_approach_to_npc_knowledge_in_persistent_mmos/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I used to dabble in amateur game development, and one of the most interesting bits to me was trying to figure out how to make believable, interesting, and alive worlds.&lt;/p&gt;&#xA;&lt;p&gt;There&amp;rsquo;re a whole bunch of interesting resources on trying to render &lt;a href=&#34;http://vterrain.org/&#34; target=&#34;_blank&#34;&gt;large virtual worlds&lt;/a&gt; and &lt;a href=&#34;http://pcg.wikidot.com/&#34; target=&#34;_blank&#34;&gt;procedurally generate&lt;/a&gt; them&amp;ndash;but while the environments are increasingly high-fidelity and cool, the denizens of those environments aren&amp;rsquo;t really seeming to get more interesting.&lt;/p&gt;&#xA;&lt;p&gt;Now, I recognize that there have been some really amazing advances in game NPC AI. There was amazing use of &lt;a href=&#34;https://aiandgames.com/facing-your-fear/&#34; target=&#34;_blank&#34;&gt;STRIPS&lt;/a&gt; &lt;a href=&#34;https://alumni.media.mit.edu/~jorkin/gdc2006_orkin_jeff_fear.pdf&#34; target=&#34;_blank&#34;&gt;planners&lt;/a&gt; in &lt;a href=&#34;https://www.youtube.com/watch?v=BmOOrh5lq7o&#34; target=&#34;_blank&#34;&gt;F.E.A.R.&lt;/a&gt;, for example. &lt;a href=&#34;https://steamcdn-a.akamaihd.net/apps/valve/2009/ai_systems_of_l4d_mike_booth.pdf&#34; target=&#34;_blank&#34;&gt;Left 4 Dead&lt;/a&gt; made some amazing strides both in ally NPC AI and also in dynamic story-beat/encounter generation.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Brief thoughts on value systems</title>
      <link>https://minor.gripe/posts/2019-11-11_brief_thoughts_on_value_systems/</link>
      <pubDate>Mon, 11 Nov 2019 05:46:41 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-11-11_brief_thoughts_on_value_systems/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;A relatively quick little ramble today, inspired by some pre-game chat while eating early dinner and getting ready for the second half of our Delta Green game from last week. One of my friends had been considering asking a person out in spite of their professed interest in chakras, energies, and that sort of thing. Another friend was in favor of bailing on the idea, I was in favor of giving it a shot, and we had gotten into a conversation about value systems. That&amp;rsquo;s how I ended up doing this today&amp;ndash;and I&amp;rsquo;ll cheerfully warn you ahead of time that this is going to be a ramble without any intent of making a strong point. &lt;strong&gt;I&amp;rsquo;m also going to use all kinds of examples of varying taste&amp;ndash;since we&amp;rsquo;re talking about ethics&amp;ndash;so expect things including: sex, violence, politics, child abuse, and so on.&lt;/strong&gt;&lt;/p&gt;</description>
    </item>
    <item>
      <title>My first Delta Green session!</title>
      <link>https://minor.gripe/posts/2019-11-04_my_first_delta_green_session/</link>
      <pubDate>Mon, 04 Nov 2019 14:51:56 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-11-04_my_first_delta_green_session/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Yay!&lt;/p&gt;&#xA;&lt;p&gt;Last afternoon/night I ran my first &lt;a href=&#34;https://en.wikipedia.org/wiki/Delta_Green&#34; target=&#34;_blank&#34;&gt;Delta Green&lt;/a&gt; campaign. I was the Handler (DG equivalent of a &lt;a href=&#34;https://en.wikipedia.org/wiki/Dungeon_Master&#34; target=&#34;_blank&#34;&gt;Dungeon Master&lt;/a&gt;) and three of my buddies were new DG recruits.&lt;/p&gt;&#xA;&lt;p&gt;I spent a couple of days prepping mostly from the &lt;a href=&#34;https://www.drivethrurpg.com/product/175760/Delta-Green-Need-to-Know&#34; target=&#34;_blank&#34;&gt;Need to Know&lt;/a&gt; starter booklet and the &lt;a href=&#34;https://www.drivethrurpg.com/product/181674/Delta-Green-Agents-Handbook&#34; target=&#34;_blank&#34;&gt;Agent&amp;rsquo;s Handbook&lt;/a&gt;. I think the former was more condensed and useful for the first game, but I have no doubt that if we get to slide into some of the more advanced mechanics we&amp;rsquo;ll get good mileage out of the latter.&lt;/p&gt;</description>
    </item>
    <item>
      <title>The People&#39;s Web: Towards a Khyber Pass Browser</title>
      <link>https://minor.gripe/posts/2019-10-28_the_people_s_web__towards_a_khyber_pass_browser/</link>
      <pubDate>Mon, 28 Oct 2019 01:09:24 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-10-28_the_people_s_web__towards_a_khyber_pass_browser/</guid>
      <description>&lt;h2 id=&#34;disclaimer&#34;&gt;Disclaimer&lt;/h2&gt;&#xA;&lt;p&gt;This is all very much a rough idea. There is no spec here, this is the fuzziest of straw-men. As you read this, please keep that in mind.&lt;/p&gt;&#xA;&lt;p&gt;I want to next publish a spec and reference implementation for both a client and server, just to give people a taste of what&amp;rsquo;s possible.&lt;/p&gt;&#xA;&lt;p&gt;This document is not quite enough to do that, but should be enough to make reading that implementation more sensible.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Travel to D.C.</title>
      <link>https://minor.gripe/posts/2019-10-21_travel_to_d_c_/</link>
      <pubDate>Mon, 21 Oct 2019 03:44:53 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-10-21_travel_to_d_c_/</guid>
      <description>&lt;p&gt;So, it looks like I&amp;rsquo;ll be heading out to D.C. tomorrow for a bit on company business. Sort of a quarterly/semi-yearly team get together and retreat. I&amp;rsquo;m usually a fan of retreats, though travel itself I don&amp;rsquo;t really enjoy much anymore. After RC and some miscellaneous adventures last year I suppose I should change my outlook  on that, but I can&amp;rsquo;t quite bring myself to.&lt;/p&gt;&#xA;&lt;p&gt;On the plus side, I know folks there and it&amp;rsquo;s only like 3 hours on the plane. On the minus side, there are a bunch of little things to get done and knowing myself I&amp;rsquo;m going to have trouble getting to bed tonight.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Making your own Bash toolbelt</title>
      <link>https://minor.gripe/posts/2019-10-14_making_your_own_bash_toolbelt/</link>
      <pubDate>Mon, 14 Oct 2019 03:52:58 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-10-14_making_your_own_bash_toolbelt/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;ve been doing a bit of work lately setting up a new machine for my job, and in the process making some scripts that can ease the process for later developers. The whole thing is written in Bash. Why might you find yourself wanting such a thing?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;a href=&#34;https://en.wikipedia.org/wiki/Bash_%28Unix_shell%29&#34; target=&#34;_blank&#34;&gt;Bash&lt;/a&gt; (or some other shell, probably Bash-compatible) is available nearly everywhere, so your tooling won&amp;rsquo;t need other tooling to bootstrap it&lt;/li&gt;&#xA;&lt;li&gt;Bash is relatively easy to use for stringing together common operations&lt;/li&gt;&#xA;&lt;li&gt;Having a common helper toolbelt with sub-commands (like you&amp;rsquo;d see with &lt;a href=&#34;https://devcenter.heroku.com/articles/heroku-cli&#34; target=&#34;_blank&#34;&gt;Heroku toolbelt&lt;/a&gt;) can save you a tremendous amount of time&lt;/li&gt;&#xA;&lt;li&gt;Encouraging teammates to build out commands for commons tasks insulates you if the precise details for those tasks change (say, switching from one way of tagging builds to another, etc.)&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;Downsides to this:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Character Sheet for developers, D&amp;D-style</title>
      <link>https://minor.gripe/posts/2019-10-07_character_sheet_for_developers__d_d_style/</link>
      <pubDate>Mon, 07 Oct 2019 01:25:13 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-10-07_character_sheet_for_developers__d_d_style/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;One of my hobbies and fun things in life is to play tabletop role-playing games. I thought it might be fun to play with that a bit.&lt;/p&gt;&#xA;&lt;p&gt;The system I&amp;rsquo;ve probably spent the most time in is &lt;a href=&#34;https://paizo.com/pathfinder&#34; target=&#34;_blank&#34;&gt;Pathfinder 1st ed.&lt;/a&gt;, though in college we used to play a whole bunch of Dungeons and Dragons 3 and 3.5 editions. These systems are all basically related, and there are some handy &lt;a href=&#34;http://www.d20srd.org/&#34; target=&#34;_blank&#34;&gt;online references&lt;/a&gt;.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A ramble on large-scale virtual worlds</title>
      <link>https://minor.gripe/posts/2019-08-27_a_ramble_on_large_scale_virtual_worlds/</link>
      <pubDate>Tue, 27 Aug 2019 23:16:24 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-08-27_a_ramble_on_large_scale_virtual_worlds/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Going back to &lt;a href=&#34;https://en.wikipedia.org/wiki/Active_Worlds&#34; target=&#34;_blank&#34;&gt;Active Worlds&lt;/a&gt;, I&amp;rsquo;ve always been really fascinated by online virtual worlds. When WoW was just being released and Everquest and Asheron&amp;rsquo;s Call were the big Western MMORPGs, some friends and I had kicked around the idea of a post-apocalyptic FPSMMORPG. We burned a &lt;em&gt;lot&lt;/em&gt; of cycles on it, learning a good deal of programming and art and game design and so forth, but ultimately never really got a product out.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Little projects for programmers</title>
      <link>https://minor.gripe/posts/2019-08-21_little_projects_for_programmers/</link>
      <pubDate>Wed, 21 Aug 2019 22:40:23 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-08-21_little_projects_for_programmers/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I keep a list of little neat projects that I think some programmers might find fun to write for themselves, if not actually &lt;em&gt;use&lt;/em&gt; all the time. I figure I&amp;rsquo;ll list out what they are and give maybe quick blurbs about why I think they&amp;rsquo;re neat projects and some ideas for how to tackle them. I&amp;rsquo;ll do a few more write-ups with more stuff from that list from time to time.&lt;/p&gt;</description>
    </item>
    <item>
      <title>S1&#39;19 Return Statement</title>
      <link>https://minor.gripe/posts/2019-08-10_s1_19_return_statement/</link>
      <pubDate>Sat, 10 Aug 2019 20:34:20 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-08-10_s1_19_return_statement/</guid>
      <description>&lt;p&gt;I&amp;rsquo;ve spent the last several months in the Summer 1 2019 batch at the &lt;a href=&#34;https://www.recurse.com/&#34; target=&#34;_blank&#34;&gt;Recurse Center&lt;/a&gt;. The whole trip has been a really interesting and occasionally intense experience, but I don&amp;rsquo;t regret a moment of it.&lt;/p&gt;&#xA;&lt;h2 id=&#34;what-i-worked-on&#34;&gt;What I worked on&lt;/h2&gt;&#xA;&lt;p&gt;My main project, spanning about ten of the twelve weeks of the time at RC, was a 3D rigid physics engine written in Elixir. I got as far as collision detection, and then got stuck for the last couple of weeks on the project on convex polyhedra intersection. I&amp;rsquo;ve written previously about that, and am planning to keep banging on it in the run-up to &lt;a href=&#34;https://elixirconf.com/2019&#34; target=&#34;_blank&#34;&gt;Elixirconf&lt;/a&gt; this year.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Tetrahedron testing</title>
      <link>https://minor.gripe/posts/2019-08-07_tetrahedron_testing/</link>
      <pubDate>Wed, 07 Aug 2019 21:28:45 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-08-07_tetrahedron_testing/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;One of the weird rabbitholes I fell into while working on the GJK implementation was figuring out how to find the nearest point on a tetrahedron to a query point. This also relates tightly to the idea of finding which Voronoi region a given point corresponds to&amp;ndash;in fact, I elected to update my projection routine to also report which region a given point fell into.&lt;/p&gt;&#xA;&lt;p&gt;The implementation of the thing itself is a bit annoying, since we have to calculate a bunch of barycoords and then figure out which domain (in increasing dimensionality) we may be falling into, but &lt;em&gt;testing&lt;/em&gt; them is even more frought.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ERP Update: Change of course, problems, new adventures</title>
      <link>https://minor.gripe/posts/2019-08-04_erp_update__change_of_course__problems__new_adventures/</link>
      <pubDate>Sun, 04 Aug 2019 18:05:38 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-08-04_erp_update__change_of_course__problems__new_adventures/</guid>
      <description>&lt;h2 id=&#34;current-state-of-the-elixir-rigid-physics-library&#34;&gt;Current State of the Elixir Rigid Physics Library&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create stub physics engine server in Elixir as a GenServer(&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Create visualizer for engine state using Three.js and Phoenix Channels (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add first body type to physics engine: boxes! (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add framework for doing dynamics sans collisions in engine (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add collision detection framework for finding contact manifolds (&lt;strong&gt;abandoned&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add collision restitution code&lt;/li&gt;&#xA;&lt;li&gt;Add friction&lt;/li&gt;&#xA;&lt;li&gt;Add joints and motors&lt;/li&gt;&#xA;&lt;li&gt;&lt;del&gt;Add more types of bodies beyond boxes&lt;/del&gt; (we&amp;rsquo;re going full convex hull, God help me)&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple processes&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple nodes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;changing-course&#34;&gt;Changing course&lt;/h2&gt;&#xA;&lt;p&gt;So, I kinda need a break on this. It&amp;rsquo;s been about ten weeks of banging on it, and the last few haven&amp;rsquo;t been nearly productive enough&amp;ndash;my experience is telling me I need to either switch sub-tasks, or pull the ripcord entirely and switch to something else while I wrap up here at RC.&lt;/p&gt;</description>
    </item>
    <item>
      <title>A simple VN engine</title>
      <link>https://minor.gripe/posts/2019-07-23_a_simple_vn_engine/</link>
      <pubDate>Tue, 23 Jul 2019 18:01:32 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-07-23_a_simple_vn_engine/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;Yesterday, my colleague Anna here at RC got to talking about her game, and being a bit stuck on how to get Javascript to do what she wanted.&lt;/p&gt;&#xA;&lt;p&gt;The game itself sounds to me like it is a sort of visual novel, which can be summarized as:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;There is a current game state, being a current node in the story and an inventory.&lt;/li&gt;&#xA;&lt;li&gt;The current game state is projected into a form that users see.&lt;/li&gt;&#xA;&lt;li&gt;Users can take actions from story nodes to move to other story nodes or re-enter the same story node.&lt;/li&gt;&#xA;&lt;li&gt;Actions are made available based on a predicate run against the game state.&lt;/li&gt;&#xA;&lt;li&gt;Actions may modify game state in various ways, e.g. adding or removing inventory items.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;This is a super simple and rough thing, but we can implement without too much trouble and get something worth hacking on.&lt;/p&gt;</description>
    </item>
    <item>
      <title>ERP Update: new ui, refactors, helpers, capsule-capsule work</title>
      <link>https://minor.gripe/posts/2019-07-15_erp_update__new_ui__refactors__helpers__capsule_capsule_work/</link>
      <pubDate>Mon, 15 Jul 2019 21:58:19 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-07-15_erp_update__new_ui__refactors__helpers__capsule_capsule_work/</guid>
      <description>&lt;h2 id=&#34;current-state-of-the-elixir-rigid-physics-library&#34;&gt;Current State of the Elixir Rigid Physics Library&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create stub physics engine server in Elixir as a GenServer(&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Create visualizer for engine state using Three.js and Phoenix Channels (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add first body type to physics engine: boxes! (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add framework for doing dynamics sans collisions in engine (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add collision detection framework for finding contact manifolds (&lt;strong&gt;in progress, see below&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add collision restitution code&lt;/li&gt;&#xA;&lt;li&gt;Add friction&lt;/li&gt;&#xA;&lt;li&gt;Add joints and motors&lt;/li&gt;&#xA;&lt;li&gt;&lt;del&gt;Add more types of bodies beyond boxes&lt;/del&gt; (we&amp;rsquo;re going full convex hull, God help me)&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple processes&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple nodes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;h2 id=&#34;since-last-update&#34;&gt;Since last update&lt;/h2&gt;&#xA;&lt;p&gt;I fixed a bunch of little annoying things that made working with (and debugging) the engine unpleasant.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Towards better employment contracts, pt. 1</title>
      <link>https://minor.gripe/posts/2019-07-02_towards_better_employment_contracts/</link>
      <pubDate>Tue, 02 Jul 2019 18:13:04 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-07-02_towards_better_employment_contracts/</guid>
      <description>&lt;h2 id=&#34;a-sketch-of-the-problems&#34;&gt;A sketch of the problems&lt;/h2&gt;&#xA;&lt;p&gt;The current situation harms workers, it harms consumers and society, and somewhat unintuitively it hurts most employers themselves.&lt;/p&gt;&#xA;&lt;h3 id=&#34;problems-for-the-worker&#34;&gt;Problems for the worker&lt;/h3&gt;&#xA;&lt;p&gt;Developers unlock or maintain vast economies of scale for companies, allowing profits at scales almost unseen in the history of mankind. At the same time, it seems that developers are increasingly cut off from the fruits of their labor and treated more poorly than they deserve.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Testing out local images.</title>
      <link>https://minor.gripe/posts/2019-06-26_testing_out_local_images_/</link>
      <pubDate>Wed, 26 Jun 2019 15:28:32 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-06-26_testing_out_local_images_/</guid>
      <description>&lt;p&gt;This is a local image!&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;figure class=&#34; --smart-image &#34;&gt;&#xA;    &#xA;    &#xA;        &lt;a target=&#34;_blank&#34; href=&#34;https://minor.gripe/posts/2019-06-26_testing_out_local_images_/images/recurse_test.jpg&#34;&gt;&#xA;            &#xA;            &lt;img src=&#34;https://minor.gripe/posts/2019-06-26_testing_out_local_images_/images/recurse_test_hu_a404b9c0dcfa47fa.jpg&#34; width=&#34;800&#34; alt=&#34;Recurse snapshot&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;        &lt;/a&gt;&#xA;        &#xA;&lt;/figure&gt;</description>
    </item>
    <item>
      <title>ERP update, checking in, surprise devops</title>
      <link>https://minor.gripe/posts/2019-06-24_erp_update__checking_in__surprise_devops/</link>
      <pubDate>Mon, 24 Jun 2019 14:42:49 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-06-24_erp_update__checking_in__surprise_devops/</guid>
      <description>&lt;h2 id=&#34;current-state-of-the-elixir-rigid-physics-library&#34;&gt;Current State of the Elixir Rigid Physics Library&lt;/h2&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create stub physics engine server in Elixir as a GenServer(&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Create visualizer for engine state using Three.js and Phoenix Channels (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add first body type to physics engine: boxes! (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add framework for doing dynamics sans collisions in engine (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add collision detection framework for finding contact manifolds&lt;/li&gt;&#xA;&lt;li&gt;Add collision restitution code&lt;/li&gt;&#xA;&lt;li&gt;Add friction&lt;/li&gt;&#xA;&lt;li&gt;Add joints and motors&lt;/li&gt;&#xA;&lt;li&gt;Add more types of bodies beyond boxes&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple processes&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple nodes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;In the process of working through (and doing so. much. reading.) the issues with integrating angular velocity on a quaternion last week, I cut a &lt;a href=&#34;https://www.hex.pm/packages/graphmath&#34; target=&#34;_blank&#34;&gt;new release (2.0.0)&lt;/a&gt; of Graphmath. Turns out we&amp;rsquo;d been doing quaternions basically entirely incorrectly, so this was a chance to fix that. Things I fixed:&lt;/p&gt;</description>
    </item>
    <item>
      <title>ERP update: Adding rotational dymanics</title>
      <link>https://minor.gripe/posts/2019-06-15_erp_update__adding_rotational_dymanics/</link>
      <pubDate>Sat, 15 Jun 2019 19:50:56 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-06-15_erp_update__adding_rotational_dymanics/</guid>
      <description>&lt;h2 id=&#34;current-state-of-the-elixir-rigid-physics-library&#34;&gt;Current state of the Elixir Rigid Physics library&lt;/h2&gt;&#xA;&lt;p&gt;After a few weeks of on-and-off work (maybe 2 weeks actual work punctuated by coder&amp;rsquo;s block and wonderful socializing here at RC), my timeline looks like this:&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;Create stub physics engine server in Elixir as a GenServer(&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Create visualizer for engine state using Three.js and Phoenix Channels (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add first body type to physics engine: boxes! (&lt;strong&gt;done&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add framework for doing dynamics sans collisions in engine (&lt;strong&gt;in progress, more below&lt;/strong&gt;)&lt;/li&gt;&#xA;&lt;li&gt;Add collision detection framework for finding contact manifolds&lt;/li&gt;&#xA;&lt;li&gt;Add collision restitution code&lt;/li&gt;&#xA;&lt;li&gt;Add friction&lt;/li&gt;&#xA;&lt;li&gt;Add joints and motors&lt;/li&gt;&#xA;&lt;li&gt;Add more types of bodies beyond boxes&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple processes&lt;/li&gt;&#xA;&lt;li&gt;Figure out how to spread the simulation across multiple nodes&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I&amp;rsquo;m currently kinda blargh on this, since it&amp;rsquo;s a long road with a lot of work and not a lot of suprises. That said, it&amp;rsquo;s definetely a bit outside of my comfort zone and has been helping me improve my Elixir understanding (more intuition about processes, more knowledge about debugging, more familiarity with Phoenix Channels) and definitely brushing up on my physics.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Comparing some physics engine APIs</title>
      <link>https://minor.gripe/posts/2019-06-04_comparing_some_physics_engine_apis/</link>
      <pubDate>Tue, 04 Jun 2019 16:01:35 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-06-04_comparing_some_physics_engine_apis/</guid>
      <description>&lt;h2 id=&#34;introduction&#34;&gt;Introduction&lt;/h2&gt;&#xA;&lt;p&gt;I&amp;rsquo;m working at the &lt;a href=&#34;https://www.recurse.com/&#34; target=&#34;_blank&#34;&gt;Recurse Center&lt;/a&gt; on a 3D rigid-body game physics engine in Elixir.&lt;/p&gt;&#xA;&lt;p&gt;What&amp;rsquo;s that mean?&lt;/p&gt;&#xA;&lt;ul&gt;&#xA;&lt;li&gt;&lt;em&gt;3D&lt;/em&gt; is pretty self-explanatory.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Rigid-body&lt;/em&gt; means that the objects being simulated don&amp;rsquo;t deform due to collisions, so more like steel beams and less like wobbly jellyfish.&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Game physics&lt;/em&gt; is meant to describe simulations that are both decent-enough in fidelity for humans to predict behavior of objects and low-enough in fidelity to run in real-time (say, 30-60Hz).&lt;/li&gt;&#xA;&lt;li&gt;&lt;em&gt;Engine&lt;/em&gt; means it should be reusable across other projects and have a clean API.&lt;/li&gt;&#xA;&lt;/ul&gt;&#xA;&lt;p&gt;I want to see what features APIs some various engines support, and go from there. The API&amp;rsquo;s I&amp;rsquo;m looking at are:&lt;/p&gt;</description>
    </item>
    <item>
      <title>Misadventures in CI</title>
      <link>https://minor.gripe/posts/2019-05-30_misadventures_in_ci/</link>
      <pubDate>Thu, 30 May 2019 20:11:26 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-05-30_misadventures_in_ci/</guid>
      <description>&lt;p&gt;Yesterday I spent many, many hours fighting with getting projects setup with CI.&lt;/p&gt;&#xA;&lt;p&gt;For &lt;a href=&#34;https://inch-ci.org/github/crertel/elixir_rigid_physics&#34; target=&#34;_blank&#34;&gt;the Elixir physics engine&lt;/a&gt; I&amp;rsquo;m breaking ground on, I need to setup my usual library infrastructure.&lt;/p&gt;&#xA;&lt;p&gt;For me, I consider the &amp;ldquo;bare minimum&amp;rdquo; for developing a library for other people to be:&lt;/p&gt;&#xA;&lt;ol&gt;&#xA;&lt;li&gt;Master should pass tests at all times&lt;/li&gt;&#xA;&lt;li&gt;100% test coverage&lt;/li&gt;&#xA;&lt;li&gt;100% docs coverage of all APIs&lt;/li&gt;&#xA;&lt;li&gt;Proper SemVer&lt;/li&gt;&#xA;&lt;li&gt;Minimum external dependencies if at all possible&amp;ndash;easier with mathy stuff&lt;/li&gt;&#xA;&lt;/ol&gt;&#xA;&lt;p&gt;The first three are what cost me hours of my life yesterday.&lt;/p&gt;</description>
    </item>
    <item>
      <title>Adding a blog aggregator</title>
      <link>https://minor.gripe/posts/2019-05-29_adding_a_blog_aggregator/</link>
      <pubDate>Wed, 29 May 2019 01:03:49 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-05-29_adding_a_blog_aggregator/</guid>
      <description>&lt;p&gt;After a lot of work today, I&amp;rsquo;ve gotten RSS feed generation implemented for my blog.&lt;/p&gt;&#xA;&lt;p&gt;I then retooled a VPS I had lying around (apparently hoarding machines happens to my accounts as well as my apartment&amp;hellip;) and threw on Ubuntu.&lt;/p&gt;&#xA;&lt;p&gt;This was then setup to do basic file serving and most of the usual lockdown I do for my serves; a good test run, since I&amp;rsquo;ll be doing a workshop on accomplishing exactly this while at Recurse Center. :)&lt;/p&gt;</description>
    </item>
    <item>
      <title>Demoing image dithering</title>
      <link>https://minor.gripe/posts/2019-05-27_demoing_image_dithering_/</link>
      <pubDate>Mon, 27 May 2019 15:59:41 +0000</pubDate>
      <guid>https://minor.gripe/posts/2019-05-27_demoing_image_dithering_/</guid>
      <description>&lt;p&gt;This is a demo for my friend Aaron showing some blog image dithering.&lt;/p&gt;&#xA;&lt;p&gt;A beautiful parrot:&lt;/p&gt;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&#xA;&lt;figure class=&#34; --smart-image &#34;&gt;&#xA;    &#xA;    &#xA;    &lt;a target=&#34;_blank&#34; href=&#34;https://previews.123rf.com/images/prinprince/prinprince1611/prinprince161100259/66286113-lovely-pair-of-green-winged-macaw-parrot-birds-perching-on-the-same-spot-with-beautiful-feathers.jpg&#34;&gt;&#xA;        &#xA;            &lt;img src=&#34;https://minor.gripe/66286113-lovely-pair-of-green-winged-macaw-parrot-birds-perching-on-the-same-spot-with-beautiful-feathers_14952688580059978489_hu_40b553cdcda1ac1c.jpg&#34; width=&#34;800&#34; alt=&#34;Pretty birb&#34; loading=&#34;lazy&#34;&gt;&#xA;&#xA;        &lt;/a&gt;&#xA;        &lt;figcaption&gt;This is a pretty birb.&lt;/figcaption&gt;&#xA;&lt;/figure&gt;</description>
    </item>
  </channel>
</rss>
