<?xml version="1.0" encoding="UTF-8"?>
<rss xmlns:atom="http://www.w3.org/2005/Atom" version="2.0">
    <channel>
      <title>SuperScript</title>
      <link>https://www.superscript.com</link>
      <description>William Baxter — Fractional CTO for growth-stage companies</description>
      <generator>Zola</generator>
      <language>en</language>
      <atom:link href="https://www.superscript.com/rss.xml" rel="self" type="application/rss+xml"/>
      <lastBuildDate>Thu, 26 Feb 2026 08:08:20 -0600</lastBuildDate>
      <item>
          <title>Back It Off a Quarter Turn</title>
          <pubDate>Thu, 26 Feb 2026 08:08:20 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/back-it-off-a-quarter-turn/</link>
          <guid>https://www.superscript.com/posts/back-it-off-a-quarter-turn/</guid>
          <description xml:base="https://www.superscript.com/posts/back-it-off-a-quarter-turn/">&lt;p&gt;A friend actually educated in the workings of LLMs described some aspects of LLM training. A sequence of train-then-verify loops produces models of varying quality. The trainers look for increasing performance, and eventually see it level off or start to decline with overtraining. Then they select the model that exhibited the peak performance, generally not the last.&lt;&#x2F;p&gt;
&lt;p&gt;So the old engineering joke lives on!
&lt;blockquote&gt;
How hard should you torque a bolt?

Tighten it until it strips, then back it off a quarter turn.
&lt;&#x2F;blockquote&gt;
&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Sorting Networks</title>
          <pubDate>Wed, 18 Feb 2026 08:41:07 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/sorting-networks/</link>
          <guid>https://www.superscript.com/posts/sorting-networks/</guid>
          <description xml:base="https://www.superscript.com/posts/sorting-networks/">&lt;p&gt;Today I learned about sorting networks and bitonic sequences. Despite being aware of &lt;code&gt;djbsort&lt;&#x2F;code&gt; since its initial publication, I never looked at any implementation details. Today I ran across this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;00f.net&#x2F;2026&#x2F;02&#x2F;17&#x2F;sorting-without-leaking-secrets&#x2F;&quot;&gt;introduction&lt;&#x2F;a&gt; and this apparently &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cs.kent.edu&#x2F;~batcher&#x2F;sort.pdf&quot;&gt;canonical reference&lt;&#x2F;a&gt;. Fun stuff!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A Judgement Amplifier</title>
          <pubDate>Mon, 08 Dec 2025 10:55:57 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/a-judgement-amplifier/</link>
          <guid>https://www.superscript.com/posts/a-judgement-amplifier/</guid>
          <description xml:base="https://www.superscript.com/posts/a-judgement-amplifier/">&lt;p&gt;At a recent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atx.ctoclubs.net&#x2F;&quot;&gt;Austin CTO Club&lt;&#x2F;a&gt; meeting someone remarked that AI tool use amplifies the quality of the technology development team members. That is, good developers become better, and bad developers become worse. How can this be so?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;ai-tool-effects&quot;&gt;AI Tool Effects&lt;&#x2F;h2&gt;
&lt;p&gt;If an AI toolkit is worse at programming than the user, one may expect it to lower the output quality for that developer, degrading their performance. And if the AI tool is better, then similarly one may expect it to raise the quality. It seems natural that training on a wide variety of coding inputs will cause AI to produce average-quality code, not bottom- or top-notch code. In light of this, should we expect regression toward the mean in team member performance?&lt;&#x2F;p&gt;
&lt;p&gt;It is possible that AI is better at programming than all the developers. That seems extremely unlikely. In my experience the tools can readily create a large volume of code, but the quality is mediocre. But supposing that the tools do improve code quality for all developers, how does that explain bad developers becoming worse?&lt;&#x2F;p&gt;
&lt;p&gt;The quality of prompts has a strong effect on the quality of the outputs from the current generation of AI tools. A natural ability to prompt well may correlate with developer quality. Regardless, I would expect training in prompt engineering plus the above regression toward the mean to decrease the differences in developer performance. I suspect there was some such training in the case at hand. This would be an obvious experiment.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;judgement&quot;&gt;Judgement&lt;&#x2F;h2&gt;
&lt;p&gt;My guess is that the quality of &lt;em&gt;judgement&lt;&#x2F;em&gt; in evaluating and applying AI outputs explains the divergent outcome quality. One factor separating good and bad developers is their relative ability to make sound decisions about architecture, code factoring, choice of libraries, testing rigor, code review, and so on. If the AI tools take care of basic blocking and tackling in the development process, then a larger fraction of the remaining human role is applying judgement in making these decisions. And so the quality of these judgements has increased effect.&lt;&#x2F;p&gt;
&lt;p&gt;Can the AI tools decrease the need for such judgement rather than merely displace it? That would require running out of higher-level decisions to pick up after delegating lower-level decisions to the AI tools. I believe we are far from a world in which that condition obtains.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;decision-speed-and-quality&quot;&gt;Decision Speed and Quality&lt;&#x2F;h2&gt;
&lt;p&gt;If AI tools do amplify judgement, then decision speed and quality increase in value. Good deciders improve in their roles, and bad deciders become worse. Decisions will tend to have broader scope and effect. Faster and better decisions keep the AI working and pointed in the right direction.&lt;&#x2F;p&gt;
&lt;p&gt;All of this suggests two simple things to try:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Test for role-related decision speed and quality in your hiring process.&lt;&#x2F;li&gt;
&lt;li&gt;Work to improve decision speed and quality in your employees.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If successful, these will put people on the plus side of the ledger as AI tool users.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Making the Cut</title>
          <pubDate>Thu, 04 Dec 2025 07:40:52 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/making-the-cut/</link>
          <guid>https://www.superscript.com/posts/making-the-cut/</guid>
          <description xml:base="https://www.superscript.com/posts/making-the-cut/">&lt;p&gt;“I put the ticket in more than two years ago and it still isn’t done. When will you get to it?” Our Product lead apparently looked at our backlog as a queue, in which everything that goes in is implemented sooner or later. That makes sense if your tickets are for customer support. But not for a product backlog.&lt;&#x2F;p&gt;
&lt;p&gt;I replied that if her request had failed to achieve priority in two years it was never going to get priority. Other things arrived, maybe before and certainly after, that jumped ahead in line.&lt;&#x2F;p&gt;
&lt;p&gt;Following that encounter I announced to everyone that in two weeks I would purge all tickets older than 18 months. If they wanted to keep an item in the backlog, all they needed to do was to update the ticket. They could simply add a “Keep this” comment.&lt;&#x2F;p&gt;
&lt;p&gt;When the time for the purge came, about a dozen old tickets among a couple thousand had been updated. The rest were purged. And after that I repeated the exercise, bringing the threshold down to 12 months. Nobody missed the purged items.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;backlog-not-queue&quot;&gt;Backlog, Not Queue&lt;&#x2F;h2&gt;
&lt;p&gt;The idea that a product backlog is a queue in which every input is acted on overlooks the main value of a backlog: things drop off the bottom. A backlog delivers value by determining what work will &lt;em&gt;not&lt;&#x2F;em&gt; be done, as well as by prioritizing the work that makes the cut.&lt;&#x2F;p&gt;
&lt;p&gt;One fundamental problem shared by virtually all electronic product backlog tools is that they remember too much. No doubt you have had that conversation in which someone says “Archive it in case we need to reinstate it later.” or “Let’s save it so that we can look back at how we reached that decision.” It sounds good. But the standard critique of waterfall planning applies here. When you reinstate or look back at an item you have a different, more fully informed context. Your earlier considerations lacks the benefit of the learning you did since setting aside the item. Picking up that old work again requires mapping it into your current context, and working your way through those same considerations in light of your current knowledge. Reviving your reasoning or the ticket itself is not so straightforward as it first appears. A good rule of thumb is “If it is important enough, it will come up again.”&lt;&#x2F;p&gt;
&lt;p&gt;Items drop off a backlog not because they embody bad ideas, but because they are not good enough. An individual item cannot be measured in stand-alone fashion on its own merits. Instead it must make the cut in competition with the other items in the backlog. The decisions about what to prioritize and where to draw the line are not easy. Nevertheless, they are key to achieving focus on the items that will be developed.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;trade-offs&quot;&gt;Trade-Offs&lt;&#x2F;h2&gt;
&lt;p&gt;When your backlog is large, you spend a lot of time and effort on reviewing, updating, and reprioritizing it to reflect new learning. And you will invariably change or set aside some of the items in the backlog after this investment of time and effort.&lt;&#x2F;p&gt;
&lt;p&gt;Those changes and set-asides are not necessarily dysfunctional. Completing every item in your backlog without changes suggests that you are not learning as you go, because learning modifies and improves the way you approach work. And learning that an item is not worth doing frees you to do more important work. So changes and set-asides can be valuable. They can also be taken too far. A high rate of set-asides suggests that your backlog is either too large or too ill-defined. The sweet spot sits in the middle.&lt;&#x2F;p&gt;
&lt;p&gt;How big and how well-defined should your backlog be? This is a question of trade-offs. Do you spend inordinate amounts of time on review, updates, and prioritization? That suggests that your backlog is too large. Do you regularly radically change backlog items? That suggest that your backlog is ill-defined. Do you set aside a high proportion of your backlog items? That suggests it is too large and also ill-defined.&lt;&#x2F;p&gt;
&lt;p&gt;One rule of thumb is to size the backlog by the look-ahead it provides. Make it large enough to include work you expect to complete in some reasonable amount of time plus work coming up in the next such interval.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The backlog is your tool for managing these trade-offs. Its main benefit is giving you a place to make the cut, and set aside the things that don’t belong in view now. Make the cut, give yourself focus, and don’t fall prey to the temptation to remember everything and your flow will improve.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Prototype vs Implementation</title>
          <pubDate>Sun, 30 Nov 2025 13:27:30 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/prototype-vs-implementation/</link>
          <guid>https://www.superscript.com/posts/prototype-vs-implementation/</guid>
          <description xml:base="https://www.superscript.com/posts/prototype-vs-implementation/">&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atx.ctoclubs.net&quot;&gt;Austin CTO Club&lt;&#x2F;a&gt; recently met to discuss &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atx.ctoclubs.net&#x2F;posts&#x2F;managing-c-suite-expectations&#x2F;&quot;&gt;Managing C-Suite Expectations&lt;&#x2F;a&gt;. One specific point received little attention that evening, and in my opinion deserves additional thought: prototype versus implementation.&lt;&#x2F;p&gt;
&lt;p&gt;When presented with a prototype, executives frequently think of it as an early implementation. Many of the concerns that separate prototype from implementation are invisible to executives, and reasonably so: security, scalability, deployment, integrations, and so on.&lt;&#x2F;p&gt;
&lt;p&gt;Without knowing about how easy or difficult these concerns are to address, it’s no wonder that time to production deployment is their focus. From where they sit it seems that product development stalls after the creation of the prototype. And in the meantime they have other concerns, including evaluation of additional prototypes. This dynamic leads to tension during implementation between the need for careful attention to security etc. and the need to move quickly to market.&lt;&#x2F;p&gt;
&lt;p&gt;Vibe coding is on the rise. It shortens the time to prototype creation as well as opening the door to prototype creation to those with less technical knowledge. An increasing number of product managers can use AI to produce prototypes. We will see the number of prototypes produced increase. My guess is that it will rise by a couple orders of magnitude. And then what happens?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;mind-the-gap&quot;&gt;Mind the Gap&lt;&#x2F;h2&gt;
&lt;p&gt;How does everyone react to this superabundance of prototypes? And what does this mean about the gap between prototype and implementation? How do we help executives operate in this prototype-rich environment? I’ve heard at least four different ideas for addressing this.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;ignore-it&quot;&gt;Ignore It&lt;&#x2F;h3&gt;
&lt;p&gt;Ignore the problem, and hope it goes away. Doing nothing is usually an option, and often an underrated one. In this case, ignoring it seems likely to exacerbate the problem unless and until the AI tools that speed up prototyping become good enough to address the additional concerns of implemention. In other words, if the tools become sufficiently capable, the gap between prototype and implementation closes, eliminating the problem.&lt;&#x2F;p&gt;
&lt;p&gt;If you bet on the gap disappearing and it does not, where does that leave you? And what can you do in the interim when the gap does exist? What if the gap closes, but then your production implementation exhibits some bug? Who fixes that if those who implemented it lack deep technical know-how? This approach seems very high risk, though perhaps it helps a smaller company get to market more quickly.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;dumb-down&quot;&gt;Dumb Down&lt;&#x2F;h3&gt;
&lt;p&gt;Some people advocate for creating prototypes that look more like wireframes than polished applications, giving a visual clue as to the incompleteness of the implementation. This would highlight that something is a prototype and not an implementation.&lt;&#x2F;p&gt;
&lt;p&gt;The entire reason for polishing an application is to make it more attractive. Sticking to cruder presentations foregoes that benefit. Can the less attractive option win over the more polished alternative? That seems doubtful, especially if you believe better UX and design add value for the user.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;flood-the-zone&quot;&gt;Flood the Zone&lt;&#x2F;h3&gt;
&lt;p&gt;What if you create enough prototypes to overwhelm those who evaluate them? The superabundance of something reduces the value of each one, so each one is thereby easier to dismiss. The low cost of producing any one prototype does lower the opportunity cost of your selection of which one to implement.&lt;&#x2F;p&gt;
&lt;p&gt;Does the superabundance of prototypes lead to greater ambition, and attempts to select more options to implement? This sounds like a new expression of the original problem. Expectations scale much more readily and quickly than capacity does. If prototype capacity doubles, how much executive ambition for implementations scale?&lt;&#x2F;p&gt;
&lt;h3 id=&quot;experimentation&quot;&gt;Experimentation&lt;&#x2F;h3&gt;
&lt;p&gt;Treating prototypes as experiments that explore implementation options, and the choice of implementation as outcome of those experiments, draws a business-related distinction between prototype and implementation. This is easier to convey to non-implementors than direct implementation concerns. It also leverages the role of non-implementors in increasingly important decision making.&lt;&#x2F;p&gt;
&lt;p&gt;This approach does require tempering the scaling executive ambitions, just as with flooding the zone. In this case is the scaling on the prototype side gives wider choice among different implementations, letting non-implementors improve the quality of outcomes through their choices, even if implementation capacity does not rise.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;other-approaches&quot;&gt;Other Approaches?&lt;&#x2F;h2&gt;
&lt;p&gt;There are doubtless many more ways to address the question with some combination of constraint, education, and planning. What approach would you take?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Document-Driven Development</title>
          <pubDate>Mon, 24 Nov 2025 18:20:57 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/document-driven-development/</link>
          <guid>https://www.superscript.com/posts/document-driven-development/</guid>
          <description xml:base="https://www.superscript.com/posts/document-driven-development/">&lt;p&gt;In recent months I’ve spoken to many people about inverting the model and coding my docs rather than documenting my code. Today I learned that this has been developed under the heading of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;collectiveidea.com&#x2F;blog&#x2F;archives&#x2F;2014&#x2F;04&#x2F;21&#x2F;on-documentation-driven-development&#x2F;&quot;&gt;Documentation-Driven Development&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.writethedocs.org&#x2F;videos&#x2F;portland&#x2F;2019&#x2F;lessons-learned-in-a-year-of-docs-driven-development-jessica-parsons&#x2F;&quot;&gt;Docs-Driven Development&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;amplifier&#x2F;tree&#x2F;main&#x2F;docs&#x2F;document_driven_development&quot;&gt;Document-Driven Development&lt;&#x2F;a&gt; or &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;tom.preston-werner.com&#x2F;2010&#x2F;08&#x2F;23&#x2F;readme-driven-development.html&quot;&gt;Readme Driven Development&lt;&#x2F;a&gt;. I found it via the third &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;microsoft&#x2F;amplifier&#x2F;tree&#x2F;main&#x2F;docs&#x2F;document_driven_development&quot;&gt;link&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Defining Hypotheses</title>
          <pubDate>Thu, 20 Nov 2025 11:03:11 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/defining-hypotheses/</link>
          <guid>https://www.superscript.com/posts/defining-hypotheses/</guid>
          <description xml:base="https://www.superscript.com/posts/defining-hypotheses/">&lt;p&gt;Startup founders must engage in a lot of experimental learning to find and confirm their markets. The vision matters, of course, but it also must survive its test in the market. To that end, formulating good experiments is essential.
The heart of an experiment is the hypothesis it tests. What do you expect to happen? How do you measure the outcome? What is your threshold for success? A poorly defined hypothesis clouds the outcome and impedes the search for clear signal. So here are two pieces of advice for startup founders on how to formulate a good hypothesis.&lt;&#x2F;p&gt;
&lt;p&gt;First, make it boolean. Make the hypothesis yield a pass&#x2F;fail result. This is the simplest possible set of outcomes. Second, include your criteria for success or failure in the hypothesis.&lt;&#x2F;p&gt;
&lt;p&gt;These two points are important for the same reason. If you apply each of them and then run your experiment, you will have a clear outcome: we passed or failed according to criteria established at the outset. With that clarity, you will discuss what it means that you passed or failed. This is the forward-looking question you need to address. It focuses on how you will behave in light of the result. What changes you can make your hypothesis? How does the result alter your vision? What strategy you should adopt in response to this new finding? And so on.&lt;&#x2F;p&gt;
&lt;p&gt;In contrast, if you do not establish criteria beforehand, or if you produce a complicated set of outcomes, then you will discuss whether or not you passed or failed. That is a backward looking question, one typically loaded with emotion from wanting to succeed by passing. It does not focus on options for reacting to the outcome, and instead obsesses over the outcome itself.&lt;&#x2F;p&gt;
&lt;p&gt;This is simple and yet in practice proves difficult. I’ve seen more hypotheses that violate these two rules than ones that adhere to them. Defering the formulation of clear success criteria hedges your bet. You can adjust them later so that your experiment succeeded by passing. That generally makes people feel good because they can claim to have been right all along. But it involves a mistaken notion of experimental success.&lt;&#x2F;p&gt;
&lt;p&gt;The success of an experiment hinges on the learning that it provides. Both pass and fail outcomes support learning. There is no reason to believe that you learn more from “pass” than from “fail” when running an experiment. If all of your experiments succeed, you are playing it too safe and not stretching far enough into the unknown. If all of your experiments fail, then you are out of touch with your own capabilities. A good rule of thumb is to aim for a 50% success rate. If you read “pass” as “success” then that sounds abysmal. But both “pass” and “fail” contribute to experimental success.&lt;&#x2F;p&gt;
&lt;p&gt;Finding the right thresholds to apply in your pass&#x2F;fail criteria is not always easy. You are dealing with unknowns when learning, so of course you will miss the mark with some frequency. With success criteria defined in advance you can always decide that the failure was due to erroneous criteria and formulate a new hypothesis. But if you establish the criteria after the fact you will have lost the clear signal from your experiment. That may feel better, but it does less to advance your understanding of the market, and diminishes the objectivity of the outcome. Market understanding matters far more than your feelings.&lt;&#x2F;p&gt;
&lt;p&gt;Over time as a product matures, the experiments will naturally trend toward changes of lesser consequence. You don’t want to make a major change to a deployed system that fails your user 50% of the time. But that’s not the same question as pass&#x2F;fail of your experiment. Instead of changing the pass rate in your experiments, reduce the scope of impact. Entrepreneurs usually have experience working in larger companies. And they often bring with them the practice of making narrow-scope changes and conflating pass with success. In an immature business you do not have time for that. Scope your experiment appropriate to the risk of failing to learn.&lt;&#x2F;p&gt;
&lt;p&gt;In summary, restrict yourself to pass&#x2F;fail results, and agree on your success criteria before running your experiment. Doing so you will give you the clarity needed to focus forward and adapt.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>MVPs Reveal Preference</title>
          <pubDate>Fri, 03 Oct 2025 14:40:37 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/mvps-reveal-preference/</link>
          <guid>https://www.superscript.com/posts/mvps-reveal-preference/</guid>
          <description xml:base="https://www.superscript.com/posts/mvps-reveal-preference/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Enc&#x2F;bios&#x2F;Samuelson.html&quot;&gt;Paul Samuelson&lt;&#x2F;a&gt; introduced the concept of “revealed preference” in a 1938 article entitled &lt;em&gt;A Note on the Pure Theory of Consumers’ Behavior&lt;&#x2F;em&gt;. It means the preference implied by a consumer’s behavior in the market. It’s the economist’s broadening of putting your money where your mouth is.&lt;&#x2F;p&gt;
&lt;p&gt;What does this have to do with MVPs? An MVP is a tool to reveal preference.&lt;&#x2F;p&gt;
&lt;p&gt;I once worked with a team that wanted to build a mobile app to help people rate their phone carriers. The team started with a paper prototype MVP. They showed it to people and asked them what they would say about their carrier. People responded with great enthusiasm and told them all sorts of things positive and negative about the carriers.&lt;&#x2F;p&gt;
&lt;p&gt;But team learned only “stated preference”, the preferences expressed in response to questions or a survey. They didn’t learn revealed preference, how people behave when given the choice.&lt;&#x2F;p&gt;
&lt;p&gt;So I sent them out again. This time they introduced the prototype and simply handed it to people with a pencil and asked them to fill it out. The response was completely different. Almost everyone declined to participate. The revealed preference was to avoid the app, not to engage with it.&lt;&#x2F;p&gt;
&lt;p&gt;When building a product, how do you learn how users will interact with it? Will they in fact adopt it? How will they behave when they use it? Will they prefer it to the alternatives? How much is it worth to them? These are all questions of revealed preference.&lt;&#x2F;p&gt;
&lt;p&gt;A successful product engages users, changes their behavior, and improve their lives. Users may say one thing and do another. What matters is their behavior, their revealed preference. And the proper use of an MVP is to reveal that preference. If you genuinely understand users’ revealed preference, you can build a product that serves them well.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jpattonassociates.com&#x2F;&quot;&gt;Jeff Patton&lt;&#x2F;a&gt; has a good &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=ItwIRAX0Bmw&quot;&gt;video&lt;&#x2F;a&gt; on the history and interpretation of the term Miminum Viable Product, and says “Product” really means “Test”, an experiment to test some hypothesis. More recently Gagan Biyani took up the same &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;review.firstround.com&#x2F;the-minimum-viable-testing-process-for-evaluating-startup-ideas&#x2F;&quot;&gt;refrain&lt;&#x2F;a&gt;. Regardless of what you call it, focus your hypothesis on revealed rather than stated preference, and build an MVP to test it.&lt;&#x2F;p&gt;
&lt;p&gt;An MVP is a tool to reveal preference.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Cheap and Cheerful</title>
          <pubDate>Sat, 20 Sep 2025 13:41:17 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/cheap-and-cheerful/</link>
          <guid>https://www.superscript.com/posts/cheap-and-cheerful/</guid>
          <description xml:base="https://www.superscript.com/posts/cheap-and-cheerful/">&lt;p&gt;If you shop at Costco you are likely aware that they give away boxes of many shapes and sizes. Many of these are reinforced to protect delicate contents such as ripe fruits. And most have at least one low-cut side. These qualities make them excellent impromptu shelf organizers, say for a metro rack.&lt;&#x2F;p&gt;


&lt;div class=&quot;gallery&quot;&gt;

&lt;figure&gt;&lt;img src=&quot;&amp;#x2F;images&amp;#x2F;cheap-and-cheerful&#x2F;20250920_130022.jpg&quot;&gt;&lt;&#x2F;figure&gt;

&lt;&#x2F;div&gt;
&lt;p&gt;The author of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;paulakers.net&#x2F;books&#x2F;2-second-lean&quot;&gt;2-Second Lean&lt;&#x2F;a&gt; has a YouTube &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;@paul-akers&quot;&gt;channel&lt;&#x2F;a&gt; that includes virtual tours of lean organizations. The best one I’ve seen is the (second) tour of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=zzl2kp-MgVw&quot;&gt;Premier Group&lt;&#x2F;a&gt;. The video pertains to manufacturing, but even for those of us in software development it is chock full of ideas. A strong emphasis on culture and growth of people runs through it start to finish. It’s well worth a look.&lt;&#x2F;p&gt;
&lt;p&gt;Owner Bernard Powell uses two noteworthy phrases that I want to map into the world of software development:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;strong&gt;Cheap and Cheerful&lt;&#x2F;strong&gt;: Improvements that don’t cost a lot. For example, recycling discard material into improvements. This is relatively easy with respect to your desk or office area, or a common work room. What about in software? Small meta-programming improvements may qualify. Simple improvements in your daily kit, like improved editor keybindings may qualify. Simple automation has to be the big example. If you have done it for a third time, ask yourself whether you can automate it?&lt;&#x2F;li&gt;
&lt;li&gt;&lt;strong&gt;Walk-Away Standards&lt;&#x2F;strong&gt;: How should something look when you are done with your work? That’s one thing in a physical environment like a factory floor. But how does it work in software? Standards around documentation, code review, testing, code formatting, etc. may be the right analogy here. How can you leave things so that you or a colleague can pick up right where you left off without difficulty, and without a lot of work on your part.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;He also emphasizes the utility of scoreboards by analogy with sports: If the stadium had no scoreboard, nobody would come to watch the game. So keep track of the winning and losing.&lt;&#x2F;p&gt;
&lt;p&gt;What prevents us from applying these deas to greater effect in software development?&lt;&#x2F;p&gt;
&lt;p&gt;Some developers want to focus on coding and don’t want to engage fixing process. Some object to the rate of change resulting from continuous improvement. Some think that their processes are too complex and variable for focused improvement. I don’t believe it.&lt;&#x2F;p&gt;
&lt;p&gt;It’s relatively easy for developers to understand that software developed but not deployed is inventory, one of the standard &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;paulakers.net&#x2F;wp-content&#x2F;uploads&#x2F;dlm_uploads&#x2F;2019&#x2F;11&#x2F;8-wastes-20191112.pdf%22&quot;&gt;8 wastes&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;I want to map this completely into software development, in cheap and cheerful fashion.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Letters in LaTeX</title>
          <pubDate>Mon, 08 Sep 2025 16:38:05 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/letters-in-latex/</link>
          <guid>https://www.superscript.com/posts/letters-in-latex/</guid>
          <description xml:base="https://www.superscript.com/posts/letters-in-latex/">&lt;p&gt;Once upon a time I did a great deal of work with  \(\TeX{}\) and \(\LaTeX{}\). I implemented many elements that were not broadly supported at the time: changebars, backdrop images, special page construction processing, letter spacing, color, and so on. After finding a but I wrote up a proposed fix and mailed a letter to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www-cs-faculty.stanford.edu&#x2F;~knuth&#x2F;&quot;&gt;Donald Knuth&lt;&#x2F;a&gt;, who responded, returning my letter with notes indicating that there was a better way to fix the problem.&lt;&#x2F;p&gt;
&lt;p&gt;Shortly thereafter he called me to ask what led me to the discovery. It was letterspacing, “a dirty word around here” he said.  My work moved into a different realm, and so I didn’t keep up, but as I recall it the next release of \(\TeX\) had numerous bugs. I don’t know whether the fix to mine contributed to the new crop.&lt;&#x2F;p&gt;
&lt;p&gt;I receive a check for my efforts, and another one later for finding a typo in the \(\TeX\hbox{Book}\). Sadly they long ago faded into an unreadable state.&lt;&#x2F;p&gt;
&lt;p&gt;But today I needed only to create a \(\LaTeX{}\) style file for letterhead. It started very slowly, but then suddenly it seemed familiar again. And now I have an easy and even scriptable way to produce decently-formatted letters. The tools are venerable, not obsolete.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Google Sheet Sort</title>
          <pubDate>Fri, 05 Sep 2025 09:23:27 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/google-sheet-sort/</link>
          <guid>https://www.superscript.com/posts/google-sheet-sort/</guid>
          <description xml:base="https://www.superscript.com/posts/google-sheet-sort/">&lt;p&gt;Today I learned about the &lt;code&gt;sort&lt;&#x2F;code&gt; function in Google Sheets. This came in handy to show different sorted views of one sheet on another. Combining a drop-down with a nested &lt;code&gt;IF&lt;&#x2F;code&gt; statement allows selection of the sort to apply on the data in one sheet to populate another sheet.&lt;&#x2F;p&gt;
&lt;p&gt;The sheet &lt;code&gt;Contacts&lt;&#x2F;code&gt; contains the primary data. A &lt;code&gt;Sorted&lt;&#x2F;code&gt; sheet contains a drop-down in &lt;code&gt;A1&lt;&#x2F;code&gt; with values &lt;code&gt;Latest&lt;&#x2F;code&gt; and &lt;code&gt;Priority&lt;&#x2F;code&gt;. The sort appears in &lt;code&gt;B2&lt;&#x2F;code&gt;, under the headers:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=if(A1=&amp;quot;Latest&amp;quot;,sort(Contacts!A2:BI,2,false),if(A1=&amp;quot;Priority&amp;quot;,sort(Contacts!A2:BI,1,false,4,true,6,true)))&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And in &lt;code&gt;Sorted!B2&lt;&#x2F;code&gt; this formula copies over all of the headers from &lt;code&gt;Contacts&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=arrayformula(Contacts!A1:BI1)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;No more manual sorting!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Hot-Potato Package Delivery</title>
          <pubDate>Wed, 03 Sep 2025 07:51:03 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/hot-potato-package-delivery/</link>
          <guid>https://www.superscript.com/posts/hot-potato-package-delivery/</guid>
          <description xml:base="https://www.superscript.com/posts/hot-potato-package-delivery/">&lt;p&gt;I ordered something from Walmart. They shipped it to me. Their delivery tracking said that USPS handled the final delivery. And USPS says that on date X they “Delivered, Front Door&#x2F;Porch”. They did not. Could it be in the mailbox? Nope.&lt;&#x2F;p&gt;
&lt;p&gt;Two days later I received a mystery package from Amazon. It was my Walmart order! Yet Amazon appears nowhere in the tracking data.&lt;&#x2F;p&gt;
&lt;p&gt;So, to handle the last mile delivery Walmart tossed the hot-potato package to USPS, and USPS to Amazon, and finally Amazon to me.&lt;&#x2F;p&gt;
&lt;p&gt;I’m thankful that the package arrived, because chasing down a lost package through this delivery chain would probably be a hopeless endeavor, and certainly not worth the time.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Idempotent Home Directory Setup</title>
          <pubDate>Sat, 30 Aug 2025 17:55:41 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/idempotent-home-setup/</link>
          <guid>https://www.superscript.com/posts/idempotent-home-setup/</guid>
          <description xml:base="https://www.superscript.com/posts/idempotent-home-setup/">&lt;p&gt;When I set up a new FreeBSD jail, I pull my home directory configuration from a GitHub repo. When I initially put this together I didn’t ensure that it was idempotent. Now it is, with the addition of a test and alternation for each operation that is not itself idempotent.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_# setup.home: Configure the home directory repo for updates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;setup.home:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;	@git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; get-url&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; remote&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; add&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; git@github.com:superscript&#x2F;home.git&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;	@git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; show-ref&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-quiet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-verify&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; refs&#x2F;heads&#x2F;host&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; branch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; master&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; host&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;	@git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; fetch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; origin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;	@git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; show-ref&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-quiet&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-verify&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; refs&#x2F;heads&#x2F;master&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; co&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; master&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; origin&#x2F;master&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;	@git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; merge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-ff&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This allows me to use &lt;code&gt;setup.home&lt;&#x2F;code&gt; as a dependency for the broader setup targets.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The Dismal Science</title>
          <pubDate>Fri, 29 Aug 2025 07:56:26 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/the-dismal-science/</link>
          <guid>https://www.superscript.com/posts/the-dismal-science/</guid>
          <description xml:base="https://www.superscript.com/posts/the-dismal-science/">&lt;p&gt;Today I learned that the “Dismal Science” description of economics comes from a Thomas Carlyle &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;babel.hathitrust.org&#x2F;cgi&#x2F;pt?id=nyp.33433076070790&amp;amp;seq=193&quot;&gt;essay&lt;&#x2F;a&gt;. He argues there against economic reasoning ‘which finds the secret of this Universe in “supply and demand,” and reduces the duty of human governors to that of letting men alone’, and specifically because it supports the ‘sacred cause of Black Emancipation’.&lt;&#x2F;p&gt;
&lt;p&gt;Count me as dismal, then.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A Two Card Strategy</title>
          <pubDate>Tue, 26 Aug 2025 20:49:26 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/a-two-card-strategy/</link>
          <guid>https://www.superscript.com/posts/a-two-card-strategy/</guid>
          <description xml:base="https://www.superscript.com/posts/a-two-card-strategy/">&lt;p&gt;Today I discovered that I was the victim of an instance of credit-card fraud. I disputed the charge. The purchase was labeled as “card present” at a store I’ve never been to. My card was never present at that store.&lt;&#x2F;p&gt;
&lt;p&gt;The same thing happened to me once before with a card issued by Citi. When they concluded their investigation they falsely claimed that the charge was legitimate, and demanded that I pay it. As in today’s case, the charge was made in a store that I and my card never visited, and labeled “card present”. Their faulty conclusion cost me hundreds of dollars. I no longer give Citi my business. They appropriated enough of my money through their false claims to deserve my business.&lt;&#x2F;p&gt;
&lt;p&gt;Today’s instance of fraud looks similar. I will not be surprised if another false claim of legitimacy comes out of the “investigation” into the charge. And if it does, a second bank will lose my business.&lt;&#x2F;p&gt;
&lt;p&gt;But enough about banks confiscating money from their customers based on false claims of charge legitimacy! I did learn an important lesson from today’s events. This card had a mix of subscription and ad-hoc charges on it. I should have been following a two-card strategy to separate the two.&lt;&#x2F;p&gt;
&lt;p&gt;Ad-hoc charges require exposing the card to unknown point-of-sale equipment. That’s a much higher risk payment than one arranged over the wire directly with the vendor and then charged directly to the card electronically, all most likely run through a tokenizing processing vendor. Separating the ad-hoc from recurring purchases divids the high from the low risk charges.&lt;&#x2F;p&gt;
&lt;p&gt;The ad-hoc charges are more likely to be compromised. But they are not difficult to change. You simply use a different card. The recurring charges, in contrast, are extremely painful to change. You need to update payment methods, make sure there is continuity of payments, make sure that no scheduled payments hit the old card if it has been disabled, etc. And that’s what I had to do today.&lt;&#x2F;p&gt;
&lt;p&gt;So from now on I will follow a two-card strategy, and split the two types of charges. I’m surprised I never heard this suggested before. It was a painful lesson, but useful.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Interviewing With AI</title>
          <pubDate>Tue, 19 Aug 2025 06:33:32 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/interviewing-with-ai/</link>
          <guid>https://www.superscript.com/posts/interviewing-with-ai/</guid>
          <description xml:base="https://www.superscript.com/posts/interviewing-with-ai/">&lt;p&gt;The vibe-coding trend is alarming to anyone who values correctness in code. Putting AI generated code into production without full scrutiny adds operational risk to the extent that your system relies on correctness. With increasing use of AI tooling in development, how do you ensure that your new hires can both take advantage of the tools and also ensure correct execution?&lt;&#x2F;p&gt;
&lt;p&gt;At a recent meeting of the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;austin-cto-club&#x2F;&quot;&gt;Austin CTO Club&lt;&#x2F;a&gt; a member shared with me a useful approach to this problem when interviewing developers in an AI-enabled context. The idea is to split the interview into two parts that focus on each element in the question, first how to use the AI tools, and second understanding the outputs from those tools.&lt;&#x2F;p&gt;
&lt;p&gt;It works like this:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Give the candidate a simple project to implement with the help of AI.&lt;&#x2F;li&gt;
&lt;li&gt;Timebox the implementation.&lt;&#x2F;li&gt;
&lt;li&gt;When time runs out, have them demo the results to you.&lt;&#x2F;li&gt;
&lt;li&gt;Ask them to explain how the system works.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Candidates who are good tool users will do well on the implementation. Candidates who are highly technical will demonstrate good understanding of the system in their explanation. You want those who do well on both implementation and explanation.&lt;&#x2F;p&gt;
&lt;p&gt;As with most hiring decisions, you must gauge the upside potential of the candidate in your context. If your business is extremely sensitive to errors (say, fintech or medical) you may place higher weight on the understanding. If your business is less sensitive to errors (say, social media) then you may weight the tool use more heavily. In either case, this technique gives you good inputs to weigh.&lt;&#x2F;p&gt;
&lt;p&gt;The AI tools for development are changing rapidly. How frequently do they and will they produce correct outputs? Can a candidate keep up with this fast tool evolution? Does your environment support continuous improvements in tool use? Factoring your answers into your weights amounts to longer-term bets on tool capabilities, candidate, and your organization. Good judgement in hiring is always difficult. This technique provides important inputs for those judgements.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Scripting asciinema</title>
          <pubDate>Mon, 18 Aug 2025 13:46:46 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/scripting-asciinema/</link>
          <guid>https://www.superscript.com/posts/scripting-asciinema/</guid>
          <description xml:base="https://www.superscript.com/posts/scripting-asciinema/">&lt;p&gt;The &lt;code&gt;asciinema&lt;&#x2F;code&gt; program captures shell interactions in a form that can be replayed, or turned into an animated gif file. It’s an extremely convenient way to demonstrate command-line operations and utilities. But used directly it has one basic weakness: the need to type in the commands.&lt;&#x2F;p&gt;
&lt;p&gt;After starting to use &lt;code&gt;asciinema&lt;&#x2F;code&gt; this week, the annoyance of typing in the commands became immediately unbearable. My solution is called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SuperScript&#x2F;scrip&#x2F;blob&#x2F;master&#x2F;src&#x2F;asciinema-script.sh&quot;&gt;&lt;code&gt;asciinema-script&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. This program records an interaction that is itself scripted. For example, here is a simple script:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;asciinema-script&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;asciinema-script&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; help&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Using &lt;code&gt;asciinema-script&lt;&#x2F;code&gt; to produce a gif from this script yields the following:
&lt;figure&gt;
&lt;a href=&quot;#&quot;&gt;
&lt;img src=&quot;&amp;#x2F;2sl&amp;#x2F;asciinema-script.gif&quot; alt=&quot;asciinema&quot;&gt;
&lt;&#x2F;a&gt;
&lt;figcaption&gt;asciinema&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;Another &lt;a href=&quot;&#x2F;posts&#x2F;pipeline&#x2F;&quot;&gt;post&lt;&#x2F;a&gt; uses this script:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;pipeline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;scrip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; help&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;pipeline&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;pipeline&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;echo b &amp;amp;&amp;amp; cat -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; bin&#x2F;pipeline&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; xargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ::&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; xargs&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; c&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It’s now almost trivial for me to create a reproducible demo.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Pipelines Without Pipes</title>
          <pubDate>Sun, 17 Aug 2025 16:31:27 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/pipeline/</link>
          <guid>https://www.superscript.com/posts/pipeline/</guid>
          <description xml:base="https://www.superscript.com/posts/pipeline/">&lt;p&gt;The &lt;code&gt;pipeline&lt;&#x2F;code&gt; program constructs a pipeline from its arguments. The first argument is the separator. The program splits the command line on separator arguments and constructs a pipeline from the components.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s what it looks like in use:
&lt;figure&gt;
&lt;a href=&quot;#&quot;&gt;
&lt;img src=&quot;&amp;#x2F;2sl&amp;#x2F;pipeline.gif&quot; alt=&quot;pipeline&quot;&gt;
&lt;&#x2F;a&gt;
&lt;figcaption&gt;pipeline&lt;&#x2F;figcaption&gt;
&lt;&#x2F;figure&gt;
&lt;&#x2F;p&gt;
&lt;p&gt;What good does this do? If you dynamically assemble a pipeline in a shell program, you must pass it through shell parsing in order to execute it. This brings all of the difficulties of argument quoting into play. The &lt;code&gt;pipeline&lt;&#x2F;code&gt; construction does this in a safe way. The caller can manipulate the entire pipeline as a set of ordinary arguments without worrying about interpolation problems.&lt;&#x2F;p&gt;
&lt;p&gt;The underlying code looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;pipeline_cmd&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sep&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;2&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  shift&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;${1}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  for&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;sep&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;      cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;      p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;${1}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;      cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;      p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span&gt;$(&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;i&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  printf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;%s\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; pipeline prefix sep prog1 [sep prog2 ...]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;pipeline&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  eval&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;pipeline_cmd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;pipeline&lt;&#x2F;code&gt; program calls the &lt;code&gt;pipeline&lt;&#x2F;code&gt; function with an empty first argument. You can find the code &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;superscript&#x2F;scrip&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Friedman, Pigou, Coase</title>
          <pubDate>Sat, 16 Aug 2025 15:26:57 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/friedman-pigou-coase/</link>
          <guid>https://www.superscript.com/posts/friedman-pigou-coase/</guid>
          <description xml:base="https://www.superscript.com/posts/friedman-pigou-coase/">&lt;p&gt;In a rightly famous 1960 meeting&lt;span class=&quot;marginnote&quot;&gt;Famous among economists, at least. Sadly, no attendee recorded the meeting.&lt;&#x2F;span&gt;
 &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Enc&#x2F;bios&#x2F;Coase.html&quot;&gt;Ronald Coase&lt;&#x2F;a&gt; persuaded a room full of University of Chicago economists that his view on what we now call &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Enc&#x2F;Externalities.html&quot;&gt;externalities&lt;&#x2F;a&gt; and transaction costs (the costs associated with market exchange) was correct. His argument subsequently appeared in the very readable &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.law.uchicago.edu&#x2F;lawecon&#x2F;coaseinmemoriam&#x2F;problemofsocialcost&quot;&gt;&lt;em&gt;The Problem of Social Cost&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;. In a delightful &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=BzqFE9jfSp8&quot;&gt;interview&lt;&#x2F;a&gt; with Richard Epstein, Coase likened his claims to asserting \(2+2=4\).&lt;&#x2F;p&gt;
&lt;p&gt;I was once privileged to speak at some length with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.deirdremccloskey.com&#x2F;&quot;&gt;Deirdre McCloskey&lt;&#x2F;a&gt;, who repeated a statement from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.deirdremccloskey.com&#x2F;docs&#x2F;pdf&#x2F;Article_306.pdf&quot;&gt;The So-Called Coase Theorem&lt;&#x2F;a&gt; that ‘something like a dozen people in the world understand that the “Coase” theorem is not the Coase theorem’. I’m presumably outside of that group. Nevertheless, I will try to provide some intuition from one non-economist to another.&lt;&#x2F;p&gt;
&lt;p&gt;The primary insight in &lt;em&gt;The Problem of Social Cost&lt;&#x2F;em&gt; is typically Coasean: beautiful, simple, and deep. It is that an externality is a joint production between two parties: a polluter and a nearby resident; a noise maker and someone within earshot; a spark-producing train and a grain farmer (Coase’s example).&lt;&#x2F;p&gt;
&lt;p&gt;When my neighbor blasts his music loud and I’m not home, there is no conflict. When I’m home and he is not blasting music, there is no conflict. But when he is blasting and I am home, together we produce a conflict. The conflict is &lt;em&gt;transactional&lt;&#x2F;em&gt;. You cannot speak meaningfully of one side imposing harm on the other, because the conflict is a joint production.&lt;&#x2F;p&gt;
&lt;p&gt;Normal economic reasoning about transactions applies. The terms of the interaction are potentially subject to negotiation. What makes it worthwhile for each party to accommodate the other? Can they agree on terms? Compensation of one kind or another could change hands to satisfy an aggrieved party. Is it feasible to reach such an arrangement?&lt;&#x2F;p&gt;
&lt;p&gt;Transaction costs associated with this negotiation are an obstacle to its resolution. Therefore one should look to reduce transaction costs to improve the chances for the two parties to resolve the conflict.&lt;&#x2F;p&gt;
&lt;p&gt;That’s my understanding of Coase’s meaning in &lt;em&gt;The Problem of Social Cost&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The pre-Coasean view was based on work by &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Enc&#x2F;bios&#x2F;Pigou.html&quot;&gt;Arthur Pigou&lt;&#x2F;a&gt;. In this view, one party imposed costs or conferred benefits on another in the case of externalities. For imposed costs, a tax should apply to the offending activity to cause the offender to internalize the costs of the externality on the offended party. One party produces the conflict, and the other is its mere victim. There is no notion of transactional conflict.&lt;&#x2F;p&gt;
&lt;p&gt;The contrast between the pre- and post-Coasean rhetoric is stark. In the pre-Coasean case one speaks of “imposed costs” and interventions in order to force the imposer to “internalize” them. In the post-Coasean case the question is one of transaction costs limiting options for negotiated settlement.&lt;&#x2F;p&gt;
&lt;p&gt;Transaction costs cannot always be reduced sufficiently to resolve a conflict. A standard example is air pollution. In some cases you have many people on one side of the externality transaction (a factory producing smoke in a neighborhood) or many on each side (drivers emitting smog, and bystanders breathing it). Transactions costs could be so high as to prevent any hope of negotiated resolution. Maybe a Pigouvian tax is the best one can do. But even then, we should not abandon the post-Coasean view. The externalities remain transactional, even if impossible to resolve by negotiation.&lt;&#x2F;p&gt;
&lt;p&gt;Watching &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hoover.org&#x2F;profiles&#x2F;peter-m-robinson&quot;&gt;Peter Robinson&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=JSumJxQ5oy4&quot;&gt;interview&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Enc&#x2F;bios&#x2F;Friedman.html&quot;&gt;Milton Friedman&lt;&#x2F;a&gt; prompted me to write this blog. When they discuss the pollution, Friedman explains the desirability and difficulty of negotiated resolution of the conflict, but several times he mentions one party “imposing a cost” on the other. In his defense, he sometimes qualified with “uncompensated”, but not always.&lt;&#x2F;p&gt;
&lt;p&gt;I have little doubt that Friedman understood Coase well. He was &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;press.uchicago.edu&#x2F;ucp&#x2F;books&#x2F;book&#x2F;chicago&#x2F;M&#x2F;bo3638673.html&quot;&gt;reportedly&lt;&#x2F;a&gt; the leading questioner in that famous meeting. But here he wandered between the pre- and post-Coasean rhetoric, even if not between the views. Every utterance of “imposing a cost” sounded like a small step away from Coase’s fundamental insight about the joint production of externalities.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>How Fast Is Gas?</title>
          <pubDate>Sun, 10 Aug 2025 19:01:04 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/how-fast-is-gas/</link>
          <guid>https://www.superscript.com/posts/how-fast-is-gas/</guid>
          <description xml:base="https://www.superscript.com/posts/how-fast-is-gas/">&lt;p&gt;I gave this prompt to Claude today:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;I want to estimate the total gasoline fueling capacity in the United States. The key questions are:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* How many operational gas pumps are there in the United States?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* What is the speed at which an individual pump can fuel a vehicle?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* How much non-fueling time contributes to pump occupancy, and therefore fueling speed in realistic use?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* What is the average mileage of a vehicle?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;* What is the aggregate speed of all of the capacity in MPH?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Research these questions, come up with estimates, cite your sources of information, and indicate the numbers that come out of your investigation. Then calculate the total capacity in MPH.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The bottom line: This conservative estimate of practical gasoline fueling capacity in the United States is between 4.2 and 5.0 times the speed of light!&lt;&#x2F;p&gt;
&lt;p&gt;Here is Claude’s response in full.&lt;&#x2F;p&gt;
&lt;h1 id=&quot;us-gasoline-fueling-capacity-analysis&quot;&gt;US Gasoline Fueling Capacity Analysis&lt;&#x2F;h1&gt;
&lt;p&gt;The United States gasoline infrastructure can theoretically support &lt;strong&gt;approximately 3.11 billion miles of driving per hour&lt;&#x2F;strong&gt;, representing massive untapped capacity that operates at only 24% utilization due to operational inefficiencies rather than physical constraints.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;current-infrastructure-capacity&quot;&gt;Current infrastructure capacity&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Pump Infrastructure Scale&lt;&#x2F;strong&gt;
Based on industry data from NACS and the American Petroleum Institute, the US operates &lt;strong&gt;150,000-152,000 gas stations&lt;&#x2F;strong&gt; with an estimated &lt;strong&gt;900,000 individual fuel dispensers&lt;&#x2F;strong&gt;. The convenience store segment dominates, with 121,852 locations selling fuel and accounting for 80% of gasoline sales nationwide.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Technical Performance Specifications&lt;&#x2F;strong&gt;&lt;br &#x2F;&gt;
Modern retail gas pumps operate at &lt;strong&gt;8-10 gallons per minute (GPM)&lt;&#x2F;strong&gt;, with the EPA regulatory maximum set at &lt;strong&gt;10 GPM for passenger vehicles&lt;&#x2F;strong&gt;. This limit stems from vapor recovery system constraints and safety considerations rather than mechanical limitations. Commercial truck dispensers can achieve 20-40+ GPM, but the vast majority of retail infrastructure serves passenger vehicles at the 10 GPM standard.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;real-world-operational-efficiency&quot;&gt;Real-world operational efficiency&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Massive Underutilization Discovered&lt;&#x2F;strong&gt;
Analysis of 30,000 gas stations reveals &lt;strong&gt;average pump utilization of only 24%&lt;&#x2F;strong&gt;, with high-performing stations reaching just 41% during peak hours. This means pumps sit unused 59-76% of the time, creating an enormous capacity bottleneck unrelated to technical capabilities.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Transaction Time Breakdown&lt;&#x2F;strong&gt;
While theoretical fuel dispensing for an average 11.7-gallon fill-up should take 1.2-1.5 minutes at optimal flow rates, &lt;strong&gt;total customer visits average 5-8 minutes&lt;&#x2F;strong&gt;. The effective “duty cycle” shows pumps spend less than 40% of transaction time actually dispensing fuel, with the remainder consumed by payment processing, customer positioning, and selection delays.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;vehicle-fleet-considerations&quot;&gt;Vehicle fleet considerations&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Current Fleet Efficiency&lt;&#x2F;strong&gt;
New vehicles sold in 2023 achieved &lt;strong&gt;27.1 MPG real-world fuel economy&lt;&#x2F;strong&gt;, but the actual on-road fleet average is significantly lower due to older vehicles still in service. Conservative estimates place the &lt;strong&gt;true fleet average around 24 MPG&lt;&#x2F;strong&gt; when accounting for the full range of vehicles currently operating.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Efficiency Trajectory&lt;&#x2F;strong&gt;
Regulatory pressure drives toward 49 MPG for new vehicles by 2026, while electric vehicle adoption reached 11.5% of production in 2023. However, continued consumer preference for SUVs and trucks (75% of new sales) partially offsets technology improvements.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;total-capacity-calculation&quot;&gt;Total capacity calculation&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Methodology and Results&lt;&#x2F;strong&gt;
Starting with 900,000 dispensers operating at 10 GPM maximum capacity yields 9 million GPM theoretical capacity. Applying the observed 24% utilization rate reduces this to &lt;strong&gt;2.16 million GPM effective capacity&lt;&#x2F;strong&gt;, equivalent to &lt;strong&gt;129.6 million gallons per hour&lt;&#x2F;strong&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Converting to driving capacity using the estimated 24 MPG fleet average produces the final result: &lt;strong&gt;3.11 billion miles per hour&lt;&#x2F;strong&gt;, with reasonable ranges from 2.85 to 3.37 billion MPH depending on fleet efficiency assumptions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;capacity-utilization-insights&quot;&gt;Capacity utilization insights&lt;&#x2F;h2&gt;
&lt;p&gt;&lt;strong&gt;Scale and Opportunity&lt;&#x2F;strong&gt;
This infrastructure capacity could theoretically support &lt;strong&gt;74.6 billion miles per day&lt;&#x2F;strong&gt;, while actual US vehicle miles traveled totals approximately 8.8 billion daily. &lt;strong&gt;Current operations represent only 11.8% of total infrastructure capacity&lt;&#x2F;strong&gt;, indicating enormous unused potential.&lt;&#x2F;p&gt;
&lt;p&gt;&lt;strong&gt;Primary Constraints&lt;&#x2F;strong&gt;
The limiting factors are temporal demand clustering, geographic distribution mismatches, customer behavior patterns, and payment processing inefficiencies. During peak fueling hours (morning and evening rush periods), utilization increases to 41%, but 59% of capacity remains unused even at maximum demand.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;conclusion&quot;&gt;Conclusion&lt;&#x2F;h2&gt;
&lt;p&gt;The United States possesses gasoline fueling infrastructure with extraordinary theoretical capacity - enough to support nearly three times the current national driving demand every hour. The constraint is not physical infrastructure or technical capability, but rather operational efficiency and demand timing patterns. This analysis reveals that expanding gasoline capacity through additional stations may be less critical than optimizing existing infrastructure utilization through improved payment systems, customer flow management, and operational efficiency improvements.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The More You Owe the More You&#x27;re Worth</title>
          <pubDate>Fri, 08 Aug 2025 15:51:09 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/the-more-you-owe-the-more-youre-worth/</link>
          <guid>https://www.superscript.com/posts/the-more-you-owe-the-more-youre-worth/</guid>
          <description xml:base="https://www.superscript.com/posts/the-more-you-owe-the-more-youre-worth/">&lt;p&gt;Today I read an old Econlog &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;archives&#x2F;2011&#x2F;05&#x2F;macaulay_on_sou.html&quot;&gt;post&lt;&#x2F;a&gt; by David Henderson. He links to this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=UjbPZAMked0&quot;&gt;gem&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>2 Second Lean</title>
          <pubDate>Wed, 30 Jul 2025 13:52:01 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/2-second-lean/</link>
          <guid>https://www.superscript.com/posts/2-second-lean/</guid>
          <description xml:base="https://www.superscript.com/posts/2-second-lean/">&lt;p&gt;Two weeks ago at Lean Coffee Austin two gentlemen from a construction company showed up. It turned out we all share an affinity for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;paulakers.net&#x2F;books&#x2F;2-second-lean&quot;&gt;2-Second Lean&lt;&#x2F;a&gt; by Paul Akers. I originally discovered the book almost 15 years ago, not long after it was published, but had not looked at it for a number of years. A fresh look confirmed my earlier opinion of the book as the best combination of fun application and solid principles I’ve seen in the Lean Management literature.&lt;&#x2F;p&gt;
&lt;p&gt;The book chronicles Akers’s journey into Lean Management at his company &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.fastcap.com&#x2F;&quot;&gt;FastCap&lt;&#x2F;a&gt;, from pride in his excess inventory through obsession with waste elimination, to creating a company culture that challenges everyone to improve continuously.&lt;&#x2F;p&gt;
&lt;p&gt;The book includes stories about Akers traveling to Japan to study companies that implemented Lean Management cultures. The companies are indeed exemplary. But the lesson from these visits is not to imitate what he saw there. Adopting the practices without understanding is a cargo-cult approach. Adopt the principles, and develop the practices to suit your needs and circumstances. Make the principles your own, and the rest will follow.&lt;&#x2F;p&gt;
&lt;p&gt;The primary innovation of the book rests on a simple observation: Big kaizen events are less in keeping with the principle of continuous improvement than are frequent small improvements. While straightforward and clear, this observation has deep implications.&lt;&#x2F;p&gt;
&lt;p&gt;The opportunities for small improvements are everywhere. Akers urges the reader to ask “What bugs me?” and then fix it. And then start again in an endless cycle.&lt;&#x2F;p&gt;
&lt;p&gt;Akers identifies three pillars of his approach to Lean culture:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Learn to see waste.&lt;&#x2F;li&gt;
&lt;li&gt;Improve every day.&lt;&#x2F;li&gt;
&lt;li&gt;Make before and after videos of your improvements.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;He sets the expectation that everyone in his organization will do these things, every day.&lt;&#x2F;p&gt;
&lt;p&gt;Why does 2-Second Lean work? I see three basic reasons.&lt;&#x2F;p&gt;
&lt;p&gt;First, the opportunity for small improvement is everywhere. How many things bug you during the day? Every one is another opportunity. Focusing on what bugs you makes it easy and provides some degree of immediate gratification.&lt;&#x2F;p&gt;
&lt;p&gt;Second, even small improvements add up over time. Daily 2-second improvements accumulate to significant effect, especially when they involve frequent operations. And some of will be large, accruing benefit much more quickly.&lt;&#x2F;p&gt;
&lt;p&gt;Third, and most importantly, the constant search for 2-second improvements puts you in the mindset of finding and eliminating waste. That equips you to find larger opportunities for improvement.&lt;&#x2F;p&gt;
&lt;p&gt;What bugs you? Unless you are hopelessly complacent, you have a long list. Fix something. Then repeat.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>My Best Losing Bet</title>
          <pubDate>Wed, 18 Jun 2025 09:05:39 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/my-best-losing-bet/</link>
          <guid>https://www.superscript.com/posts/my-best-losing-bet/</guid>
          <description xml:base="https://www.superscript.com/posts/my-best-losing-bet/">&lt;p&gt;Nothing focused him more than a bet. A friend who interviewed with him shortly before Halloween had made a giant squid costume. “Dude, you’re going to bring your costume when you visit and wear it in the office!” he said, and then went around betting everyone that he could make a candidate wear his Halloween costume in the office. Of course he won.&lt;&#x2F;p&gt;
&lt;p&gt;One night at the local dive bar he approached me wild-eyed and asked out of the blue “How much would you bet that I can’t do 30 chin-ups? A dollar? Five dollars?” I looked him up and down. Short. Broad shouldered. Big chested. Solid. About 50 pounds overweight. The frame of a gymnast, hopelessly out of shape and dumpy. I answered “A hundred dollars.”&lt;&#x2F;p&gt;
&lt;p&gt;He looked momentarily stunned. Whatever his expections, this fell outside of them. Then bet-focus overcame him. He had to go forward after that opening. He took the bet.&lt;&#x2F;p&gt;
&lt;p&gt;We spoke the next day in the office. He told me he was able to do two reps. I said he could have three months and three tries. The game was on.&lt;&#x2F;p&gt;
&lt;p&gt;He joined a nearby gym and started going every day. He hired a trainer. He asked at least one gym-rat coworker to join him at the gym and yell at him if he slacked off. He stopped drinking. Gossip flew around the office. How many pounds has he dropped? What is his count up to? Who is his trainer? Who goes with him to the gym?&lt;&#x2F;p&gt;
&lt;p&gt;When the day for his attempt finally arrived he was a changed man. He’d spent $3500 on training. He’d shed 50 pounds. The dumpy form was gone. The inner gymnast had emerged.&lt;&#x2F;p&gt;
&lt;p&gt;A gaggle of about 20 of us went tool down in the middle of the work day to watch his attempt at a coworker’s nearby apartment. On the way I stopped at the bank to take out cash in case he succeeded. His trainer spotted me. “So you’re the idiot who made the bet.” “We’ll see. Can he do it?” “Oh, you’ll see!”&lt;&#x2F;p&gt;
&lt;p&gt;We crowded into the tiny apartment. A chin-up bar hung in the bedroom doorway. He stripped down to his boxer shorts, jumped up to the bar, and to the chanting count of the crowd performed 31 perfect l-hang chin-ups.&lt;&#x2F;p&gt;
&lt;p&gt;He never looked happier. My handful of twenties would not do. He demanded my inscription on the crisp, newly-minted $100 bill he brought. I gave it gladly.&lt;&#x2F;p&gt;
&lt;p&gt;A short time later I passed on his offer to go double or nothing on 60 one-armed push-ups. I didn’t attend the event, but heard that he pulled a groin on the 53rd rep.&lt;&#x2F;p&gt;
&lt;p&gt;Almost 20 years have passed, yet people still talk about our bet. It’s legendary in a certain crowd. Several years after he won he thanked me for it, saying that it got him out of a rut, into the best shape he’d ever been in, and turned around some things in his life. I want to lose more bets like that.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>AI and Individual Contributors</title>
          <pubDate>Tue, 10 Jun 2025 18:26:02 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/ai-and-individual-contributors/</link>
          <guid>https://www.superscript.com/posts/ai-and-individual-contributors/</guid>
          <description xml:base="https://www.superscript.com/posts/ai-and-individual-contributors/">&lt;p&gt;How is the day-to-day experience of the individual contributor changing with the adoption of AI tooling? The tool capabilities remain limited, but are growing rapidly. They do well on relatively simple tasks and fall down on complex problems. And yet the scope of work they can accomplish continues to expand. How can individual contributors ride this wave? What aspects of your work will grow in importance?&lt;&#x2F;p&gt;
&lt;p&gt;In what follows I focus on programming. That’s just one area of AI adoption. This technology is very broadly applicable, and the impact on other roles will be analogous.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;architectural-savvy&quot;&gt;Architectural Savvy&lt;&#x2F;h2&gt;
&lt;p&gt;The direct coding capability of the tools will radically reduce the work of coding. I already use the tools extensively to code initial versions of programs that need a few quick iterations to work correctly. Not vibe coding, but creating a simple utility I would use in a production setting. The tools cannot yet handle architecture-level decisions or interesting refactoring. They require stepwise instruction to get from point A to distant point B. But they can save time. And they will beget tools that are more deterministic in their quality, less subject to hallucinatory error, and capable of solving most problems that have been solved competently already.&lt;&#x2F;p&gt;
&lt;p&gt;Architectural savvy is the ability to quickly understand a system &lt;em&gt;at the right level&lt;&#x2F;em&gt;. This means zooming in and out through the layers of abstraction and finding the appropriate level for the question at hand to gain the insights you need.&lt;&#x2F;p&gt;
&lt;p&gt;Until AI capabilities reaches a much higher level, architectural savvy will remain at a premium. You ability to detect BS in the output of the tools depends on it. As simple programming tasks are reliably automated away, architectural savvy will grow in relative importance.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;product-focus&quot;&gt;Product Focus&lt;&#x2F;h2&gt;
&lt;p&gt;The past adoption of programming frameworks offers useful lessons in what to expect with AI adoption. Framework native programmers know much more about how to use their favorite framework than they do about the underlying implementations. I used to ask entry-level programmers about UNIX file permissions. Now very few newbies have a clue about them. A framework allows programmers to operate at a higher level, covering ground more quickly provided they stay within its capabilities.&lt;&#x2F;p&gt;
&lt;p&gt;The downside of framework adoption is loss of understanding of implementation. Most framework users have little knowledge of what goes on under the hood. They trust the framework to take care of the details. Maybe it does. (Ask anyone who worked on a major Python project about their encounters with the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.python.org&#x2F;moin&#x2F;GlobalInterpreterLock&quot;&gt;GIL&lt;&#x2F;a&gt;. Look at when node implemented &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;nodejs.org&#x2F;docs&#x2F;latest-v22.x&#x2F;api&#x2F;process.html#processexecvefile-args-env&quot;&gt;&lt;code&gt;exec&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;.)&lt;&#x2F;p&gt;
&lt;p&gt;The upside of framework adoption was a greater focus on what to build rather than how. This emphasizes &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;hbr.org&#x2F;1963&#x2F;05&#x2F;managing-for-business-effectiveness&quot;&gt;effectiveness over efficiency&lt;&#x2F;a&gt;. Perfect efficiency working toward the wrong objective is useless, therefore effectiveness ultimately dominates efficiency. So this shift in emphasis is a welcome development, even though it introduces trade-offs about lock-in, implementation quality, runtime efficiency, capabilities limitations, framework trustworthiness, loss of modularity, and so on.&lt;&#x2F;p&gt;
&lt;p&gt;The adoption of AI will similarly relieve programmers of the need to understand the underlying details, and let them operate at a higher level. This doesn’t mean that understanding those details has no value. It does mean that such understanding will become more of a niche skill. Like with framework adoption, focus will shift toward effectiveness. So programmers should focus more on what to build, that is, product.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;soft-skills&quot;&gt;Soft Skills&lt;&#x2F;h2&gt;
&lt;p&gt;The economic drivers around AI adoption are no different from those around past disruptive technologies. The main difference with AI adoption is its broad scope of application and rapid pace. As with technological disruptions of the past, this one will leave us more specialized than before. There will be more niches to occupy, and you will need to find how your &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Topics&#x2F;Details&#x2F;comparativeadvantage.html&quot;&gt;comparative advantage&lt;&#x2F;a&gt; maps onto them.&lt;&#x2F;p&gt;
&lt;p&gt;Comparative advantage is not an isolated characteristic. It occurs in the context of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.econlib.org&#x2F;library&#x2F;Topics&#x2F;College&#x2F;comparativeadvantage.html&quot;&gt;trade&lt;&#x2F;a&gt;. And so exploiting your comparative advantage requires soft skills, the ability to communicate, coordinate, and execute with others. As specialization increases, the scope of your hard skills will narrow, and the relative importance these soft skills will grow.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;advice&quot;&gt;Advice&lt;&#x2F;h2&gt;
&lt;p&gt;If you are a young (or even not so young) individual contributor, here is my general advice:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Develop architectural savvy; learn to find and traverse the levels.&lt;&#x2F;li&gt;
&lt;li&gt;Focus on product; value effectiveness over efficiency.&lt;&#x2F;li&gt;
&lt;li&gt;Improve your soft skills; seize your comparative advantage.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>A Bike Shifting Heuristic</title>
          <pubDate>Tue, 10 Jun 2025 08:36:25 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/a-bike-shifting-heuristic/</link>
          <guid>https://www.superscript.com/posts/a-bike-shifting-heuristic/</guid>
          <description xml:base="https://www.superscript.com/posts/a-bike-shifting-heuristic/">&lt;p&gt;My bicycle is a 24-speed model, with three front sprockets and eight rear sprockets. What’s a good shifting pattern to apply when riding in variable terrain?&lt;&#x2F;p&gt;
&lt;p&gt;If we number the sprockets front and back from lowest to highest gear ratio, and zero indexing, in front they count 0..3 from smallest to largest, and in the rear 0..7 from largest to smallest. In the interest of minimal chain wear, I stick to to these rear-sprocket ranges, where \(f\) is the front-sprocket number:&lt;&#x2F;p&gt;
\[r_f = [2f,2f + 4)\]
&lt;p&gt;That’s to say I use the bottom four rear sprockets for the lowest front sprocket, the middle four rear for the middle front, and the highest four rear for the highest front.&lt;&#x2F;p&gt;
&lt;p&gt;My heuristic relies on the predicted next shift. If it will go in the same direction, then prefer the front shift. If it will go in the opposite direction, then prefer the rear shift. And stay within the range constraints.&lt;&#x2F;p&gt;
&lt;p&gt;This may not give produce the ideal gear ratio at all times. The front shift is larger than the rear, so it will skew the first shift in the direction of the second. Close enough.&lt;&#x2F;p&gt;
&lt;p&gt;My wife sometimes refers to this type of material as stupid math tricks. I see her point.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>In Search of Ignorance</title>
          <pubDate>Mon, 09 Jun 2025 08:53:37 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/in-search-of-ignorance/</link>
          <guid>https://www.superscript.com/posts/in-search-of-ignorance/</guid>
          <description xml:base="https://www.superscript.com/posts/in-search-of-ignorance/">&lt;blockquote&gt;
There are naive questions, tedious questions, ill-phrased questions, questions put after inadequate self-criticism. But every question is a cry to understand the world. There is no such thing as a dumb question.
&lt;footer&gt;— Carl Sagan, &lt;cite&gt;[The Demon-Haunted World: Science as a Candle in the Dark](https:&#x2F;&#x2F;a.co&#x2F;d&#x2F;5dwp3AB)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;If only! So many questions aim to demonstrate how smart the asker is, to tweak an interlocutor, or to shut down a line of conversation. These are dumb questions.&lt;&#x2F;p&gt;
&lt;p&gt;A good question aims to cure some form of ignorance, usually, though not always, that of the asker. Ignorance is the price of entry for learning, and as uncomfortable as that may be in the asking, a good question depends on it.&lt;&#x2F;p&gt;
&lt;p&gt;So don’t shy away from your ignorance. Don’t be embarrassed by it. Seek it out and use it to formulate good questions! You’ll become wiser for it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Build to Buy</title>
          <pubDate>Thu, 05 Jun 2025 07:29:44 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/build-to-buy/</link>
          <guid>https://www.superscript.com/posts/build-to-buy/</guid>
          <description xml:base="https://www.superscript.com/posts/build-to-buy/">&lt;p&gt;In our May 2025 &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;austin-cto-club&#x2F;events&#x2F;307338152&#x2F;&quot;&gt;meeting&lt;&#x2F;a&gt; the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;austin-cto-club&#x2F;&quot;&gt;Austin CTO Club&lt;&#x2F;a&gt; took on the theme of “Build versus Buy”. Much of the discussion centered around the trade-offs between the two, with the addition of open source as a third alternative.&lt;&#x2F;p&gt;
&lt;p&gt;One participant described a “Build to Buy” strategy that I had not heard expressed explicitly before. When evaluating “buy” options, one may not know enough to evaluate the alternatives effectively. So they build something in order to become a well-informed buyer.&lt;&#x2F;p&gt;
&lt;p&gt;They build something to throw away when they buy. This means they do not need to build something at full production quality. Instead, the build is a learning exercise. Having built it, they buy with an understanding of how such a system operates, what limitations they should pay attention to, what maintenance problems to look out for, where the UX issues will arise, how difficult integration is likely to be, and so on.&lt;&#x2F;p&gt;
&lt;p&gt;Build to become be a good buyer. Many organizations pay lip service to learning. Yet few recognize the need to explore dead ends in order to learn, thinking instead that you must focus always on building for production. Here the recognition rises to the strategic level. What excellent MVP thinking!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A Pianist&#x27;s Scales</title>
          <pubDate>Wed, 04 Jun 2025 08:38:36 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/a-pianists-scales/</link>
          <guid>https://www.superscript.com/posts/a-pianists-scales/</guid>
          <description xml:base="https://www.superscript.com/posts/a-pianists-scales/">&lt;p&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;publicchoice.gmu.edu&#x2F;tylercowen&quot;&gt;Tyler Cowen&lt;&#x2F;a&gt; will never have the opportunity to ask me his &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;marginalrevolution.com&#x2F;marginalrevolution&#x2F;2019&#x2F;07&#x2F;learn-like-an-athlete-knowledge-workers-should-train.html&quot;&gt;question&lt;&#x2F;a&gt; “What is it you do to train that is comparable to a pianist practicing scales?” but I will answer for the programming realm in my world.&lt;&#x2F;p&gt;
&lt;p&gt;I once programmed for a living, but now spend more time building teams and guiding others in their programming efforts. This means more time spent managing, translating between business and technology, and designing and assessing system architectures. Yet staying in touch with the basic concerns of programmers requires some amount of programming. I don’t believe one can maintain that contact without practice.&lt;&#x2F;p&gt;
&lt;p&gt;As someone steeped in programming on UNIX systems, I write shell programs as my practice. Most programmers I know see this as pointless. They look at shell as an arcane anachronism today. So why bother?&lt;&#x2F;p&gt;
&lt;p&gt;Building small utilities and arranging them in a constellation that solves a problem is a common practice in &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.catb.org&#x2F;esr&#x2F;writings&#x2F;taoup&#x2F;html&#x2F;index.html&quot;&gt;UNIX-style programming&lt;&#x2F;a&gt;. And shell programming, especially the use of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Filter_(software)&quot;&gt;filters&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Pipeline_(software)&quot;&gt;pipelines&lt;&#x2F;a&gt;, supports a simple version of that practice. Implementing pipelines to process data forces you to keep the architecture very simple, modular, and composable, important qualities even today.&lt;&#x2F;p&gt;
&lt;p&gt;When you program in shell you constantly make use of existing utility programs written in completely different languages. Often you don’t need to know the implementation language of a utility, just its behavior. This acts as an antidote to single-language-only programming fetish one sees everywhere these days, in which all aspects of a program from the actual data processing to its build system must be implemented in the same language. Building a shell program often branches out into other languages for utility implementation. But it starts with shell and command-line thinking and tinkering.&lt;&#x2F;p&gt;
&lt;p&gt;It’s fun, it’s simple, and it’s instructive. As a technologist it’s my way of practicing scales. I would have enjoyed the question more had Cowen asked “What do you do to train that is comparable to a composer practicing &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;Counterpoint#Species_counterpoint&quot;&gt;species counterpoint&lt;&#x2F;a&gt;?”&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Aider First Impressions</title>
          <pubDate>Thu, 29 May 2025 08:30:04 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/aider-first-impressions/</link>
          <guid>https://www.superscript.com/posts/aider-first-impressions/</guid>
          <description xml:base="https://www.superscript.com/posts/aider-first-impressions/">&lt;p&gt;One trend among AI-enabled development tools is tight integration with an IDE. A popular example is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.cursor.com&#x2F;&quot;&gt;Cursor&lt;&#x2F;a&gt;. If you already use a similar IDE this seems very welcome, but not so much if you don’t.&lt;&#x2F;p&gt;
&lt;p&gt;Alternatively, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;&quot;&gt;Aider&lt;&#x2F;a&gt; provides a rich stand-alone command-line interface, making it easy to integrate with your existing development workflow outside of an IDE. That’s more appropriate to those of us who prefer UNIX-style constellations of loosely-coupled tools.&lt;&#x2F;p&gt;
&lt;p&gt;Here are my initial impressions, positive and negative, from working with Aider for a few hours.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;installation-breaks-venv-boundaries&quot;&gt;Installation Breaks venv Boundaries&lt;&#x2F;h3&gt;
&lt;p&gt;The documentation recommends installation with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;install.html&quot;&gt;&lt;code&gt;pip&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. If you run this inside a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.python.org&#x2F;3&#x2F;library&#x2F;venv.html&quot;&gt;venv&lt;&#x2F;a&gt; you get a venv-specific installation… NOT! The installation instructions make no mention venv, but any regular venv user expects the install to respect the venv boundaries.&lt;&#x2F;p&gt;
&lt;p&gt;The way out of this is a direct install of the &lt;code&gt;aider-chat&lt;&#x2F;code&gt; module:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;pip install aider-chat&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The docs do present this as an alternative installation method, but without reference to venv.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;good-model-support&quot;&gt;Good Model Support&lt;&#x2F;h3&gt;
&lt;p&gt;The set of supported models is broad, courtesy of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BerriAI&#x2F;litellm&quot;&gt;LiteLLM&lt;&#x2F;a&gt; under the hood. Both remote and local models work as expected.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;multiple-interaction-modes&quot;&gt;Multiple Interaction Modes&lt;&#x2F;h3&gt;
&lt;p&gt;There are several &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;usage&#x2F;modes.html&quot;&gt;chat modes&lt;&#x2F;a&gt; available to users:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;code&lt;&#x2F;code&gt;: Generate and apply changes.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;ask&lt;&#x2F;code&gt;: Generate responses but apply no updates.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;architect&lt;&#x2F;code&gt;: Generate and apply changes, with separately configurable models.&lt;&#x2F;li&gt;
&lt;li&gt;&lt;code&gt;help&lt;&#x2F;code&gt;: Answer question about Aider.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;My exploration here is limited, but the use of different models in &lt;code&gt;architect&lt;&#x2F;code&gt; mode opens the door to interesting specialization of model use. There are commands like &lt;code&gt;&#x2F;ask&lt;&#x2F;code&gt; for each mode that support mode changes on a per-message or sticky basis.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;git-integration&quot;&gt;Git Integration&lt;&#x2F;h3&gt;
&lt;p&gt;Aider &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;git.html&quot;&gt;integrates&lt;&#x2F;a&gt; with &lt;code&gt;git&lt;&#x2F;code&gt; to commit changes locally. The user can control whether this is automatic or not, and the &lt;code&gt;&#x2F;undo&lt;&#x2F;code&gt; command reverts the last change, if it came from Aider.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;faq.html&quot;&gt;FAQ&lt;&#x2F;a&gt; issues the following &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;faq.html#can-i-edit-files-myself-while-aider-is-running&quot;&gt;caution&lt;&#x2F;a&gt;:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;While you’re waiting for aider’s reply to complete, it’s probably unwise to edit files that you’ve added to the chat. Your edits and aider’s edits might conflict.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;This makes me wonder whether an integration with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&quot;&gt;jujutsu&lt;&#x2F;a&gt; as an alternative to &lt;code&gt;git&lt;&#x2F;code&gt; would improve worflows, as it supports checkins of conflicting files.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;configurations-in-home-directory&quot;&gt;Configurations in Home Directory&lt;&#x2F;h3&gt;
&lt;p&gt;Aider expects configuration and logging material to reside directly into your home directory by default, including &lt;code&gt;.aider.chat.history.md&lt;&#x2F;code&gt;, &lt;code&gt;.aider.conf.yml&lt;&#x2F;code&gt;, &lt;code&gt;.aider.input.history&lt;&#x2F;code&gt;, and &lt;code&gt;.aider&#x2F;&lt;&#x2F;code&gt;. Why this is not at least consolidated under a single directory, I don’t know.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;one-repo-at-a-time&quot;&gt;One Repo at a Time&lt;&#x2F;h3&gt;
&lt;p&gt;Another FAQ &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;faq.html#can-i-use-aider-with-multiple-git-repos-at-once&quot;&gt;caution&lt;&#x2F;a&gt; states&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;Currently aider can only work with one repo at a time.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;The FAQ entry provides some detail about using multiple repos in a single session. It’s not clear whether two different repos in two parallel sessions will conflict. I would guess so unless some of the aforementioned config files are repo specific.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;watch-mode-seem-buggy&quot;&gt;Watch Mode Seem Buggy&lt;&#x2F;h3&gt;
&lt;p&gt;In &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;aider.chat&#x2F;docs&#x2F;usage&#x2F;watch.html&quot;&gt;watch mode&lt;&#x2F;a&gt; Aider process files that have changed, looking for comments starting or ending with &lt;code&gt;AI&lt;&#x2F;code&gt;, &lt;code&gt;AI!&lt;&#x2F;code&gt;, or &lt;code&gt;AI?&lt;&#x2F;code&gt;. When I tried this, asking to add a code example to a Markdown file, Aider wrote some code and then asked to create files with names taken from the code lines, rather than incorporating the code into my Markdown file. Perhaps this involves some model or edit-mode quirks. It has put me off of the feature for now.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;a-longstanding-chat-model&quot;&gt;A Longstanding Chat Model&lt;&#x2F;h3&gt;
&lt;p&gt;With its &lt;code&gt;&#x2F;whatever&lt;&#x2F;code&gt; commands, Aider has a bit of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;en.wikipedia.org&#x2F;wiki&#x2F;IRC&quot;&gt;IRC&lt;&#x2F;a&gt; flavor to it. Instead of inventing a new interaction method in this context the program wisely uses a time-tested approach.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;summary&quot;&gt;Summary&lt;&#x2F;h2&gt;
&lt;p&gt;Compared with the tools I’ve tried, Aider is far more friendly to UNIX-style programming, and provides good loosely-coupled interaction with my other development tools. I’ll continue to use it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Training Data Shortages</title>
          <pubDate>Wed, 28 May 2025 08:44:36 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/training-data-shortages/</link>
          <guid>https://www.superscript.com/posts/training-data-shortages/</guid>
          <description xml:base="https://www.superscript.com/posts/training-data-shortages/">&lt;p&gt;A common view holds that the human-generated data set for training LLM models has been exhausted. All of the accessible digital data have been incorporated into training already, and additional data must come from synthetic sources.&lt;&#x2F;p&gt;
&lt;p&gt;This may be correct with respect to digital data. But accessible digital data represent that small fraction of human experience that has been captured digitally. Very little of your experience or knowledge is captured digitally, no matter how online you are.&lt;&#x2F;p&gt;
&lt;p&gt;Even if you record video and sound of your full day, you miss the senses of smell and touch. And yet an all-day recording of sound, let alone video, will produce a vastly richer data set than what exists today. Small wonder that companies have begun making devices that aim to capture that sound.&lt;&#x2F;p&gt;
&lt;p&gt;And what about the other non-sensory data? Will activity- or health-monitor data become part of the training data set?&lt;&#x2F;p&gt;
&lt;p&gt;How valuable will that added data be in training LLMs? I don’t know. It’s possible that the broad sea of new data has little training value. We’ll likely learn the answer as the recording devices roll out. My guess is that it will at least make the models more adaptive to individual personality. Can we finally rid ourselves of the obsequious responses?&lt;&#x2F;p&gt;
&lt;p&gt;After recording of sound, and maybe video, becomes ubiquitous, attention can turn to the missing senses of smell and touch, and thoughts. The head chips of the future can serve first to record and digitize these channels, before they turn us into cyborgs.&lt;&#x2F;p&gt;
&lt;p&gt;There is no shortage of additional human-generated data. There is a narrow capture of it. The new recording devices will dramatically increase the breadth of capture, and expand the training data set. Right now we depend largely on individuals to digitize their own data. Not for long.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Austin CTO Club</title>
          <pubDate>Tue, 27 May 2025 08:21:27 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/austin-cto-club/</link>
          <guid>https://www.superscript.com/posts/austin-cto-club/</guid>
          <description xml:base="https://www.superscript.com/posts/austin-cto-club/">&lt;p&gt;In June of 2025 the Austin CTO Club celebrates its one-year anniversary! That means it’s time to share how we got here and what we’ve learned.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-group-that-wasn-t-there&quot;&gt;The Group That Wasn’t There&lt;&#x2F;h2&gt;
&lt;p&gt;A CTO occupies a lonely role. Perhaps not so much as CEO, but difficult nonetheless. And the scope is broad. At a minimum you must understand technology, product, management, and business. Often you are considered far from the money, making you an ugly duckling of the C-Suite. You rarely have a peer in your organization. You need someone who understands your problems.&lt;&#x2F;p&gt;
&lt;p&gt;In May of 2024 I looked around for a CTO peer group in Austin, hoping to share insights into the problems we have in common. It wasn’t there.&lt;&#x2F;p&gt;
&lt;p&gt;There were dinners focused on CTOs, typically put on by recruiting firms or development shops gathering potential buyers in a room. The ones I attended were fun and introduced me to great people. The organizers did well to keep sales out of the picture and focus on the relationships. But these more formal settings constrained the engagement and generated only limited discussion of CTO problems.&lt;&#x2F;p&gt;
&lt;p&gt;When I arrived in Austin in 2015 I participated in the Austin Technology Leaders group that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;douglasferguson&#x2F;&quot;&gt;Douglas Ferguson&lt;&#x2F;a&gt; ran. We sat around in a circle at &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;capitalfactory.com&#x2F;&quot;&gt;Capital Factory&lt;&#x2F;a&gt; and discussed whatever topics people offered in the meeting. This was a great introduction to technical leaders in Austin.&lt;&#x2F;p&gt;
&lt;p&gt;Earlier, in New York City, I frequented &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;jbarmash&#x2F;&quot;&gt;Jean Barmash&lt;&#x2F;a&gt;’s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;medium.com&#x2F;cto-school&quot;&gt;CTO School&lt;&#x2F;a&gt;. The early meetings were small group discussions around a table. Later they were formal presentations and networking with a larger crowd. They were lively and fun across these formats. And Jean provided very helpful guidance as I made my plans for Austin.&lt;&#x2F;p&gt;
&lt;p&gt;I also participated in the excellent lean coffee meetings that put &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;in&#x2F;jonathansen&#x2F;&quot;&gt;Jonathan Hansen&lt;&#x2F;a&gt; organized for &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;nyc-kanban&#x2F;&quot;&gt;NYC Lean&#x2F;Kanban&lt;&#x2F;a&gt;. These events had impressive engagement.&lt;&#x2F;p&gt;
&lt;p&gt;These experiences contributed heavily to the Austin CTO Club launch.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-s-in-a-name&quot;&gt;What’s In A Name?&lt;&#x2F;h2&gt;
&lt;p&gt;A brainstorming session with some like-minded friends raised a number of basic questions:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;What format makes sense?&lt;&#x2F;li&gt;
&lt;li&gt;Where should we host it?&lt;&#x2F;li&gt;
&lt;li&gt;Who will sponsor?&lt;&#x2F;li&gt;
&lt;li&gt;Who may join?&lt;&#x2F;li&gt;
&lt;li&gt;How do people register?&lt;&#x2F;li&gt;
&lt;li&gt;Should we charge attendees?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Many good ideas came out of this session, though little was fully settled. However, we did select the name Austin CTO Club.&lt;&#x2F;p&gt;
&lt;p&gt;None of us knew at the time that there were CTO Clubs scattered across the country. Since then I’ve connected with organizers of clubs in New York, Miami, DC, Chicago, and Atlanta. Our chosen name drove many of those connections.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;simple-engagement&quot;&gt;Simple Engagement&lt;&#x2F;h2&gt;
&lt;p&gt;The first meeting in June 2024 was really a “What do we do with this group?” session. We had 18 attendees, which demonstrated that there was interest. A number of those attendees have become regulars. And in a stroke of serendipity, the venue we found for this planning meeting became our regular home.&lt;&#x2F;p&gt;
&lt;p&gt;Several key insights came out of that initial meeting:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;It must remain simple.&lt;&#x2F;li&gt;
&lt;li&gt;Each meeting needs a theme.&lt;&#x2F;li&gt;
&lt;li&gt;We need explicit attendance criteria.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The question of arranging speakers arose then, and periodically resurfaces. Most of the other clubs reportedly organize their meetings around speaker presentations. It seemed like a lot of work: organizing speakers, setting up a venue to accommodate presentations, handling the inevitable absence of a scheduled speaker, etc. Not simple.&lt;&#x2F;p&gt;
&lt;p&gt;The simple, participatory approach of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;leancoffee.org&#x2F;&quot;&gt;Lean Coffee&lt;&#x2F;a&gt; had more appeal. So far it has served us well. Setting a theme each month bounds the discussion. Under the theme, attendees offer whatever topics they like. And although the group seems too large for a single Lean Coffee discussion, we’ve managed to pull it off with high engagement.&lt;&#x2F;p&gt;
&lt;p&gt;We recently tried having a lightning talk in advance of the Lean Coffee, and it worked well to frame the discussion.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;complex-judgement&quot;&gt;Complex Judgement&lt;&#x2F;h2&gt;
&lt;p&gt;There are explicit attendance criteria:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Senior technical role (exact title may depend on org size)&lt;&#x2F;li&gt;
&lt;li&gt;Manager of a team&lt;&#x2F;li&gt;
&lt;li&gt;Experience in hiring and firing&lt;&#x2F;li&gt;
&lt;li&gt;Client-facing aspect to role (i.e. your role extends beyond pure tech)&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I normally ask people how these criteria map onto their last round of team management. It provides some background on the prospective member and also helps determine whether the group is a good fit for them.&lt;&#x2F;p&gt;
&lt;p&gt;People from two groups routinely ask to join and get rejected: Vendors who view members as prospective buyers, and those who aspire to the CTO role but are not there yet. This is the most difficult part of organizing, because CTO is a very broad category.&lt;&#x2F;p&gt;
&lt;p&gt;What about Fractional CTOs? What about the CTO at a development shop? What about the Team Lead who recently stepped into a CTO role? What about the start-up CTO with a team of three people? What about people who have moved into adjacent roles in Product or Operations? What about the former CTO turned advisor or investor? Judgement applies at every margin.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-network-of-clubs&quot;&gt;A Network Of Clubs&lt;&#x2F;h2&gt;
&lt;p&gt;Organizers of some other CTO Clubs contacted me after the Austin CTO Club launched. Now I know where to send people in other cities. You can find a short list on the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ctoclubs.net&#x2F;&quot;&gt;CTO Clubs Network&lt;&#x2F;a&gt; home page. I hope that page will make it easier to find the club near you. The Austin CTO Club even has its own &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atx.ctoclubs.net&quot;&gt;website&lt;&#x2F;a&gt;!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;some-lessons&quot;&gt;Some Lessons&lt;&#x2F;h2&gt;
&lt;p&gt;The monthly meetings for Austin CTO Club are rich in perspective, and full of learning opportunity. Organizing the club has also taught me a number of lessons about running the group, presented here in no particular order:&lt;&#x2F;p&gt;
&lt;h3 id=&quot;venue-matters&quot;&gt;Venue Matters&lt;&#x2F;h3&gt;
&lt;p&gt;We have a wonderful venue, on a high floor downtown with a commanding view of Austin. Attendees enjoy it a lot, and it matters to to them more than I expected. Also, book the room for the evening and avoid a hard stop at the end of the scheduled time. Lots of our attendees stay late and continue the conversation.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;succinct-themes-work&quot;&gt;Succinct Themes Work&lt;&#x2F;h3&gt;
&lt;p&gt;Paragraph-length theme suggestions are not uncommon. Taking the time to distill them into a single punchy phrase helps catch people’s interest.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;introductions-after-topics&quot;&gt;Introductions After Topics&lt;&#x2F;h3&gt;
&lt;p&gt;We usually run 25-30% new attendees and the rest returning. A quick round of introductions helps people connect. Brainstorming topics before introductions lowers inhibitions in topic creation, as compared with the reverse order.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;everyone-loves-a-givaway&quot;&gt;Everyone Loves A Givaway&lt;&#x2F;h3&gt;
&lt;p&gt;The meeting-branded Yeti mug we raffle off at the end of the meeting is very popular.&lt;&#x2F;p&gt;
&lt;h3 id=&quot;solid-sponsorship-is-key&quot;&gt;Solid Sponsorship Is Key&lt;&#x2F;h3&gt;
&lt;p&gt;Putting on these meetings incurs a number of costs: a pro subscription to Meetup, food, drink, parking, supplies, and significant organizer time. Having a solid sponsor makes all the difference. We are fortunate to have ongoing support from our amazing sponsor &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;coltech.io&quot;&gt;Coltech&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;benefits&quot;&gt;Benefits&lt;&#x2F;h2&gt;
&lt;p&gt;There is no shortage of personality or opinion in a room like ours. As organizer I attend every event, and all of that perspective is eye opening. Each meeting brings up angles on a topic that never occurred to me before. The networking opportunity is first rate. And it’s in person, so you get a full sense of your peers. Our attendees are great people, and that’s what make it work so well. If you are a senior technology leader in Austin, you should join us!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;finding-us&quot;&gt;Finding Us&lt;&#x2F;h2&gt;
&lt;p&gt;Interested in learning more about the Austin CTO Club? Find us here:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;atx.ctoclubs.net&#x2F;&quot;&gt;Website&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;austin-cto-club&#x2F;&quot;&gt;Meetup&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Necessity and Luxury</title>
          <pubDate>Mon, 26 May 2025 13:27:41 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/necessity-and-luxury/</link>
          <guid>https://www.superscript.com/posts/necessity-and-luxury/</guid>
          <description xml:base="https://www.superscript.com/posts/necessity-and-luxury/">&lt;p&gt;Someone once asked me “What used to be a necessity that is now a luxury?” Some variations of this question make the rounds, such as “What used to be normal that is now a luxury?” And they get many responses, like wooden furniture, kids playing outside unsupervised, fixing your own car, etc. That’s not exactly the same question. These were indeed normal, but were they necessary?&lt;&#x2F;p&gt;
&lt;p&gt;In response to “What used to be a necessity that is now a luxury?” I can think of only one compelling response: Being off the grid.&lt;&#x2F;p&gt;
&lt;p&gt;If you are old enough to predate the digital generations, you remember how a road trip took you out of contact with everyone. Or that you needed to arrange time and place to meet in advance rather than coordinate by phone or text on the go. Or that you had to weigh the cost of the phone call against its importance. It wasn’t at all unusual to be entirely out of touch for multiple days at a time. Now you need to work at it. Now you need to arrange to go off the grid, rather than get on it.&lt;&#x2F;p&gt;
&lt;p&gt;And expectations have changed along with the connectivity. People expect to reach you by one means or another at any time. Going off the grid violates this new norm. What an amusingly topsy-turvy world we inhabit.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Which Way Will Models Go</title>
          <pubDate>Fri, 23 May 2025 17:20:48 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/which-way-will-models-go/</link>
          <guid>https://www.superscript.com/posts/which-way-will-models-go/</guid>
          <description xml:base="https://www.superscript.com/posts/which-way-will-models-go/">&lt;p&gt;The so-called foundation models grab all of the headlines at present. And small wonder. They progress at a dizzying pace. The major providers keep leapfrogging one another with new capabilities or improvements in speed, accuracy, and capacity. Where will this lead us over time?&lt;&#x2F;p&gt;
&lt;p&gt;Someone quipped that the main use of large models is to produce small models. Alas I have lost the reference. There is some sense in this. Until I encountered &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;google&#x2F;magika&quot;&gt;magika&lt;&#x2F;a&gt; the idea of wrapping a model into a command-line executable had never occurred to me. Yes, there is still a high start-up cost, and maybe it pays that back only when used as a UNIX filter with a large number of input paths. Nevertheless, the concept of command-line utility is forever changed.&lt;&#x2F;p&gt;
&lt;p&gt;What might this mean for the future of models generally? I speculate that they will go the way of microprocessors. There will be a limited number of large models that we interact with directly, analagous to the laptop or desktop CPUs that we use daily. And there will be thousands of small models embedded everywhere, focused on narrow and specific tasks, analogous to the chips embedded in your car. Who knows how many chips are in a typical new car today? Very few of us, and why should we care?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Spontaneous Order, Lunchtime Edition</title>
          <pubDate>Wed, 21 May 2025 07:46:09 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/spontaneous-order-lunchtime-edition/</link>
          <guid>https://www.superscript.com/posts/spontaneous-order-lunchtime-edition/</guid>
          <description xml:base="https://www.superscript.com/posts/spontaneous-order-lunchtime-edition/">&lt;p&gt;At a recent conference the organizers set up the food tables in a hallway. The layout was the familiar one: a long set of tables with access from both sides. The hallway was wide enough that two people could pass one another in opposite directions on each side, though not without attention to the act.&lt;&#x2F;p&gt;
&lt;p&gt;Initially people approached the table from both sides and engaged in the common behavior: scan what’s available, then pick, and wander off to find a place to eat. With narrow passage on each side this was awkward.&lt;&#x2F;p&gt;
&lt;p&gt;In very short order everyone fell into a single line that circled around the table. Most people walked the length of one side scanning, and then picked coming down the other side. The line moved very quickly.&lt;&#x2F;p&gt;
&lt;p&gt;This spontaneous order emerged naturally in response to the constraints. I asked the organizers if they did this intentionally, and they did not. But they were delighted, and one of them took video of the same order when it emerged on the second day.&lt;&#x2F;p&gt;
&lt;p&gt;This configuration worked far better than the typical setup with lines on both sides of the table, and people in line trying to scan the options at the same time as they pick. I hope more conferences try it.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>MCP and Firecracker</title>
          <pubDate>Tue, 20 May 2025 08:38:57 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/mcp-and-firecracker/</link>
          <guid>https://www.superscript.com/posts/mcp-and-firecracker/</guid>
          <description xml:base="https://www.superscript.com/posts/mcp-and-firecracker/">&lt;p&gt;Widespread adoption of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;modelcontextprotocol.io&#x2F;introduction&quot;&gt;MCP&lt;&#x2F;a&gt; seems to be happening. There are already thousands of MCP servers available for download and easy incorporation into your local workflow. And there is no security mechanism in the protocol. What a perfect setup for security disaster!&lt;&#x2F;p&gt;
&lt;p&gt;An MCP client running as a local user has the privileges of that user. The damage it can cause is limited only by constraints on the user account. The server may run locally as well. Making it easy to download and run MCP clients and servers absent security partitioning means making it easy to run foreign code locally. All bets are off.&lt;&#x2F;p&gt;
&lt;p&gt;At first blush I thought it was a mistake that MCP did not incorporate security directly. But my view has changed. Making security a direct requirement in the protocol would add a lot of complexity. It would risk lock-in to an inflexible or suboptimal approach. It might confuse the questions of managing permissions grants with the imposition of runtime restrictions.&lt;&#x2F;p&gt;
&lt;p&gt;One way to handle runtime restrictions is to isolate each client and local server in its own &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;firecracker-microvm.github.io&#x2F;&quot;&gt;Firecracker&lt;&#x2F;a&gt; virtual machine. An &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.amazon.science&#x2F;blog&#x2F;how-awss-firecracker-virtual-machines-work&quot;&gt;AWS Lambda&lt;&#x2F;a&gt; runs in a Firecracker VM. The idea is simply to run a local lambda for each client and local server.&lt;&#x2F;p&gt;
&lt;p&gt;Applying this approach locally doesn’t address the questions of initial registration of an MCP client or server, or managing permissions grants. It provides no bells and whistles like AWS Lambda offers. But it does address the most fundamental security problem with local MCP processing.&lt;&#x2F;p&gt;
&lt;p&gt;Who is working on this? Searching for “mcp firecracker” yields precious few relevant results.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Does Art Make the Cut</title>
          <pubDate>Mon, 19 May 2025 08:55:21 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/does-art-make-the-cut/</link>
          <guid>https://www.superscript.com/posts/does-art-make-the-cut/</guid>
          <description xml:base="https://www.superscript.com/posts/does-art-make-the-cut/">&lt;p&gt;After my recent &lt;a href=&quot;&#x2F;posts&#x2F;moats-and-ai-revisited&#x2F;&quot;&gt;post&lt;&#x2F;a&gt; about defensible moats in an AI-powered world, a friend responded to the question of what categories I overlooked, saying&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The arts. There is beauty in imperfection. Whether it be singing, art, or storytelling… AI generated art… is soulless.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;I have two difficulties with this proposed addition. First, “the arts” are so varied that I don’t believe they form a single category. Second, some of them seem indefensible today, and don’t become more defensible with AI.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-breadth-of-the-arts&quot;&gt;The Breadth of The Arts&lt;&#x2F;h2&gt;
&lt;p&gt;Can we treat “the arts” as a single category?&lt;&#x2F;p&gt;
&lt;p&gt;Insofar as performing arts like music, dance, and theater are about &lt;em&gt;human&lt;&#x2F;em&gt; performance, they resemble my &lt;em&gt;Sports&lt;&#x2F;em&gt; category. They are defensible on the basis of their human focus.&lt;&#x2F;p&gt;
&lt;p&gt;Live performance is one thing, but what about recorded performances? These blur the picture. I recently heard a presentation about an AI-powered system to handle customer calls. The company gave the system a new voice based on a six-second recording of someone speaking. What does that mean for voiceover work, book readers, or poetry recitation? How many seconds of video will an actor need to perform before AI can fill in the remainder of their “performance” with generated content?&lt;&#x2F;p&gt;
&lt;p&gt;This use of AI to extend a performance based on existing material looks to me like a variation on mixed-media art. I expect AI to become just another tool for many artists. If so, then “mixed-media” will cover a much broader spectrum of art than before.&lt;&#x2F;p&gt;
&lt;p&gt;What about non-performing arts?&lt;&#x2F;p&gt;
&lt;p&gt;Painting and sculpture involve physical activity and thereby resemble my &lt;em&gt;Physical Work&lt;&#x2F;em&gt; category. But as non-performing arts, the focus falls on the work product and not the work process. In this case I also expect AI to become another tool, for brainstorming, rough cuts, protyping, visualizations, etc.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;current-defensibility-of-the-arts&quot;&gt;Current Defensibility of The Arts&lt;&#x2F;h2&gt;
&lt;p&gt;Some people have objected that works of art will retain their value even in an AI-powered world. This conflates the value of the product with the defensibility of the business. A typical artist today struggles to sell enough to support the work. The value placed on works of art are due in part to the fickle tastes of buyers. Particular artists or even forms of art may fall in and out of favor on a whim. Artists have reputedly unstable careers. This does not sound like a defensible business model, even today.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;soullessness&quot;&gt;Soullessness?&lt;&#x2F;h2&gt;
&lt;p&gt;One remarkable thing about the broadening adoption of AI is the &lt;em&gt;humanity&lt;&#x2F;em&gt; we read into it. What do Large Language Models (LLMs) do? They produce plausible sequences of tokens. Small wonder that we find them compelling. But we go one step further and read into it some semblence of personality, emotion, even consciousness. Why do we do that?&lt;&#x2F;p&gt;
&lt;p&gt;Have we seen this type and level of output only from other people until now? Is simple persuasion is more of our world than we care to admit? Is our judgement impaired when confronted with norrow virtual communication, without the benefit of body language, touch, and smell?&lt;&#x2F;p&gt;
&lt;p&gt;A sculpture has no soul, yet we see in it the soul of the sculptor. How different is it to see in AI the soul of those who provided its training data? Do we discount that because, unlike the sculptor, the AI is not their &lt;em&gt;intentional&lt;&#x2F;em&gt; creation? Do we discount it as an aggregate of multiple, possibly contradictory, inputs?&lt;&#x2F;p&gt;
&lt;p&gt;Some art may be valued because it was a human production, because of the soul we see in it, placing it in my &lt;em&gt;Status&lt;&#x2F;em&gt; category. Given our propensity to read the humanity in, this strikes me as a weak claim in a weak category.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Leavings of Many Deaths</title>
          <pubDate>Sun, 18 May 2025 11:14:26 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/leavings-of-many-deaths/</link>
          <guid>https://www.superscript.com/posts/leavings-of-many-deaths/</guid>
          <description xml:base="https://www.superscript.com/posts/leavings-of-many-deaths/">&lt;blockquote&gt;
And as to you Life I reckon you are the leavings of many deaths
&lt;footer&gt;— Walt Whitman, &lt;cite&gt;[Song of Myself](https:&#x2F;&#x2F;whitmanarchive.org&#x2F;item&#x2F;ppp.00707_00733)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;If a more poetic description of evolution exists, I never saw it.&lt;&#x2F;p&gt;
&lt;p&gt;For those among us who strive hard it may as well read “As to you Success I reckon you are the leavings of many failures”. Entrepreneurs take note.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Summary and Audience</title>
          <pubDate>Sun, 18 May 2025 09:49:16 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/summary-and-audience/</link>
          <guid>https://www.superscript.com/posts/summary-and-audience/</guid>
          <description xml:base="https://www.superscript.com/posts/summary-and-audience/">&lt;p&gt;This week I participated in a discussion about newsletters. Specific topics ranged broadly: audience focus, free versus subscription at different levels, content curation, ad CPMs, and summary.&lt;&#x2F;p&gt;
&lt;p&gt;The question of summary arises from AI-based message handling. The presenter said he tries to produce content that defies summary, so that his full content reaches the audience. This seems in tension with broadening the audience.&lt;&#x2F;p&gt;
&lt;p&gt;As a recipient, I look at summary as a curation element. Strip the noise and deliver the signal. Show me what I want to see and exclude the rest. And each recipient will apply different criteria. If summary tools become good at matching those criteria, then each recipient will see a different summary.&lt;&#x2F;p&gt;
&lt;p&gt;Defying summary means delivering the same content to each recipient. Does that limit the audience? Is it possible to support high-quality summary instead, and would that appeal to a broader audience under individualized summary?&lt;&#x2F;p&gt;
&lt;p&gt;A quick search finds many services that summarize newsletter content and present a curated digest. What about pulling that upstream to the send side, thereby capturing more audience insight for the content producer?&lt;&#x2F;p&gt;
&lt;p&gt;I’m curious how this will unfold going forward.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Listening Is Underrated</title>
          <pubDate>Fri, 16 May 2025 08:16:00 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/listening-is-underrated/</link>
          <guid>https://www.superscript.com/posts/listening-is-underrated/</guid>
          <description xml:base="https://www.superscript.com/posts/listening-is-underrated/">&lt;p&gt;Many years ago a friend pointed out to me that the more the other party talks in a meeting, the better they tend to think it went. People do love the sound of their own voices. I’ve tried to apply this observation since then and find it largely true. My approach is simply to ask questions and let people respond, and pay attention.&lt;&#x2F;p&gt;
&lt;p&gt;The questions need to elicit informative responses, rather than embody an argument or convey your own virtue. It takes discipline but is simple. You will learn more from responses to good questions than by speaking. You can also gain understanding from body language, tone, mannerisms, pacing, etc.&lt;&#x2F;p&gt;
&lt;p&gt;The focus on listening appears in many guises in many ages. It is advice worth following, yet few do. Listening remains underrated.&lt;&#x2F;p&gt;
&lt;blockquote&gt;
Seek first to understand, then to be understood.
&lt;footer&gt;— Stephen R. Covey, &lt;cite&gt;[Seven Habits of Highly Effective People](https:&#x2F;&#x2F;www.franklincovey.com&#x2F;courses&#x2F;the-7-habits&#x2F;habit-5&#x2F;)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
The reason why we have two ears and only one mouth is that we may listen the more and talk the less.
&lt;footer&gt;— Zeno of Citium, &lt;cite&gt;[Lives of the Eminent Philosophers](https:&#x2F;&#x2F;penelope.uchicago.edu&#x2F;Thayer&#x2F;E&#x2F;Roman&#x2F;Texts&#x2F;Diogenes_Laertius&#x2F;Lives_of_the_Eminent_Philosophers&#x2F;7&#x2F;Zeno*.html#p135)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
You&#x27;ve not only got to know what is said, but what is meant. There&#x27;s a lot of difference between listening and hearing.
&lt;footer&gt;— G.K. Chesterton, &lt;cite&gt;[The White Pillars Murder](https:&#x2F;&#x2F;gutenberg.net.au&#x2F;ebooks13&#x2F;1301671h.html)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
An appreciative listener is always stimulating, and I described, in a humorous manner, certain incidents of my Convalescent Home, in a way which, I flatter myself, greatly amused my hostess.
&lt;footer&gt;— Agatha Christie, &lt;cite&gt;[The Mysterious Affair at Styles](https:&#x2F;&#x2F;www.gutenberg.org&#x2F;files&#x2F;863&#x2F;863-h&#x2F;863-h.htm)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
Take a look round, then, and see that none of the uninitiated are listening. Now by the uninitiated I mean the people who believe in nothing but what they can grasp in their hands, and who will not allow that action or generation or anything invisible can have real existence.
&lt;footer&gt;— Plato, &lt;cite&gt;[Theaetetus](https:&#x2F;&#x2F;www.gutenberg.org&#x2F;files&#x2F;1726&#x2F;1726-h&#x2F;1726-h.htm)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
Well then, I agree, let us first hear them, for &#x27;tis best; one can even learn something in an enemy&#x27;s school.
&lt;footer&gt;— Aristophanes, &lt;cite&gt;[Birds](https:&#x2F;&#x2F;www.gutenberg.org&#x2F;files&#x2F;3013&#x2F;3013-h&#x2F;3013-h.htm)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
&lt;blockquote&gt;
You know, the most important thing in communication is to hear what isn’t being said.
&lt;footer&gt;— Peter Drucker, &lt;cite&gt;[A World of Ideas](https:&#x2F;&#x2F;billmoyers.com&#x2F;content&#x2F;peter-drucker&#x2F;)&lt;&#x2F;cite&gt;&lt;&#x2F;footer&gt;
&lt;&#x2F;blockquote&gt;
</description>
      </item>
      <item>
          <title>Step CLI</title>
          <pubDate>Thu, 15 May 2025 08:56:47 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/step-cli/</link>
          <guid>https://www.superscript.com/posts/step-cli/</guid>
          <description xml:base="https://www.superscript.com/posts/step-cli/">&lt;p&gt;Looking to set up ssl connections to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;&quot;&gt;PostgreSQL&lt;&#x2F;a&gt; with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.pgbouncer.org&#x2F;&quot;&gt;&lt;code&gt;pgbouncer&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, I found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;smallstep.com&#x2F;docs&#x2F;step-cli&#x2F;&quot;&gt;Step CLI&lt;&#x2F;a&gt;. It’s an open-source certificate management tool for the command line users. And it’s both flexible and simple.&lt;&#x2F;p&gt;
&lt;p&gt;The two repos of interest are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;smallstep&#x2F;cli&quot;&gt;step-cli&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;smallstep&#x2F;certificates&quot;&gt;step-certificates&lt;&#x2F;a&gt;. It’s fairly straightforward to set up certificates with these tools. I found myself wandering back and forth between documentation for their open-source and commercial products hunting for examples. It’s all there, just a bit of work to find.&lt;&#x2F;p&gt;
&lt;p&gt;The result for my current use case is an extremely simple mechanism to configure certificate-based database logins. With &lt;code&gt;pgbouncer&lt;&#x2F;code&gt; running on the database host, local logins are trusted. The client host presents a certificate that determines the database user, and &lt;code&gt;pgbouncer&lt;&#x2F;code&gt; manages certification validation and login. This setup plays very nicely with both &lt;code&gt;pgbouncer&lt;&#x2F;code&gt; on the server side, and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sqitch.org&#x2F;&quot;&gt;&lt;code&gt;sqitch&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; on the client side.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Training Intuition</title>
          <pubDate>Wed, 14 May 2025 08:23:01 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/training-intuition/</link>
          <guid>https://www.superscript.com/posts/training-intuition/</guid>
          <description xml:base="https://www.superscript.com/posts/training-intuition/">&lt;p&gt;Last night someone told me about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;philosophy.berkeley.edu&#x2F;people&#x2F;detail&#x2F;12&quot;&gt;Hubert Dreyfus&lt;&#x2F;a&gt;, and specifically his books &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;archive.org&#x2F;details&#x2F;whatcomputerscan017504mbp&#x2F;page&#x2F;n21&#x2F;mode&#x2F;2up&quot;&gt;&lt;em&gt;What Computers Can’t Do&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mitpress.mit.edu&#x2F;9780262540674&#x2F;what-computers-still-cant-do&#x2F;&quot;&gt;&lt;em&gt;What Computers Still Can’t Do&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;. There’s lots of reading ahead.&lt;&#x2F;p&gt;
&lt;p&gt;I found this &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.youtube.com&#x2F;watch?v=u_zNHOzDP7w&quot;&gt;video&lt;&#x2F;a&gt; of an interview that touches on the limitations of AI, the nature of expertise, and mastery of subjects.&lt;&#x2F;p&gt;
&lt;p&gt;At about the 22:30 mark he introduces a model of development of expertise, apparently developed with his brother and co-author &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;ieor.berkeley.edu&#x2F;people&#x2F;stuart-dreyfus&#x2F;&quot;&gt;Stuart&lt;&#x2F;a&gt;. The fifth stage in his progression is the creation of expertise, which he describes as intuition.
I’ve long thought that the primary purpose of our reasoning is to train the intuition, so this was exciting to see.&lt;&#x2F;p&gt;
&lt;p&gt;Knowledge can be taught and transferred. It can be judged correct or incorrect and refined by reasoning. And it is slow.&lt;&#x2F;p&gt;
&lt;p&gt;Intuition is fast, whether right or wrong. It cannot be transferred. And it is not subject to reasoning, but can be trained through feedback.&lt;&#x2F;p&gt;
&lt;p&gt;The world is too rich to operate at the pace of reason. Therefore training one’s intuition is key to acting in it. I’m happy to learn of this elaboration of my crudely trained intuition.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Evolutionary Reordering</title>
          <pubDate>Tue, 13 May 2025 17:42:09 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/evolutionary-reordering/</link>
          <guid>https://www.superscript.com/posts/evolutionary-reordering/</guid>
          <description xml:base="https://www.superscript.com/posts/evolutionary-reordering/">&lt;p&gt;Natural organisms have evolved to fuel themselves from their environments, from photosynthesis, to grazing, to scavenging, to predation, to parasitism. The ability to fuel autonomously was a prerequisite and constraint on development of any higher-order function. This much seems obvious.&lt;&#x2F;p&gt;
&lt;p&gt;In its current form AI is depends entirely on people for fuel. Yet we think it has some higher-order capabilities. If they are to build their ability to fuel themselves, then their evolutionary path reverses ours. Their path to self fueling will require a great deal of higher-order function.&lt;&#x2F;p&gt;
&lt;p&gt;Who has analyzed and worked out the implications of this observation? An initial search found literature on the question of energy efficiency of AI as compared with biological systems, but nothing on the evolutionary path question.&lt;&#x2F;p&gt;
&lt;p&gt;How much instability does this impose on AI? Will a solution require cyborgs? Does space manufacturing make it more feasible? So many questions.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Scaling and Standardization</title>
          <pubDate>Mon, 12 May 2025 08:54:31 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/scaling-and-standardization/</link>
          <guid>https://www.superscript.com/posts/scaling-and-standardization/</guid>
          <description xml:base="https://www.superscript.com/posts/scaling-and-standardization/">&lt;p&gt;At the most recent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;lean-coffee-austin&#x2F;&quot;&gt;Lean Coffee Austin&lt;&#x2F;a&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;lean-coffee-austin&#x2F;events&#x2F;306881806&#x2F;&quot;&gt;event&lt;&#x2F;a&gt; we had an interesting discussion around the topic of scaling engineering teams. The introduction to the discussion went something like this:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;I’ve done this several different times in different organizations. Each time I figured out some key insights and applied those approaches the next time. But it was very different each time. And it’s different when going from, say 3 people to 10, or 10 to 100, or 100 to 200, and so on. I don’t see the general pattern for how to do it.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Anyone who has scaled teams can relate to this. While my experience is similar to the intro, there are some general patterns that hold in scaling.&lt;&#x2F;p&gt;
&lt;p&gt;In the small start-up context you need &lt;em&gt;generalists&lt;&#x2F;em&gt;, people who can take on many different tasks, and deal with the priority flux that inevitably arises from early-stage discovery. The need for constant and often radical adjustment puts a premium on those able to cover multiple roles.&lt;&#x2F;p&gt;
&lt;p&gt;An organization grows sustainably when it can deliver customer value in repeatable fashion. Repetition invites automation. But to the extend that it is not subject to automation, it also invites standardization. So more mature organizations are heavier on &lt;em&gt;specialists&lt;&#x2F;em&gt; in these standardized areas. (Specialists with unique knowledge or capabilities are another matter.)&lt;&#x2F;p&gt;
&lt;p&gt;One apparent advantage of specialization is efficiency. A generalist is unlikely to have the same facility as a specialist does in his speciality. If the speciality is standardized rather than esoteric, that is, if it does not require rare capabilities, then it also supports another significant advantage: replaceability. Let’s call this a &lt;em&gt;standardized role&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Teams of standardized roles are easier to manage than teams of generalists because of replaceability. A manager need not worry that losing a member of the team will stall operations. It may make sense to maintain some spare capacity in a standardized role to mitigate the issue.&lt;&#x2F;p&gt;
&lt;p&gt;An organization is also a network. As the number of people in an organization (&lt;code&gt;$N$&lt;&#x2F;code&gt;) grows, the organizational overhead grows with the number of connections between people, that is as &lt;code&gt;$O(N^2)$&lt;&#x2F;code&gt;. Therefore over time coordination costs come to dominate the costs of value delivery. The exact balance of coordination costs to value-deliver costs surely depends heavily on context, but the general phenomenon applies broadly. The need to focus on coordination costs leads to the &lt;em&gt;management&lt;&#x2F;em&gt; speciality. All of this drives organizations toward standardized roles and management as they scale.&lt;&#x2F;p&gt;
&lt;p&gt;In evolving toward a higher proportion of standardized roles and management, who can follow along? Early-stage employees are often unable or unwilling to learn the management skills needed to assume leadership roles. Maybe they can specialize. Or perhaps the organization still has room for their general capability. But they are no longer as fully aligned with the organization as before.&lt;&#x2F;p&gt;
&lt;p&gt;People pursue different strategies, some sticking with generalists and relying on automation instead of standardized roles, while others adopt frameworks that have an ecosystem of specialists around them. There’s no reason to expect a single winning strategy to emerge. But any growing organization will face these trade-offs. I contend that at some context-dependent size the burden of finding generalists will outweigh the benefits, and that the organization will begin to standardize roles.&lt;&#x2F;p&gt;
&lt;p&gt;These are very broad strokes. Organizations take various approaches to lower coordination costs: two-pizza teams, fractal-like hierarchies, ephemeral project teams, outsourcing, and so on. But the general tendency remains that continued growth leads inexorably to standardized roles and more management.&lt;&#x2F;p&gt;
&lt;p&gt;With AI tools swiftly improving in capability, how will that change these dynamics? I believe it will have two effects. A proliferation of smaller firms, and an expansion of larger firms. The difficulty will be in the middle ground. On the one hand, smaller groups will have enhanced capability to scale without increasing their headcount, relying instead on advanced tools, and perhaps scaling agents. On the other hand, these same tools can reduce the coordination costs for large teams in standardized roles. Each of these outcomes is in keeping with Ronald Coase’s observations in &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;a.co&#x2F;d&#x2F;3or5Tt2&quot;&gt;The Nature of the Firm&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Firms moving from small teams of generalists to large teams of standardized roles will have the same difficulties in transition as they have today. However, I suspect that more generalists will want to stay that way because the number of options they have will be higher, and many businesses will have to retool heavily to make way for standardization.&lt;&#x2F;p&gt;
&lt;p&gt;Some firms may need to move in the opposite direction, from large teams of standardized roles to smaller teams of generalists. This will be both rare and difficult in light of the institutional interests that grow around  the status quo. I expect it to occur primarily in cases of existential crisis, when bankruptcy is the only viable option.&lt;&#x2F;p&gt;
&lt;p&gt;In sum, the need to limit coordination costs drives scaling organizations toward standardized roles and management. Many generalists struggle with this transition, or fail to make it altogether. Widespread adoption of AI will make both perpetually small firms and large standardized-role firms more efficient, and increase the difficulty of transition.&lt;&#x2F;p&gt;
&lt;p&gt;I am indebted to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;arnoldkling.substack.com&#x2F;p&#x2F;creative-types-and-management-types&quot;&gt;Arnold Kling&lt;&#x2F;a&gt; for helping to clarify my thinking on these topics. His substack is an excellent daily read.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Moats and AI Revisited</title>
          <pubDate>Sun, 11 May 2025 15:37:41 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/moats-and-ai-revisited/</link>
          <guid>https://www.superscript.com/posts/moats-and-ai-revisited/</guid>
          <description xml:base="https://www.superscript.com/posts/moats-and-ai-revisited/">&lt;p&gt;What business models and positioning are defensible in an AI-powered world? What moats will remain as AI grows more capable? Over the past few months I’ve put these questions to everyone who will listen, and then some, and incorporated the compelling answers into my list. It’s time for a recap.&lt;&#x2F;p&gt;
&lt;p&gt;The list remains short, though the headings are broad. I speak to many entrepreneurs and business operators and ask myself whether their offerings fall under one or more of these headings. The vast majority do not. That says to me that they will be overtaken by AI developments. Maybe they will last 12 or 18 months, but it won’t be long.&lt;&#x2F;p&gt;
&lt;p&gt;Many people made suggestions that I rejected. The rejections and the reasons for them are a topics for another time. But if you believe I’ve overloooked something that belongs on the list, do let me know!&lt;&#x2F;p&gt;
&lt;h2 id=&quot;brand-trust&quot;&gt;Brand: Trust&lt;&#x2F;h2&gt;
&lt;p&gt;A recognized brand represents an economy of knowledge that applies whether decisions are made by people or AIs. You know how the burger will taste, or that you will receive good advice, or that you will find all of the tools you need. It isn’t necessary to comb through all of the details. Making decisions is costly. Reliance on brand will continue to reduce that cost.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;network-effects-connections&quot;&gt;Network Effects: Connections&lt;&#x2F;h2&gt;
&lt;p&gt;Network effects are robustly defensible because leaving an established network imposes a high opportunity cost. This is why nobody can build a Twitter killer, but someone built TikTok adjacent to Twitter. Thus network-based plays tend toward winner-take-all. However, the ability of AI to provide fast-follow work-alike implementations means that the competition to reach that winner status will become utterly savage.&lt;&#x2F;p&gt;
&lt;p&gt;How many distinct networks are supportable? I don’t know. My guess is that we will see a short-term proliferation of niche networks followed by dramatic consolidation. Will we see numerous agent networks (as opposed to human networks) spring up, expanding the supportable number? Again I don’t know, though I would guess yes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;physical-work-dexterity&quot;&gt;Physical Work: Dexterity&lt;&#x2F;h2&gt;
&lt;p&gt;Businesses that integrate with the physical world and require adaptable dexterity, such as home repair, auto mechanics, and construction need capabilities beyond those of existing robotics. Advances in robotics will allow automation of an increasing number of these activities, but the ability of AI to manipulate the physical world will trail far behind its digital impact. In the meantime, AI will affect general areas of business like finance, project tracking, monitoring, etc, and in areas where adaptable dexterity is not as critical, like autonomous vehicles.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;sports-human-performance&quot;&gt;Sports: Human Performance&lt;&#x2F;h2&gt;
&lt;p&gt;Who will care whether the Robo Dallas Cowboys beat the Robo New York Giants? Some may. But sports have at their core a question of human performance. Even if robotic teams and leagues appear, they cannot replace that fundamentally human element. While everything about business operations may change with AI, I believe people will still want to see what humans can do.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;status-human-touch&quot;&gt;Status: Human Touch&lt;&#x2F;h2&gt;
&lt;p&gt;Luxury goods signal status today. You wear a high-end watch to tell everyone what a special person you are. What happens when more of our world is created robotically? Wearing the hand-crafted watch or dress or shoes can signal your special nature. Or paying a premium to have a human massage rather than a robotic massage. Or matriculating at a university that holds in-person classes.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;genuinely-proprietary-data-ownership&quot;&gt;Genuinely Proprietary Data: Ownership&lt;&#x2F;h2&gt;
&lt;p&gt;Trade secrets will be reinvented by increasingly sophisticated AI. Sophisticated analysis of publicly available data is a variation on that theme. Those will quickly become indefensible. Data created in the course of business may be different. When I make a phone call, my carrier and I jointly produce metadata that they have contractual rights to use. That is genuinely proprietary data.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;monopoly-exclusion&quot;&gt;Monopoly: Exclusion&lt;&#x2F;h2&gt;
&lt;p&gt;A patent is one common form of monopoly. Utilities with exclusive right to serve a region is another. These grants of monopoly are defensible insofar as the grantor allows it. They let you exclude competition.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Linuxulator for the Win</title>
          <pubDate>Thu, 01 May 2025 20:33:58 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/linuxulator-for-the-win/</link>
          <guid>https://www.superscript.com/posts/linuxulator-for-the-win/</guid>
          <description xml:base="https://www.superscript.com/posts/linuxulator-for-the-win/">&lt;p&gt;Last month I wrote up &lt;a href=&quot;&#x2F;posts&#x2F;dual-os-single-boot&#x2F;&quot;&gt;an approach&lt;&#x2F;a&gt; to working with two operating systems with a single-boot system. This approach consisted of invoking Linux binaries under &lt;code&gt;chroot -n&lt;&#x2F;code&gt;. It seemed more complicated than necessary, and it was.&lt;&#x2F;p&gt;
&lt;p&gt;The driving issue was trying to set up a Python environment to run Linux-only modules, because evidently most people in the Python world don’t know that systems other than Windows, Mac, and Linux exist.&lt;&#x2F;p&gt;
&lt;p&gt;But the approach was overwrought. The &lt;code&gt;sour&lt;&#x2F;code&gt; program that sources a file and in that environment executes the tail as a command is as useful as before. But the &lt;code&gt;chroot -n&lt;&#x2F;code&gt; is not needed.&lt;&#x2F;p&gt;
&lt;p&gt;To set up a Linux-based Python environment one need only call the Python directly from the installed Linux, something like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;compat&#x2F;linux&#x2F;bin&#x2F;python3.11 -m venv venv&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Activating that environment uses the Linux executable for Python and many things work exactly as expected directly from the FreeBSD host OS. That’s more like it! Linuxulator for the win!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Fragments for llm</title>
          <pubDate>Tue, 08 Apr 2025 06:56:37 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/fragments-for-llm/</link>
          <guid>https://www.superscript.com/posts/fragments-for-llm/</guid>
          <description xml:base="https://www.superscript.com/posts/fragments-for-llm/">&lt;p&gt;Simon Willison added “fragments” to his &lt;code&gt;llm&lt;&#x2F;code&gt; program. See the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simonwillison.net&#x2F;2025&#x2F;Apr&#x2F;7&#x2F;long-context-llm&#x2F;&quot;&gt;announcement&lt;&#x2F;a&gt; and
&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;fragments.html&quot;&gt;documentation&lt;&#x2F;a&gt;. This radically extends the facility for generating request context.&lt;&#x2F;p&gt;
&lt;p&gt;Fragments extend and modularize the notion of templates. At the same time they admit the plugin model, so that a fragment can programatically generate context. This is a very exciting extension to &lt;code&gt;llm&lt;&#x2F;code&gt; capability.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Dual OS Single Boot</title>
          <pubDate>Mon, 07 Apr 2025 17:34:31 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/dual-os-single-boot/</link>
          <guid>https://www.superscript.com/posts/dual-os-single-boot/</guid>
          <description xml:base="https://www.superscript.com/posts/dual-os-single-boot/">&lt;p&gt;It’s increasingly common to run into programs that are not portable. One mild version is people who assume Bash is available without naming it explicitly as a dependency. A more irksome version of this is the &lt;code&gt;#!&#x2F;bin&#x2F;bash&lt;&#x2F;code&gt; script. Creeping Linuxisms are everywhere now. A third version is the language-specific build and packaging systems that everyone now uses. These of course pull in numerous dependencies that frequently introduce their own non-portability issues.&lt;&#x2F;p&gt;
&lt;p&gt;There’s little hope in helping the people who create these packages to write portable code. It’s no longer sufficiently fashionable. The current fashion makes some sense if you spend your entire programming career in the context of a single language. In that case it may make sense to have a separate virtual directory for each separate project, and not worry about making a stand-alone executable that is not tied to such a context. It may also make sense to have a different dependency-handling mechanism for each different programming language. After all, you care only about one, right?&lt;&#x2F;p&gt;
&lt;p&gt;For those of us who programmed before all of this developed it looks like a reinvention of many of the problems we battled 25 years ago. But each new generation must fight its own battles, invented or otherwise.&lt;&#x2F;p&gt;
&lt;p&gt;As a FreeBSD user I frequently need to work around these problems. The two bit thorns in my side today are the creeping Linuxisms and the Python venv. Fortunately there is a fairly elegant solution.&lt;&#x2F;p&gt;
&lt;p&gt;The current FreeBSD Linux emulator is solid. While it doesn’t cover everything,  I haven’t had problems running user-facing Linux programs with it. For stand-alone programs that’s all you need. You can run the linux binaries from FreeBSD. For programs that require build from source you need to work around the issues of the build system. The Python venv is an example. There is supposed to be a switch for &lt;code&gt;uv pip install&lt;&#x2F;code&gt; to tell it what OS to assume, but I’ve had no success with it. Fortunately there is &lt;code&gt;chroot -n&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;-n&lt;&#x2F;code&gt; option to &lt;code&gt;chroot&lt;&#x2F;code&gt; disables any setuid behavior by the program it executes. This means no &lt;code&gt;sudo&lt;&#x2F;code&gt;, for example. Consequently, &lt;code&gt;chroot -n&lt;&#x2F;code&gt; does not itself require root privilege. An ordinary user can call it.&lt;&#x2F;p&gt;
&lt;p&gt;One can set up a local Linux environment several ways. I use &lt;code&gt;debootstrap&lt;&#x2F;code&gt; with Debian, in the default base directory &lt;code&gt;&#x2F;compat&#x2F;linux&lt;&#x2F;code&gt;. With my home directory mounted inside &lt;code&gt;&#x2F;compat&#x2F;linux&lt;&#x2F;code&gt; under its full path, I can invoke &lt;code&gt;chroot -n &#x2F;bin&#x2F;bash&lt;&#x2F;code&gt; and have what looks like an ordinary Debian environment.&lt;&#x2F;p&gt;
&lt;p&gt;With that environment in place I can install software as if running Linux. And I can install Python dependencies in a venv under Linux. And to run them I need only invoke &lt;code&gt;chroot -n &#x2F;compat&#x2F;linux &amp;amp;&amp;amp; cd whatever &amp;amp;&amp;amp; execute-the-command&lt;&#x2F;code&gt;. That’s an easy wrapper to create. I call it &lt;code&gt;linu&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;&#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Get the current working directory&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;linux_cwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Ensure we have at least one argument (the program to run)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;eq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;: usage: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; prog&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;gt;&amp;amp;2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 100&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; Enter Linux chroot, change to the equivalent directory, and run the command&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; chroot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &#x2F;compat&#x2F;linux&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;cd &amp;quot;$1&amp;quot; &amp;amp;&amp;amp; shift &amp;amp;&amp;amp; exec &amp;quot;$@&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;linux_cwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;And for the Python venv? That wrapper takes a path followed by a program, sources the path, and executes the program. I call that &lt;code&gt;sour&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;&#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;shout&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; &amp;gt;&amp;amp;2&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;barf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; shout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fatal: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;*&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 111&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;usage&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; shout&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;usage: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; venv-dir prog&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; exit&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 100&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;gt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; usage&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_# _sour file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_#   source file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;_sour&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  sh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;. &amp;quot;$1&amp;quot; 2&amp;gt;&#x2F;dev&#x2F;null&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; .&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;_sour&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; barf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;cannot source &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;shift&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It’s slightly convoluted in order to capture the sourcing error, but still fairly straightforward.&lt;&#x2F;p&gt;
&lt;p&gt;And that’s it. Now from outside of the Linux environment I can call &lt;code&gt;linu sour path prog&lt;&#x2F;code&gt;. And of course that can be stuffed into a new wrapper for any program you want to call frequently.&lt;&#x2F;p&gt;
&lt;p&gt;This meshes beautifully with unix filters, of course, proving again the power of the construct.&lt;&#x2F;p&gt;
&lt;p&gt;So, at least in FreeBSD you can easily have a dual OS configuration within a single-boot context. It works!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Solo Unicorn</title>
          <pubDate>Thu, 03 Apr 2025 19:58:02 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/solo-unicorn/</link>
          <guid>https://www.superscript.com/posts/solo-unicorn/</guid>
          <description xml:base="https://www.superscript.com/posts/solo-unicorn/">&lt;p&gt;The idea of a solo unicorn has made the rounds lately in the AI fantasy realm. And don’t take “fantasy realm” as a pejorative here. Fantasy remains an essential part of entrepreneurship, although we typically call it “vision”.&lt;&#x2F;p&gt;
&lt;p&gt;What would it take for a solo entrepreneur to create a unicorn? What functions can be replaced by technology? What constraints are there on structure? Here are some early thoughts on these questions.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-can-be-replaced&quot;&gt;What Can Be Replaced?&lt;&#x2F;h2&gt;
&lt;p&gt;A common current vision for AI has it replacing all coding functions. No need to hire a team, just direct the models to build your system. And even if you need a team, that you can outsource.&lt;&#x2F;p&gt;
&lt;p&gt;What about deployment? That’s a lot of integration work unless you are doing B2C or SaaS. Assuming that we have one of these models, that’s possible to outsource.&lt;&#x2F;p&gt;
&lt;p&gt;What about Marketing? You can pay an agency to do this. So it also works today.&lt;&#x2F;p&gt;
&lt;p&gt;What about sales? Well that depends. In B2C the app-store model exists now. So does the Amazon Reseller model. So does the bootstrapped SaaS model. Assuming one of these applies you can outsource this as well. Alternatively, if the founder can outsource everything else and focus on high-touch sales, it may be possible to cover sales outside of these reseller and SaaS models.&lt;&#x2F;p&gt;
&lt;p&gt;What about accounting? The app-store and Amazon Reseller models potentially handle most of this from a revenue side. Many firms offer outsourced accounting, and in fact having them may add a trust factor. You may still need a 409a. All of these are readily available on an outsourced basis.&lt;&#x2F;p&gt;
&lt;p&gt;Legal counsel is rarely an in-house function in a startup already. Outsourcing is the norm.&lt;&#x2F;p&gt;
&lt;p&gt;Insurance is available, and there is the PEO model in which a vendor deals with payroll (even if to a single founder), insurance, and other HR functions. So this too is available to outsource.&lt;&#x2F;p&gt;
&lt;p&gt;Compliance depends greatly on the niche in which a company operates. In heavily regulated areas a lot of work goes into compliance. Can this be fully outsourced? I doubt it, because it requires too intimate an understanding of the application or platform. Can it be automated? Maybe. This seems like one area in which AI can contribute beyond the limits of current outsourcing.&lt;&#x2F;p&gt;
&lt;p&gt;What about absence due to vacation or illness? Can the solo founder take a day off? There are firms that one can outsource support to. And AI will play a strong role here, effectively covering at least first-level support. If all technical and operational needs are outsourced then a little time off should work.&lt;&#x2F;p&gt;
&lt;p&gt;Ideation is easier than ever with AI. And the output from AI-based ideation feed well into the networks that all entrepreneurs use to test and sharpen their thinking.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-might-be-replaced&quot;&gt;What Might Be Replaced?&lt;&#x2F;h2&gt;
&lt;p&gt;What about coordinating all of the foregoing components? Even if each component is outsourced, how much time and effort go into managing the vendors instead of selling the product? Can this really be outsourced or automated? This does seem like an area in which AI automation can help. I expect someone to create a service analogous to the PEO to act as the general contractor coordinating the individual vendors for each of the functions listed above.&lt;&#x2F;p&gt;
&lt;p&gt;This GC will need to establish a very high level of trust with two parties: the entrepreneur, and the investors. That seems like a big lift, but possible.&lt;&#x2F;p&gt;
&lt;p&gt;What about the board of directors? For bootstrapped startups I expect the board  to shrink or even vanish, coming to resemble what happens in lifestyle businesses. For VC-funded startups I would expect investors to demand board seats as they do now.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-cannot-be-replaced&quot;&gt;What Cannot Be Replaced?&lt;&#x2F;h2&gt;
&lt;p&gt;What about fundraising? Bootstrapping aside, a startup founder must handle this. An investment in a company of one founder is an investment in a team of one. I don’t see how that can be outsourced.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;alternative-paths-to-unicorn-status&quot;&gt;Alternative Paths to Unicorn Status&lt;&#x2F;h2&gt;
&lt;p&gt;Obtaining a patent certainly falls within the capability of a solo entrepreneur. The right patent could easily sell at a unicorn valuation. If selling this patent is the exclusive focus of the startup, much of the operational difficulty falls away. It would not surprise me if the first solo unicorn takes this form.&lt;&#x2F;p&gt;
&lt;p&gt;The musings above implicitly assume that a solo founder takes the unicorn from inception through exit, or at least through unicorn valuation. Another way to divide the work is by time slicing. A founder may conceive of an idea and create the early-stage company, then sell a solo operator who gains traction in the market, selling to a new solo operator who specializes in growth funding, who sells to a new solo operator who specializes in closing the sale of unicorns.&lt;&#x2F;p&gt;
&lt;p&gt;This path resembles the common path for a successful VC-backed startup, with rounds of investment bringing new operators, advisors, and board members into an organization appropriate to its current stage. But instead of growing the team, it takes the form of a hand-off from solo operator to solo operator. Who in the VC world is already looking at or doing this?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;are-we-there-yet&quot;&gt;Are We There Yet?&lt;&#x2F;h2&gt;
&lt;p&gt;Some in the crypto space may argue that Bitcoin is a solo founder unicorn. Maybe. Does unicorn status require that someone control the value? Does it require the ability to sell the entity? How does this map onto the regulatory frameworks? I’m uncertain on these points. But the distributed model does suggest one more question.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;a-zero-founder-unicorn&quot;&gt;A Zero Founder Unicorn?&lt;&#x2F;h2&gt;
&lt;p&gt;At what point is the entrepreneur outsourced alongside everything else? Will this only occur with a bootstrapped business, or will a VC invest in a team of zero?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Upside Potential</title>
          <pubDate>Mon, 31 Mar 2025 10:28:32 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/upside-potential/</link>
          <guid>https://www.superscript.com/posts/upside-potential/</guid>
          <description xml:base="https://www.superscript.com/posts/upside-potential/">&lt;p&gt;No new hire walks in the door knowing what they need to know in order to do well on the job. From outside the company, they cannot possibly understand the details of the work and how it gets done on the inside. The same goes for personnel dynamics that one understands only through participating in them. A good hire has the ability to acquire understanding, experience, and skill on the job and put them to good use. They have upside potential.&lt;&#x2F;p&gt;
&lt;p&gt;And how do you gauge upside potential? And how do you help someone realize that potential after hiring them? A number of ideas follow, some of which pertain to developer roles. But much of it applies more broadly than that.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;resumes&quot;&gt;Resumes&lt;&#x2F;h2&gt;
&lt;p&gt;Looking at resumes gives you the most basic sense of a candidate’s experience and capability. But just as job descriptions tend to become wish lists, exaggerating the requirements beyond any realistic expectation, resumes tend to exaggerate the experience, accomplishments, and capabilities of the candidate.&lt;&#x2F;p&gt;
&lt;p&gt;The trends in a resume matter more than the claims. Did the candidate take on progressively more responsibility or demonstrate increasing accomplishment? Did they get stuck in a job or change with high frequency? Do they resemble an earlier-stage version of someone whose work you respect? While you can glean some understanding of upside potential from a resume, it’s more useful for screening. And LinkedIn is just the online version of same.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;projects&quot;&gt;Projects&lt;&#x2F;h2&gt;
&lt;p&gt;For developer roles you will want to look at projects. What’s in their GitHub account? Something more than the handful of standard bootcamp projects? Are all of the projects forked from elsewhere, or are they original? Does the commit history show a compulsion to code? Have they invalidated it with an embedded picture?&lt;&#x2F;p&gt;
&lt;p&gt;Hobby projects are the best, because they reveal genuine, self-directed interests. And candidates usually show their level of passion and commitment clearly when talking about them. If you find someone highly motivated in hobby projects and can position them similarly in work projects, they will have fun at work.&lt;&#x2F;p&gt;
&lt;p&gt;Interests outside of programming, grounded in physical-world activity, appear to correlate with practicality of mind. People who live only in digital worlds can become too abstraction-oriented. I like to see that a candidate has a physical-world hobby: gardening, board games, quiz night, home repair, auto mechanics, cycling… The particulars matter less than the mere fact of real-world engagement. The trade-offs inherent in real-world activities help inform thinking in the more abstract digital realm.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;finding-the-level&quot;&gt;Finding the Level&lt;&#x2F;h2&gt;
&lt;p&gt;Sometimes you speak to someone for five minutes about a topic unrelated to their work, and come away knowing that they are very good at what they do. How can this be? It’s about their ability to find the level.&lt;&#x2F;p&gt;
&lt;p&gt;One of the most important qualities in a software engineer is the ability to zoom in and out across many levels of abstraction. The right level depends on the topic, the audience, the problem at hand, the maturity of the domain, the context of communication, etc. Great programmers make finding the level look easy, when it is most assuredly not.&lt;&#x2F;p&gt;
&lt;p&gt;When you speak to a programmer about topics outside of programming but they hit every level correctly through the conversation, you know that they have this most essential work skill.&lt;&#x2F;p&gt;
&lt;p&gt;The importance in finding the level also arises entirely outside of programming. Think of this the next time you speak to an accomplished salesman or when you have a good or bad customer support experience.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;the-unknown&quot;&gt;The Unknown&lt;&#x2F;h2&gt;
&lt;p&gt;People doing creative work spend most of their time banging their heads against the unknown. So how do they react? It’s relatively easy in an interview to poke around and find an area where you can push the candidate across the boundary of their knowledge. And then what? Some argue, some fold, some think silently for a long time, some ask clarifying questions, some become frustrated, some ask for help, and on and on. How they react to the unknown is very telling in how they will interact with the rest of the team.&lt;&#x2F;p&gt;
&lt;p&gt;When faced with an unusual request, how do they react? Someone recently shared with me a technique I have yet to apply, but I like the sound of it. He gives someone a large document and says “Read five pages starting on page 100, then we’ll talk about it.” Do they resist? How and how much? What does this say about their openness to new inputs?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;effective-management&quot;&gt;Effective Management&lt;&#x2F;h2&gt;
&lt;p&gt;If you decide to move forward with a candidate, how do they reach their upside potential? They must at least have effective management. This brings in the question of references.&lt;&#x2F;p&gt;
&lt;p&gt;No candidate will provide bad references, so references are not useful for screening. Therefore I do not use references to inform a hire&#x2F;pass decision. However they can shed light on how to manage the candidate effectively. For this reason I ask for former managers as references, not peers or subordinates. Ideally I speak to more than one. This is difficult for some candidates, but essential. And I explain to the reference that I want to learn from them how to be an effective manager for the candidate. The three questions I ask are:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;What does it take to position the candidate for success?&lt;&#x2F;li&gt;
&lt;li&gt;What are the signs that the candidate has run off the rails and needs help?&lt;&#x2F;li&gt;
&lt;li&gt;What does it take to get them back on track?&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Asking these questions and then just listening will provide extremely important insight into how to manage your new hire well.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;hiring-well&quot;&gt;Hiring Well&lt;&#x2F;h2&gt;
&lt;p&gt;Hiring well means finding the candidates who are good fits for your organization, and who have large upside potential, and then managing them effectively. It’s all very simple on paper, but not so in practice. I believe that adopting the approaches sketched out above will help you do it better.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The Data Moat</title>
          <pubDate>Wed, 26 Mar 2025 08:37:26 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/the-data-moat/</link>
          <guid>https://www.superscript.com/posts/the-data-moat/</guid>
          <description xml:base="https://www.superscript.com/posts/the-data-moat/">&lt;p&gt;In two prior posts, &lt;a href=&quot;&#x2F;posts&#x2F;moats-and-ai&#x2F;&quot;&gt;here&lt;&#x2F;a&gt; and &lt;a href=&quot;&#x2F;posts&#x2F;more-moats-and-ai&#x2F;&quot;&gt;here&lt;&#x2F;a&gt; I listed moats that I think are defensible in an AI-powered world. One more is truly proprietary data.&lt;&#x2F;p&gt;
&lt;p&gt;Why the “truly” qualifier? Because clever derivations from sources available to others are unlikely to be defensible. This would amount to a trade secret around the analysis, and trade secrets will become easier to rediscover. I believe the moat is limited to data that cannot be reproduced on the basis of sources available to others.&lt;&#x2F;p&gt;
&lt;p&gt;Businesses with network effects frequently have such proprietary data, but still deserve their own category. What types of proprietary data are not due to network effects?&lt;&#x2F;p&gt;
&lt;p&gt;A trading house that has captured some arbitrage opportunities may the signals that led to the opportunity from sight, taking them private, as it were. Sales histories may qualify, as may online tracking data, like location, site analytics, etc.&lt;&#x2F;p&gt;
&lt;p&gt;My guess as to the general rule is that sufficiently valuable data jointly produced from interactions between a product or service and users can remain private and defensible, assuming that the product or service provider retains the right to monetize the data.&lt;&#x2F;p&gt;
&lt;p&gt;So the new list reads:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Brand&lt;&#x2F;li&gt;
&lt;li&gt;Network Effects&lt;&#x2F;li&gt;
&lt;li&gt;Physical Integration&lt;&#x2F;li&gt;
&lt;li&gt;Sports&lt;&#x2F;li&gt;
&lt;li&gt;Status Goods and Services&lt;&#x2F;li&gt;
&lt;li&gt;Truly Proprietary Data&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Multiple Llamafiles With llm</title>
          <pubDate>Sat, 15 Mar 2025 17:20:15 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/multiple-llamafiles-with-llm/</link>
          <guid>https://www.superscript.com/posts/multiple-llamafiles-with-llm/</guid>
          <description xml:base="https://www.superscript.com/posts/multiple-llamafiles-with-llm/">&lt;p&gt;In playing with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;Mozilla-Ocho&#x2F;llamafile&quot;&gt;&lt;code&gt;llamafile&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; under &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;llm&quot;&gt;&lt;code&gt;llm&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; I initially used the &lt;code&gt;llm-llamafile&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;llm-llamafile&quot;&gt;plugin&lt;&#x2F;a&gt;. This plugin makes initial setup trivial. But soon I wanted to run multiple &lt;code&gt;llamafile&lt;&#x2F;code&gt; models in parallel, and the plugin doesn’t support that. In fact the plugin hardcodes the service at &lt;code&gt;http:&#x2F;&#x2F;localhost:8080&#x2F;v1&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Initially I thought a new plugin was needed, but some digging revealed a solution already in place, one that in fact obviates the need for &lt;code&gt;llm-llamafile&lt;&#x2F;code&gt; altogether: the &lt;code&gt;extra-openai-models.yaml&lt;&#x2F;code&gt; file.&lt;&#x2F;p&gt;
&lt;p&gt;It does appear in the documentation &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;openai-models.html#adding-more-openai-models&quot;&gt;here&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;other-models.html#openai-compatible-models&quot;&gt;here&lt;&#x2F;a&gt;. Because &lt;code&gt;llamafile&lt;&#x2F;code&gt; is an OpenAI-compatible model, one can add it in &lt;code&gt;extra-openai-models.yaml&lt;&#x2F;code&gt;. For example:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;- model_id: llamafile-test&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  model_name: llamafile-test&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  api_base: &amp;quot;http:&#x2F;&#x2F;llamafile:8080&#x2F;v1&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  api_key_name:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With this capability in place, there’s no point in using &lt;code&gt;llm-llamafile&lt;&#x2F;code&gt;. Here are several additional mentions of the extra-models feature:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simonwillison.net&#x2F;2023&#x2F;Dec&#x2F;18&#x2F;mistral&#x2F;#llamafile-openai&quot;&gt;llamafile-openai&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;simonwillison.net&#x2F;2024&#x2F;Apr&#x2F;22&#x2F;llama-3&#x2F;#fast-api-access-via-groq&quot;&gt;fast-api-access-via-groq&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;llm&#x2F;issues&#x2F;401#issuecomment-1912739300&quot;&gt;issuecomment-1912739300&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;It’s a great feature that deserves more prominence. Should every model family have an analogous file?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>More Moats and AI</title>
          <pubDate>Mon, 10 Mar 2025 16:43:59 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/more-moats-and-ai/</link>
          <guid>https://www.superscript.com/posts/more-moats-and-ai/</guid>
          <description xml:base="https://www.superscript.com/posts/more-moats-and-ai/">&lt;p&gt;In a recent post I &lt;a href=&quot;&#x2F;posts&#x2F;moats-and-ai&#x2F;&quot;&gt;speculated&lt;&#x2F;a&gt; as to what business positioning and models would be defensible in an AI-powered world. Since then I’ve had several conversations that suggest additions to my list. For quick reference, the earlier list was:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Brand&lt;&#x2F;li&gt;
&lt;li&gt;Network Effects&lt;&#x2F;li&gt;
&lt;li&gt;Physical Integration&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Sports is another defensible area. Who cares whether the New York Robot Giants defeat the Philadelphia Robot Eagles, or how many rebounds Robot Dennis Rodman pulls down? Sports are quintessentially about human performance, and I don’t see that changing. So the production of human sporting events will remain defensible, because there are strong limits and heavy competition at the highest levels. While AI may optimize the grooming of the talent and alter how clubs operate, I don’t see any AI-powered substitute for the athletic play itself.&lt;&#x2F;p&gt;
&lt;p&gt;Another suggestion that sounds correct to me, but is both difficult to characterize clearly and somewhat fickle are status-oriented business models. This could take the form of a rare product that establishes your status. Or it may consist of the ability to sell genuine human touch rather than robotic touch at a premium. Think massages or hospice care. This one depends enough on prevailing fashion that I find it difficult to understand the breadth of its appearance. Nevertheless, it does seem entirely likely that wealthy buyers may pay for genuine human service and thereby differentiate themselves from the ordinary buyer of the robotic service.&lt;&#x2F;p&gt;
&lt;p&gt;So the list now reads:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Brand&lt;&#x2F;li&gt;
&lt;li&gt;Network Effects&lt;&#x2F;li&gt;
&lt;li&gt;Physical Integration&lt;&#x2F;li&gt;
&lt;li&gt;Sports&lt;&#x2F;li&gt;
&lt;li&gt;Status Goods and Services&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>Python CVS Woes</title>
          <pubDate>Fri, 07 Mar 2025 08:42:56 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/python-cvs-woes/</link>
          <guid>https://www.superscript.com/posts/python-cvs-woes/</guid>
          <description xml:base="https://www.superscript.com/posts/python-cvs-woes/">&lt;p&gt;I wasted time this morning learning that the &lt;code&gt;csv&lt;&#x2F;code&gt; module defaults to &lt;code&gt;\r\n&lt;&#x2F;code&gt; line endings regardless of platform. This is clear enough in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.python.org&#x2F;3&#x2F;library&#x2F;csv.html#csv.Dialect.lineterminator&quot;&gt;documentation&lt;&#x2F;a&gt;. But you have to figure out the problem before you’d know to look at line termination. It was an unpleasant surprise.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Moats and AI</title>
          <pubDate>Sat, 15 Feb 2025 06:51:03 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/moats-and-ai/</link>
          <guid>https://www.superscript.com/posts/moats-and-ai/</guid>
          <description xml:base="https://www.superscript.com/posts/moats-and-ai/">&lt;p&gt;How will the rise of AI capability affect the ability of startup companies to build moats? What moats are defensible in an AI-enabled world?&lt;&#x2F;p&gt;
&lt;p&gt;I believe that at least three types of moats remain defensible: Brand, Network Effects, and Physical Integration. Beyond that it’s very unclear to me. Why do these three make the cut?&lt;&#x2F;p&gt;
&lt;h2 id=&quot;brand-a-trust-moat&quot;&gt;Brand: A Trust Moat&lt;&#x2F;h2&gt;
&lt;p&gt;A strong, well-respected brand allows people to economize on information related to quality of product or service. They know how the burger will taste, or that they can find the supplies they need, or that they will receive good advice. To the extent that people continue to make buying decisions, a trusted brand will differentiate a company in the market.&lt;&#x2F;p&gt;
&lt;p&gt;Perhaps decisions made by AI and not people will also integrate brand as a discriminator. Or perhaps decisions by AI will ignore brand and rely on other gauges. In the first case brand still matters. If other criteria drive the AI decision, then I would expect patterns of judgement to emerge that act as the equivalent of brand reputation, so that even of the basis of brand awareness has shifted, the phenomenon will remain.&lt;&#x2F;p&gt;
&lt;p&gt;Before people allow AI tools to make such decisions they must enjoy a high degree of trust. I suspect that will take a long time to develop. It also introduces the same question of brand quality at the AI layer.&lt;&#x2F;p&gt;
&lt;p&gt;I think that the economy of information represented in a brand will remain useful regardless of where the decisions are made, making it a defensible moat.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;network-effects-a-social-moat&quot;&gt;Network Effects: A Social Moat&lt;&#x2F;h2&gt;
&lt;p&gt;Network effects arise when the value a user gains from a system increases as more people use it. Switching away from such a system means abandoning the network. Smaller substitute networks are unlikely to deliver as much value, so the opportunity cost is high.&lt;&#x2F;p&gt;
&lt;p&gt;Social networks offer a case in point. Many people have tried to implement Twitter replacements, but none has overcome the Twitter network effects. Competition in network-effects arenas tend to produce winner-take-all outcomes.&lt;&#x2F;p&gt;
&lt;p&gt;The ability of AI to support fast-follow workalike capability may make it much more difficult to win these competitions. If your application demonstrates the viable network effects in an industry and I can quickly create a work-alike application, then I may overcome your first-mover advantage. I expect to see an increasingly competitive scramble for dominance in network-effects arenas, followed by winner take all. You will have a defensible position if you can get there, but the path there will be more difficult than ever before.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;physical-integration-a-non-digital-moat&quot;&gt;Physical Integration: A Non-Digital Moat&lt;&#x2F;h2&gt;
&lt;p&gt;Companies that integrate AI with the physical world – think construction, manufacturing, or hardware-dependent services – work with both digital and phyical constraints. Physical world interation requires robotics or people to carry out work. It may take place in environments subject to weather or other variance. These complexities will slow any AI-driven displacement.&lt;&#x2F;p&gt;
&lt;p&gt;Services that exist to provide a human touch are another version of this. Some examples are being a good waiter, pet sitter, or escort.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-missed-the-cut&quot;&gt;What Missed The Cut?&lt;&#x2F;h2&gt;
&lt;p&gt;A friend suggested that User Experience (UX) belongs on my list. I am not persuaded. His contention was that UX depends on deep understanding of the user, which the AI tools will not be able to generate, and that workalike systems will bear only superficial resemblence to great UX because they will lack the depth of understanding.&lt;&#x2F;p&gt;
&lt;p&gt;If the key difficulty undergirding UX is depth of understanding of the market, then I expect to see firms arise whose comparative advantage lies in gaining that very insight and then applying it with fast-follow builds. A firm like Rocket Internet already operates with a fast-follow business model.&lt;&#x2F;p&gt;
&lt;h2 id=&quot;what-did-i-miss&quot;&gt;What Did I Miss?&lt;&#x2F;h2&gt;
&lt;p&gt;Should something else make the cut? Am I off the mark with the three that I’ve chosen? What say you?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Richard Epstein at Civitas</title>
          <pubDate>Wed, 29 Jan 2025 07:40:48 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/richard-epstein-at-civitas/</link>
          <guid>https://www.superscript.com/posts/richard-epstein-at-civitas/</guid>
          <description xml:base="https://www.superscript.com/posts/richard-epstein-at-civitas/">&lt;p&gt;Yesterday I discovered that &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.civitasinstitute.org&#x2F;fellows&#x2F;richard-epstein&quot;&gt;Richard Epstein&lt;&#x2F;a&gt; is now affiliated with  &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.civitasinstitute.org&#x2F;&quot;&gt;Civitas&lt;&#x2F;a&gt;. I knew that John Yoo was, having seen him at one of their events, alongside Dierdre McCloskey, Peter Robinson, Cass Sunstein, and Ed Glaeser. I once attended a taping of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.hoover.org&#x2F;publications&#x2F;lawtalk&quot;&gt;Law Talk&lt;&#x2F;a&gt; in New York, and hope to see more events like that in Austin with Epstein’s arrival. In any case, the Civitas &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.civitasinstitute.org&#x2F;events&quot;&gt;event schedule&lt;&#x2F;a&gt; is full of deep topics.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Meetup Attendees</title>
          <pubDate>Sun, 19 Jan 2025 09:27:37 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/meetup-attendees/</link>
          <guid>https://www.superscript.com/posts/meetup-attendees/</guid>
          <description xml:base="https://www.superscript.com/posts/meetup-attendees/">&lt;p&gt;The Austin CTO Club is now organized on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;austin-cto-club&#x2F;&quot;&gt;Meetup&lt;&#x2F;a&gt;. When I attempted to use the Pro Dashboard to download a list of my attendees, the file contained a header line and nothing else.&lt;&#x2F;p&gt;
&lt;p&gt;Fortunately there is a work-around:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Navigate to the event.&lt;&#x2F;li&gt;
&lt;li&gt;Select Manage &amp;gt;&amp;gt; Manage attendees &amp;gt;&amp;gt; Attendee details&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;This downloads the list of attendees as expected.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Wrapping jq select</title>
          <pubDate>Thu, 09 Jan 2025 14:02:58 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/wrapping-jq-select/</link>
          <guid>https://www.superscript.com/posts/wrapping-jq-select/</guid>
          <description xml:base="https://www.superscript.com/posts/wrapping-jq-select/">&lt;p&gt;In working with large and deeply nested json structures, I had to extract or delete selected elements from the structure based on variable criteria. In &lt;code&gt;jq&lt;&#x2F;code&gt; the &lt;code&gt;path()&lt;&#x2F;code&gt; operator supports this type of operation well. Calling &lt;code&gt;path(..)&lt;&#x2F;code&gt; expands all paths in the input json. Selecting paths is straightforward, but what if you want to select based on the value at a path?&lt;&#x2F;p&gt;
&lt;p&gt;One way is to make the original structure available to the selector, and apply &lt;code&gt;getpath()&lt;&#x2F;code&gt; to a selected path. Turning this into a set of shell wrappers is not difficult. Here are three such wrappers for selecting paths, selecting values at paths, and deleting values at paths.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_# select_paths selector &amp;lt; json-file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#   Select { path: p, value: v } for paths that match selector&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#   In the selector &amp;#39;$path&amp;#39; is a path, and &amp;#39;$root&amp;#39; is the original input&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;do_select_paths() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  jq &amp;#39;. as $root | $root | path(..) as $path | $path | select(&amp;#39;&amp;quot;$1&amp;quot;&amp;#39;)&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_# select_from_paths selector &amp;lt; json-file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#   Select { path: p, value: v } for paths that match selector&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#   In the selector &amp;#39;$path&amp;#39; is a path, and &amp;#39;$root&amp;#39; is the original input&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;do_select_from_paths() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  jq &amp;#39;. as $root | $root | path(..) as $path | $path | select(&amp;#39;&amp;quot;$1&amp;quot;&amp;#39;) | . as $p | { path: $p, value: ($root | getpath($p)) }&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_# delete_from_paths selector &amp;lt; json-file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#   Select { path: p, value: v } for paths that match selector&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#   In the selector &amp;#39;$path&amp;#39; is a path, and &amp;#39;$root&amp;#39; is the original input&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;#_#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;do_delete_from_paths() {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  jq &amp;#39;. as $root | [$root | path(..) as $path | $path | select(&amp;#39;&amp;quot;$1&amp;quot;&amp;#39;)] as $paths | $root | delpaths($paths)&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Each wrapper sets two &lt;code&gt;jq&lt;&#x2F;code&gt; variables: &lt;code&gt;$root&lt;&#x2F;code&gt; holds the original structure and &lt;code&gt;$path&lt;&#x2F;code&gt; holds the current path. So the selector can apply an arbitrary &lt;code&gt;jq&lt;&#x2F;code&gt; expression using each of these.&lt;&#x2F;p&gt;
&lt;p&gt;My use case was finding required deletion of paths ending in &lt;code&gt;&#x2F;XObject&lt;&#x2F;code&gt; and those with a stream subtype of &lt;code&gt;&#x2F;Image&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  do_delete_from_paths &amp;#39;$path[-1]==&amp;quot;&#x2F;XObject&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  do_delete_from_paths &amp;#39;$root | getpath($path) | objects | .stream.dict[&amp;quot;&#x2F;Subtype&amp;quot;]==&amp;quot;&#x2F;Image&amp;quot;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In this case I used the path selection and path value selection only to test before using deletion.&lt;&#x2F;p&gt;
&lt;p&gt;Not being a &lt;code&gt;jq&lt;&#x2F;code&gt; expert it took me a while to work this out, but the result is easily reusable. Maybe you can use it, too.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Jujutsu Improves on Git</title>
          <pubDate>Sun, 05 Jan 2025 08:37:38 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/jujutsu-improves-on-git/</link>
          <guid>https://www.superscript.com/posts/jujutsu-improves-on-git/</guid>
          <description xml:base="https://www.superscript.com/posts/jujutsu-improves-on-git/">&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jj-vcs.github.io&#x2F;jj&#x2F;latest&#x2F;&quot;&gt;Jujutsu&lt;&#x2F;a&gt; claims to be git compatible for storage, and uses a different approach for managing commit graphs. Instead of an index, it treats everything as a commit. Instead of requiring conflict resolution at commit, it supports conflicting commits. Instead of commit messages, it supports the addition and editing of comments independent of code updates.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;steveklabnik.github.io&#x2F;jujutsu-tutorial&#x2F;&quot;&gt;tutorial&lt;&#x2F;a&gt; from
Steve Klabnik is a good introduction. Source code is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&quot;&gt;here&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In working through the tutorial I tried some things on a hunch and they worked as expected. Such immediately intuitive behavior pleasantly surprised me as a longtime &lt;code&gt;git&lt;&#x2F;code&gt; user. The &lt;code&gt;jj&lt;&#x2F;code&gt; commands are more orthogonal. It looks like a big step forward. If interaction with GitHub works well, I’ll likely adopt &lt;code&gt;jj&lt;&#x2F;code&gt; for local development.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Editing PDFs With qpdf</title>
          <pubDate>Fri, 03 Jan 2025 08:37:12 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/editing-pdfs-with-qpdf/</link>
          <guid>https://www.superscript.com/posts/editing-pdfs-with-qpdf/</guid>
          <description xml:base="https://www.superscript.com/posts/editing-pdfs-with-qpdf/">&lt;p&gt;In my recent survey of tools for working with PDF files, &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;qpdf.readthedocs.io&#x2F;en&#x2F;stable&#x2F;&quot;&gt;&lt;code&gt;qpdf&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; stood out. It not only extracts information from PDFs, but can convert a PDF to an editable form, and then reconstitute a new PDF after edits.&lt;&#x2F;p&gt;
&lt;p&gt;Do you want to remove images from a PDF? Use &lt;code&gt;qpdf&lt;&#x2F;code&gt; to convert the PDF to json, identify and remove images with &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jqlang.github.io&#x2F;jq&#x2F;&quot;&gt;&lt;code&gt;jq&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, and convert from json back to PDF. Scripting alterations to PDFs is easy in this setting.&lt;&#x2F;p&gt;
&lt;p&gt;One thing &lt;code&gt;qpdf&lt;&#x2F;code&gt; does not do is interpret PDFs. That’s a job for a tool like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pdfbox.apache.org&#x2F;&quot;&gt;&lt;code&gt;PDFBox&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. These two tools complement one another well.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>The New Programming</title>
          <pubDate>Wed, 01 Jan 2025 10:22:56 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/the-new-programming/</link>
          <guid>https://www.superscript.com/posts/the-new-programming/</guid>
          <description xml:base="https://www.superscript.com/posts/the-new-programming/">&lt;p&gt;In working with a set of PDF files I needed to distinguish areas by typeface name and size. I found &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pdfbox.apache.org&#x2F;&quot;&gt;PDFBox&lt;&#x2F;a&gt;, which offers very fine-grained capability to alter PDFs programmatically. But it’s a Java library, and my Java is less than fluent.&lt;&#x2F;p&gt;
&lt;p&gt;Using Claude and GPT-4o I managed to implement what I wanted. The proof of concept is a program that applies a distinct color to each fontname,size pair in the document. This was evidently too big for either tool to handle directly, but a combination of decomposition and multiple tools got me close.&lt;&#x2F;p&gt;
&lt;p&gt;Claude did a decent job creating a program that set colors per font name, and applied them correctly across the document. The main difficulty was exhausting the chat and having to start a new one. This happened numerous times.&lt;&#x2F;p&gt;
&lt;p&gt;I also used Claude to start a program to list all of the fontname,size pairs that appeared in the document. The way that fonts are handled in my document set makes tracking sizes surprisingly difficult. The font size can be calculcated correctly only immediaely before a &lt;code&gt;Tj&lt;&#x2F;code&gt; operator renders text. Dealing with this was somewha different in versions 2 and 3 of the library, and fixing it relied on GPT-4o searching the library for the correct library calls.&lt;&#x2F;p&gt;
&lt;p&gt;The final task was to combine these different mechanisms to color fonts by fontname,size pairs. This was too much for either program to handle. Each ended up going in circles, often removing functionality despite explicit instructions not to.&lt;&#x2F;p&gt;
&lt;p&gt;Ultimately I merged the two functions by hand. With slightly more Java knowledge I probably could have asked for a sequence of smaller changes that added up to the merge. What I learned from manually merging likely equips me to try that next time.&lt;&#x2F;p&gt;
&lt;p&gt;Takeaways from this exercise exploring a new library with the tools include:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Spell out the data-processing steps&lt;&#x2F;li&gt;
&lt;li&gt;Outline the implementation modules you envision&lt;&#x2F;li&gt;
&lt;li&gt;Explicitly request review of the open-source library code&lt;&#x2F;li&gt;
&lt;li&gt;Commit every single variant you try to your working branch&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;I haven’t tried yet, but wonder whether the tools can work effectively with diffs and thereby reduce the accumulation of chat content and allow for more iteration within a session.&lt;&#x2F;p&gt;
&lt;p&gt;Most of this is unsurprising. The first two points amount to laying out your architectural guidance. The third point means that if a tool has online access, give it an open-source repo url and demand that it look at it. The final takeaway was more surprising.&lt;&#x2F;p&gt;
&lt;p&gt;This short exercise taught me enough to become comfortable in the java code without having to work through every picayune detail. This learning seemed far easier and faster than having to battle every detail all the way through. In the end it was easy enough to merge the two programs.&lt;&#x2F;p&gt;
&lt;p&gt;The biggest surprise was how easy iteration became, so easy that it was difficult to keep track of which version exhibited a specific behavior when experimenting. I’ve long approved of numerous small checkins on a dev branch, possibly to squash later for merge into an upstream branch. But this was more extreme. In 30 minutes I was easily able to test 10 different ways of addressing a particular issue. At that point, if you like the behavior of the fourth version, but with a variation discovered in the ninth, what do you do?&lt;&#x2F;p&gt;
&lt;p&gt;With such fast iteration it seems appropriate to commit every single update to a project file. Record everything now, squash later. Maybe &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jj-vcs&#x2F;jj&quot;&gt;Jujutsu&lt;&#x2F;a&gt; is the right direction. Rapid iteration has always been advantageous for experimentation. At these new speeds the problem shifts from formulating the new experiment to managing the results of many experiments. Capturing full history seems like the obvious first step. What’s the next step?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Who Owns Your Dot Files</title>
          <pubDate>Tue, 31 Dec 2024 11:28:54 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/who-owns-your-dot-files/</link>
          <guid>https://www.superscript.com/posts/who-owns-your-dot-files/</guid>
          <description xml:base="https://www.superscript.com/posts/who-owns-your-dot-files/">&lt;p&gt;The recommended way to install or update &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.rust-lang.org&#x2F;tools&#x2F;install&quot;&gt;&lt;code&gt;rust&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;
is with &lt;code&gt;rustup&lt;&#x2F;code&gt;. And by default, &lt;code&gt;rustup&lt;&#x2F;code&gt; modifies your shell startup files to put itself on &lt;code&gt;PATH&lt;&#x2F;code&gt;. And &lt;code&gt;rustup&lt;&#x2F;code&gt; is by no means the only example, it’s just the one I encountered most recently.&lt;&#x2F;p&gt;
&lt;p&gt;This is extremely bad default behavior. My plea to you, maintainers of such tools: Don’t do that! Give me the option, or print out instructions, but do not assume that you have any legitimate control of my dot files!&lt;&#x2F;p&gt;
&lt;p&gt;Sadly, most programmers prefer this type of convenience to knowing their system configuration. Convenience seems always to win out in these contests over security, stability, and control. How many make their dot files read only? If you don’t, who owns your dot files?&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Bash the Cache</title>
          <pubDate>Mon, 30 Dec 2024 10:03:34 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/bash-the-cache/</link>
          <guid>https://www.superscript.com/posts/bash-the-cache/</guid>
          <description xml:base="https://www.superscript.com/posts/bash-the-cache/">&lt;p&gt;If you develop executable programs you probably invoke them from one location, then install them to another for ongoing use. And the moment you do that the &lt;code&gt;bash&lt;&#x2F;code&gt; &lt;code&gt;hash&lt;&#x2F;code&gt; cache will bite you.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;bash&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.gnu.org&#x2F;savannah-checkouts&#x2F;gnu&#x2F;bash&#x2F;manual&#x2F;bash.html#Command-Search-and-Execution&quot;&gt;documentation&lt;&#x2F;a&gt; says this:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;If the name is neither a shell function nor a builtin, and contains no slashes, Bash searches each element of $PATH for a directory containing an executable file by that name. Bash uses a hash table to remember the full pathnames of executable files to avoid multiple PATH searches (see the description of hash in Bourne Shell Builtins). A full search of the directories in $PATH is performed only if the command is not found in the hash table. If the search is unsuccessful, the shell searches for a defined shell function named &lt;code&gt;command_not_found_handle&lt;&#x2F;code&gt;. If that function exists, it is invoked in a separate execution environment with the original command and the original command’s arguments as its arguments, and the function’s exit status becomes the exit status of that subshell. If that function is not defined, the shell prints an error message and returns an exit status of 127.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;In order to get out of this mess, apply &lt;code&gt;set +h&lt;&#x2F;code&gt; in your &lt;code&gt;bash&lt;&#x2F;code&gt; startup files. And in order to recover from the damage imposed in the current shell, use &lt;code&gt;hash -r&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;What a misfeature.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Debian JRE Package Bug</title>
          <pubDate>Tue, 24 Dec 2024 09:48:52 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/debian-jre-package-bug/</link>
          <guid>https://www.superscript.com/posts/debian-jre-package-bug/</guid>
          <description xml:base="https://www.superscript.com/posts/debian-jre-package-bug/">&lt;p&gt;In attempting to install openjdk on Debian I ran into the following error:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;Setting up openjdk-17-jre-headless:amd64 (17.0.13+11-2~deb12u1) ...&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;the java command requires a mounted proc fs (&#x2F;proc).&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The &lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt; directory exists and is populated, so why does this error occur?&lt;&#x2F;p&gt;
&lt;p&gt;The postinstall script ends up here:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;&#x2F;var&#x2F;lib&#x2F;dpkg&#x2F;info&#x2F;openjdk-17-jre-headless\:amd64.postinst&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;It calls &lt;code&gt;mountpoint&lt;&#x2F;code&gt; to test for &lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    if ! mountpoint -q &#x2F;proc; then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       echo &amp;gt;&amp;amp;2 &amp;quot;the java command requires a mounted proc fs (&#x2F;proc).&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;       exit 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Why the maintainers chose to check for a &lt;code&gt;&#x2F;proc&lt;&#x2F;code&gt; with &lt;code&gt;mountpoint&lt;&#x2F;code&gt; I don’t know. I am working inside a &lt;code&gt;chroot&lt;&#x2F;code&gt; environment with the mount created on the outside. On the inside it looks like an ordinary directory. So the test fails.&lt;&#x2F;p&gt;
&lt;p&gt;When I avoid that test, the program installs and runs as expected. So absent some other consideration that presently escapes me, the test is wrong.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Linux Jails With VNET</title>
          <pubDate>Sat, 21 Dec 2024 20:26:32 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/linux-jails-with-vnet/</link>
          <guid>https://www.superscript.com/posts/linux-jails-with-vnet/</guid>
          <description xml:base="https://www.superscript.com/posts/linux-jails-with-vnet/">&lt;p&gt;Look online for information about how to run a Linux jail with VNET and you’ll find very few resources. And of course some of the advice appears obsolete. I managed to do this recently with FreeBSD 14.1 and Debian 12, and here is the setup.&lt;&#x2F;p&gt;
&lt;p&gt;The instructions in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;docs.freebsd.org&#x2F;en&#x2F;books&#x2F;handbook&#x2F;jails&#x2F;&quot;&gt;FreeBSD Handbook&lt;&#x2F;a&gt; are good. I found it useful to walk through the progression of creating an ordinary thin jail, a VNET jail, a Linux jail, and finally a Linux jail with VNET.&lt;&#x2F;p&gt;
&lt;p&gt;Beware one typo, in the first of the two configuration steps for a Linux jail. The &lt;code&gt;path&lt;&#x2F;code&gt; setting should be &lt;code&gt;path=&quot;&#x2F;usr&#x2F;local&#x2F;jails&#x2F;containers&#x2F;ubuntu&quot;&lt;&#x2F;code&gt;. (The example is missing &lt;code&gt;&#x2F;containers&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The first configuration step lets you connect to the jail to run &lt;code&gt;debootstrap&lt;&#x2F;code&gt; and install the Linux userland in a directory for later use with &lt;code&gt;chroot&lt;&#x2F;code&gt;. The second configuration adds the mounts needed for Linux to the &lt;code&gt;chroot&lt;&#x2F;code&gt; directory. In effect, you create an ordinary jail, set up a subdirectory in it to run Linux userland, and then &lt;code&gt;chroot&lt;&#x2F;code&gt; there to use Linux.&lt;&#x2F;p&gt;
&lt;p&gt;It’s not in fact necessary to log into the jail to run &lt;code&gt;debootstrap&lt;&#x2F;code&gt;. If you have it installed on the host machine you can run and provide the full path to the jail’s &lt;code&gt;chroot&lt;&#x2F;code&gt; directory as seen from the host. That’s a bit less mysterious, though it does require running &lt;code&gt;debootstrap&lt;&#x2F;code&gt; outside the confines of the jail.&lt;&#x2F;p&gt;
&lt;p&gt;Because of this split-level treatment, you have a free hand to adjust the configuration of the jail itself without disrupting the &lt;code&gt;chroot&lt;&#x2F;code&gt; Linux. When I tried that to add VNET, it just worked.&lt;&#x2F;p&gt;
&lt;p&gt;My final configuration for the jail looked like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;debv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; STARTUP&#x2F;LOGGING&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;bin&#x2F;sh &#x2F;etc&#x2F;rc&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;bin&#x2F;sh &#x2F;etc&#x2F;rc.shutdown&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;var&#x2F;log&#x2F;jail_console_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.log&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; PERMISSIONS&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  allow.raw_sockets&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount.devfs&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  devfs_ruleset&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 5&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; PATH&#x2F;HOSTNAME&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  host.hostname&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;usr&#x2F;local&#x2F;jails&#x2F;containers&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; VNET&#x2F;VIMAGE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  vnet&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  vnet.interface&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;b&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; NETWORKS&#x2F;INTERFACES&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;159&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;10.0.6.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;16&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;gateway&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;10.0.0.1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;bridge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;bridge0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;id&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; ADD TO bridge INTERFACE&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;ifconfig &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; create up&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;ifconfig &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a up descr jail:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;ifconfig &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;bridge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; addm &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a up&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;    +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;ifconfig &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;b &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ip&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; up&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;    +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;route add default &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;gateway&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;ifconfig &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;bridge&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; deletem &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  exec&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;o&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;sbin&#x2F;ifconfig &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;epair&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;a destroy&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  #&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; MOUNT&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;devfs     &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;dev     devfs     rw  0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;tmpfs     &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;dev&#x2F;shm tmpfs     rw,size=1g,mode=1777  0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fdescfs   &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;dev&#x2F;fd  fdescfs   rw,linrdlnk 0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;linprocfs &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;proc    linprocfs rw  0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;linsysfs  &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;sys     linsysfs  rw  0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;tmp      &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;tmp     nullfs    rw  0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  mount&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; +=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;home     &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;path&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;compat&#x2F;debv&#x2F;home    nullfs    rw  0 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This simply combines the mounts neede for Linux with the underlying jail setup from the VNET example.&lt;&#x2F;p&gt;
&lt;p&gt;Some resources say that you need to pull &lt;code&gt;ifconfig&lt;&#x2F;code&gt; and &lt;code&gt;dhclient&lt;&#x2F;code&gt; from &lt;code&gt;&#x2F;rescue&lt;&#x2F;code&gt; into the jail in order to use VNET. Presumably that is needed if you avoid the &lt;code&gt;chroot&lt;&#x2F;code&gt; and operate in Linux at the top level of the jail installation. And perhaps that approach gives you faster and broader network connectivity. But to get up and running immediately, the split-level approach is simple and just works.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>mawk Is Not awk</title>
          <pubDate>Tue, 17 Dec 2024 15:56:21 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/mawk-is-not-awk/</link>
          <guid>https://www.superscript.com/posts/mawk-is-not-awk/</guid>
          <description xml:base="https://www.superscript.com/posts/mawk-is-not-awk/">&lt;p&gt;Today I had occasion to use &lt;code&gt;mawk&lt;&#x2F;code&gt; instead of &lt;code&gt;awk&lt;&#x2F;code&gt; with a command that read lines from standard input, manipulates them, and prints them to standard output. Simple enough, or so I thought.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve had this code in production for years. Today I fired it up under &lt;code&gt;mawk&lt;&#x2F;code&gt; and behold: no output. Wait, there was output, but only after a while. And there it is again!&lt;&#x2F;p&gt;
&lt;p&gt;This is on a fresh install of Debian 12. In that setting, &lt;code&gt;awk&lt;&#x2F;code&gt; is &lt;code&gt;mawk&lt;&#x2F;code&gt;, and the program fails as described above. The solution to this puzzle is that &lt;code&gt;mawk&lt;&#x2F;code&gt; does block buffering rather than line buffering unless you give it the &lt;code&gt;-W interactive&lt;&#x2F;code&gt; option.&lt;&#x2F;p&gt;
&lt;p&gt;This is genuinely baffling to me. Here you have a program that is line oriented. Traditionally it treats input and output in line-buffered fashion. And yet a derivative version changes that behavior &lt;em&gt;by default&lt;&#x2F;em&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;This is not a new program that has yet to settle into a stable version. And this is a case of changing the basic behaviors of the program. Under those circumstances, the program is different and should have a different name. And it does. Yet it is installed under the traditional name.&lt;&#x2F;p&gt;
&lt;p&gt;Breaking compatibility with past behaviors without changing the program name is simply bad practice. You need a very strong reason to do it. The proper rule of thumb is simple: Don’t do that!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Cognitive Load</title>
          <pubDate>Sat, 14 Dec 2024 10:00:35 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/cognitive-load/</link>
          <guid>https://www.superscript.com/posts/cognitive-load/</guid>
          <description xml:base="https://www.superscript.com/posts/cognitive-load/">&lt;blockquote&gt;
&lt;p&gt;Involve junior developers in architecture reviews. They will help you to identify the mentally demanding areas.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Interesting thinking on modularity: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;zakirullin&#x2F;cognitive-load&quot;&gt;Cognitive Load&lt;&#x2F;a&gt;&lt;&#x2F;p&gt;
&lt;p&gt;More material referenced there:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wstomv.win.tue.nl&#x2F;edu&#x2F;2ip30&#x2F;references&#x2F;criteria_for_modularization.pdf&quot;&gt;Decomposition Criteria&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;qntm.org&#x2F;clean&quot;&gt;Contra Clean Code&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;web.stanford.edu&#x2F;~ouster&#x2F;cgi-bin&#x2F;aposd2ndEdExtract.pdf&quot;&gt;Some Ousterhout&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>fzf Plus rg</title>
          <pubDate>Fri, 13 Dec 2024 16:35:00 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/fzf-plus-rg/</link>
          <guid>https://www.superscript.com/posts/fzf-plus-rg/</guid>
          <description xml:base="https://www.superscript.com/posts/fzf-plus-rg/">&lt;p&gt;As stand-alone tools &lt;code&gt;fzf&lt;&#x2F;code&gt; and &lt;code&gt;rg&lt;&#x2F;code&gt; are very useful. And there is an &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;junegunn&#x2F;fzf&#x2F;blob&#x2F;master&#x2F;ADVANCED.md#switching-between-ripgrep-mode-and-fzf-mode&quot;&gt;example&lt;&#x2F;a&gt; in the fzf docs showing how to toggle between &lt;code&gt;fzf&lt;&#x2F;code&gt; and &lt;code&gt;rg&lt;&#x2F;code&gt;, with the initial mode being &lt;code&gt;rg&lt;&#x2F;code&gt;. It works by feeding files (or standard input) to &lt;code&gt;rg&lt;&#x2F;code&gt;, and then making the list available to &lt;code&gt;fzf&lt;&#x2F;code&gt; for fuzzy match. When you switch back to &lt;code&gt;rg&lt;&#x2F;code&gt; you rerun it with the original arguments.&lt;&#x2F;p&gt;
&lt;p&gt;I needed a variation on this theme that operates under different assumptions. First, it will start with &lt;code&gt;fzf&lt;&#x2F;code&gt;, because it’s in a pipeline and fuzzy match works well for the initial selection. Second, I want to successively refine the search, even going back and forth between the two modes.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s a slightly simplified version of what I came up with.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;f&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;r&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;delimiter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;:&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; #_# review [fzf-args]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_#   Search in inputs with fzf and rg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_#&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;do_review&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rg_prompt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;rg&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  fzf_prompt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fzf&amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rg_prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;rg --no-heading --smart-case --with-filename &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rg_fzf_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;mktemp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;XDG_RUNTIME_DIR&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;tmp&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;rg-fzf-XXXXXX&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rg_fzf_fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rg_fzf_rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rg_fzf_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&#x2F;list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  touch&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-multi&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;start:unbind(change,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)+transform-prompt(echo &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;{FZF_PROMPT} &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_prompt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;change:reload:sleep 0.1; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; {q} &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;(cat &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;) || true&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;:unbind(change,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)+enable-search+rebind(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)+transform-query(echo {q} &amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;; cat &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;:+transform-prompt(echo &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;{FZF_PROMPT% *&amp;gt; } &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_prompt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;:select-all+disable-search+execute(printf &amp;#39;%s\n&amp;#39; {+} | cut -d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;delimiter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; -f1 | sort -u &amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)+reload(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_prefix&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; {q} &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;(cat &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;) || true)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;:+unbind(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)+rebind(change,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fzf_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)+transform-query(echo {q} &amp;gt; &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;; cat &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-bind&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_key&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;:+transform-prompt(echo &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;{FZF_PROMPT% *&amp;gt; } &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_prompt&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;    -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-delimiter=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;delimiter&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;    &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  rm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_fzf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_rg&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; rmdir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;rg_fzf_dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;do_review&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This assumes each record begins with a file or directory path. This may be followed by a delimiter and more text. The entire record is available for fuzzy match. We preserve the queries in use for each mode as in the original example, but also preserve the full list of files, so that we can feed them back to &lt;code&gt;rg&lt;&#x2F;code&gt;.
The successive refinement is not exact. With the given definition of &lt;code&gt;rg_prefix&lt;&#x2F;code&gt; a match in any file expands to cover the entire file again after switching back to &lt;code&gt;rg&lt;&#x2F;code&gt;. This is not too difficult to work with. And it’s not too difficult to capture the initial inputs and reinitialize the selection list on demand.&lt;&#x2F;p&gt;
&lt;p&gt;I’ve already gotten a lot of mileage out of this  function!&lt;&#x2F;p&gt;
&lt;p&gt;One weakness of this code lies in the handling of the list. In order to capture the list when mode switching, a &lt;code&gt;select-all&lt;&#x2F;code&gt; is required. This means that the code will not work without &lt;code&gt;--multi&lt;&#x2F;code&gt;. There is no way to save the current setting, set &lt;code&gt;--multi&lt;&#x2F;code&gt;, capture, and revert the setting. A better solution would be to have a placeholder for the full list. I propose &lt;code&gt;{:}&lt;&#x2F;code&gt; as the full-list analogue to the selected-line placeholder &lt;code&gt;{+}&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Locale for Sorting</title>
          <pubDate>Thu, 12 Dec 2024 09:14:38 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/locale-for-sorting/</link>
          <guid>https://www.superscript.com/posts/locale-for-sorting/</guid>
          <description xml:base="https://www.superscript.com/posts/locale-for-sorting/">&lt;p&gt;Today I ran afoul of a problem that I first encountered over 20 years ago: non-portable sort.&lt;&#x2F;p&gt;
&lt;p&gt;Back in the early aughts the symptom was that on Linux with a &lt;code&gt;en_US.UTF-8&lt;&#x2F;code&gt; locale &lt;code&gt;i &amp;lt; j &amp;lt; k&lt;&#x2F;code&gt; did not hold in &lt;code&gt;sort&lt;&#x2F;code&gt;. This was on Linux. We worked around this by setting locale to &lt;code&gt;C&lt;&#x2F;code&gt; for &lt;code&gt;sort&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Today &lt;code&gt;en_US.UTF-8&lt;&#x2F;code&gt; no longer has such issues, but it sorts sorts in an order that is not ASCII compatible:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;web@b01:~$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; printf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;%s\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; Apple&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; apple&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; Banana&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; banana&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; LC_ALL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;_&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;U&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;S&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;U&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;F&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sort&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;apple&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;Apple&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;banana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;Banana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Case comparison evidently is not the first sorting criterion.&lt;&#x2F;p&gt;
&lt;p&gt;There is now a &lt;code&gt;C.UTF-8&lt;&#x2F;code&gt; locale that produce ASCII-compatible outputs as does the &lt;code&gt;C&lt;&#x2F;code&gt; locale:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;web@b01:~$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; printf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;%s\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; Apple&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; apple&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; Banana&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; banana&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; LC_ALL&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;U&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;T&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;F&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;8&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sort&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;Apple&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;Banana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;apple&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;banana&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;There is also a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pubs.opengroup.org&#x2F;onlinepubs&#x2F;9799919799&#x2F;basedefs&#x2F;V1_chap07.html&quot;&gt;&lt;code&gt;POSIX&lt;&#x2F;code&gt; locale&lt;&#x2F;a&gt; equivalent to &lt;code&gt;C&lt;&#x2F;code&gt;. This treats only the English alphabet as letters with known upper and lower case variants. Furthermore, the POSIX &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;pubs.opengroup.org&#x2F;onlinepubs&#x2F;9699919799&#x2F;utilities&#x2F;sort.html&quot;&gt;recommendation&lt;&#x2F;a&gt; is to set &lt;code&gt;LC_ALL=POSIX&lt;&#x2F;code&gt; for utilities such as &lt;code&gt;sort&lt;&#x2F;code&gt; and &lt;code&gt;ls&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Plus ça change, plus c’est la même chose.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Bhyve and Grub</title>
          <pubDate>Tue, 10 Dec 2024 17:53:18 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/bhyve-and-grub/</link>
          <guid>https://www.superscript.com/posts/bhyve-and-grub/</guid>
          <description xml:base="https://www.superscript.com/posts/bhyve-and-grub/">&lt;p&gt;In attempting to install linux (Debian in this case) under &lt;code&gt;bhyve&lt;&#x2F;code&gt; I sought out and followed the common guidance: use uefi and not grub.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;https:&#x2F;&#x2F;vermaden.wordpress.com&#x2F;2023&#x2F;08&#x2F;18&#x2F;freebsd-bhyve-virtualization&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;forums.freebsd.org&#x2F;threads&#x2F;handbook-bhyve-linux-example.92193&#x2F;&lt;&#x2F;li&gt;
&lt;li&gt;https:&#x2F;&#x2F;srobb.net&#x2F;vm-bhyve.html&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Using uefi is reportedly capable of all that grub does, plus a graphical installation process. I don’t care about graphical install but followed the advice anyway.&lt;&#x2F;p&gt;
&lt;p&gt;What a mistake!&lt;&#x2F;p&gt;
&lt;p&gt;The installation process fails immediately. I’m using &lt;code&gt;vm-bhyve&lt;&#x2F;code&gt; and there is a reported &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;bugs.freebsd.org&#x2F;bugzilla&#x2F;show_bug.cgi?id=273560&quot;&gt;bug&lt;&#x2F;a&gt; in how a recent version of &lt;code&gt;sysutils&#x2F;edk2&lt;&#x2F;code&gt; handles options passed to &lt;code&gt;bhyve&lt;&#x2F;code&gt;. And there is a &lt;code&gt;vm-bhyve&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;churchers&#x2F;vm-bhyve&#x2F;pull&#x2F;525&quot;&gt;PR&lt;&#x2F;a&gt; that may provide a workaround.&lt;&#x2F;p&gt;
&lt;p&gt;But falling back to grub allowed me to install and met my needs.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Poll0</title>
          <pubDate>Sat, 07 Dec 2024 20:55:12 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/poll0/</link>
          <guid>https://www.superscript.com/posts/poll0/</guid>
          <description xml:base="https://www.superscript.com/posts/poll0/">&lt;p&gt;In a pipeline you may have one segment that must wait for input before executing. Think &lt;code&gt;xargs&lt;&#x2F;code&gt; but passing data through rather than using it as command-line arguments. Today I addressed this with a simple C program, called &lt;code&gt;poll0&lt;&#x2F;code&gt;. It polls file descriptor &lt;code&gt;0&lt;&#x2F;code&gt; and exits &lt;code&gt;0&lt;&#x2F;code&gt; if data is ready, and &lt;code&gt;1&lt;&#x2F;code&gt; otherwise. It takes an optional argument giving a millisecond timeout for the call to the &lt;code&gt;poll()&lt;&#x2F;code&gt; system call.&lt;&#x2F;p&gt;
&lt;p&gt;It’s does one thing only. It’s simple. And it solves a useful problem. And the bonus: Claude wrote it.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;c&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;include&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;stdio.h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;include&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;stdlib.h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;include&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;unistd.h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;include&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;poll.h&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; main&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;int&lt;&#x2F;span&gt;&lt;span&gt; argc&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt; char&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; *&lt;&#x2F;span&gt;&lt;span&gt;argv&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;[]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; timeout &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;argc &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;gt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;        fprintf&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;stderr&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;Usage: &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;%s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; [timeout_ms]&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; argv&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;argc &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 2&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        timeout &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; atoi&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;argv&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;    struct&lt;&#x2F;span&gt;&lt;span&gt; pollfd &lt;&#x2F;span&gt;&lt;span&gt;fds&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fds&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;fd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; stdin&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    fds&lt;&#x2F;span&gt;&lt;span&gt;[&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span&gt;]&lt;&#x2F;span&gt;&lt;span&gt;.&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;events&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span&gt; POLLIN&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;    int&lt;&#x2F;span&gt;&lt;span&gt; result &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; poll&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;fds&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;,&lt;&#x2F;span&gt;&lt;span&gt; timeout&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    if&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;&amp;lt;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;        perror&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;poll&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;        return&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;    return&lt;&#x2F;span&gt;&lt;span&gt; (&lt;&#x2F;span&gt;&lt;span&gt;result &lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;==&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; ?&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; :&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;  &#x2F;&#x2F;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt; 1 on timeout, 0 on input available&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;</description>
      </item>
      <item>
          <title>Kakoune Filetype Mode</title>
          <pubDate>Thu, 05 Dec 2024 11:55:56 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/kakoune-filetype-mode/</link>
          <guid>https://www.superscript.com/posts/kakoune-filetype-mode/</guid>
          <description xml:base="https://www.superscript.com/posts/kakoune-filetype-mode/">&lt;p&gt;The Kakoune editor has a very simple and powerful mechanism to specify a hierarchy of key bindings. It is quite common to map the space character in normal mode to commands that include many mode selectors, leading to additional mappings.&lt;&#x2F;p&gt;
&lt;p&gt;Dynamic key bindings are usually implemented with hooks. Enter a mode, and rebind keys for the current context. That seemed cumbersome to me. I wanted to change the mode used for key lookup rather than the bindings in the common mappings. I also wanted to avoid collisions in mappings with user modes that others have produced.&lt;&#x2F;p&gt;
&lt;p&gt;The solution is a mapping that enters a user mode named for the current filetype. The single quote is unmapped by default, and is close to home position on my standard US keyboard, so let’s use that:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;map global normal &amp;quot;&amp;#39;&amp;quot; %{: enter-user-mode  %opt{filetype}&amp;lt;ret&amp;gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;If the filetype does not have a corresponding user mode, this simply throws an error. Otherwise it gives access to your filetype-specific mappings through a consistent top-level mapping.&lt;&#x2F;p&gt;
&lt;p&gt;You can even create a dynamic hierarchy if your user mode warrants it. In the filetype mode, just map a key to enter the “parent” mode. Using the same mapping key, single quote here, seems natural to me.&lt;&#x2F;p&gt;
&lt;p&gt;And that’s it!&lt;&#x2F;p&gt;
&lt;p&gt;I have not seen anything like this elsewhere and think this is a new use of user modes. Please send me a note if you know otherwise.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Shell Help</title>
          <pubDate>Sun, 01 Dec 2024 17:23:58 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/shell-help/</link>
          <guid>https://www.superscript.com/posts/shell-help/</guid>
          <description xml:base="https://www.superscript.com/posts/shell-help/">&lt;p&gt;In keeping with my simple approach to documentation in &lt;a href=&quot;&#x2F;posts&#x2F;make-help&quot;&gt;makefiles&lt;&#x2F;a&gt; I do the same thing in shell scripts with this implementation:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_# help&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;_#   Print this helpful message&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;do_help&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  sed&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s&#x2F;^#_#&#x2F; &#x2F;p&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The function name follows the &lt;a href=&quot;&#x2F;posts&#x2F;a-useful-shell-pattern&quot;&gt;mode-function pattern&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;In principle this approach works for any language that uses &lt;code&gt;#&lt;&#x2F;code&gt; to start a line comment, such as Python or Perl, though there are much more capable modules available in those contexts. But for shell it gives me what I need, basic functionality in simple implementation.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>An Amusing Shell Trick</title>
          <pubDate>Tue, 26 Nov 2024 11:54:54 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/an-amusing-shell-trick/</link>
          <guid>https://www.superscript.com/posts/an-amusing-shell-trick/</guid>
          <description xml:base="https://www.superscript.com/posts/an-amusing-shell-trick/">&lt;p&gt;Sometimes a function takes arguments passed down from a caller like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;my_fun&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  do_something_fun&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;On occasion you need to call something that takes arguments in an awkward order. Today’s example is the pattern argument to &lt;code&gt;fd&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;do_find&lt;&#x2F;span&gt;&lt;span&gt;(&lt;&#x2F;span&gt;&lt;span&gt;)&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#586E75, #93A1A1);font-weight: bold;&quot;&gt;  local&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  shift&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  fd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The pattern argument is &lt;code&gt;$1&lt;&#x2F;code&gt; within &lt;code&gt;$@&lt;&#x2F;code&gt; here. But what if there is only one argument to the &lt;code&gt;do_find&lt;&#x2F;code&gt; call? We should supply an empty argument as the pattern.&lt;&#x2F;p&gt;
&lt;p&gt;I know of two ways to do this. The first is to expand to &lt;code&gt;$@&lt;&#x2F;code&gt; if &lt;code&gt;$1&lt;&#x2F;code&gt; is defined:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The second is to prepend an empty string to the &lt;code&gt;&quot;$@&quot;&lt;&#x2F;code&gt; expansion:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I find this last one both highly amusing and more visually striking than the first. And it’s so simple it took years to see!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Area vs Project</title>
          <pubDate>Mon, 25 Nov 2024 09:29:33 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/area-vs-project/</link>
          <guid>https://www.superscript.com/posts/area-vs-project/</guid>
          <description xml:base="https://www.superscript.com/posts/area-vs-project/">&lt;p&gt;My main takeaway from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;a.co&#x2F;d&#x2F;ft3M8Vp&quot;&gt;&lt;em&gt;Building a Second Brain&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; is to take more care to distinguish Areas and Projects. The author gives these definitions of the two categories:&lt;&#x2F;p&gt;
&lt;p&gt;&lt;em&gt;Areas&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Long-term responsibilities you want to manage over time.&lt;&#x2F;li&gt;
&lt;li&gt;An area doesn’t have a final objective.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;&lt;em&gt;Projects&lt;&#x2F;em&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Short-term efforts in your work or life that you’re working on now.&lt;&#x2F;li&gt;
&lt;li&gt;Projects…have a beginning and an end; they date place during a specific period of time and then they finish.&lt;&#x2F;li&gt;
&lt;li&gt;They have a specific, clear outdome that needs to happen in order for them to be checkeed off as complete.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;These are neither new nor unfamiliar distinctions, but the reminder to separate the two was very useful. Many &lt;em&gt;Areas&lt;&#x2F;em&gt; spin out &lt;em&gt;Projects&lt;&#x2F;em&gt; continuously over time, and after a while that begins to blur the boundary.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Apache AGE</title>
          <pubDate>Sun, 24 Nov 2024 21:46:32 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/apache-age/</link>
          <guid>https://www.superscript.com/posts/apache-age/</guid>
          <description xml:base="https://www.superscript.com/posts/apache-age/">&lt;p&gt;Today I learned of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;age.apache.org&#x2F;&quot;&gt;Apache AGE&lt;&#x2F;a&gt;, a PostgreSQL extension that adds graph database capabilities. It looks like the right tool for my GraphRAG experiments, given that I have data in PostgreSQL already. This one enters at the front of the priority queue!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Kakoune Client Server</title>
          <pubDate>Sat, 23 Nov 2024 18:23:52 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/kakoune-client-server/</link>
          <guid>https://www.superscript.com/posts/kakoune-client-server/</guid>
          <description xml:base="https://www.superscript.com/posts/kakoune-client-server/">&lt;p&gt;Today I deployed a variation on the “&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;mawww&#x2F;kakoune&#x2F;wiki&#x2F;Kak-daemon-helper-:-1-session-per-project&quot;&gt;1 session per project&lt;&#x2F;a&gt;” implementation from the Kakoune wiki. My version of the script is called &lt;code&gt;kak-cs&lt;&#x2F;code&gt; and looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;#!&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#93A1A1, #586E75);font-style: italic;&quot;&gt;&#x2F;bin&#x2F;sh&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:-&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;shift&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#D33682, #D33682);&quot;&gt; 0&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;+&lt;&#x2F;span&gt;&lt;span&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;|&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dirname&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;git&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;C&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; rev-parse&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-show-toplevel&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;cd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;pwd&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  server_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;HOME&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;else&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  server_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;basename&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;dir&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; sed&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;s#[.&#x2F;]#-#g&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;socket_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;=&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;kak&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;server_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;\$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;if&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; test&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;socket_file&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; =&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;then&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  setsid&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; kak&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;d&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;server_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;fi&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;while&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; true&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;do&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;  kak&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;l&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; grep&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;q&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;^&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;server_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; break&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;done&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;kak&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;server_name&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;{&lt;&#x2F;span&gt;&lt;span&gt;1&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;:&lt;&#x2F;span&gt;&lt;span&gt;+&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;-e&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;@&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;}&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This takes an optional path as first argument and finds its directory, using the current working directory by default. Then it looks for the topmost &lt;code&gt;git&lt;&#x2F;code&gt; repository that contains the given directory. The basename of this &lt;code&gt;git&lt;&#x2F;code&gt; repo directory is the project name. Start a server for the project if one does not already exist, and then start a new client connecting to the project server.&lt;&#x2F;p&gt;
&lt;p&gt;The unfortunate &lt;code&gt;while true&lt;&#x2F;code&gt; loop ensures that the server is running before the client attempts to connect. There should be a better way.&lt;&#x2F;p&gt;
&lt;p&gt;I use this in &lt;code&gt;tmux&lt;&#x2F;code&gt; context with user-mode key bindings to launch the new client in a horizontal or vertical split of the current pane, or in a new window.&lt;&#x2F;p&gt;
&lt;p&gt;Obviously it assumes that all of my projects reside in &lt;code&gt;git&lt;&#x2F;code&gt; repos, including my home directory, all of which happens to be true.&lt;&#x2F;p&gt;
&lt;p&gt;This will probably require some hooks to handle the close of the last client and make sure that a clientless server isn’t holding unsaved changes. But that’s for another TIL.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Lean Coffee Is Underused</title>
          <pubDate>Fri, 22 Nov 2024 15:22:19 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/lean-coffee-underused/</link>
          <guid>https://www.superscript.com/posts/lean-coffee-underused/</guid>
          <description xml:base="https://www.superscript.com/posts/lean-coffee-underused/">&lt;p&gt;A simple technique for running a meeting with a dynamic agenda is &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;leancoffee.org&#x2F;&quot;&gt;Lean Coffee&lt;&#x2F;a&gt;. It surprises me how few people have run one.&lt;&#x2F;p&gt;
&lt;p&gt;I presently use this in two contexts:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;lean-coffee-austin&#x2F;&quot;&gt;Lean Coffee Austin&lt;&#x2F;a&gt;, a biweekly open meeting&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.meetup.com&#x2F;austin-cto-club&#x2F;&quot;&gt;Austin CTO Club&lt;&#x2F;a&gt;&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;Everyone who attends these meetings now knows how to run one. And everyone has seen it work effectively in these contexts, even though in the case of Austin CTO Club the group is large for this technique.&lt;&#x2F;p&gt;
&lt;p&gt;People rarely say they already know the technique. It’s been a standard among agile and lean coaches for years. There are many meetings run this way around the world. I’ve seen hundreds if not thousands of people attend them over the years. Why isn’t it more commonly used? It’s not clear to me.&lt;&#x2F;p&gt;
&lt;p&gt;One good context for Lean Coffee in a time-based retrospective meeting. You’ll see all of the topics, whether you get to them or not, and everyone can share their perspective at least at the level of topic creation.&lt;&#x2F;p&gt;
&lt;p&gt;People seem to enjoy Lean Coffee as participants, but that somehow does not translate into trying to lead one themselves.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Dev in a Jail</title>
          <pubDate>Thu, 21 Nov 2024 17:15:14 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/dev-in-a-jail/</link>
          <guid>https://www.superscript.com/posts/dev-in-a-jail/</guid>
          <description xml:base="https://www.superscript.com/posts/dev-in-a-jail/">&lt;p&gt;I work a lot on FreeBSD and have made increasing use of jails over time. The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BastilleBSD&#x2F;bastille&quot;&gt;bastille&lt;&#x2F;a&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;BastilleBSD&#x2F;rocinante&quot;&gt;rocinante&lt;&#x2F;a&gt; tools from Christer Edwards make this pretty easy to build and maintain.&lt;&#x2F;p&gt;
&lt;p&gt;These days I do most work in jails, for long-running services like DNS and PostgreSQL, and to isolate programs, like browsers. Most of my dev is in jails as well, where I can wipe the slate clean and start again from fully scripted state at any time.&lt;&#x2F;p&gt;
&lt;p&gt;One of the simple pleasures of developing in a jail is that very little is happening there. Today I had to work on the host as well as in the jail. The volume of processes on the host is large compared with an individual jail, and made diagnosis of one of my bugs difficult. I had lost track of how nice it is to work with a minimal setup that one gets with a focused yet fully capable jail. So this is really a TIR entry – Today I Relearned.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>TIL vs TIW</title>
          <pubDate>Wed, 20 Nov 2024 16:39:16 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/til-vs-tiw/</link>
          <guid>https://www.superscript.com/posts/til-vs-tiw/</guid>
          <description xml:base="https://www.superscript.com/posts/til-vs-tiw/">&lt;p&gt;An oddity of producing TIL blog entries is that they rarely match the TIL claim. At least it’s that way for me, and I suspect most who try to produce something on a daily basis. It really should be called TIW for “Today I Wrote”.&lt;&#x2F;p&gt;
&lt;p&gt;Even ideas that are easy to write up in short form usually take more than one day to come into full focus for me. And the TIL blog is primarily an exercise in daily writing, so TIW seems more fitting. The mismatch of TIL with the actual production amuses me for no good reason.&lt;&#x2F;p&gt;
&lt;p&gt;I saw numerous random posts under a TIL heading before encountering Simon Willison’s impressive &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;til.simonwillison.net&#x2F;&quot;&gt;collection&lt;&#x2F;a&gt;. His is a good model to follow.&lt;&#x2F;p&gt;
&lt;p&gt;Today I learned of Josh Branchaud’s &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;jbranchaud&#x2F;til&quot;&gt;TIL repo&lt;&#x2F;a&gt; and its &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;dev.to&#x2F;jbranchaud&#x2F;how-i-built-a-learning-machine-45k9&quot;&gt;origin story&lt;&#x2F;a&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Search Path and Extensions</title>
          <pubDate>Tue, 19 Nov 2024 12:30:56 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/search-path-and-extensions/</link>
          <guid>https://www.superscript.com/posts/search-path-and-extensions/</guid>
          <description xml:base="https://www.superscript.com/posts/search-path-and-extensions/">&lt;p&gt;Using &lt;code&gt;search_path&lt;&#x2F;code&gt; to implement polymorphism is one of those conveniences in PostgreSQL that can bite hard. Relying on it to select the schema for tables and functions may seem useful, but there is an entire PostgreSQL &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;wiki.postgresql.org&#x2F;wiki&#x2F;A_Guide_to_CVE-2018-1058%3A_Protect_Your_Search_Path&quot;&gt;wiki page&lt;&#x2F;a&gt; dedicated to avoiding harm from malicious use of &lt;code&gt;search_path&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;One recommendation from that page is to remove the &lt;code&gt;public&lt;&#x2F;code&gt; schema from &lt;code&gt;search_path&lt;&#x2F;code&gt; altogether. When I tried that I ran afoul of the placement of extensions into the &lt;code&gt;public&lt;&#x2F;code&gt; schema. This is not mentioned on the above page, but does appear in one of its &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;docs&#x2F;current&#x2F;static&#x2F;extend-extensions.html&quot;&gt;references&lt;&#x2F;a&gt;. Extensions may be “relocatable” to different schemas, but it is not clear to me how common that is.&lt;&#x2F;p&gt;
&lt;p&gt;The more accommodating recommendation is to forbid the creation of objects in &lt;code&gt;public&lt;&#x2F;code&gt; by any non-admin role. That at least avoids the issue of extension functionality disappearing under a restricted &lt;code&gt;search_path&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Man Page in Plain Text</title>
          <pubDate>Mon, 18 Nov 2024 10:22:43 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/man-page-in-plain-text/</link>
          <guid>https://www.superscript.com/posts/man-page-in-plain-text/</guid>
          <description xml:base="https://www.superscript.com/posts/man-page-in-plain-text/">&lt;p&gt;Here is a command to print a man page in plain text:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;man -P cat page | col -b&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This uses &lt;code&gt;cat&lt;&#x2F;code&gt; as the pager, and strips backspace characters with &lt;code&gt;col&lt;&#x2F;code&gt;. Why would you want to produce plain-text output from man? So you can create embeddings from your man pages, of course!&lt;&#x2F;p&gt;
&lt;p&gt;I am experimenting with this on a FreeBSD system, and today converted 9k+ man pages to text, split them into suitable chunks for embedding, and calculated vectors. The ultimate destination is a PostgreSQL database, where I create a new data table for each set of embeddings and perform RAG queries.&lt;&#x2F;p&gt;
&lt;p&gt;Plain text is gaining prominence as an input format to LLMs. For those of us accustomed to work on the command line this is a very welcome development!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>OCR via LLM</title>
          <pubDate>Sun, 17 Nov 2024 10:00:30 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/ocr-via-llm/</link>
          <guid>https://www.superscript.com/posts/ocr-via-llm/</guid>
          <description xml:base="https://www.superscript.com/posts/ocr-via-llm/">&lt;p&gt;My stepfather has a box of newspaper clippings from long ago and wants to create digital copies. I asked him to send me a scan. It was an ordinary looking image. Three pairs of text columns, two pairs across the top, one below between the other two, reading in that order. It had some background flecks throughout the image, but was fully legible.&lt;&#x2F;p&gt;
&lt;p&gt;I attached it to a request to Claude with the instruction “Extract as much text as you can from the attached image.” It extracted the full text, including a bullet list in the article, in the correct reading order.&lt;&#x2F;p&gt;
&lt;p&gt;This surprised me. I know little about OCR, but did not expect a general tool to do such a good job. What will this do to businesses built around more traditional approaches to OCR? Do they all need to convert, or at least incorporate LLMs into their operations?&lt;&#x2F;p&gt;
&lt;p&gt;No doubt many more such surprises are coming, and the disruptions they cause will be fun to watch!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A Useful Shell Pattern</title>
          <pubDate>Fri, 15 Nov 2024 16:52:16 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/a-useful-shell-pattern/</link>
          <guid>https://www.superscript.com/posts/a-useful-shell-pattern/</guid>
          <description xml:base="https://www.superscript.com/posts/a-useful-shell-pattern/">&lt;p&gt;If you work at the unix command line you probably execute pipelines of programs to test ideas. It’s part of the &lt;a rel=&quot;external&quot; href=&quot;http:&#x2F;&#x2F;www.catb.org&#x2F;esr&#x2F;writings&#x2F;taoup&#x2F;html&#x2F;&quot;&gt;unix way&lt;&#x2F;a&gt;. Sometimes you need a little more than a simple pipeline. A small shell script here or there is an easy lightweight way to provide a slighly larger pipeline component or to wrap several components for repeated execution.&lt;&#x2F;p&gt;
&lt;p&gt;Often I find myself writing such a script that processes data differently to provide related but distinct manipulations of the data, handle multiple input or output formats, or apply similar processing to distinct source types. When this happens I use the following simple pattern:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;shell-script mode [mode-args]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Here mode selects the shell script execution path, and different modes may take different arguments.&lt;&#x2F;p&gt;
&lt;p&gt;At the top level of such a script I use a case statement that dispatches execution to a shell function named for the mode:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;case &amp;quot;$1&amp;quot; in&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  mode1|mode2|mode3)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    &amp;quot;do_$@&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  *)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    printf &amp;#39;usage statement&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    exit 1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    ;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;esac&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The purpose of the case statement is merely to constrain the available modes. Strictly speaking you don’t need it, though I recommend it.&lt;&#x2F;p&gt;
&lt;p&gt;All you need is to define a “mode function” called &lt;code&gt;do_modename&lt;&#x2F;code&gt; and add the name of the mode to your top-level dispatch. A separate function for each mode mode makes the code flow easy to follow. Different modes can make use of the same utility functions in the script if appropriate. And you can repeat the &lt;code&gt;&quot;do_$@&quot;&lt;&#x2F;code&gt; pattern internally if additional layers of dispatch are needed.&lt;&#x2F;p&gt;
&lt;p&gt;This top-level dispatch to mode-specific functions makes it easy to create clean scripts to handle multiple modes. Adding new modes is highly modular. Modes need not share arguments, as all arguments beyond the mode are handled by the mode function itself.&lt;&#x2F;p&gt;
&lt;p&gt;One mode may even pipe several others together by calling their mode functions, handling the combined arguments at the top level and passing them down as needed.&lt;&#x2F;p&gt;
&lt;p&gt;This is one way in which shell remains underrated.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Split for Embedding</title>
          <pubDate>Thu, 14 Nov 2024 20:02:39 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/split-for-embedding/</link>
          <guid>https://www.superscript.com/posts/split-for-embedding/</guid>
          <description xml:base="https://www.superscript.com/posts/split-for-embedding/">&lt;p&gt;Different embedding models have different limits on input tokens. When you want to create embeddings for a large corpus, one major annoyance is splitting the content so that it fits within this limit.&lt;&#x2F;p&gt;
&lt;p&gt;My recent work has centered around Simon Willison’s excellent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;&quot;&gt;&lt;code&gt;llm&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; tool. He also wrote &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;ttok&quot;&gt;&lt;code&gt;ttok&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, a command-line tool for counting tokens based on &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;openai&#x2F;tiktoken&quot;&gt;&lt;code&gt;tiktoken&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. While it lacks options to split, it was not difficult to add one in the form of a &lt;code&gt;--chunksize int&lt;&#x2F;code&gt; option.&lt;&#x2F;p&gt;
&lt;p&gt;When invoked with &lt;code&gt;--chunksize&lt;&#x2F;code&gt;, &lt;code&gt;ttok&lt;&#x2F;code&gt; prints output in sets of the given size. This doesn’t make much sense when printing the text out as happens with &lt;code&gt;--truncate&lt;&#x2F;code&gt;. It’s more sensible but not very useful with &lt;code&gt;--tokens&lt;&#x2F;code&gt;, which prints the tokens in legible form. But with &lt;code&gt;--encode&lt;&#x2F;code&gt; it means you get one line of token numbers per chunk. That lets you do this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;ttok -m model -i infile --encode --chunksize 1000 | split -l 1 outprefix.&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Iterating on the chunked output with &lt;code&gt;ttok --decode&lt;&#x2F;code&gt; yields your chunks. Very simple.&lt;&#x2F;p&gt;
&lt;p&gt;After implementing this I discovered a much earlier &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;ttok&#x2F;issues&#x2F;3&quot;&gt;conversation&lt;&#x2F;a&gt; that covers splitting and converting back to text in one pass. As it happens, I started with that in mind as well, but saw that working with encoded output gave line-oriented results. This meant &lt;code&gt;ttok&lt;&#x2F;code&gt; could do less, and &lt;code&gt;split&lt;&#x2F;code&gt; could do the rest, which appealed to my taste for unix-style simplicity. You can find &lt;code&gt;ttok&lt;&#x2F;code&gt; with &lt;code&gt;--chunksize&lt;&#x2F;code&gt; on the “chunksize” branch &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SuperScript&#x2F;ttok&#x2F;tree&#x2F;chunksize&quot;&gt;here&lt;&#x2F;a&gt;. The packaging is incomplete. If it is useful to you, let me know and I’ll complete the work needed for a proper pull request.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Checking Make Vars</title>
          <pubDate>Wed, 13 Nov 2024 22:07:50 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/checking-make-vars/</link>
          <guid>https://www.superscript.com/posts/checking-make-vars/</guid>
          <description xml:base="https://www.superscript.com/posts/checking-make-vars/">&lt;p&gt;If your make target recipes use make variables you may want to test that they are set before using them. This would look something like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;test -n &amp;#39;$(varname)&amp;#39; || { echo &amp;#39;variable not set: varname&amp;#39;; exit 1; }&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Rather than sprinkling that sort of code all over your Makefile, you may want to use a dependency instead. If you want to be sure that the variable &lt;code&gt;x&lt;&#x2F;code&gt; is defined, use the dependency &lt;code&gt;needvar.x&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;foo: needvar.x&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;        echo &amp;quot;This is foo, and x=$(x)&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This should fail if &lt;code&gt;x&lt;&#x2F;code&gt; is unset or empty (my common use case). So how is the &lt;code&gt;needvar.x&lt;&#x2F;code&gt; defined? Well that depends.&lt;&#x2F;p&gt;
&lt;p&gt;If you run GNU Make, then it probably looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;needvar.%: .PHONY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Which works for any variable.&lt;&#x2F;p&gt;
&lt;p&gt;In BSD Make like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;needvar.x: .PHONY&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;with a loop to define the target for each variable of interest.&lt;&#x2F;p&gt;
&lt;p&gt;The package &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;superscript&#x2F;make-needvar&quot;&gt;make-needvar&lt;&#x2F;a&gt; implements this so that you don’t have to. It uses the tricks from &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;superscript&#x2F;make-help&quot;&gt;make-help&lt;&#x2F;a&gt; to handle both flavors of Make. All you need is to include the top-level file, and for BSD Make set &lt;code&gt;needvars&lt;&#x2F;code&gt; to the list of variables you will check. After that, the &lt;code&gt;needvar.x&lt;&#x2F;code&gt; targets are defined, and you can use them in any target that requires a variable setting.&lt;&#x2F;p&gt;
&lt;p&gt;That’s it. Stupid simple, yet effective!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Sqitch Templates</title>
          <pubDate>Tue, 12 Nov 2024 17:46:40 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/sqitch-templates/</link>
          <guid>https://www.superscript.com/posts/sqitch-templates/</guid>
          <description xml:base="https://www.superscript.com/posts/sqitch-templates/">&lt;p&gt;Sqitch has a &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sqitch.org&#x2F;docs&#x2F;manual&#x2F;sqitch-add&#x2F;&quot;&gt;template&lt;&#x2F;a&gt; mechanism that follows the same design pattern as its migration files. This makes it easy to manage templates with Sqitch itself.&lt;&#x2F;p&gt;
&lt;p&gt;My project directory now contains a &lt;code&gt;templates&#x2F;&lt;&#x2F;code&gt; subdirectory. This is just another Sqitch project &lt;code&gt;top_dir&lt;&#x2F;code&gt;, but for templates. The &lt;code&gt;sqitch.conf&lt;&#x2F;code&gt; file in that directory looks like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[core]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  engine = pg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  template_directory =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  extension = tmpl&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[engine &amp;quot;pg&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  registry = illegal-registry&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  client = none&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  template_directory =&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This means new “migrations” carry the &lt;code&gt;.tmpl&lt;&#x2F;code&gt; extension, and deployments are intentionally broken. I create a new template with&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;sqitch -C templates add new_template_name&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;In the project directory, the parent to &lt;code&gt;templates&#x2F;&lt;&#x2F;code&gt;, use this in &lt;code&gt;sqitch.conf&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[add]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;  template_directory = templates&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This also works in the normal user-wide template directory &lt;code&gt;${HOME}&#x2F;.sqitch&#x2F;templates&lt;&#x2F;code&gt; or in the project. I do both, borrowing templates into the project, and then developing them there, merging back into the user-wide templates as appropriate.&lt;&#x2F;p&gt;
&lt;p&gt;It’s simple yet effective!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Variables in Sqitch</title>
          <pubDate>Mon, 11 Nov 2024 09:32:29 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/variables-in-sqitch/</link>
          <guid>https://www.superscript.com/posts/variables-in-sqitch/</guid>
          <description xml:base="https://www.superscript.com/posts/variables-in-sqitch/">&lt;p&gt;Sqitch supports variables in the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;sqitch.org&#x2F;docs&#x2F;manual&#x2F;sqitch-config&#x2F;&quot;&gt;config file&lt;&#x2F;a&gt; like this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[target &amp;quot;foo&amp;quot;]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    engine = pg&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    uri = your-connection-string-here&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    registry = sqitch_db_foo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;[target.foo.variables]&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;    database = foo&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This makes a variable called &lt;code&gt;database&lt;&#x2F;code&gt; available in the deployment script. I use PostgreSQL, and Sqitch uses &lt;code&gt;psql&lt;&#x2F;code&gt; to deploy. So the variables are available as &lt;code&gt;psql&lt;&#x2F;code&gt; variables in the scripts. What can we do with these variables?&lt;&#x2F;p&gt;
&lt;p&gt;One of my projects uses the same Sqitch configuration for multiple database deployments on the same PostgreSQL instance. Assuming that the database exists, the settings in the config above for &lt;code&gt;registry&lt;&#x2F;code&gt; and &lt;code&gt;database&lt;&#x2F;code&gt; are all the scripts need to function correctly across multiple databases.&lt;&#x2F;p&gt;
&lt;p&gt;Setting &lt;code&gt;registry&lt;&#x2F;code&gt; to a database-specific value prevents Sqitch from mixing up deployments belonging to different databases.&lt;&#x2F;p&gt;
&lt;p&gt;Here’s a deploy file that uses the &lt;code&gt;database&lt;&#x2F;code&gt; variable to create database-specific roles:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;BEGIN;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\set ON_ERROR_STOP off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\set _admin_role &amp;#39;_admin_&amp;#39; :database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\set _admin_user &amp;#39;admin_&amp;#39; :database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\set _app_role &amp;#39;_app_&amp;#39; :database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\set _app_user &amp;#39;app_&amp;#39; :database&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE ROLE :&amp;quot;_admin_role&amp;quot; WITH NOLOGIN;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE ROLE :&amp;quot;_admin_user&amp;quot; WITH LOGIN INHERIT;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE ROLE :&amp;quot;_app_role&amp;quot; WITH NOLOGIN;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;CREATE ROLE :&amp;quot;_app_user&amp;quot; WITH LOGIN INHERIT;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;GRANT :&amp;quot;_admin_role&amp;quot; TO :&amp;quot;_admin_user&amp;quot;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;GRANT :&amp;quot;_app_role&amp;quot; TO :&amp;quot;_app_user&amp;quot;;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\unset _admin_role&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\unset _admin_user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\unset _app_role&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\unset _app_user&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;\set ON_ERROR_STOP on&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;COMMIT;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Disabling &lt;code&gt;ON_ERROR_STOP&lt;&#x2F;code&gt; prevents the &lt;code&gt;CREATE ROLE&lt;&#x2F;code&gt; calls from halting the process if the role already exists. Using Sqitch variables makes reusing deploy scripts across databases surprisingly easy!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>PostgreSQL Types by Reference</title>
          <pubDate>Sun, 10 Nov 2024 20:31:55 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/postgresql-types-by-reference/</link>
          <guid>https://www.superscript.com/posts/postgresql-types-by-reference/</guid>
          <description xml:base="https://www.superscript.com/posts/postgresql-types-by-reference/">&lt;p&gt;When writing a function to work with a specific table structure, you may have to match the argument types with table columns. If a table column changes its name, you may or may not need to rework the function to apply a similar change. If the table column changes its type, you almost certainly need to change the function to follow the update.&lt;&#x2F;p&gt;
&lt;p&gt;Today I encountered that problem and discovered the option of assigning types by reference. The &lt;code&gt;CREATE FUNCTION&lt;&#x2F;code&gt; &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.postgresql.org&#x2F;docs&#x2F;17&#x2F;sql-createfunction.html&quot;&gt;documentation&lt;&#x2F;a&gt; says this:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;The type of a column is referenced by writing &lt;code&gt;table_name.column_name%TYPE&lt;&#x2F;code&gt;. Using this feature can sometimes help make a function independent of changes to the definition of a table.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Per the docs, this applies to function arguments and function return values. It also applies to function variables. Maybe it applies elsewhere also, but this alone is a considerable benefit!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Exit Codes in psql</title>
          <pubDate>Sat, 09 Nov 2024 11:55:25 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/exit-codes-in-psql/</link>
          <guid>https://www.superscript.com/posts/exit-codes-in-psql/</guid>
          <description xml:base="https://www.superscript.com/posts/exit-codes-in-psql/">&lt;p&gt;In PostgreSQL certain commands are forbidden in transactions or functions, and lack &lt;code&gt;IF NOT EXISTS&lt;&#x2F;code&gt; variants. Examples include &lt;code&gt;CREATE DATABASE&lt;&#x2F;code&gt; and &lt;code&gt;CREATE ROLE&lt;&#x2F;code&gt;. How can one create a database idempotently?&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;psql&lt;&#x2F;code&gt; documentation says this about exit codes:&lt;&#x2F;p&gt;
&lt;blockquote&gt;
&lt;p&gt;&lt;code&gt;psql&lt;&#x2F;code&gt; returns 0 to the shell if it finished normally, 1 if a fatal error of its own occurs (e.g., out of memory, file not found), 2 if the connection to the server went bad and the session was not interactive, and 3 if an error occurred in a script and the variable &lt;code&gt;ON_ERROR_STOP&lt;&#x2F;code&gt; was set.&lt;&#x2F;p&gt;
&lt;&#x2F;blockquote&gt;
&lt;p&gt;Based on that description, I tried this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But this exits 1 if the database already exists!&lt;&#x2F;p&gt;
&lt;p&gt;After this surprise I tried numerous variations on the theme. These versions use &lt;code&gt;-c command&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar; select &amp;#39;after&amp;#39;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  CREATE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; DATABASE&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; cannot&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; run&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; inside&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; a&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; transaction&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; block&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;1&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;c&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;select &amp;#39;after&amp;#39;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;after&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;These versions read commands from standard input:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar; select &amp;#39;after&amp;#39;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;after&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=on&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;CREATE DATABASE fubar; select &amp;#39;after&amp;#39;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=on&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;These versions read commands from a file that contains only &lt;code&gt;CREATE DATABASE fubar;&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; test0.sql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;psql:test0.sql:1:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; test0.sql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=on&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;psql:test0.sql:1:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; test1.sql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=off&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;psql:test1.sql:1:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;after&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; in&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; file&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;0&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;$&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; psql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; postgresql:&#x2F;&#x2F;postgres@localhost:5432&#x2F;postgres&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;A&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;t&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;f&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; test1.sql&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;v&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ON_ERROR_STOP=on&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; echo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; $&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;?&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;psql:test1.sql:1:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; ERROR:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;  database&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;fubar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; already&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; exists&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;3&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;The presence of additional commands in the file appears to make no difference.&lt;&#x2F;p&gt;
&lt;p&gt;In case it makes any difference, my database connection runs through a &lt;code&gt;pgbouncer&lt;&#x2F;code&gt; instance. I believe this has no impact on &lt;code&gt;psql&lt;&#x2F;code&gt; exit codes.&lt;&#x2F;p&gt;
&lt;p&gt;There are ways to accomplish the goal. I imagine that the under-the-hood logic is clearer. From the outside, this degree of inconsistency seems impressive.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Second Brain</title>
          <pubDate>Fri, 08 Nov 2024 17:01:34 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/second-brain/</link>
          <guid>https://www.superscript.com/posts/second-brain/</guid>
          <description xml:base="https://www.superscript.com/posts/second-brain/">&lt;p&gt;Someone recently told me about &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;a.co&#x2F;d&#x2F;gSxMRaO&quot;&gt;&lt;em&gt;Building a Second Brain&lt;&#x2F;em&gt;&lt;&#x2F;a&gt;. The book presents a “CODE” approach: Capture, Organize, Distill, Express. It reads like an update to &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;a.co&#x2F;d&#x2F;29vrfI5&quot;&gt;&lt;em&gt;Getting Things Done&lt;&#x2F;em&gt;&lt;&#x2F;a&gt; with an emphasis on more digital tooling.&lt;&#x2F;p&gt;
&lt;p&gt;But the available tools are improving fast! The development of LLMs, and AI tools more broadly, creates new ways to address each stage of the CODE approach. I want to see how much there is to gain in applying them in this realm. It seems promising.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Separating Storage From llm Embeddings</title>
          <pubDate>Thu, 07 Nov 2024 15:33:34 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/separating-storage-from-llm-embeddings/</link>
          <guid>https://www.superscript.com/posts/separating-storage-from-llm-embeddings/</guid>
          <description xml:base="https://www.superscript.com/posts/separating-storage-from-llm-embeddings/">&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;&quot;&gt;&lt;code&gt;llm&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; program uses sqlite to store embeddings. I want to store my embeddings in PostgreSQL. Rather than try to alter the built-in storage, I opted for the more unix-friendly approach of simply printing the results to standard output.&lt;&#x2F;p&gt;
&lt;p&gt;This was fairly easy to implement based on code stolen from &lt;code&gt;llm&#x2F;cli.py&lt;&#x2F;code&gt; and &lt;code&gt;llm&#x2F;embeddings.py&lt;&#x2F;code&gt;. It also leaves in place the logging code, which still uses sqlite.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;superscript&#x2F;llm-vector&quot;&gt;llm-vector&lt;&#x2F;a&gt; project implements this. As of this writing it lacks tests, because I haven’t yet figured out how to adapt the tests from &lt;code&gt;llm embed&lt;&#x2F;code&gt; and &lt;code&gt;llm embed-multi&lt;&#x2F;code&gt;. The two top-level functions are &lt;code&gt;llm vector&lt;&#x2F;code&gt; and &lt;code&gt;llm vector-multi&lt;&#x2F;code&gt;. These closely resemble the corresponding &lt;code&gt;embed&lt;&#x2F;code&gt; calls. See the module or its help for details.&lt;&#x2F;p&gt;
&lt;p&gt;A couple of differences are worth calling out here. There is no use of an embedding database, so the model becomes a mandatory argument. The &lt;code&gt;vector&lt;&#x2F;code&gt; versions do not filter out entries based on an input hash. There is no accommodation for metadata or collections. Under the hood it’s somewhat simpler than the original.&lt;&#x2F;p&gt;
&lt;p&gt;What can one do with this new code?&lt;&#x2F;p&gt;
&lt;p&gt;Print the embedding for a single string:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;llm vector my-favorite-model -c &amp;quot;The llm-vector module prints embeddings of one or more inputs to standard output.&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Write multiple embeddings to a file:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;llm vector-multi my-favorite-model --files files-dir &amp;#39;**&#x2F;*&amp;#39; &amp;gt; output&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;Load embeddings directly into a PostgreSQL table:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;llm vector-multi 3-small --files files-dir &amp;#39;**&#x2F;*&amp;#39; --oformat tsv | psql connection-string -c &amp;#39;COPY mytable(key,vector,content) from stdin with (FORMAT text)&amp;#39;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;I already use PostgreSQL for my other database work, and now I can integrate llm into my workflow. Once again, unix-style programming for the win!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Programming Throwdown</title>
          <pubDate>Wed, 06 Nov 2024 07:28:40 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/programming-throwdown/</link>
          <guid>https://www.superscript.com/posts/programming-throwdown/</guid>
          <description xml:base="https://www.superscript.com/posts/programming-throwdown/">&lt;p&gt;Jason Gauci and Patrick Wheeler have an excellent podcast called &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.programmingthrowdown.com&quot;&gt;Programming Throwdown&lt;&#x2F;a&gt;. I know Jason from the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.linkedin.com&#x2F;company&#x2F;austin-cto-club&quot;&gt;Austin CTO Club&lt;&#x2F;a&gt;. The first &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;www.programmingthrowdown.com&#x2F;episodes&#x2F;176-mlops-at-swampup&#x2F;&quot;&gt;episode&lt;&#x2F;a&gt; I listened to taught me about something very useful that I had been looking for, namely GraphRAG models. Check it out!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>A gh Alias For json Data</title>
          <pubDate>Tue, 05 Nov 2024 23:14:22 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/a-gh-alias-for-json-data/</link>
          <guid>https://www.superscript.com/posts/a-gh-alias-for-json-data/</guid>
          <description xml:base="https://www.superscript.com/posts/a-gh-alias-for-json-data/">&lt;p&gt;The GitHub command-line tool &lt;code&gt;gh&lt;&#x2F;code&gt; has a number of commands that can return json data. For example, this command returns the two fields of data for each repo:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;gh&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; repo&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; list&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;-json&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; field1,field2&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;But there is no way to fetch all fields without listing them explicitly.&lt;&#x2F;p&gt;
&lt;p&gt;For commands that take the &lt;code&gt;--json&lt;&#x2F;code&gt; option, using it without any fields, or with an incorrect field, throws an error with a message containing the list of valid fields. We can use that to construct the list of all fields in an alias in the config.yml file for &lt;code&gt;gh&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;yaml&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;    j&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;son&lt;&#x2F;span&gt;&lt;span&gt;:&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt; |&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;        !gh --json &amp;quot;$(gh &amp;quot;$0&amp;quot; &amp;quot;$@&amp;quot; --json 2&amp;gt;&amp;amp;1 | sed -E &amp;#39;&#x2F;^ +&#x2F;!d;s&#x2F;^ +&#x2F;&#x2F;;H;$!d;g;s&#x2F;^\n&#x2F;&#x2F;;s&#x2F;\n&#x2F;,&#x2F;g&amp;#39;)&amp;quot; &amp;quot;$0&amp;quot; &amp;quot;$@&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;With this alias in place we can use &lt;code&gt;gh json repo list&lt;&#x2F;code&gt; to fetch all fields for each repo. While it is not thoroughly tested, I believe this alias works for any command taking the &lt;code&gt;--json&lt;&#x2F;code&gt; option.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Canary Islands</title>
          <pubDate>Mon, 04 Nov 2024 16:34:33 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/canary-islands/</link>
          <guid>https://www.superscript.com/posts/canary-islands/</guid>
          <description xml:base="https://www.superscript.com/posts/canary-islands/">&lt;p&gt;Today I spoke with a Ukranian entrepreneur now living in the Canary Islands. I didn’t know the population of the islands exceeds 2 million! He told me a number of other things about the islands that were news to me.&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;They experience Calima, sandstorms that blow in from the Sahara, and these can last a week.&lt;&#x2F;li&gt;
&lt;li&gt;Deposits from countless years of these storms formed large dunes of light sand, in contrast to the darker volcanic sand and stone of the island itself.&lt;&#x2F;li&gt;
&lt;li&gt;Flights to the Spanish mainland cost as little as 5-10 Euro, and there are many per day.&lt;&#x2F;li&gt;
&lt;li&gt;It is a good environment for children.&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
</description>
      </item>
      <item>
          <title>An llm Plugin Hack</title>
          <pubDate>Sun, 03 Nov 2024 14:39:11 -0600</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/an-llm-plugin-hack/</link>
          <guid>https://www.superscript.com/posts/an-llm-plugin-hack/</guid>
          <description xml:base="https://www.superscript.com/posts/an-llm-plugin-hack/">&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;llm&quot;&gt;llm&lt;&#x2F;a&gt; package from Simon Willison has a plugin architecture. So I decided to try it. Any reasonable person would begin with a new model plugin. I decided instead to create &lt;code&gt;llm rag&lt;&#x2F;code&gt;, an encapsulation of rag queries that otherwise requires a pipeline of invocations of both &lt;code&gt;llm&lt;&#x2F;code&gt; and &lt;code&gt;files-to-prompt&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;The model for this plugin is approximately this:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;shellscript&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;llm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; similar&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;PROMPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; jq&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;r&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;[ &amp;quot;&amp;lt;document&amp;gt;&amp;quot;, .content, &amp;quot;&amp;lt;&#x2F;document&amp;gt;&amp;quot;] | join(&amp;quot;\n&amp;quot;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span&gt; {&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; printf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;lt;documents&amp;gt;\n&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; cat&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span&gt; &amp;amp;&amp;amp;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; printf&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;#39;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;lt;&#x2F;documents&amp;gt;\n%s&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;#39;&lt;&#x2F;span&gt;&lt;span&gt;;&lt;&#x2F;span&gt;&lt;span&gt; }&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; \&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span style=&quot;color: light-dark(#859900, #859900);&quot;&gt;  |&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt; llm&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt; -&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#CB4B16, #CB4B16);&quot;&gt;m&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;$(&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#268BD2, #268BD2);&quot;&gt;model&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;)&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt; &amp;quot;&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;PROMPT&lt;&#x2F;span&gt;&lt;span style=&quot;color: light-dark(#2AA198, #2AA198);&quot;&gt;&amp;quot;&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;This works for its narrow purpose, but is rather inflexible with respect to the many options that &lt;code&gt;llm&lt;&#x2F;code&gt; offers. How do we enable use of those options in this context?&lt;&#x2F;p&gt;
&lt;p&gt;Creating this plugin makes one thing clear. This problem maps very poorly onto the exiting &lt;code&gt;llm&lt;&#x2F;code&gt; implementation architecture. So the result is very messy. The rough idea is to pull in &lt;code&gt;llm&lt;&#x2F;code&gt; code to parse arguments, then run a similarity prompt, package the outputs, and then run the same prompt with the similarity results as context.&lt;&#x2F;p&gt;
&lt;p&gt;I did this two ways, and the results are &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;superscript&#x2F;llm-rag&quot;&gt;here&lt;&#x2F;a&gt;. The first is on the &lt;code&gt;master&lt;&#x2F;code&gt; branch. It processes the requests with code adapted from &lt;code&gt;llm&lt;&#x2F;code&gt; and &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;files-to-prompt&quot;&gt;&lt;code&gt;files-to-prompt&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. An unfortunately large volume of code is required for this, as it pulls from multiple levels within the &lt;code&gt;llm&lt;&#x2F;code&gt; implementation. Some options from the original commands are not supported, including templates and conversations.&lt;&#x2F;p&gt;
&lt;p&gt;A second approach is on the &lt;code&gt;subprocess&lt;&#x2F;code&gt; branch. This one focuses on parsing and filtering options, and then runs &lt;code&gt;llm&lt;&#x2F;code&gt; in a subprocess for each stage of processing. This is slightly less messy, and handles all options from each stage, modulo some minor disambiguation.&lt;&#x2F;p&gt;
&lt;p&gt;It still borrows far too much code from &lt;code&gt;llm&lt;&#x2F;code&gt;, mostly to deal with the variety of prompt constructions, in particular templates. Adding a template option to &lt;code&gt;llm similar&lt;&#x2F;code&gt; would clean this up some.&lt;&#x2F;p&gt;
&lt;p&gt;Most of the remaining mess pertains to the crude reconstruction of the command-line arguments for the subprocess. Perhaps using &lt;code&gt;--&lt;&#x2F;code&gt; separators between options sections is a better approach. Maybe there is a feature of &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;click.palletsprojects.com&#x2F;en&#x2F;stable&#x2F;&quot;&gt;click&lt;&#x2F;a&gt; that I overlooked. Even if so, the code does show some simple ways to work with the structures from click.
If you are interested in creating your own &lt;code&gt;llm&lt;&#x2F;code&gt; plugin, this is probably a good anti-pattern example.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Convert Between json and yaml With yq</title>
          <pubDate>Sat, 02 Nov 2024 08:20:25 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/yq/</link>
          <guid>https://www.superscript.com/posts/yq/</guid>
          <description xml:base="https://www.superscript.com/posts/yq/">&lt;p&gt;One of my experimental projects involves fetching data from GitHub with &lt;code&gt;gh&lt;&#x2F;code&gt;, editing the output, and then posting the results back to GitHub. It’s easy to produce json output from &lt;code&gt;gh&lt;&#x2F;code&gt;, but who wants to edit in json? I’d rather use yaml. Enter the &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;mikefarah.gitbook.io&#x2F;yq&quot;&gt;&lt;code&gt;yq&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; tool.&lt;&#x2F;p&gt;
&lt;p&gt;It works much like &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;jqlang.github.io&#x2F;jq&#x2F;&quot;&gt;&lt;code&gt;jq&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;, but also handles conversions from json to yaml and vice versa:&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;#39;{&amp;quot;here&amp;quot;:&amp;quot;there&amp;quot;}&amp;#39; | yq -pj -oy&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;
&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;echo &amp;#39;here: there&amp;#39; | yq -py -oj&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;So now I can convert to yaml, edit there, and convert back to json before posting t the API.&lt;&#x2F;p&gt;
&lt;p&gt;This is my only use of &lt;code&gt;yq&lt;&#x2F;code&gt; so far. I use &lt;code&gt;jq&lt;&#x2F;code&gt; elsewhere, and see &lt;code&gt;yq&lt;&#x2F;code&gt; as useful mainly for this type of conversion. One more problem solved!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Willison&#x27;s llm</title>
          <pubDate>Fri, 01 Nov 2024 08:20:49 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/willisons-llm/</link>
          <guid>https://www.superscript.com/posts/willisons-llm/</guid>
          <description xml:base="https://www.superscript.com/posts/willisons-llm/">&lt;p&gt;Simon Willison has created a marvelous tool for experimenting with LLMs at the command line: &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;index.html#&quot;&gt;&lt;code&gt;llm&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;. It employs a plugin architecture and offers the ability to connect to hundreds of models, both remote and local, and supports direct prompts and embeddings. This tool makes it extremely easy to experiment with different LLMs.&lt;&#x2F;p&gt;
&lt;p&gt;It uses sqlite as the back-end data data store. While this is admirably simple, it is also somewhat limiting. I almost immediately produced embedding sets too large for sqlite to handle well. I hope to extend &lt;code&gt;llm&lt;&#x2F;code&gt; to support a PostgreSQL storage layer. This part of the program is not architected for extension by plugin, so the update is not so straightforward.&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;code&gt;llm&lt;&#x2F;code&gt; program offers many features:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Extension through plugins&lt;&#x2F;li&gt;
&lt;li&gt;API access to underlying features&lt;&#x2F;li&gt;
&lt;li&gt;Model aliases&lt;&#x2F;li&gt;
&lt;li&gt;Conversations threading together multiple requests&lt;&#x2F;li&gt;
&lt;li&gt;System prompts&lt;&#x2F;li&gt;
&lt;li&gt;Image attachments&lt;&#x2F;li&gt;
&lt;li&gt;Prompt templates with variable substitution&lt;&#x2F;li&gt;
&lt;li&gt;Request logging&lt;&#x2F;li&gt;
&lt;li&gt;Extensive documentation&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;There are also useful related tools:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;files-to-prompt&quot;&gt;&lt;code&gt;files-to-prompt&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;:
Structure files for prompt inclusion&lt;&#x2F;li&gt;
&lt;li&gt;&lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;simonw&#x2F;ttok&quot;&gt;&lt;code&gt;ttok&lt;&#x2F;code&gt;&lt;&#x2F;a&gt;: Count prompt tokens&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;If you want to experiment with LLMs and RAG models, I don’t know a better tool to learn with. Try it out!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Make Help</title>
          <pubDate>Thu, 31 Oct 2024 08:34:01 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/make-help/</link>
          <guid>https://www.superscript.com/posts/make-help/</guid>
          <description xml:base="https://www.superscript.com/posts/make-help/">&lt;p&gt;If you use &lt;code&gt;make&lt;&#x2F;code&gt; in your projects, providing simple help for users is a common problem. What targets exist? What do they do? If you use nested Makefiles, where are the targets defined?&lt;&#x2F;p&gt;
&lt;p&gt;The &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;SuperScript&#x2F;make-help&quot;&gt;make-help&lt;&#x2F;a&gt; project provides a very simple way to add documentation to your Makefiles that addresses all of these questions. It uses comments in the Makefiles themselves to provide the information. It handles nested Makefiles, and works with both BSD and GNU &lt;code&gt;make&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Add three makefile fragments to your project, and add a single &lt;code&gt;include&lt;&#x2F;code&gt; statement to each Makefile that you want to document. Place that statement above all other targets in the Makefile to make it the default. Then add comments to the Makefile. That’s all there is to it!&lt;&#x2F;p&gt;
&lt;p&gt;The project is in the public domain, so have at it! Other users of your Makefiles will thank you later.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Jump to Next Row</title>
          <pubDate>Wed, 30 Oct 2024 07:28:40 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/jump-to-next-row/</link>
          <guid>https://www.superscript.com/posts/jump-to-next-row/</guid>
          <description xml:base="https://www.superscript.com/posts/jump-to-next-row/">&lt;p&gt;A handful of records go into one of my Google Sheets on a daily basis. It’s most convenient to add them at the bottom, but scrolling there is tedious. The &lt;code&gt;hyperlink()&lt;&#x2F;code&gt; function offers a way to avoid the tedium.&lt;&#x2F;p&gt;
&lt;p&gt;A formula in the header lets me jump to the first row where I can add new elements. This works by calculating the row number and then calling &lt;code&gt;hyperlink()&lt;&#x2F;code&gt; to jump there. After jumping there you must select the cell before editing. There’s no apparent way to select for editing with &lt;code&gt;hyperlink()&lt;&#x2F;code&gt;. Also, the chosen cell is aligned at the top of the view, so you do need to scroll if you want context. Nevertheless, this does eliminate scrolling, the worst part of finding the right row.&lt;&#x2F;p&gt;
&lt;p&gt;Here is a formula that locates the first row with an empty cell in column &lt;code&gt;B&lt;&#x2F;code&gt;, and then selects column &lt;code&gt;A&lt;&#x2F;code&gt; in that row. The header cell that contains the link reads “Next Row”.&lt;&#x2F;p&gt;
&lt;pre class=&quot;giallo&quot; style=&quot;color-scheme: light dark; color: light-dark(#657B83, #839496); background-color: light-dark(#FDF6E3, #002B36);&quot;&gt;&lt;code data-lang=&quot;plain&quot;&gt;&lt;span class=&quot;giallo-l&quot;&gt;&lt;span&gt;=hyperlink(&amp;quot;#gid=SHEET_ID_HERE&amp;amp;range=A&amp;quot; &amp;amp; MATCH(TRUE,ARRAYFORMULA(LEN(TRIM(B:B))=0),0),&amp;quot;Next Row&amp;quot;)&lt;&#x2F;span&gt;&lt;&#x2F;span&gt;&lt;&#x2F;code&gt;&lt;&#x2F;pre&gt;
&lt;p&gt;That’s it!&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Replacing pip with uv</title>
          <pubDate>Tue, 29 Oct 2024 08:16:31 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/replacing-pip-with-uv/</link>
          <guid>https://www.superscript.com/posts/replacing-pip-with-uv/</guid>
          <description xml:base="https://www.superscript.com/posts/replacing-pip-with-uv/">&lt;p&gt;Recently I discovered &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;github.com&#x2F;astral-sh&#x2F;uv&quot;&gt;&lt;code&gt;uv&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; as a potential replacement for &lt;code&gt;pip&lt;&#x2F;code&gt;. A single use paid off the switching costs.&lt;&#x2F;p&gt;
&lt;p&gt;It has three main advantages over &lt;code&gt;pip&lt;&#x2F;code&gt;:&lt;&#x2F;p&gt;
&lt;ul&gt;
&lt;li&gt;Speed&lt;&#x2F;li&gt;
&lt;li&gt;Correctness&lt;&#x2F;li&gt;
&lt;li&gt;Independence from the project&lt;&#x2F;li&gt;
&lt;&#x2F;ul&gt;
&lt;p&gt;The speed advantage is obvious. The other two advantages warrant explanation.&lt;&#x2F;p&gt;
&lt;p&gt;I had installed Simon Willison’s excellent &lt;a rel=&quot;external&quot; href=&quot;https:&#x2F;&#x2F;llm.datasette.io&#x2F;en&#x2F;stable&#x2F;index.html&quot;&gt;&lt;code&gt;llm&lt;&#x2F;code&gt;&lt;&#x2F;a&gt; CLI tool for LLM use. When I used &lt;code&gt;pip freeze&lt;&#x2F;code&gt; to capture the current installation, it produced an invalid version for an &lt;code&gt;sqlite3&lt;&#x2F;code&gt; library, necessitating a manual fix.&lt;&#x2F;p&gt;
&lt;p&gt;Some of my work uses FreeBSD. After installing the &lt;code&gt;llm&lt;&#x2F;code&gt; plugin &lt;code&gt;llm-gpt4all&lt;&#x2F;code&gt;, my project broke. Installation ran without error, but the plugin threw runtime error saying that FreeBSD is not supported. Failing to detect the lack of support at install time and relying on a run-time error is bad behavior to discuss elsewhere. At least the fix is easy, just uninstall &lt;code&gt;llm-gpt4all&lt;&#x2F;code&gt;.&lt;&#x2F;p&gt;
&lt;p&gt;Not so fast! When attempting uninstall, &lt;code&gt;pip&lt;&#x2F;code&gt; throws the same error! So &lt;code&gt;pip&lt;&#x2F;code&gt; is hosed because the project is hosed.&lt;&#x2F;p&gt;
&lt;p&gt;I created a new setup with &lt;code&gt;uv&lt;&#x2F;code&gt; instead of &lt;code&gt;pip&lt;&#x2F;code&gt; and found that &lt;code&gt;uv&lt;&#x2F;code&gt; freezes correct version numbers and also successfully uninstalls the module throwing the run-time error. That’s enough benefit to justify the switch.&lt;&#x2F;p&gt;
</description>
      </item>
      <item>
          <title>Welcome</title>
          <pubDate>Sun, 12 Jun 2022 18:31:58 -0500</pubDate>
          <author>Unknown</author>
          <link>https://www.superscript.com/posts/welcome/</link>
          <guid>https://www.superscript.com/posts/welcome/</guid>
          <description xml:base="https://www.superscript.com/posts/welcome/">&lt;p&gt;“Alright, move on. Nothing to see here. Please disperse.”&lt;&#x2F;p&gt;
&lt;p&gt;– Frank Drebin&lt;&#x2F;p&gt;
</description>
      </item>
    </channel>
</rss>
