<?xml version="1.0" encoding="utf-8"?>
<rss version="2.0" xmlns:dc="http://purl.org/dc/elements/1.1/" xmlns:content="http://purl.org/rss/1.0/modules/content/">
    <channel>
        <title>The Lack Thereof</title>
        <link>https://thelackthereof.org/</link>
        <description>undefined</description>
        <lastBuildDate>Sat, 10 Oct 2026 12:47:45 GMT</lastBuildDate>
        <docs>https://validator.w3.org/feed/docs/rss2.html</docs>
        <generator>https://github.com/jpmonette/feed</generator>
        <item>
            <title><![CDATA[Summer Job Samba Interview]]></title>
            <link>https://thelackthereof.org/tlt-2026.05.16-summer-job-samba-interview</link>
            <guid>https://thelackthereof.org/tlt-2026.05.16-summer-job-samba-interview</guid>
            <pubDate>Sat, 16 May 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[First you get the job Fixing Samba. Then you get the book so you can learn how to Fix Samba. Then you figure out what the actual job entails (... which is not Samba).]]></description>
            <content:encoded><![CDATA[<p>First you get the job Fixing Samba. Then you get the book so you can learn how to Fix Samba. Then you figure out what the actual job entails (... which is not Samba).</p>
<hr />
<p><em>Names and identifying details have been changed to protect the innocent. I'm probably not making this up.</em></p>
<p>Once upon a time, one summer in college, I was staying in Tempe with my girlfriend's family and I needed to get a summer job. I didn't really have any particular ideas about what job I should get. I was even thinking, I don't know, maybe a hotdog stand at the mall or something.</p>
<p>I was walking down Mill Avenue when I saw one of these businesses that exist inside of a cottage house, with a sign out front that said &quot;Web Design.&quot; A couple of people were leaning up against a car talking, and I sauntered up and asked if they were hiring.</p>
<p>They said, well, what do you know? What do you do?</p>
<p>I told them I know a little bit of this, a little bit of that - some web applications, some maybe a little sysadmin Linux-y stuff.</p>
<p>And they asked if I knew Samba. <span>ed: Samba is more or less a Linux application that acts as a Windows file server. Like the L: drive at your work</span></p>
<p>And I said, sure.</p>
<p>They said, well, tell you what. Nice to meet you. My name is Mark. Come over tomorrow at 10 AM, and if you can get our Samba server back up and running, you've got yourself a job.</p>
<p>I said, great. Sounds like a plan. See you tomorrow.</p>
<p>And I walked on. Two or three blocks over to Barnes and Noble, to the computer section, where I got myself a book on Samba and started reading. I had surely done something with Samba before, but it had been a little while. I don't think I actually bought the book, but it was helpful to er ... refresh some details.</p>
<hr />
<p>The next day I showed up, awkwardly knocking on the door. Someone let me in and took me back to Mark. They had sort of a front of house and a back of house, and way in the back was where Mark's office was. I imagine this was originally a 2-bedroom cottage.</p>
<p>He took me around to the server room - a literal closet, but it had a keyboard and a screen and a pretty nice rack-mounted Dell server. He gave me the root password.</p>
<p>Up front they had computers all wired into a network with a shared drive. The machines were all Windows, and they couldn't access the drive. So I poked around the machines a bit, messed with Samba a bit, and just kept digging around until I finally found some configuration option that wasn't quite right. Got it working. Went and chatted with Mark.</p>
<p>He was pretty happy.</p>
<p>He said, well, what kind of money are you looking for? We hadn't actually discussed that up to this point.</p>
<p>I said, well, I'm looking for something that's an alternative to a hotdog stand.</p>
<p>He said, how about $10 an hour?</p>
<p>I said, sure. That'll do.</p>
<p>What kind of hours?</p>
<p>He said, well, we usually start a little late, stay a little late. It'll be PHP web development.</p>
<p>Congratulations. I got the job. Start tomorrow.</p>
<hr />
<p>I can't remember if they gave me a key or if the door was just unlocked. But either way, it was a good thing because I rolled in the next day around 9 AM, wanted to get a good start. Nobody there. I had a machine Mark had put on a table which I assumed was mine, and I started doing all my setup.</p>
<p>Around 10. Nobody.</p>
<p>Around 11, Mark finally came in and started telling me about the different projects we'd be working on.</p>
<p>He had a collection of clients, each with their own specific project setup - usually PHP, sometimes a little WordPress. He'd give me the specifics and give me access to the files, sometimes through an FTP server. Usually I had to almost start from scratch on the development setup, then push up to their server once I had something running.</p>
<p>The weird thing, though, was that I would get just one or two bugs fixed and he'd have me move on to another client. Get one or two bugs fixed, then on to a different client. Each one getting a relatively tiny amount of work.</p>
<p>What I realized was that he was putting off all of these folks. There had previously been some developers, and I don't know how long it had been since they left, but he was scrambling to stay ahead of angry customers. It seemed like all of his clients were angry clients - over-promised and under-delivered - and I was doing just enough work on each of them to make them think progress was being made.</p>
<p>Meanwhile, I started to get familiar with the secondary (or was it primary?) business: a nightlife lifestyle magazine operated out of the front of house. They had a couple of graphic designers, photographers, and an editor, and there was an endless stream of both beautiful people and beautiful photos and lots and lots of advertisements going into these glossy pages. They published weekly or maybe biweekly.</p>
<p>The magazine ran on Photoshop and PageMaker. And sitting right there on that shared drive - the same drive I'd spent my trial interview getting back online - was not only all of their content, but all of their software. With clearly cracked serials. Lots of password.txt and registration_keytxt.crackz files. Lots and lots of professional-grade software, very much not paid for.</p>
<p>It was increasingly obvious that this place operated using any means necessary to cut corners and get things out the door.</p>
<hr />
<p>The front of house was run by another guy named Marc - Marc with a C - who was in charge of the magazine. Mark with a K was in charge of the web stuff, the investor, the business partner. There was also a main layout editor who did a lot of the heavy lifting. Sometimes when I came in around 8am or 9am, he'd already be there.</p>
<p>I'd say, you got an early start?</p>
<p>He had not, in fact, left from the night before. Pounding energy drinks (and who knows what else). Printer deadline!</p>
<p>Meanwhile, the biggest perk I had was a fridge full of Sobe <span>ed: A sugary fruit drink in a glass bottle with some cool lizards; see <a href="https://en.wikipedia.org/wiki/SoBe" rel="nofollow">SoBe on wikipedia</a></span>. I am partial to orange Sobe, and I had an unlimited supply. They tended to play house and techno music, pretty loud, all the time.</p>
<p>It was cool. A little weird. Had sort of a shady vibe. OK maybe very shady.</p>
<p>Between the beautiful people in the front of the house and me stuck way in the back, this random guy who just handed me his root password as a trial interview, helping rob Peter to pay Paul in terms of software development, the heavy ad-based front business - I never really felt like I quite knew what was going on.</p>
<p>And I didn't realize it would just keep going, getting stranger as we went all summer.</p>
<p>Definitely more interesting than working at a hotdog stand in the mall.</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Agent-Researcher Helping With reMarkable Ghostwriter]]></title>
            <link>https://thelackthereof.org/tlt-2026.03.08-agent-researcher-helping-with-remarkable-ghostwriter</link>
            <guid>https://thelackthereof.org/tlt-2026.03.08-agent-researcher-helping-with-remarkable-ghostwriter</guid>
            <pubDate>Sun, 08 Mar 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[With Ghostwriter I inject pen input on the device to show the output of LLM (Claude, ChatGPT, Gemini, etc) on-device. But the result is a bit messy. So here I give Claude Code some direction and access to the device to iterate experimentally!]]></description>
            <content:encoded><![CDATA[<p>With <a href="https://thelackthereof.org/ghostwriter">Ghostwriter</a> I inject pen input on the device to show the output of LLM (Claude, ChatGPT, Gemini, etc) on-device. But the result is a bit messy. So here I give Claude Code some direction and access to the device to iterate experimentally!</p>
<p>Here is my initial prompt:</p>
<blockquote><p>I would like to perfect drawing on the reMarkable using the pen, which can then be used to more quickly draw SVG or images to the screen using the injected pen input. Toward this end, I want you to set up an experiment loop. I have the remarkable available via <code>ssh rmpp</code> where you can run remote commands, including test commands that we scp over. We could also set up a remote-control that can act as a tool, so like a cli debug version of ghostwriter that runs one command and exits or accepts commands over http or something like that. In any case, you can run code on the thing and treat it like a remote-computer-use situation -- take screenshots, inject input, take a screenshot to verify the result. You can send pen and touch input. You can get a new page by swiping from right to left and then tapping the new-page icon that comes up on the right side, for example. You can tap on the tools menu, the tiny circle in the upper-left, and use that to see tools. You can tap with two-fingers at once to undo.</p><p>So what I want is for you to bootstrap up some experiments to verify your capabilities, ultimately leading to an improvement in the drawing tools for ghostwriter -- especially the ability to accurately render SVG and png content using the injected pen input.</p><p>For example, you could iteratively (by a series of screenshots and pen/touch injection) verify that you can accurately:</p><ul><li>Draw a horizontal line</li><li>Draw a vertical line</li><li>Draw a diagonal line</li><li>Draw a dot at any x/y coordinate</li><li>Draw a triangle</li><li>Draw a single dot</li><li>Draw a png as a bunch of dots</li><li>Trace an SVG</li></ul><p>Between each you could send a bunch of undo-touches or try to go to a new page so that you can see what is happening. You can also experiment with being able to quickly change between tools. There are two pens, so one idea is that pen-1 is for the human and pen-2 is for ghostwriter.</p><p>From these series of built up experiments we should be able to document how to interact accurately and reliably with the screen to render content via pen input.</p></blockquote>
<p>That got it going really well. I had to give it a bunch of permissions to get the loop going, but soon it was trying something, taking a screenshot, deciding on the result, and then trying something else. I also had to steer it a bit to be more precise... it kept concluding &quot;give or take 5px is fiiinneeee&quot;.</p>
<p>It built an &quot;experiment&quot; binary that takes cli commands to draw. I had to coach it a bit on clearing the screen or getting a new screen, and how to avoid (or on purpose utilize) the tool menu. Now step by step it is getting better and better at pen drawing. We are working our way up to drawing smooth polylines from svgs and even outline fonts.</p>
<p>The general technique of giving Claude Code a way to observe results and an overall goal (even a vague one like &quot;be better&quot; or &quot;increase accuracy&quot;) works really well. Now it is chomp chomp chomping on tokens and doing small experiments to find bugs and alternate techniques for operating the reMarkable.</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Modern Coding Discomfort, or, Four Colors Suffice]]></title>
            <link>https://thelackthereof.org/tlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice</link>
            <guid>https://thelackthereof.org/tlt-2026.02.22-modern-coding-discomfort-or-four-colors-suffice</guid>
            <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Some thoughts on modern generative code discomfort and the Four Color Problem]]></description>
            <content:encoded><![CDATA[<p>Some thoughts on modern generative code discomfort and the Four Color Problem</p>
<h2 id="four-colors-suffice">Four Colors Suffice</h2>
<p>There is this little puzzle called the map coloring problem. If you have a map - let's say of countries - and you have some different colored crayons, you need to fill in each country so that no two countries touching each other share the same color.</p>
<p>In the 1970s, mathematicians finally worked out a proof that you only need four colors. The problem is that, unlike many proofs before it where you'd come up with some cool underlying pattern or elegant structure, the proof they came up with was to first enumerate all of the different possible equivalent configurations of a map. This is pretty cool - but it came out to something like just under 2,000 different combinations. Using 1970s computing technology, the proof was to get a computer to go through every single combination and demonstrate, for every single one, that you could color it with only four colors directly or through a simplifying transformation.</p>
<p>Mathematicians at the time found this very, very unsatisfying. The only way to understand the proof was to read through every possibility, which was kind of crazy. There was nothing special in the solution - it felt like a coincidence that four colors suffice. It boiled down to pages and pages of &quot;I tried combination one. That one worked. I tried combination two. That one worked.&quot; All the way through, with no underlying structure, no unique beauty, and nothing you could really build anything else on top of.</p>
<p>Here we are in 2026, and in software engineering people keep putting up pull requests which are not small and elegant. They solve the problem, and yet they are dissatisfying. They are too long to read. Submitting the pull request makes us feel like we have not provided meaning, only an answer. A maintainer trying to work through a flood of large pull requests is like looking for the pattern in the four color theorem. It is not there - because it turns out it doesn't need to be there in order to solve the problem.</p>
<p>In programming we've had this problem of unreviewable details before, but now we need a new way to build trust.</p>
<h2 id="the-glass-box">The Glass Box</h2>
<p>Software has always been a kind of layered glass box. You could peer inside, see what was happening, understand how the machine was doing what you asked of it.</p>
<p>When I first learned to program, I did it across multiple levels - high-level languages, medium-level languages, and assembly. I used to program on TI graphing calculators in assembly, often hand-translating the op codes to hexadecimal. I made a compiler that could take TI Basic and translate it down into assembly, which was pretty cool - though it would write assembly that wasn't as optimized as what I was writing by hand. It would spit out so much that I couldn't really read it, and that made me worry about inefficiency, about losing nuance, about the code losing the aesthetic of the system. Soon better hardware came into my life, more high-level systems, and I moved on.</p>
<p>After a while, you don't really want to constantly be thinking about whether memory is growing from the bottom up or the top down, where the stack and heap are, how to manage pointers. After a while, you don't even want to worry about garbage collection. You just want stuff to work.</p>
<p>As you move up these levels of abstraction, it's like you take each lower level and put it in a box. Maybe it's a semi-transparent box where you know roughly what's happening underneath, but you care less and less. Then you take that level and put it inside another box. You can squint through and sort of see, but you see less and less. You can open the boxes when you need to - you can get back inside and see what's going on. But for the most part, if it's a good box, you don't really care what's going on inside.</p>
<p>What makes people eventually stop worrying is that you build up trust. Your tools build up capability to where you can write a smaller, more abstract chunk of code, and it does what you need with less fiddling. Less control, but usually less control in dimensions you don't really care about - like where specifically the bytes are in memory. Sometimes it constrains you in ways you do care about, like vertically centering text in CSS being a real pain. But most of the time, you're able to build up trust in your higher level system because it lets you move faster, get your idea out on screen, let people interact with it faster than you could have before.</p>
<p>Less control in dimensions you don't really care about. That's the deal you keep making, one abstraction layer at a time.</p>
<h2 id="whats-actually-happening-with-ai-generated-code">What's Actually Happening With AI-Generated Code</h2>
<p>Here's the thing people get wrong about AI-generated code: it's still just code. You can look at it, peel it apart, figure out how it works, figure out what it's doing and what it's not doing. The issue isn't that it's mysterious or non-deterministic in any fundamental sense. The issue is quantity. There is simply more code than anyone can read.</p>
<p>This is exactly where the overlap with the four color theorem comes in. There were so many individual cases that the proof was more or less to enumerate all of them - and that made it too much to fit in a human brain. It doesn't take away from the fact that this is still ultimately deterministic. Things can be sloppy without losing determinism.</p>
<p>People get distracted because LLMs generate code somewhat non-deterministically - ask the same prompt three times and you'll get three different implementations. But if you judge the solutions based on their behavior, if you look at all three and pick the one that behaves most like what you want, you still have a system. You still have execution you can run and observe.</p>
<p>So when you have some monster pull request and you're a little nervous about merging it, what do you actually do? You pull it down and start treating it as a more opaque box. Check out the behavior. Check out whether it works, whether it does the original thing. Try out a few edge cases and see how it feels. I still sometimes scan the code looking for something obvious that's trying to escape its little box, a view page with SQL embedded or something - the more contained it is, the better. But for the most part, you treat it more like a found object than a beautifully constructed theorem.</p>
<p>This is also where a tempting instinct leads you astray. You might think: &quot;They generated that code through prompts, through some kind of English-level specification - let's hold on to that.&quot; The problem is that your prompts are already trying to account for your current situation, the capabilities of your model, the assumptions it has, the rest of the codebase at that time. Your prompt is not really something worth saving in the way source code is worth saving. If you run the same prompt multiple times, you get different results. Run it against different models, you get different results.</p>
<p>The prompt isn't like high-level JavaScript compared to assembly. If you take your high-level JavaScript and execute it, you end up with pretty much the same thing each time. Take your high-level prompt, and you could end up with something quite different. Your LLM is adding something to it - it's adding a snapshot of its current data and style, its taste based on the training and context.</p>
<p>This means the whole world is flipped on its head. Historically, you should not commit build artifacts - they don't belong in your tree. Now it feels like the opposite. There is no point in committing the construction; you're only committing the build artifact. Your version history becomes much more like a transaction log of your artifact than a journal of an engineer.</p>
<p>You might save a prompt as documentation, as inspiration if you ever wanted to start over - but it isn't an artifact. You can't validate behavior at the prompt level. You have to validate it at the resulting code level, at the behavior level.</p>
<h2 id="rigor-doesnt-disappear-it-relocates">Rigor Doesn't Disappear - It Relocates</h2>
<p>So where does that leave us? We have these generated artifacts and throw-away prompts, and we need to start shifting how we think about the whole situation. We need to treat the artifacts as found pieces - things generated more like material science than traditional engineering. We can't depend on the underlying construction since we did not construct anything ourselves. We need to pressure test the actual thing, the actual result.</p>
<p>We can look to other disciplines for guidance here. Material science? Structural engineering? Folks who do testing on things to see how well they work. You can still gain a lot of insight if you understand how something works - that knowledge should give you better ideas about how to break it, how to pressure test it, how to make sure it fits your actual goals, and even what compromises you might be making. But even without that knowledge you can hit something a few times with a hammer to see if it breaks.</p>
<p>In practical terms: you might observe through real usage that a piece of AI-generated code isn't going to scale because of memory constraints, or you hit it with more than a couple dozen concurrent users and it falls apart. That might then lead you to find out exactly when it does fall apart, and to spend more of your time prodding at the outside of the black box rather than trying to comprehend it and build it up from first principles on the inside. More of a behavioral science than a dissection or construction.</p>
<p>Like the Four Color Problem, we must give up elegance and embrace observation.</p>
<p>The rigor applied toward validation has always been in service of building trust. If you can build trust through behavioral evidence instead of through reading the source, the rigor hasn't gone away - it's just relocated. The person who understands crystalline structures doesn't run the stress test any differently than someone who doesn't, but they know which stress tests to run. Deep knowledge of how things work still gives you an advantage. It just expresses itself differently now.</p>
<h2 id="the-new-practitioner">The New Practitioner</h2>
<p>I think about how much it actually matters that I know how a NAND gate works at the transistor level. It's genuinely fun to know. I can draw inspiration from it for higher-level concepts. But I can build a lot of things without ever having lifted a soldering iron.</p>
<p>A lot of people new to building software haven't had the background and traditional skills that would let them peer inside these boxes. Up until now, they could operate as QAs, as users, as people able to judge results - but generating the artifact itself was hard to do without years of accumulated knowledge. That's changing.</p>
<p>Someone coming to coding now should use tools like Claude Code to generate artifacts. They need to be technical, working through details on top of their creative prompting. They'll still need to think about how things fit together. But they can start from the other end, from the imagined outcome, more extremely than ever before. They can generate, magic-wand an artifact into existence, and then push on it with interactive and even real-world testing.</p>
<p>As they do this, the more they scratch into it - thinking about edges, failure modes, how other people are going to interact with it - the better they'll get. If they can get all the way down into the fundamentals, down into the black box a bit, they'll have more powerful techniques. But they might not need that. They will be able to trial-and-error their way into some really amazing things.</p>
<h2 id="the-invitation">The Invitation</h2>
<p>In the end, Four Colors Suffice.</p>
<p>We don't need to understand why from first principles; we can convince ourselves via other means. Grab a couple maps, a couple crayons. Give it a try. You might not be able to get through all 2,000-ish combinations, but you can get through a few and build up your faith that it's probably fine. You end up with some very beautiful little maps.</p>
<p>You might not be able to see all the way through these layers of abstraction, these boxes inside of boxes. But you can build some amazing things. You can share some amazing things. You can make ideas and visions come to life that never could have made it through before - not because the tools are magic, but because the barrier to making something real has changed.</p>
<p>And if you do have the ability to get down into the details, you can still help other folks out when they get stuck. You can design better experiments, ask smarter questions, push on edges in ways that matter.</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Pierre Menard in the House]]></title>
            <link>https://thelackthereof.org/tlt-2026.02.22-pierre-menard-in-the-house</link>
            <guid>https://thelackthereof.org/tlt-2026.02.22-pierre-menard-in-the-house</guid>
            <pubDate>Sun, 22 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[I've just finished reading House of Leaves in a book club.]]></description>
            <content:encoded><![CDATA[<p>I've just finished reading House of Leaves in a book club.</p>
<p>One of my favorite bits from the House of Leaves is that all through the whole thing there's all these footnotes and they're basically all just made up references to random academic journals or speeches or things that don't exist. And then out of nowhere in one of the citations, they are talking about the Frenchman <a href="https://en.wikipedia.org/wiki/Pierre_Menard,_Author_of_the_Quixote" rel="nofollow">Pierre Menard</a> and mentioning it as fact, someone who is attempting (succeeding) to recreate Don Quixote.</p>
<p>This is actually a Jorge Louis Borges quote and a piece of one of his writings, which is completely unattributed inside of the House of Leaves footnote. It's like they are citing the fictional book, not the actual Borges book, but they didn't even cite the fictional book. Maybe both stories are set in the same universe.</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[RPM Challenge 2026]]></title>
            <link>https://thelackthereof.org/rpm-challenge-2026</link>
            <guid>https://thelackthereof.org/rpm-challenge-2026</guid>
            <pubDate>Mon, 02 Feb 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Mostly using Rotae Versantur]]></description>
            <content:encoded><![CDATA[<p>Mostly using <a href="https://thelackthereof.org/rotae-versantur">Rotae Versantur</a></p>
<p><audio controls="true" preload="metadata" src="https://thelackthereof.org/_ipx/_//docs/music/things_to_say_v1.mp3"></audio> (<a download="docs/music/things_to_say_v1.mp3" external="" href="https://thelackthereof.org/docs/music/things_to_say_v1.mp3">download</a>) - You and Me and The Devil</p>
<h2 id="things-to-say-you-and-me">Things to Say (You and Me)</h2>
<p>I've been rolling the chorus-bits around for a few years, now trying to figure out how to glue it together. With the four-track I first sang it a bit, then doot-da-doot a bit, then sing it better, then add some bass.</p>
<p><audio controls="true" preload="metadata" src="https://thelackthereof.org/_ipx/_//docs/music/things_to_say_v1.mp3"></audio> (<a download="docs/music/things_to_say_v1.mp3" external="" href="https://thelackthereof.org/docs/music/things_to_say_v1.mp3">download</a>)</p>
<p>Next ... I might start over :)</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Jamuary 8]]></title>
            <link>https://thelackthereof.org/tlt-2026.01.08-jamuary-8</link>
            <guid>https://thelackthereof.org/tlt-2026.01.08-jamuary-8</guid>
            <pubDate>Thu, 08 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[So Damn Cute]]></description>
            <content:encoded><![CDATA[<p>So Damn Cute</p>
<p><audio controls="true" preload="metadata" src="https://thelackthereof.org/_ipx/_//docs/music/so_damn_cute_v1.mp3"></audio> (<a download="docs/music/so_damn_cute_v1.mp3" external="" href="https://thelackthereof.org/docs/music/so_damn_cute_v1.mp3">download</a>)</p>
<p>Practice using <a href="https://thelackthereof.org/rotae-versantur">Rotae Versantur</a></p>
<p>Well I love you<br />
'cause you're so damn cute<br />
and when the people ask me why<br />
well the question is moot</p>
<p>because I love you dearly<br />
from your head to your toe<br />
and if you're going somewhere<br />
well that's where I'll go</p>
<p>because I love you<br />
'cause you're so damn cute<br />
and you might ask why<br />
well I'll tell you the truth</p>
<p>It's 'cause you're so cool<br />
and you're so nice<br />
and if you asked me on a date<br />
don't need to ask twice</p>
<p>when you come a round<br />
I just lose my head<br />
when I hear your name<br />
my whole face turns red</p>
<p>because I love you<br />
'cause you're so damn cute<br />
because I love you<br />
'cause you're so damn cute<br />
because I love you<br />
'cause you're so damn cute<br />
because I love you<br />
'cause you're so damn cute</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Rotae Versantur]]></title>
            <link>https://thelackthereof.org/rotae-versantur</link>
            <guid>https://thelackthereof.org/rotae-versantur</guid>
            <pubDate>Sat, 03 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[The Wheels Turn. A monome norns+arc four track inspired recorder.]]></description>
            <content:encoded><![CDATA[<p>The Wheels Turn. A monome norns+arc four track inspired recorder.</p>
<h2 id="concept">Concept</h2>
<p>The idea is to have four audio tracks that we play back and record against, one assigned to each wheel (knob control on the Arc).</p>
<p>See the project on <a href="https://github.com/awwaiid/rotae_versantur" rel="nofollow">github</a></p>
<p>Equipment:<br /><a href="https://monome.org/docs/norns/" rel="nofollow">Monome Norns</a> (though I technically have the <a href="https://monome.org/docs/norns/shield/" rel="nofollow">Monome Norns Shield</a>)</p>
<p><img alt="" src="https://monome.org/docs/norns/image/norns-shield.png" /></p>
<p><a href="https://monome.org/docs/arc/" rel="nofollow">Monome Arc</a></p>
<p><img alt="" src="https://monome.org/docs/arc/images/arc.jpg" /></p>
<h2 id="instructions">Instructions</h2>
<ul><li>Use the Arc to visualize and control a four-track recording and playback machine</li><li>Button release
<ul><li>Toggle Rolling vs Stopped</li></ul></li><li>Turn a Wheel
<ul><li>Set <span>MODE</span> for that track</li><li>Amp, Pan, Reverb, Tone</li></ul></li><li>Button + Wheel 1
<ul><li>Seek</li></ul></li><li>Button + Wheel 2
<ul><li>Set MODE</li><li>Amp, Pan, Reverb, Tone</li></ul></li><li>Button + Wheel 3
<ul><li>Select recording track</li></ul></li><li>Button + Wheel 4
<ul><li>Select bounced tracks, they then feed recording</li></ul></li></ul>
<h2 id="thoughts">Thoughts</h2>
<p>This is a non-DAW setup, the idea being that we want more than a single recording but less than the distraction of an overly powerful computer. Four track recorders have been used to make a lot of great things, they appear to be sufficient for some complex pieces. Why buy one when I could buy something even more expensive and write some Lua and Supercollider code?</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Jamuary 2]]></title>
            <link>https://thelackthereof.org/tlt-2026.01.02-jamuary-2</link>
            <guid>https://thelackthereof.org/tlt-2026.01.02-jamuary-2</guid>
            <pubDate>Fri, 02 Jan 2026 00:00:00 GMT</pubDate>
            <description><![CDATA[Practice on my norns-powered digital four track: Hotel Yorba cover (including mistakes, heh)]]></description>
            <content:encoded><![CDATA[<p>Practice on my norns-powered digital four track: <a href="https://thelackthereof.org/docs/music/2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3" rel="nofollow">Hotel Yorba cover</a> (including mistakes, heh)</p>
<p><audio controls="true" preload="metadata" src="https://thelackthereof.org/_ipx/_//docs/music/2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3"></audio> (<a download="docs/music/2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3" external="" href="https://thelackthereof.org/docs/music/2026-01-02%20Rotae%20Practice%20-%20Hotel%20Yorba.mp3">download</a>)</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[A DX/DevOps Pattern: bin/service]]></title>
            <link>https://thelackthereof.org/bin-service-pattern</link>
            <guid>https://thelackthereof.org/bin-service-pattern</guid>
            <pubDate>Invalid Date</pubDate>
            <description><![CDATA[One pattern I like a lot is a bin/service wrapper. In each of your services (I like to call them Macro Service instead of Microservice).]]></description>
            <content:encoded><![CDATA[<p>One pattern I like a lot is a <code>bin/service</code> wrapper. In each of your services (I like to call them <a href="https://thelackthereof.org/macro-service">Macro Service</a> instead of <a href="https://thelackthereof.org/microservice">Microservice</a>).</p>
<p>The idea is to provide a few key things:</p>
<ul><li>Simple tools for developers to manage the service</li><li>Lifecycle hooks for deployment</li><li>All wrapped up in code, providing executable self-documentation</li></ul>
<p>Imagine this:</p>
<pre><code>Usage: bin/service &lt;command&gt;

Commands:
    system-setup          # Install machine dependencies (may require sudo)
    init                  # Initialize config files and the DB
    build                 # Build (rebuild) the image to get new deps
    start [service]       # Start up the app or a specific sub-service
    run [cmd] [args]      # Run a command in the 'web' sub-service
    stop                  # Stop the app
    status                # Get the app status

Deployment Commands:
    deploy &lt;env&gt;          # Deploys an environment using CI
    force-deploy &lt;env&gt;    # Deploys an environment using your machine

Database Commands:
    reset-db-from-staging # Download/restore from staging database
    reset-test-db         # Reset local test database (load schema/seed)
    db-snapshot &lt;file&gt;    # Use local psql to snapshot a DB dump to a local file
    db-restore &lt;file&gt;     # Use local psql to load a DB dump into the running db

Lifecycle Commands, used by Kubernetes/Helm:
    boostrap-job          # Entrypoint for bootstrap job
    start-web-pod         # Entrypoint for web pod
    start-worker-pod      # Entrypoint for starting the worker pod
    stop-worker-pod       # Entrypoint for stopping the worker pod
    upgrade-job           # Entrypoint for upgrade job
    build-assets          # Build step to compile assets prior to container build
    shell                 # Entrypoint for bash process (for a debugging pod)
</code></pre>
<p>These service-oriented commands don't really care what your internal-app tech stack is. But by standardizing the commands you can depend on them in a bunch of contexts. The most important is that you can run them both in your dev env, and then the lifecycle hooks can be part of a helm chart setup. You can have one generic chart that can manage any service that conforms to this general shape.</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/brock-logo-outline-80x100.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Gremllm]]></title>
            <link>https://thelackthereof.org/tlt-2025.07.12-gremllm</link>
            <guid>https://thelackthereof.org/tlt-2025.07.12-gremllm</guid>
            <pubDate>Sat, 12 Jul 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A project which puts LLM-powered gremlins right into your runtime!]]></description>
            <content:encoded><![CDATA[<p>A project which puts LLM-powered gremlins right into your runtime!</p>
<p><img alt="Gremllm cartoon" src="https://thelackthereof.org/_ipx/_/img/Gremllm_cartoon.png" /></p>
<p>As previously mentioned, I enjoy trying out new tech like claude-code, making esoteric and ill-advised libraries that are maybe-jokes, pushing on meta-models and run-time <code>eval</code>, and like many others I don't mind 5 minutes of fame. So by that measure, TOTAL SUCCESS!</p>
<p>Let's start with what this new <code>Gremllm</code> library that I made can do:</p>
<pre><code>from gremllm import Gremllm

counter = Gremllm('counter')
counter.value = 0
counter.increment()
counter.increment(5)
counter.add_seventeen()
print(counter.current_value)
print(counter.value_in_hex)
counter.reset()
</code></pre>
<p>To be clear -- each of those methods is completely made up. At runtime when you invoke a method it is <em>at that moment</em> sent over to the LLM (ChatGPT in this case) to generate the python code, which is then executed. It's like claude-code, but at runtime!</p>
<p>Speaking of which, I built Gremllm <em>using</em> Claude Code, which I've been using a lot lately. I'm not always convinced that it is faster, and I'm not always convinced that it is slower, but it is fun enough that I am making stuff that I might not make otherwise at the very least.</p>
<p>Using Claude Code did have some trickery. The biggest thing is that it kept wanting to run my <code>eval</code> (or in Python it is actually <code>exec</code>) in some sort of sandbox, and I had to be like &quot;no... please do this dangerous thing. Really!&quot;. Even now it is doing some things that are more safe than I would have done if it was completely written by hand.</p>
<style>html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}</style>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/Gremllm_cartoon.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Helped That One]]></title>
            <link>https://thelackthereof.org/tlt-2025.03.28-helped-that-one</link>
            <guid>https://thelackthereof.org/tlt-2025.03.28-helped-that-one</guid>
            <pubDate>Fri, 28 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Taking inspiration from The Star Thrower; Action, even in the face of futility, is the path I take.]]></description>
            <content:encoded><![CDATA[<p>Taking inspiration from <a href="https://thelackthereof.org/the-star-thrower">The Star Thrower</a>; Action, even in the face of futility, is the path I take.</p>
<p><img alt="The Ocean" src="https://thelackthereof.org/_ipx/_/img/The_Ocean.png" /></p>
<hr />
<p>I recall from childhood church sermons the story of the Starfish Thrower. One of my favorite parables, it tells the story of two people walking along a beach. One of them bends down now and again to pick up a living starfish and fling it into the sea. The second person asks why? What is the point? There are millions of these things on the beach - you cannot save them all. The first person reaches down, picks up a starfish and tosses it with a flick of their wrist far out to sea, then they look at their companion and they say, simply, &quot;Saved that one.&quot;</p>
<p>Dozens of variations of this story are told. I've always loved it, and like to think that I live by the simple idea that one contribution, one bit of effort, has value even in the face of overwhelming opposition to success.</p>
<blockquote><p>&quot;The stars,&quot; he said, &quot;throw well. One can help them.&quot;</p></blockquote>
<p>I like to help people. The other day I took a call to help someone as they look for a job, just starting out their career and finding themselves in the worst job market of my lifetime. I can't do much directly, but I try to advise, give some ideas, review their resume, give some context on the right words to use. I put them in contact with some resources; I plan on vouching for them when I get the chance. Yet I know that I could spend all day every day having the same conversation with person after person, with no end. There are always more starfish. Still, I hope to help the ones I can each time I take a stroll on the beach.</p>
<p>Thinking about this story, I decided to look it up -- I discovered that the short version is a VERY choppity chopped allusion to a (longer) short essay, <a href="https://en.wikipedia.org/wiki/The_Star_Thrower" rel="nofollow">The Star Thrower by Loren Eiseley (wikipedia)</a>. After quite some searching, I found the original version and you can <a href="https://thelackthereof.org/the-star-thrower">read a copy of the full Star Thrower essay here</a>.</p>
<blockquote><p>Long ago, when the future was just a simple tomorrow, men had cast intricately carved game counters to determine its course, or they had traced with a grimy finger the cracks on the burnt shoulder blade of a hare.</p></blockquote>
<p>The movie &quot;Blade Runner&quot; is similarly inspired by &quot;Do Androids Dream of Electric Sheep&quot; by Philip K. Dick. Please read the book! You will find that the book is not &quot;better&quot; so much as &quot;bigger&quot;. Deeper, darker, wider. It is existential well beyond the android identity struggle. I find that the original Star Thrower essay has a similar relationship to the short parable I learned in church. It feels more like reading a piece by Borges instead of an inspirational bookmark.</p>
<blockquote><p>Things, in the words of G. K. Chesterton, were to grow incalculable by being calculated. Man's powers were finite; the forces he had released in nature recognized no such limitations. They were the irrevocable monsters conjured up by a completely amateur sorcerer.</p></blockquote>
<p>The Star Thrower essay touches upon science, spirituality, death, life, meaningfulness, Darwinistic selfishness, and on and on. Reading it during the thrash of current politics, reading it during the rise of language-using AI, even reading it during a life transition (I got a new job!) casts a different sort of light on the day-to-day and cosmic struggles I, we, find ourselves in.</p>
<blockquote><p>I picked up a star whose tube feet ventured timidly among my fingers while, like a true star, it cried soundlessly for life.</p></blockquote>
<p><a href="https://thelackthereof.org/the-star-thrower">Give it a taste</a>. Maybe toss a starfish or two.</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/The_Ocean.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The Star Thrower (Loren Eiseley)]]></title>
            <link>https://thelackthereof.org/the-star-thrower</link>
            <guid>https://thelackthereof.org/the-star-thrower</guid>
            <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Editor Note: This piece is by Loren Eiseley, 1969. Published in The Unexpected Universe. Transcribed here from a PDF scan I found.]]></description>
            <content:encoded><![CDATA[<p><strong>Editor Note: This piece is by <a href="https://en.wikipedia.org/wiki/The_Star_Thrower" rel="nofollow">Loren Eiseley</a>, 1969. Published in <em>The Unexpected Universe</em>. Transcribed here from a PDF scan I found.</strong></p>
<img src="https://thelackthereof.org/_ipx/_/img/The_Star_Thrower_Scan.png" alt="Printed Version Screenshot" width="100" align="right" />
<hr />
<blockquote><p>Who is the man walking in the Way?<br />
An eye glaring in the skull.</p><p>-SECCHO</p></blockquote>
<p>It has ever been my lot, though formally myself a teacher, to be taught surely by none. There are times when I have thought to read lessons in the sky, or in books, or from the behavior of my fellows, but in the end my perceptions have frequently been inadequate or betrayed. Nevertheless, I venture to say that of what man may be I have caught a fugitive glimpse, not among multitudes of men, but along an endless wave-beaten coast at dawn. As always, there is this apparent break, this rift in nature, before the insight comes. The terrible question has to translate itself into an even more terrifying freedom.</p>
<p>If there is any meaning to this book, it began on the beaches of Costabel with just such a leap across an unknown abyss. It began, if I may borrow the expression from a Buddhist sage, with the skull and the eye. I was the skull. I was the inhumanly stripped skeleton without voice, without hope, wandering alone upon the shores of the world. I was devoid of pity, because pity implies hope. There was, in this desiccated skull, only an eye like a pharos light, a beacon, a search beam revolving endlessly in sunless noonday or black night. Ideas like swarms of insects rose to the beam, but the light consumed them. Upon that shore meaning had ceased. There were only the dead skull and the revolving eye. With such an eye, some have said, science looks upon the world. I do not know. I know only that I was the skull of emptiness and the endlessly revolving light without pity.</p>
<p>Once, in a dingy restaurant in the town, I had heard a woman say: &quot;My father reads a goose bone for the weather.&quot; A modern primitive, I had thought, a diviner, using a method older than Stonehenge, as old as the arctic forests.</p>
<p>&quot;And where does he do that?&quot; the woman's companion had asked amusedly.</p>
<p>&quot;In Costabel,&quot; she answered complacently, &quot;in Costabel.&quot; The voice came back and buzzed faintly for a moment in the dark under the revolving eye. It did not make sense, but nothing in Costabel made sense. Perhaps that was why I had finally found myself in Costabel. Perhaps all men are destined at some time to arrive there as I did.</p>
<p>I had come by quite ordinary means, but I was still the skull with the eye. I concealed myself beneath a fisherman's cap and sunglasses, so that I looked like everyone else on the beach. This is the way things are managed in Costabel. It is on the shore that the revolving eye begins its beam and the whispers rise in the empty darkness of the skull.</p>
<p>The beaches of Costabel are littered with the debris of life. Shells are cast up in windrows; a hermit crab, fumbling for a new home in the depths, is tossed naked ashore, where the waiting gulls cut him to pieces. Along the strip of wet sand that marks the ebbing and flowing of the tide death walks hugely and in many forms. Even the torn fragments of green sponge yield bits of scrambling life striving to return to the great mother that has nourished and protected them.</p>
<p>In the end the sea rejects its offspring. They cannot fight their way home through the surf which casts them repeatedly back upon the shore. The tiny breathing pores of starfish are stuffed with sand. The rising sun shrivels the mucilaginous bodies of the unprotected. The seabeach and its endless war are soundless. Nothing screams but the gulls.</p>
<p>In the night, particularly in the tourist season, or during great storms, one can observe another vulturine activity. One can see, in the hour before dawn on the ebb tide, electric torches bobbing like fireflies along the beach. It is the sign of the professional shellers seeking to outrun and anticipate their less aggressive neighbors. A kind of greedy madness sweeps over the competing collectors. After a storm one can see them hurrying along with bundles of gathered starfish, or, toppling and overburdened, clutching bags of living shells whose hidden occupants will be slowly cooked and dissolved in the outdoor kettles provided by the resort hotels for the cleaning of specimens. Following one such episode I met the star thrower.</p>
<p>As soon as the ebb was flowing, as soon as I could make out in my sleeplessness the flashlights on the beach, I arose and dressed in the dark. As I came down the steps to the shore I could hear the deeper rumble of the surf. A gaping hole filled with churning sand had cut sharply into the breakwater. Flying sand as light as powder coated every exposed object like snow. I made my way around the altered edges of the cove and proceeded on my morning walk up the shore. Now and then a stooping figure moved in the gloom or a rain squall swept past me with light pattering steps. There was a faint sense of coming light somewhere behind me in the east.</p>
<p>Soon I began to make out objects, upended timbers, conch shells, sea wrack wrenched from the far-out kelp forests. A pink-clawed crab encased in a green cup of sponge lay sprawling where the waves had tossed him. Long-limbed starfish were strewn everywhere, as though the night sky had showered down. I paused once briefly. A small octopus, its beautiful dark-lensed eyes bleared with sand, gazed up at me from a ragged bundle of tentacles. I hesitated, and touched it briefly with my foot. It was dead. I paced on once more before the spreading whitecaps of the surf.</p>
<p>The shore grew steeper, the sound of the sea heavier and more menacing, as I rounded a bluff into the full blast of the offshore wind. I was away from the shellers now and strode more rapidly over the wet sand that effaced my footprints. Around the next point there might be a refuge from the wind. The sun behind me was pressing upward at the horizon's rim -- an ominous red glare amidst the tumbling blackness of the clouds. Ahead of me, over the projecting point, a gigantic rainbow of incredible perfection had sprung shimmering into existence. Somewhere toward its foot I discerned a human figure standing, as it seemed to me, within the rainbow, though unconscious of his position. He was gazing fixedly at something in the sand.</p>
<p>Eventually he stooped and flung the object beyond the breaking surf. I labored toward him over a half mile of uncertain footing. By the time I reached him the rainbow had receded ahead of us, but something of its color still ran hastily in many changing lights across his features. He was starting to kneel again.</p>
<p>In a pool of sand and silt a starfish had thrust its arms up stiffly and was holding its body away from the stifling mud.</p>
<p>&quot;It's still alive,&quot; I ventured.</p>
<p>&quot;Yes,&quot; he said, and with a quick yet gentle movement he picked up the star and spun it over my head and far out into the sea. It sank in a burst of spume, and the waters roared once more.</p>
<p>&quot;It may live,&quot; he said, &quot;if the offshore pull is strong enough.&quot; He spoke gently, and across his bronzed worn face the light still came and went in subtly altering colors.</p>
<p>&quot;There are not many come this far,&quot; I said, groping in a sudden embarrassment for words. &quot;Do you collect?&quot;</p>
<p>&quot;Only like this,&quot; he said softly, gesturing amidst the wreckage of the shore. &quot;And only for the living.&quot; He stooped again, oblivious of my curiosity, and skipped another star neatly across the water.</p>
<p>&quot;The stars,&quot; he said, &quot;throw well. One can help them.&quot;</p>
<p>He looked full at me with a faint question kindling in his eyes, which seemed to take on the far depths of the sea.</p>
<p>&quot;I do not collect,&quot; I said uncomfortably, the wind beating at my garments. &quot;Neither the living nor the dead. I gave it up a long time ago. Death is the only successful collector.&quot; I could feel the full night blackness in my skull and the terrible eye resuming its indifferent journey. I nodded and walked away, leaving him there upon the dune with that great rainbow ranging up the sky behind him.</p>
<p>I turned as I neared a bend in the coast and saw him toss another star, skimming it skillfully far out over the ravening and tumultuous water. For a moment, in the changing light, the sower appeared magnified, as though casting larger stars upon some greater sea. He had, at any rate, the posture of a god.</p>
<p>But again the eye, the cold world-shriveling eye, began its inevitable circling in my skull. He is a man, I considered sharply, bringing my thought to rest. The star thrower is a man, and death is running more fleet than he along every seabeach in the world.</p>
<p>I adjusted the dark lens of my glasses and, thus disguised, I paced slowly back by the starfish gatherers, past the shell collectors, with their vulgar little spades and the stick-length shelling pincers that eased their elderly backs while they snatched at treasures in the sand. I chose to look full at the steaming kettles in which beautiful voiceless things were being boiled alive. Behind my sunglasses a kind of litany began and refused to die down. &quot;As I came through the desert thus it was, as I came through the desert.&quot;</p>
<p>In the darkness of my room I lay quiet with the sunglasses removed, but the eye turned and turned. In the desert, an old monk had once advised a traveler, the voices of God and the Devil are scarcely distinguishable. Costabel was a desert. I lay quiet, but my restless hand at the bedside fingered the edge of an invisible abyss. &quot;Certain coasts,&quot; the remark of a perceptive writer came back to me, &quot;are set apart for shipwreck.&quot; With unerring persistence I had made my way thither.</p>
<h2 id="_2">2</h2>
<p>There is a difference in our human outlook, depending on whether we have been born upon level plains, where one step reasonably leads to another, or whether, by contrast, we have spent our lives amidst glacial crevasses and precipitous descents. In the case of the mountaineer, one step does not always lead rationally to another save by a desperate leap over a chasm or by an even more hesitant tiptoeing across precarious snow bridges.</p>
<p>Something about these opposed landscapes has its analogue in the mind of man. Our prehistoric life, one might say, began amidst enforested gloom with the abandonment of the protected instinctive life of nature. We sought, instead, an adventurous existence amidst the crater lands and ice fields of self-generated ideas. Clambering onward, we have slowly made our way out of a maze of isolated peaks into the level plains of science. Here, one step seems definitely to succeed another, the universe appears to take on an imposed order, and the illusions through which mankind has painfully made its way for many centuries have given place to the enormous vistas of past and future time. The encrusted eye in the stone speaks to us of undeviating sunlight; the calculated elliptic of Halley's comet no longer forecasts world disaster. The planet plunges on through a chill void of star years, and there is little or nothing that remains unmeasured.</p>
<p>Nothing, that is, but the mind of man. Since boyhood I had been traveling across the endless co-ordinated realms of science, just as, in the body, I was a plains dweller, accustomed to plodding through distances unbroken by precipices. Now that I come to look back, there was one contingent aspect of that landscape I inhabited whose significance, at the time, escaped me. &quot;Twisters,&quot; we called them locally. They were a species of cyclonic, bouncing air funnel that could suddenly loom out of nowhere, crumpling windmills or slashing with devastating fury through country towns. Sometimes, by modest contrast, more harmless varieties known as dust devils might pursue one in a gentle spinning dance for miles. One could see them hesitantly stalking across the alkali flats on a hot day, debating, perhaps, in their tall, rotating columns, whether to ascend and assume more formidable shapes. They were the trickster part of an otherwise pedestrian landscape.</p>
<p>Infrequent though the visitations of these malign creations of the air might be, all prudent homesteaders in those parts had provided themselves with cyclone cellars. In the careless neighborhood in which I grew up, however, we contented ourselves with the queer yarns of cyclonic folklore and the vagaries of weather prophecy. As a boy, aroused by these tales and cherishing a subterranean fondness for caves, I once attempted to dig a storm cellar. Like most such projects this one was never completed. The trickster element in nature, I realize now, had so buffeted my parents that they stoically rejected planning. Unconsciously, they had arrived at the philosophy that foresight merely invited the attention of some baleful intelligence that despised and persecuted the calculating planner. It was not until many years later that I came to realize that a kind of maleficent primordial power persists in the mind as well as in the wandering dust storms of the exterior world.</p>
<p>A hidden dualism that has haunted man since antiquity runs across his religious conceptions as the conflict between good and evil. It persists in the modern world of science under other guises. It becomes chaos versus form or antichaos. Form, since the rise of the evolutionary philosophy, has itself taken on an illusory quality. Our apparent shapes no longer have the stability of a single divine fiat. Instead, they waver and dissolve into the unexpected. We gaze backward into a contracting cone of life until words leave us and all we know is dissolved into the simple circuits of a reptilian brain. Finally, sentience subsides into an animalcule.</p>
<p>Or we revolt and refuse to look deeper, but the void remains. We are rag dolls made out of many ages and skins, changelings who have slept in wood nests or hissed in the uncouth guise of waddling amphibians. We have played such roles for infinitely longer ages than we have been men. Our identity is a dream. We are process, not reality, for reality is an illusion of the daylight -- the light of our particular day. In a fortnight, as aeons are measured, we may lie silent in a bed of stone, or, as has happened in the past, be figured in another guise. Two forces struggle perpetually in our bodies: Yam, the old sea dragon of the original Biblical darkness, and, arrayed against him, some wisp of dancing light that would have us linger, wistful, in our human form. &quot;Tarry thou, till I come again&quot; -- an old legend survives among us of the admonition given by Jesus to the Wandering Jew. The words are applicable to all of us. Deep-hidden in the human psyche there is a similar injunction no longer having to do with the longevity of the body but, rather, a plea to wait upon some transcendent lesson preparing in the mind itself.</p>
<p>Yet the facts we face seem terrifyingly arrayed against us. It is as if at our backs, masked and demonic, moved the trickster as I have seen his role performed among the remnant of a savage people long ago. It was that of the jokester present at the most devout of ceremonies. This creature never laughed; he never made a sound. Painted in black, he followed silently behind the officiating priest, mimicking, with the added flourish of a little whip, the gestures of the devout one. His timed and stylized posturings conveyed a derision infinitely more formidable than actual laughter.</p>
<p>In modern terms, the dance of contingency, of the indeterminable, outwits us all. The approaching, fateful whirlwind on the plain had mercifully passed me by in youth. In the moment when I had witnessed that fireside performance I knew with surety that primitive man had lived with a dark message. He had acquiesced in the admission into his village of a cosmic messenger. Perhaps the primitives were wiser in the ways of the trickster universe than ourselves; perhaps they knew, as we do not, how to ground or make endurable the lightning.</p>
<p>At all events, I had learned, as I watched that half-understood drama by the leaping fire, why man, even modern man, reads goose bones for the weather of his soul. Afterward I had gone out, a troubled unbeliever, into the night. There was a shadow I could not henceforth shake off, which I knew was posturing and would always posture behind me. That mocking shadow looms over me as I write. It scrawls with a derisive pen and an exaggerated flourish. I know instinctively it will be present to caricature the solemnities of my deathbed. In a quarter of a century it has never spoken.</p>
<p>Black magic, the magic of the primeval chaos, blots out or transmogrifies the true form of things. At the stroke of twelve the princess must flee the banquet or risk discovery in the rags of a kitchen wench; coach reverts to pumpkin. Instability lies at the heart of the world. With uncanny foresight folklore has long toyed symbolically with what the nineteenth century was to proclaim a reality, namely, that form is an illusion of the time dimension, that the magic flight of the pursued hero or heroine through frogskin and wolf coat has been, and will continue to be, the flight of all men.</p>
<p>Goethe's genius sensed, well before the publication of the Origin of Species, the thesis and antithesis that epitomize the eternal struggle of the immediate species against its dissolution into something other: in modern terms, fish into reptile, ape into man. The power to change is both creative and destructive -- a sinister gift, which, unrestricted, leads onward toward the formless and inchoate void of the possible. This force can only be counterbalanced by an equal impulse toward specificity. Form, once arisen, clings to its identity. Each species and each individual holds tenaciously to its present nature. Each strives to contain the creative and abolishing maelstrom that pours unseen through the generations. The past vanishes; the present momentarily persists; the future is potential only. In this specious present of the real, life struggles to maintain every manifestation, every individuality, that exists. In the end, life always fails, but the amorphous hurrying stream is held and diverted into new organic vessels in which form persists, though the form may not be that of yesterday.</p>
<p>The evolutionists, piercing beneath the show of momentary stability, discovered, hidden in rudimentary organs, the discarded rubbish of the past. They detected the reptile under the lifted feathers of the bird, the lost terrestrial limbs dwindling beneath the blubber of the giant cetaceans. They saw life rushing outward from an unknown center, just as today the astronomer senses the galaxies fleeing into the infinity of darkness. As the spinning galactic clouds hurl stars and worlds across the night, so life, equally impelled by the centrifugal powers lurking in the germ cell, scatters the splintered radiance of consciousness and sends it prowling and contending through the thickets of the world.</p>
<p>All this devious, tattered way was exposed to the ceaselessly turning eye within the skull that lay hidden upon the bed in Costabel. Slowly that eye grew conscious of another eye that searched it with equal penetration from the shadows of the room. It may have been a projection from the mind within the skull, but the eye was, nevertheless, exteriorized and haunting. It began as something glaucous and blind beneath a web of clinging algae. It altered suddenly and became the sand-smeared eye of the dead cephalopod I had encountered upon the beach. The transformations became more rapid with the concentration of my attention, and they became more formidable. There was the beaten, bloodshot eye of an animal from somewhere within my childhood experience. Finally, there was an eye that seemed torn from a photograph, but that looked through me as though it had already raced in vision up to the steep edge of nothingness and absorbed whatever terror lay in that abyss. I sank back again upon my cot and buried my head in the pillow. I knew the eye and the circumstance and the question. It was my mother. She was long dead, and the way backward was lost.</p>
<h2 id="_3">3</h2>
<p>Now it may be asked, upon the coasts that invite shipwreck, why the ships should come, just as we may ask the man who pursues knowledge why he should be left with a revolving search beam in the head whose light falls only upon disaster or the flotsam of the shore. There is an answer, but its way is not across the level plains of science, for the science of remote abysses no longer shelters man. Instead, it reveals him in vaporous metamorphic succession as the homeless and unspecified one, the creature of the magic flight.</p>
<p>Long ago, when the future was just a simple tomorrow, men had cast intricately carved game counters to determine its course, or they had traced with a grimy finger the cracks on the burnt shoulder blade of a hare. It was a prophecy of tomorrow's hunt, just as was the old farmer's anachronistic reading of the weather from the signs on the breastbone of a goose. Such quaint almanacs of nature's intent had sufficed mankind since antiquity. They would do so no longer, nor would formal apologies to the souls of the game men hunted. The hunters had come, at last, beyond the satisfying supernatural world that had always surrounded the little village, into a place of homeless frontiers and precipitous edges, the indescribable world of the natural. Here tools increasingly revenged themselves upon their creators and tomorrow became unmanageable. Man had come in his journeying to a region of terrible freedoms.</p>
<p>It was a place of no traditional shelter, save those erected with the aid of tools, which had also begun to achieve a revolutionary independence from their masters. Their ways had grown secretive and incalculable. Science, more powerful than the magical questions that might be addressed by a shaman to a burnt shoulder blade, could create these tools but had not succeeded in controlling their ambivalent nature. Moreover, they responded all too readily to that urge for tampering and dissolution which is part of our primate heritage.</p>
<p>We had been safe in the enchanted forest only because of our weakness. When the powers of that gloomy region were given to us, immediately, as in a witch's house, things began to fly about unbidden. The tools, if not science itself, were linked intangibly to the subconscious poltergeist aspect of man's nature. The closer man and the natural world drew together, the more erratic became the behavior of each. Huge shadows leaped triumphantly after every blinding illumination. It was a magnified but clearly recognizable version of the black trickster's antics behind the solemn backs of the priesthood. Here, there was one difference. The shadows had passed out of all human semblance; no societal ritual safely contained their posturings, as in the warning dance of the trickster. Instead, unseen by many because it was so gigantically real, the multiplied darkness threatened to submerge the carriers of the light.</p>
<p>Darwin, Einstein, and Freud might be said to have released the shadows. Yet man had already entered the perilous domain that henceforth would contain his destiny. Four hundred years ago Francis Bacon had already anticipated its dual nature. The individuals do not matter. If they had not made their discoveries, others would have surely done so. They were good men, and they came as enlighteners of mankind. The tragedy was only that at their backs the ritual figure with the whip was invisible. There was no longer anything to subdue the pride of man. The world had been laid under the heavy spell of the natural; henceforth, it would be ordered by man.</p>
<p>Humanity was suddenly entranced by light and fancied it reflected light. Progress was its watchword, and for a time the shadows seemed to recede. Only a few guessed that the retreat of darkness presaged the emergence of an entirely new and less tangible terror. Things, in the words of G. K. Chesterton, were to grow incalculable by being calculated. Man's powers were finite; the forces he had released in nature recognized no such limitations. They were the irrevocable monsters conjured up by a completely amateur sorcerer.</p>
<p>But what, we may ask, was the nature of the first discoveries that now threaten to induce disaster? Pre-eminent among them was, of course, the perception to which we have already referred: the discovery of the interlinked and evolving web of life. The great Victorian biologists saw, and yet refused to see, the war between form and formlessness, chaos and antichaos, which the poet Goethe had sensed contesting beneath the smiling surface of nature. &quot;The dangerous gift from above,&quot; he had termed it, with uneasy foresight.</p>
<p>By contrast, Darwin, the prime student of the struggle for existence, sought to visualize in a tangled bank of leaves the silent and insatiable war of nature. Still, he could imply with a veiled complacency that man might &quot;with some confidence&quot; look forward to a secure future &quot;of inappreciable length.&quot; This he could do upon the same page in the Origin of Species where he observes that &quot;of the species now living very few will transmit progeny to a far distant futurity.&quot; The contradiction escaped him; he did not wish to see it. Darwin, in addition, saw life as a purely selfish struggle, in which nothing is modified for the good of another species without being directly advantageous to its associated form.</p>
<p>If, he contended, one part of any single species had been formed for the exclusive good of another, &quot;it would annihilate my theory.&quot; Powerfully documented and enhanced though the statement has become, famine, war, and death are not the sole instruments biologists today would accept as the means toward that perfection of which Darwin spoke. The subject is subtle and intricate, however, and one facet of it must be reserved for another chapter. Let it suffice to say here that the sign of the dark cave and the club became so firmly fixed in human thinking that in our time it has been invoked as signifying man's true image in books selling in the hundreds of thousands.</p>
<p>From the thesis and antithesis contained in Darwinism we come to Freud. The public knows that, like Darwin, the master of the inner world took the secure, stable, and sunlit province of the mind and revealed it as a place of contending furies. Ghostly transformations, flitting night shadows, misshapen changelings existed there, as real as anything that haunted the natural universe of Darwin. For this reason, appropriately, I had come as the skull and the eye to Costabel -- the coast demanding shipwreck. Why else had I remembered the phrase, except for a dark impulse toward destruction lurking somewhere in the subconscious? I lay on the bed while the agonized eye in the remembered photograph persisted at the back of my closed lids.</p>
<p>It had begun when, after years of separation, I had gone dutifully home to a house from which the final occupant had departed. In a musty attic -- among old trunks, a broken aquarium, and a dusty heap of fossil shells collected in childhood -- I found a satchel. The satchel was already a shabby antique, in whose depths I turned up a jackknife and a &quot;rat&quot; of hair such as women wore at the beginning of the century. Beneath these lay a pile of old photographs and a note -- two notes, rather, evidently dropped into the bag at different times. Each, in a thin, ornate hand, reiterated a single message that the writer had believed important. &quot;This satchel belongs to my son, Loren Eiseley.&quot; It was the last message. I recognized the trivia. The jackknife I had carried in childhood. The rat of hair had belonged to my mother, and there were also two incredibly pointed slippers that looked as though they had been intended for a formal ball, to which I knew well my mother would never in her life have been invited. I undid the rotted string around the studio portraits.</p>
<p>Mostly they consisted of stiff, upright bearded men and heavily clothed women equally bound to the formalities and ritual that attended upon the photography of an earlier generation. No names identified the pictures, although here and there a reminiscent family trait seemed faintly evident. Finally I came upon a less formal photograph, taken in the eighties of the last century. Again no names identified the people, but a commercial stamp upon the back identified the place: Dyersville, Iowa. I had never been in that country town, but I knew at once it was my mother's birthplace.</p>
<p>Dyersville, the thought flashed through my mind, making the connection now for the first time: the dire place. I recognized at once the two sisters at the edge of the photograph, the younger clinging reluctantly to the older. Six years old, I thought, turning momentarily away from the younger child's face. Here it began, her pain and mine. The eyes in the photograph were already remote and shadowed by some inner turmoil. The poise of the body was already that of one miserably departing the peripheries of the human estate. The gaze was mutely clairvoyant and lonely. It was the gaze of a child who knew unbearable difference and impending isolation.</p>
<p>I dropped the notes and pictures once more into the bag. The last message had come from Dyersville: &quot;my son.&quot; The child in the photograph had survived to be an ill-taught prairie artist. She had been deaf. All her life she had walked the precipice of mental breakdown. Here on this faded porch it had begun -- the long crucifixion of life. I slipped downstairs and out of the house. I walked for miles through the streets.</p>
<p>Now at Costabel I put on the sunglasses once more, but the face from the torn photograph persisted behind them. It was as though I, as man, was being asked to confront, in all its overbearing weight, the universe itself. &quot;Love not the world,&quot; the Biblical injunction runs, &quot;neither the things that are in the world.&quot; The revolving beam in my mind had stopped, and the insect whisperings of the intellect. There was, at last, an utter stillness, a waiting as though for a cosmic judgment. The eye, the torn eye, considered me.</p>
<p>&quot;But I <em>do</em> love the world,&quot; I whispered to a waiting presence in the empty room. &quot;I love its small ones, the things beaten in the strangling surf, the bird, singing, which flies and falls and is not seen again.&quot; I choked and said, with the torn eye still upon me, &quot;I love the lost ones, the failures of the world.&quot; It was like the renunciation of my scientific heritage. The torn eye surveyed me sadly and was gone. I had come full upon one of the last great rifts in nature, and the merciless beam no longer was in traverse around my skull.</p>
<p>But no, it was not a rift but a joining: the expression of love projected beyond the species boundary by a creature born of Darwinian struggle, in the silent war under the tangled bank. &quot;There is no boon in nature,&quot; one of the new philosophers had written harshly in the first years of the industrial cities. Nevertheless, through war and famine and death, a sparse mercy had persisted, like a mutation whose time had not yet come. I had seen the star thrower cross that rift and, in so doing, he had reasserted the human right to define his own frontier. He had moved to the utmost edge of natural being, if not across its boundaries. It was as though at some point the supernatural had touched hesitantly, for an instant, upon the natural.</p>
<p>Out of the depths of a seemingly empty universe had grown an eye, like the eye in my room, but an eye on a vastly larger scale. It looked out upon what I can only call itself. It searched the skies and it searched the depths of being. In the shape of man it had ascended like a vaporous emanation from the depths of night. The nothing had miraculously gazed upon the nothing and was not content. It was an intrusion into, or a projection out of, nature for which no precedent existed. The act was, in short, an assertion of value arisen from the domain of absolute zero. A little whirlwind of commingling molecules had succeeded in confronting its own universe.</p>
<p>Here, at last, was the rift that lay beyond Darwin's tangled bank. For a creature, arisen from that bank and born of its contentions, had stretched out its hand in pity. Some ancient, inexhaustible, and patient intelligence, lying dispersed in the planetary fields of force or amidst the inconceivable cold of interstellar space, had chosen to endow its desolation with an apparition as mysterious as itself. The fate of man is to be the ever recurrent, reproachful Eye floating upon night and solitude. The world cannot be said to exist save by the interposition of that inward eye -- an eye various and not under the restraints to be apprehended from what is vulgarly called the natural.</p>
<p>I had been unbelieving. I had walked away from the star thrower in the hardened indifference of maturity. But thought mediated by the eye is one of nature's infinite disguises. Belatedly, I arose with a solitary mission. I set forth in an effort to find the star thrower.</p>
<h2 id="_4">4</h2>
<p>Man is himself, like the universe he inhabits, like the demoniacal stirrings of the ooze from which he sprang, a tale of desolations. He walks in his mind from birth to death the long resounding shores of endless disillusionment. Finally, the commitment to life departs or turns to bitterness. But out of such desolation emerges the awesome freedom to choose -- to choose beyond the narrowly circumscribed circle that delimits the animal being. In that widening ring of human choice, chaos and order renew their symbolic struggle in the role of titans. They contend for the destiny of a world.</p>
<p>Somewhere far up the coast wandered the star thrower beneath his rainbow. Our exchange had been brief because upon that coast I had learned that men who ventured out at dawn resented others in the greediness of their compulsive collecting. I had also been abrupt because I had, in the terms of my profession and experience, nothing to say. The star thrower was mad, and his particular acts were a folly with which I had not chosen to associate myself. I was an observer and a scientist. Nevertheless, I had seen the rainbow attempting to attach itself to earth.</p>
<p>On a point of land, as though projecting into a domain beyond us, I found the star thrower. In the sweet rain-swept morning, that great many-hued rainbow still lurked and wavered tentatively beyond him. Silently I sought and picked up a still-living star, spinning it far out into the waves. I spoke once briefly. &quot;I understand,&quot; I said. &quot;Call me another thrower.&quot; Only then I allowed myself to think, He is not alone any longer. After us there will be others.</p>
<p>We were part of the rainbow -- an unexplained projection into the natural. As I went down the beach I could feel the drawing of a circle in men's minds, like that lowering, shifting realm of color in which the thrower labored. It was a visible model of something toward which man's mind had striven, the circle of perfection.</p>
<p>I picked and flung another star. Perhaps far outward on the rim of space a genuine star was similarly seized and flung. I could feel the movement in my body. It was like a sowing -- the sowing of life on an infinitely gigantic scale. I looked back across my shoulder. Small and dark against the receding rainbow, the star thrower stooped and flung once more. I never looked again. The task we had assumed was too immense for gazing. I flung and flung again while all about us roared the insatiable waters of death.</p>
<p>But we, pale and alone and small in that immensity, hurled back the living stars. Somewhere far off, across bottomless abysses, I felt as though another world was flung more joyfully. I could have thrown in a frenzy of joy, but I set my shoulders and cast, as the thrower in the rainbow cast, slowly, deliberately, and well. The task was not to be assumed lightly, for it was men as well as starfish that we sought to save. For a moment, we cast on an infinite beach together beside an unknown hurler of suns. It was, unsought, the destiny of my kind since the rituals of the ice age hunters, when life in the Northern Hemisphere had come close to vanishing. We had lost our way, I thought, but we had kept, some of us, the memory of the perfect circle of compassion from life to death and back again to life -- the completion of the rainbow of existence. Even the hunters in the snow, making obeisance to the souls of the hunted, had known the cycle. The legend had come down and lingered that he who gained the gratitude of animals gained help in need from the dark wood.</p>
<p>I cast again with an increasingly remembered sowing motion and went my lone way up the beaches. Somewhere, I felt, in a great atavistic surge of feeling, somewhere the Thrower knew. Perhaps he smiled and cast once more into the boundless pit of darkness. Perhaps he, too, was lonely, and the end toward which he labored remained hidden -- even as with ourselves.</p>
<p>I picked up a star whose tube feet ventured timidly among my fingers while, like a true star, it cried soundlessly for life. I saw it with an unaccustomed clarity and cast far out. With it, I flung myself as forfeit, for the first time, into some unknown dimension of existence. From Darwin's tangled bank of unceasing struggle, selfishness, and death, had arisen, incomprehensibly, the thrower who loved not man, but life. It was the subtle cleft in nature before which biological thinking had faltered. We had reached the last shore of an invisible island -- yet, strangely, also a shore that the primitives had always known. They had sensed intuitively that man cannot exist spiritually without life, his brother, even if he slays. Somewhere, my thought persisted, there is a hurler of stars, and he walks, because he chooses, always in desolation, but not in defeat.</p>
<p>In the night the gas flames under the shelling kettles would continue to glow. I set my clock accordingly. Tomorrow I would walk in the storm. I would walk against the shell collectors and the flames. I would walk remembering Bacon's forgotten words &quot;for the uses of life.&quot; I would walk with the knowledge of the discontinuities of the unexpected universe. I would walk knowing of the rift revealed by the thrower, a hint that there looms, inexplicably, in nature something above the role men give her. I knew it from the man at the foot of the rainbow, the starfish thrower on the beaches of Costabel.</p>
<hr />
<p><strong>Editor Note: This piece is by <a href="https://en.wikipedia.org/wiki/The_Star_Thrower" rel="nofollow">Loren Eiseley</a>, 1969. Published in <em>The Unexpected Universe</em>. Transcribed here from a PDF scan I found.</strong></p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/The_Star_Thrower_Scan.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Generative ChuhuaPin]]></title>
            <link>https://thelackthereof.org/tlt-2025.03.27-generative-chuapin</link>
            <guid>https://thelackthereof.org/tlt-2025.03.27-generative-chuapin</guid>
            <pubDate>Thu, 27 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Using the new ChatGPT GPT-4o Image Generation to incrementally generate a photo of Hoda! (A "Chipin" is a 50-50 Chuhuahua and Mini-Pincer. Hoda is 70-20, so is a ChuhuaPin!)]]></description>
            <content:encoded><![CDATA[<p>Using the <a href="https://openai.com/index/introducing-4o-image-generation/" rel="nofollow">new ChatGPT GPT-4o Image Generation</a> to incrementally generate a photo of Hoda! (A &quot;Chipin&quot; is a 50-50 Chuhuahua and Mini-Pincer. Hoda is 70-20, so is a ChuhuaPin!)</p>
<hr />
<p>Previously if you asked ChatGPT to generate you an image it would switch over to DALL-E, a separate image generation model. Each time it generated a new image it would more or less start from the beginning, maybe, and it was a challenge to get small incremental changes to an image.</p>
<p>With <a href="https://openai.com/index/introducing-4o-image-generation/" rel="nofollow">ChatGPT GPT-4o Image Generation Update</a> it now uses the <em>same model</em> to generate the image as it is contextualizing your prompt, which makes it much more capable of things like incremental changes (it isn't starting from scratch each time). At least, that's how I understand it.</p>
<p>As a fun experiment, I tried to generate a dog that looks like hoda! Here is every step that I took. I had to brighten/sharpen the images quite a bit.</p>
<table><tbody><tr><td>Create an image of a dog that is 70% Chihuahua, 20% mini pincer, and 10% mutt</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_1.png" width="400" /></td></tr><tr><td>Give it a slightly brindle coloring. Still with a black base coat, but the brindle highlights closer to grey</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_2.png" width="400" /></td></tr><tr><td>Close, but went a bit too far. Make one halfway between these two!</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_3.png" width="400" /></td></tr><tr><td>More black. Also give her a blue harness</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_4.png" width="400" /></td></tr><tr><td>Make her a liiiitle thinner</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_5.png" width="400" /></td></tr><tr><td>The body and color are good. Make the head a little more chihuahua</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_6.png" width="400" /></td></tr><tr><td>Make her hair on her neck a little bald</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_7.png" width="400" /></td></tr><tr><td>Really close! Make her ears just a little bit smaller.</td><td><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_8.png" width="400" /></td></tr></tbody></table>
<p>This is a lot like what I imagine working with a crime sketch artist would be like! Here is the final image a bit bigger. I think this is what Hoda looked like when she was young!<br /><img src="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_8.png" width="600" /></p>
<p>And here is Hoda from a real camera IRL. A bit older, a bit blinder :)<br /><img src="https://thelackthereof.org/_ipx/_/img/hoda-20250327.png" width="800" /></p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/bright_chatgpt_gen_chihuahua_8.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[The Four Squares of Agency]]></title>
            <link>https://thelackthereof.org/tlt-2025.03.14-the-four-squares-of-agency</link>
            <guid>https://thelackthereof.org/tlt-2025.03.14-the-four-squares-of-agency</guid>
            <pubDate>Fri, 14 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Agency (a more useful concept of Free Will), has two important ingredients -- the ability to predict outcomes and the ability to influence outcomes -- both of which come in a spectrum of possible degrees. We can lay these out into a visualization that breaks down naturally into a four-square grid.]]></description>
            <content:encoded><![CDATA[<p><strong>Agency</strong> (a more useful concept of Free Will), has two important ingredients -- the ability to <em><strong>predict</strong></em> outcomes and the ability to <em><strong>influence</strong></em> outcomes -- both of which come in a spectrum of possible degrees. We can lay these out into a visualization that breaks down naturally into a four-square grid.</p>
<hr />
<h2 id="the-two-ingredients">The Two Ingredients</h2>
<p>Lately there has been a lot of thrash in the AI world around <code>Agents</code>, like what one is or what differentiates an Agent from an Algorithm and things like that. Let's take this from another angle, and talk through a concept of <strong>Agency</strong>.</p>
<p><small><i>(Note that there is nothing new under the sun; my thoughts here are largely (probably incorrect and mis-remembered) inspirations from Daniel Dennett and others. I struggle with knowing how to cite these ideas that have been rolling round my head for a long time.)</i></small></p>
<h3 id="prediction">Prediction</h3>
<p>Given the state of the world, how far out and how accurately can you predict what comes next? Drop an apple from shoulder height and you can work out pretty accurately how long it'll take to hit the ground. Flip a coin and you can get it right .... half the time. Guessing what the weather will be in 5 minutes is quite a bit different from 5 hours or 5 years.</p>
<p><img alt="Prediction scale" src="https://thelackthereof.org/_ipx/_/img/Prediction_scale.png" /></p>
<p>Your ability to predict outcomes, to predict the future, varies based on the thing being predicted and how good your model is of the world. It gets more complicated when there are other Agents around changing things, but even without that some things are harder to predict and some things are easier to predict. You can also, at the very least, narrow down the range of possible or probable outcomes.</p>
<p><strong>Prediction is a context-specific spectrum</strong></p>
<h3 id="influence">Influence</h3>
<p>You have some control, some influence, over the world around you. Generally you can move about, interact with things, push buttons and open doors, etc. The result is that you are changing the state of the world, or possibly even preserving the state of the world. Typing on a keyboard, talking to other people, shouting on a street corner -- these all count too, and can have an outsized effect. Sticks and stones may break my bones, but words can build an army.</p>
<p><img alt="Influence scale" src="https://thelackthereof.org/_ipx/_/img/Influence_scale.png" /></p>
<p>Making changes to the world, similar to prediction, varies on magnitude and accuracy. This includes how much control we have over our own bodies -- I can stand on a skateboard but I can't do a flip from a half-pipe. I can hold a knife, but I can't use it to repair a heart. The current state of the world also locks down what changes are available -- the heart surgeon can't operate if the patient isn't physically accessible to them.</p>
<p><strong>Influence is a context-specific spectrum</strong></p>
<h2 id="the-four-squares">The Four Squares</h2>
<p>Put simply -- the amount of <strong>Agency</strong> you have is built on the degree of <strong>Prediction</strong> and the degree of <strong>Influence</strong>. Neither ingredient is all-or-nothing, and Agency itself is not all-or-nothing. Let's lay this out into a diagram:</p>
<p><img alt="Four Square Agency Model Blank" src="https://thelackthereof.org/_ipx/_/img/Four_Square_Agency_Model_Blank.png" /></p>
<p>Along the bottom axis we plot the ability to <strong>Predict</strong> outcomes. On the left you have zero ability to predict what-comes-next, and as you move to the right your predictive powers increase in both accuracy and distance into the future.</p>
<p>Along the left axis we plot <strong>Influence</strong>. At the bottom you have zero ability to influence (change) the world, and as you move up your influence increases. A small action might make for a big change, and this axis is meant to capture the magnitude of the resulting change.</p>
<p>Thinking about this in a two-dimensional space gives us some idea of a feedback loop on a fundamental concept -- to have <strong>meaningful Agency</strong> you need to not only be able to influence the world, but have an idea about how that influence is going to actually impact things.</p>
<p>We can break this space into four quadrants and label each of them to get some intuition on the combination between Prediction and Influence.</p>
<p><img alt="Four Square Agency Model" src="https://thelackthereof.org/_ipx/_/img/Four_Square_Agency_Model.png" /></p>
<p>Starting in the upper-left quadrant, <em><strong>Low Prediction, High Influence -- The Gamble</strong></em>. Here you are able to perform an action, make a change to the world, but really have no idea what is going to happen. It is like being on a game-show and you can pick a door, any door, but you don't know what is behind the door.</p>
<p>Jumping down to the lower-right quadrant, <em><strong>High Prediction, Low Influence -- The Inevitable</strong></em>. Being on the high-end of the prediction range, you have a VERY good idea about what is going to happen. But very little of what you do will have any influence on the world, on the outcome. This is the fatalistic and inevitable end that is well known in advance.</p>
<p>Moving to the left bottom, we have <em><strong>Low Prediction, Low Influence -- The Lack Thereof</strong></em>. Here you have no control and no idea what is going to happen. This might be some form of transcendent peace, an acceptance and simplistic state of being. It could also be that you are a pet rock with googly eyes. This is pretty much the opposite of having a lot of Agency.</p>
<p>Finally, in the upper-right, we find <em><strong>High Prediction, High Influence -- Agency</strong></em>. This is a meaningful and useful idea of Agency. You both have the ability to influence the world <strong>AND</strong> a good idea of the outcomes from that influence. Here is where you can <strong>&quot;Call your shots&quot;</strong>, performing some action and having a good idea about the result.</p>
<p>From this basic framework, which we can probe in various ways to build more intuitions, we can derive a lot of interesting questions and conclusions. Chief among them -- if Agency is built on two variable ingredients, and we can change these variables, then <em><strong>we can change our degree of Agency</strong></em>.</p>
<p>I will leave you with that thought :)</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/Four_Square_Agency_Model.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Nerd Snipe - Task time tracking]]></title>
            <link>https://thelackthereof.org/tlt-2025.03.04-nerd-snipe-task-time-tracking</link>
            <guid>https://thelackthereof.org/tlt-2025.03.04-nerd-snipe-task-time-tracking</guid>
            <pubDate>Tue, 04 Mar 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Since I'm going some consulting work I have to do a bit of time tracking. And you know what that means! Playing with my taskwarrior and timewarrior config!!!]]></description>
            <content:encoded><![CDATA[<p>Since I'm going some consulting work I have to do a bit of time tracking. And you know what that means! Playing with my <a href="https://taskwarrior.org/" rel="nofollow">taskwarrior</a> and <a href="https://timewarrior.net/" rel="nofollow">timewarrior</a> config!!!</p>
<p><img alt="stopwatch oil painting" src="https://thelackthereof.org/_ipx/_/img/stopwatch_oil_painting.png" /></p>
<p><small><i>openai: Generate an image of a stopwatch in the style of an impressionist oil painting with thick bold brush strokes</i></small></p>
<h2 id="what-would-you-say-you-do-here">What would you say you do here?</h2>
<p>It's pretty easy for me to focus on something but it takes effort to make sure that I'm focused on the right thing, don't forget stuff, and keep track of what it is that I did. I have been using taskwarrior for quite a while, I even have it integrated in with my gmail-starred emails which is handy.</p>
<p>But I also need to keep track of billable hours. There is a separate but corresponding <code>timewarrior</code> project for this, and a hook that ties them together. So once configured, if you do <code>task 123 start</code> it will start the clock for task 123, and if you do either <code>task 123 stop</code> or <code>task 123 done</code> then it will stop the clock. You can use <code>timew</code> reports to see the total time.</p>
<h2 id="start-the-clock-immediately">Start the clock immediately</h2>
<p>Sometimes, often, I want to note a task and immediately begin working on it. I modified the <a href="https://github.com/GothenburgBitFactory/timewarrior/blob/develop/ext/on-modify.timewarrior" rel="nofollow">on-modify.timewarrior</a> to be a <a href="https://gist.github.com/awwaiid/6963af7895005f7fa839b1663ec48a7e" rel="nofollow">on-add.timewarrior</a> and then add this alias into <code>.taskrc</code>:</p>
<pre><code>alias.doing = add start:now
</code></pre>
<h2 id="only-one-clock-stop-it">Only One Clock. Stop &quot;it&quot;.</h2>
<p>While there might be fancier ways to use <code>timewarrior</code>, how I'm using it basically assumes there is only one task happening at a time. If you <code>task 123 stop</code> then it stops the clock. If you <code>task 456 start</code> then it stops the old one (in <code>timewarrior</code>, not in <code>taskwarrior</code>) and starts the new one. Fine. But let's make a handy shorthand for stopping/finishing the &quot;current&quot; task.</p>
<p>Altogether, I now have this in my <code>.taskrc</code>:</p>
<pre><code># These use on-add.timewarrior and on-modify.timewarrior hooks

# Shortcuts to both add and start
alias.doing = add start:now

# Shortcuts to stop or complete the currently started
alias.stopit = start.not: stop
alias.doneit = start.not: done
</code></pre>
<p>Now I can <code>task doing &quot;working on something&quot;</code> and then either <code>task stopit</code> or <code>task doneit</code>!</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/stopwatch_oil_painting.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Link Roundup (LLM/AI)]]></title>
            <link>https://thelackthereof.org/tlt-2025.01.31-link-roundup-(llm-ai)</link>
            <guid>https://thelackthereof.org/tlt-2025.01.31-link-roundup-(llm-ai)</guid>
            <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[My friend Brad asked about what I've been reading lately in the AI/LLM space to keep up. Here's my link roundup! Things that have been on my rotation lately.]]></description>
            <content:encoded><![CDATA[<p>My friend Brad asked about what I've been reading lately in the AI/LLM space to keep up. Here's my link roundup! Things that have been on my rotation lately.</p>
<p><img alt="LLM Newspaper Dog Cartoon" src="https://thelackthereof.org/_ipx/_/img/LLM_Newspaper_Dog_Cartoon.png" /></p>
<ul><li><strong><a href="https://www.amazon.com/dp/1098166302" rel="nofollow">AI Engineering: Building Applications with Foundation Models</a></strong>: Great January-2025 catch up on consuming LLM/AI usage in real world applications; enough background to Get It without being distracted by details</li><li><strong><a href="https://simonwillison.net/" rel="nofollow">Simon Willison Website</a></strong>: Follow for great links and chasing the dragon of new releases and thoughts</li><li><strong><a href="https://llm.datasette.io/" rel="nofollow">LLM CLI (Datasette)</a></strong>: From Simon Willison, a very handy CLI tool for interfacing with LLMs. Once set up, I use this as a unixy native tool. Like ... <code>cat some_file.txt | llm -s 'Turn this into a CSV of street, city, state, zip' &gt; data.csv</code></li><li><strong><a href="https://www.reddit.com/r/LocalLLaMA/" rel="nofollow">/r/LocalLLaMA</a></strong>: Reddit community all about running local LLMs; even if you only ever run things on other people's computer (API) it is interesting to know what might be happening on the other side</li><li><strong><a href="https://www.reddit.com/r/ClaudeAI/" rel="nofollow">/r/ClaudeAI</a></strong>: Latest and Greatest with Claude Stuff</li><li><strong><a href="https://groq.com/" rel="nofollow">Groq</a></strong>: Hardware accelerated LLM (also see <a href="https://cerebras.ai/" rel="nofollow">Cerebras</a>)</li><li><strong><a href="https://aider.chat/" rel="nofollow">Aider</a></strong>: Open source CLI coding assistant. They've been building up an <a href="https://aider.chat/docs/leaderboards/" rel="nofollow">Aider LLM Leaderboard</a> which is interesting, especially the highlighted polyglot board (one model for architecture plan, another for low-level coding)</li><li><strong><a href="https://sourcegraph.com/cody" rel="nofollow">Sourcegraph Cody</a></strong>: There are several VSCode-embedded code assistants in this space, Cody is one to keep an eye on. Recently <a href="https://code.visualstudio.com/docs/copilot/copilot-edits" rel="nofollow">Copilot Edits</a> has stepped up to a similar cross-file assistant too. There are a bunch of others; I'm not really psyched about switching from vim to vscode, and I <em>certainly</em> don't want to switch to a proprietary editor, so I haven't spent much time with things like <a href="https://www.cursor.com/" rel="nofollow">Cursor</a> (yet)</li><li><strong><a href="https://www.youtube.com/@matthew_berman/videos" rel="nofollow">Matthew Berman (YouTube)</a></strong>: He does videos with some demos and commentary that is pretty fun; I may not always agree, but even knowing what the latest <em>topics</em> are is very helpful!</li><li><strong><a href="https://changelog.com/practicalai" rel="nofollow">Practical AI Podcast</a></strong>: I listen to podcasts when I commute or go for longer drives, which isn't often but often enough that I've listened to some good episodes both here and on other ChangeLogs.</li><li><strong><a href="https://www.latent.space/podcast" rel="nofollow">Latent Space: The AI Engineer Podcast</a></strong>: I've only listened to a few of these, but it is on top of my feed list in <a href="https://antennapod.org/" rel="nofollow">AntennaPod</a> currently</li></ul>
<p>... I think that'll do for now!</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/LLM_Newspaper_Dog_Cartoon.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[VisiData XDG]]></title>
            <link>https://thelackthereof.org/tlt-2025.01.31-visidata-xdg</link>
            <guid>https://thelackthereof.org/tlt-2025.01.31-visidata-xdg</guid>
            <pubDate>Fri, 31 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[Figured out how to make opening a CSV in firefox pop open a terminal running VisiData (vd)]]></description>
            <content:encoded><![CDATA[<p>Figured out how to make opening a CSV in firefox pop open a terminal running VisiData (vd)</p>
<h2 id="visidata">VisiData!</h2>
<p>I like <a href="https://www.visidata.org/" rel="nofollow">VisiData</a>! If you are working with tabular data, like a CSV file, it is a lovely slicer and dicer. It's a pretty terminal-keyboard-heavy program, like a vim family thing. Like many of these power tools, I find that you can get into it best by finding ONE use-case and then gradually introducing new tricks from there. So the simple use-case for VisiData is simply viewing CSV files.</p>
<p><img alt="VisiData a simple CSV" src="https://thelackthereof.org/_ipx/_/img/VisiData_a_simple_CSV.png" /></p>
<p>After that you can learn some new commands, such as selecting rows with <code>|gilbert</code> (regex select rows containing &quot;gilbert&quot;) and then zooming in on them with <code>&quot;</code> (view only selected rows). You can press <code>&lt;enter&gt;</code> on a row to see it vertically.</p>
<p>After a while you get addicted to this sort of manipulation and you find yourself downloading CSVs from Firefox and then opening a terminal, navigating over to your downloads folder, and opening it with <code>vd data.csv</code> or whatnot. So I wanted to cut out the middle bits.</p>
<h2 id="xdg-terminal-wrapping">XDG, Terminal Wrapping</h2>
<p>First make a .desktop file for visidata at ~/.local/share/applications/VisiData.desktop containing:</p>
<pre><code>[Desktop Entry]
Encoding=UTF-8
Version=1.0
Type=Application
Terminal=true
Exec=vd %U
MimeType=application/vnd.oasis.opendocument.spreadsheet;application/vnd.oasis.opendocument.spreadsheet-template;application/vnd.sun.xml.calc;application/vnd.sun.xml.calc.template;application/msexcel;application/vnd.ms-excel;application/vnd.openxmlformats-officedocument.spreadsheetml.sheet;application/vnd.ms-excel.sheet.macroEnabled.12;application/vnd.openxmlformats-officedocument.spreadsheetml.template;application/vnd.ms-excel.template.macroEnabled.12;application/vnd.ms-excel.sheet.binary.macroEnabled.12;text/csv;application/x-dbf;text/spreadsheet;application/csv;application/excel;application/tab-separated-values;application/vnd.lotus-1-2-3;application/vnd.oasis.opendocument.chart;application/vnd.oasis.opendocument.chart-template;application/x-dbase;application/x-dos_ms_excel;application/x-excel;application/x-msexcel;application/x-ms-excel;application/x-quattropro;application/x-123;text/comma-separated-values;text/tab-separated-values;text/x-comma-separated-values;text/x-csv;application/vnd.oasis.opendocument.spreadsheet-flat-xml;application/vnd.ms-works;application/clarisworks;application/x-iwork-numbers-sffnumbers;application/x-starcalc;
Name=VisiData
</code></pre>
<p>which I got from <a href="https://dev.to/ajkerrigan/today-i-learned-opening-csvs-with-visidata-in-tmux-from-the-firefox-flatpak-app-4m07" rel="nofollow">this fun page</a> with some slight modification.</p>
<p>This worked! But it opens in gnome-terminal instead of alacritty. After some digging I found from <a href="https://gitlab.gnome.org/GNOME/glib/-/merge_requests/2839" rel="nofollow">this merge request</a> that you can put a wrapper named <code>xdg-terminal-exec</code> in your path and it'll use that as the priority terminal app. So I created ~/bin/xdg-terminal-exec containing:</p>
<pre><code>#!/bin/sh

exec ~/bin/terminal -e "$@"
</code></pre>
<p>And that in turn calls my per-machine terminal script, which contains roughly:</p>
<pre><code>#!/bin/sh

if [ "$HOSTNAME" == "arcanejill.thelackthereof.org" ]; then
  exec aterm -rv -tr -sl 10000 -sh 50 -ls +sb -vb -fn 6x12 -e "$@"
elif [ "$HOSTNAME" == "feline.thelackthereof.org" ]; then
  exec aterm -tr -sl 10000 -sh 50 -ls +sb -vb -fn '-b&amp;h-lucidatypewriter-bold-r-normal-*-13-*-*-*-m-*-iso10646-1' -e "$@"

# ... and so on for various machines I've had that I wanted different settings on

else
  exec ~/.cargo/bin/alacritty "$@"
fi
</code></pre>
<p>... and now when I click on the CSV from my downloads dropdown in firefox POP goes a terminal running VisiData!</p>
<style>html pre.shiki code .s8-w5, html code.shiki .s8-w5{--shiki-default:#6A737D;--shiki-dark:#6A737D;--shiki-sepia:#88846F}html pre.shiki code .sTrkL, html code.shiki .sTrkL{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#66D9EF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sdpu8, html code.shiki .sdpu8{--shiki-default:#005CC5;--shiki-default-font-style:inherit;--shiki-dark:#79B8FF;--shiki-dark-font-style:inherit;--shiki-sepia:#FD971F;--shiki-sepia-font-style:italic}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}</style>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/VisiData_a_simple_CSV.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Nerd Snipes]]></title>
            <link>https://thelackthereof.org/tlt-2025.01.19-nerd-snipes</link>
            <guid>https://thelackthereof.org/tlt-2025.01.19-nerd-snipes</guid>
            <pubDate>Sun, 19 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[What distracted me today? Flameshot and Rofi.]]></description>
            <content:encoded><![CDATA[<p>What distracted me today? Flameshot and Rofi.</p>
<p>--</p>
<p>It's a weekend, and on the weekends I am retired. And it has long been my declaration that someday when I retire I will spend all day every day messing with dumb config files. SO!</p>
<h2 id="screenshot-to-keyboard">Screenshot to Keyboard</h2>
<p>I have been using <a href="https://flameshot.org/" rel="nofollow">Flameshot</a> for a while now, and it is great! But ... something something Wayland something something and in the end it doesn't copy the image to my clipboard. I have rotated through a few screenshot managers, so my <code>win+s</code> keybinding actually runs <code>~/bin/screenshot</code>. Today, I modified it to contain:</p>
<pre><code>QT_QPA_PLATFORM=wayland flameshot gui --raw | wl-copy -f
</code></pre>
<p>And now I can take a screenshot and paste it wherever I want. I also have Flameshot configured to save <em>all</em> of my screenshots to a directory. Someday I can ask some vision-LLM questions about these files :)</p>
<h2 id="faster-and-prettier-runner">Faster and Prettier Runner</h2>
<p>I've been using <a href="https://github.com/davatorium/rofi" rel="nofollow">Rofi</a> as my run-dialog for a while. It is kinda slow to start though ... like a lag between when I press <code>win+shift+p</code> and actually get the dialog. Looking at it ... I had previous set up the wrapper script to run zsh in interactive mode. Why? Because for some reason <code>$PATH</code> wasn't getting set I think. But interactive-mode takes a sec to run. hmm.</p>
<p>I thrashed all about trying to fix the <code>$PATH</code>. Rando <code>systemctrl</code> things, editing <code>~/.config/environment.d/10-path.conf</code>, all sorts of things. No dice.</p>
<p>Then I spent some time switching over to <a href="https://codeberg.org/dnkl/fuzzel" rel="nofollow">fuzzel</a> which seems fast and cool. But ... same problems sorta. It was wanting to run .desktop entries instead of <code>$PATH</code> entries, though you could get it to run <code>$PATH</code> commands ... but then it didn't add them into the memory list ... etc.</p>
<p>Finally I realized I could go back to Rofi and since I have this wrapper script just throw my <code>$PATH</code> export in there! UGLY!!! But it works.</p>
<p>Then I spent a while updating the theme for Rofi to take some inspiration from what I saw over in Fuzzel. Now it looks like this:</p>
<p><img alt="rofi theme" src="https://thelackthereof.org/_ipx/_/img/rofi_theme.png" /></p>
<p>Pretty snazzy!!!</p>
<style>html pre.shiki code .sMOD_, html code.shiki .sMOD_{--shiki-default:#24292E;--shiki-dark:#E1E4E8;--shiki-sepia:#F8F8F2}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}</style>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/rofi_theme.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Little Dashes of LLMs]]></title>
            <link>https://thelackthereof.org/tlt-2025.01.11-little-dashes-of-llms</link>
            <guid>https://thelackthereof.org/tlt-2025.01.11-little-dashes-of-llms</guid>
            <pubDate>Sat, 11 Jan 2025 00:00:00 GMT</pubDate>
            <description><![CDATA[A small data transform / cleanup task using LLM labor.]]></description>
            <content:encoded><![CDATA[<p>A small data transform / cleanup task using LLM labor.</p>
<hr />
<p>My mom is now running a small business, <a href="https://129aztss.com/" rel="nofollow">$129 Arizona Discount Traffic Survival School</a>, and I'm tinkering away at a website for her. The other day she gives me a google doc with venue addresses, asking if I can put it up on the site.</p>
<p><img alt="addresses in a google doc" src="https://thelackthereof.org/_ipx/_/img/addresses_in_a_google_doc.png" /></p>
<p>While the doc was pretty consistent, it'd be even better as a nice little spreadsheet. In fact, if it is a Google Sheet then you can HTTP GET it as a CSV live! Then if she adds a venue to the sheet it will magically show up on her website.</p>
<p>Alas. This is a Doc not a Sheet. But we live in the future! Grabbing my pre-set-up <a href="https://llm.datasette.io/en/stable/" rel="nofollow">llm</a> and <a href="https://claude.ai" rel="nofollow">claude.ai</a>, I simpy do this:</p>
<pre><code>cat | llm -s 'turn this into a tsv with location, venue name, address, notes'
</code></pre>
<p>Then I <em>copy</em> from the docs and <em>paste</em> into my terminal, and out pops a tab-separated list! <em>copy</em> from my terminal and <em>paste</em> into a Google Sheet and PRESTO!</p>
<p><img alt="venue list in spreadsheet" src="https://thelackthereof.org/_ipx/_/img/venue_list_in_spreadsheet.png" /></p>
<p>Yes -- I could have piped it into <code>wl-copy</code> instead of using my mouse to copy like a caveman. One can only go so far!</p>
<style>html pre.shiki code .srTi1, html code.shiki .srTi1{--shiki-default:#6F42C1;--shiki-dark:#B392F0;--shiki-sepia:#A6E22E}html pre.shiki code .sC2Qs, html code.shiki .sC2Qs{--shiki-default:#D73A49;--shiki-dark:#F97583;--shiki-sepia:#F92672}html pre.shiki code .s7F3e, html code.shiki .s7F3e{--shiki-default:#005CC5;--shiki-dark:#79B8FF;--shiki-sepia:#AE81FF}html pre.shiki code .sstjo, html code.shiki .sstjo{--shiki-default:#032F62;--shiki-dark:#9ECBFF;--shiki-sepia:#E6DB74}html .default .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .shiki span {color: var(--shiki-default);background: var(--shiki-default-bg);font-style: var(--shiki-default-font-style);font-weight: var(--shiki-default-font-weight);text-decoration: var(--shiki-default-text-decoration);}html .dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html.dark .shiki span {color: var(--shiki-dark);background: var(--shiki-dark-bg);font-style: var(--shiki-dark-font-style);font-weight: var(--shiki-dark-font-weight);text-decoration: var(--shiki-dark-text-decoration);}html .sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}html.sepia .shiki span {color: var(--shiki-sepia);background: var(--shiki-sepia-bg);font-style: var(--shiki-sepia-font-style);font-weight: var(--shiki-sepia-font-weight);text-decoration: var(--shiki-sepia-text-decoration);}</style>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/addresses_in_a_google_doc.png" length="0" type="image/png"/>
        </item>
        <item>
            <title><![CDATA[Little Boxes For Your Ghost]]></title>
            <link>https://thelackthereof.org/tlt-2024.12.12-little-boxes-for-your-ghost</link>
            <guid>https://thelackthereof.org/tlt-2024.12.12-little-boxes-for-your-ghost</guid>
            <pubDate>Thu, 12 Dec 2024 00:00:00 GMT</pubDate>
            <description><![CDATA[Drawing Xes in Boxes is harder than you might think! Teaching Ghostwriter a bit about space by pre-segmenting the input image gets us closer.]]></description>
            <content:encoded><![CDATA[<p>Drawing Xes in Boxes is harder than you might think! Teaching <a href="https://thelackthereof.org/ghostwriter">Ghostwriter</a> a bit about space by pre-segmenting the input image gets us closer.</p>
<h2 id="the-problem">The Problem</h2>
<p>You may recall from <a href="https://thelackthereof.org/tlt-2024.11.23-a-ghostly-game">TLT - 2024.11.23 - A Ghostly Game</a> that <a href="https://thelackthereof.org/ghostwriter">Ghostwriter</a> is ... not good with spatial awareness. For example, we can ask it to draw an X in a box and see how close it gets...</p>
<p><img alt="Ghostwriter X not in box" src="https://thelackthereof.org/_ipx/_/img/Ghostwriter_X_not_in_box.png" /></p>
<p>Not great. That is even <em>after</em> we tried the &quot;plz think harder&quot; approach, asking the LLM to write out where it thinks things are with bounding boxes and planning where things should go and all that. It still can't hit the box that it can see.</p>
<p>It can <em>read handwriting</em>, it <em>knows there is a box more or less in the middle</em>. So close!</p>
<h2 id="step-outside-the-box">Step Outside The Box</h2>
<blockquote><p><strong>Vivian Jaffe:</strong> Have you ever transcended space and time?<br /><strong>Albert Markovski:</strong> No. Yes. Uh, time not space. No. I have no idea what you're talking about.<br /><em>(I Heart Huckabees, 2004)</em></p></blockquote>
<p>So with a little help from my friend <a href="https://sourcegraph.com/cody" rel="nofollow">Cody</a> I whipped up a relatively dumb segmenter. It uses <a href="https://docs.rs/image/latest/image/" rel="nofollow">image</a> and <a href="https://docs.rs/imageproc/latest/imageproc/" rel="nofollow">imageproc</a> to find contours, snaps boxes around them, and then looks for the big ones. So in the case of our box, here is a bit of extra that we put into the prompt:</p>
<pre><code>Here are interesting regions based on an automatic segmentation algorithm. Use
them to help identify the exact location of interesting features.

Region: x=400, y=572, width=640, height=613
Region: x=31, y=32, width=41, height=41
Region: x=811, y=96, width=133, height=127
Region: x=279, y=162, width=83, height=29
Region: x=178, y=128, width=69, height=86
Region: x=1014, y=138, width=43, height=47
Region: x=36, y=37, width=31, height=31
Region: x=979, y=96, width=42, height=85
Region: x=549, y=118, width=56, height=76
Region: x=439, y=149, width=53, height=56
</code></pre>
<p>And now it gets much closer!</p>
<p><img alt="Ghostwriter X more in box" src="https://thelackthereof.org/_ipx/_/img/Ghostwriter_X_more_in_box.png" /></p>
<p>This is a pretty coarse-grained way to give a sense of space, but it is working much better with this segmentation hint. There are a few other things that might work as well -- we could give it an image of what each of the segments has inside of it, we could merge segments with some center-of-gravity sort of thing. Etc.</p>
<p>Let's try more boxes!</p>
<p><img alt="Ghostwriter x in boxes not great" src="https://thelackthereof.org/_ipx/_/img/Ghostwriter_x_in_boxes_not_great.png" /></p>
<p>Whelp... still more work to do! :)</p>]]></content:encoded>
            <enclosure url="https://thelackthereof.org/_ipx/_/img/Ghostwriter_X_not_in_box.png" length="0" type="image/png"/>
        </item>
    </channel>
</rss>